Skip to content

MyLib.TileChunkUtil ​

タイルチャンクキー作成 / ローカルインデックス算出

所属:mylibのAPI解説 · 全モジュール索引

読み方 ​

このページは実ファイルから生成したソース照合用資料です。公開関数の引数・戻り値の型、オーバーロード、列挙値を確認できます。public/protected/privateを区別し、privateメンバーを呼び出し例に使わないでください。コメントは原文であり、古い説明や誤記を含む場合があります。利用条件・訂正は上記のAPI解説と既知の制約を優先してください。

元ファイル:ProjectName/include/MyLib/TileChunkUtil.ixx。確認基準:08f9fa53。

インターフェースとインライン実装 ​

cpp
export module MyLib.TileChunkUtil;

import <cstdint>;
import <unordered_map>;
import <vector>;
import <optional>;
import MyLib.Math.Vector2;

using namespace math;

export namespace tile
{
    /// <summary>
    /// タイルチャンクキー作成
    /// </summary>
    /// <param name="cx">チャンクX座標</param>
    /// <param name="cy">チャンクY座標</param>
    /// <returns>タイルチャンクキー</returns>
    inline size_t MakeTileKey(uint32_t cx, uint32_t cy)
    {
        return (static_cast<uint64_t>(cy) << 32) | static_cast<uint64_t>(cx);
    }

    /// <summary>
    /// ローカルインデックス算出
    /// </summary>
    /// <param name="x">グリッドX座標</param>
    /// <param name="y">グリッドY座標</param>
    /// <param name="chunkSize">チャンクサイズ</param>
    /// <returns>ローカルインデックス</returns>
    inline size_t LocalIndex(size_t x, size_t y, const Vector2u& chunkSize)
    {
        return (y % chunkSize.y) * chunkSize.x + (x % chunkSize.x);
    }

    /// <summary>
    /// チャンク化されたグリッド構築
    /// </summary>
    /// <typeparam name="T">データ型</typeparam>
    /// <typeparam name="Provider">データ提供関数型</typeparam>
    /// <param name="width">グリッド幅</param>
    /// <param name="height">グリッド高さ</param>
    /// <param name="chunkSize">チャンクサイズ</param>
    /// <param name="provider">データ提供関数</param>
    template<class T, class Provider>
    std::unordered_map<size_t, std::vector<T>> BuildChunkedGrid(size_t width, size_t height, const Vector2u& chunkSize, Provider&& provider)
    {
        std::unordered_map<size_t, std::vector<T>> result;

        for (size_t y = 0; y < height; ++y)
        {
            for (size_t x = 0; x < width; ++x)
            {
                // チャンク座標算出
                const uint32_t cx = static_cast<uint32_t>(x / chunkSize.x);
                const uint32_t cy = static_cast<uint32_t>(y / chunkSize.y);

                // キーとインデックス生成
                const size_t key = MakeTileKey(cx, cy);
                const size_t index = LocalIndex(x, y, chunkSize);
                
                
                std::optional<T> val = provider(x, y, y * width + x, key, index);
                if (!val) continue;

                auto& vec = result[key];
                if (vec.empty())
                {
                    vec.resize(chunkSize.x * chunkSize.y);
                }
                vec[index] = std::move(*val);
            }
        }
        return result;
    }
}

コード確認基準:08f9fa53 · C++実機検証は別途実施