Skip to content

Commit

Permalink
[共通] Morton 3D
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed Aug 28, 2023
1 parent e914091 commit 7f939b3
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 0 deletions.
40 changes: 40 additions & 0 deletions Siv3D/include/Siv3D/Morton.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,45 @@ namespace s3d
/// @return 2D 座標
[[nodiscard]]
Point Decode2D64(Morton64 morton) noexcept;

/// @brief 3D 座標を 32-bit のモートン順序にエンコードして返します。
/// @param x X 座標
/// @param y Y 座標
/// @param z Z 座標
/// @return モートン順序
[[nodiscard]]
Morton32 Encode3D32(uint16 x, uint16 y, uint16 z) noexcept;

/// @brief 3D 座標を 64-bit のモートン順序にエンコードして返します。
/// @param x X 座標
/// @param y Y 座標
/// @param z Z 座標
/// @return モートン順序
[[nodiscard]]
Morton64 Encode3D64(uint32 x, uint32 y, uint32 z) noexcept;

/// @brief 3D 座標を 32-bit のモートン順序にエンコードして返します。
/// @param pos 座標
/// @return モートン順序
[[nodiscard]]
Morton32 Encode3D32(Point3D pos) noexcept;

/// @brief 3D 座標を 64-bit のモートン順序にエンコードして返します。
/// @param pos 座標
/// @return モートン順序
[[nodiscard]]
Morton64 Encode3D64(Point3D pos) noexcept;

/// @brief 32-bit のモートン順序を 3D 座標にデコードして返します。
/// @param morton モートン順序
/// @return 3D 座標
[[nodiscard]]
Point3D Decode3D32(Morton32 morton) noexcept;

/// @brief 64-bit のモートン順序を 3D 座標にデコードして返します。
/// @param morton モートン順序
/// @return 3D 座標
[[nodiscard]]
Point3D Decode3D64(Morton64 morton) noexcept;
}
}
34 changes: 34 additions & 0 deletions Siv3D/src/Siv3D/Morton/SivMorton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,39 @@ namespace s3d
libmorton::morton2D_64_decode(morton, x, y);
return{ x, y };
}

Morton32 Encode3D32(const uint16 x, const uint16 y, const uint16 z) noexcept
{
return libmorton::morton3D_32_encode(x, y, z);
}

Morton64 Encode3D64(const uint32 x, const uint32 y, const uint32 z) noexcept
{
return libmorton::morton3D_64_encode(x, y, z);
}

Morton32 Encode3D32(const Point3D pos) noexcept
{
return libmorton::morton3D_32_encode(static_cast<std::uint_fast16_t>(pos.x), static_cast<std::uint_fast16_t>(pos.y), static_cast<std::uint_fast16_t>(pos.z));
}

Morton64 Encode3D64(const Point3D pos) noexcept
{
return libmorton::morton3D_64_encode(static_cast<std::uint_fast32_t>(pos.x), static_cast<std::uint_fast32_t>(pos.y), static_cast<std::uint_fast32_t>(pos.z));
}

Point3D Decode3D32(const Morton32 morton) noexcept
{
std::uint_fast16_t x, y, z;
libmorton::morton3D_32_decode(morton, x, y, z);
return{ x, y, z };
}

Point3D Decode3D64(const Morton64 morton) noexcept
{
std::uint_fast32_t x, y, z;
libmorton::morton3D_64_decode(morton, x, y, z);
return{ x, y, z };
}
}
}

0 comments on commit 7f939b3

Please sign in to comment.