5#include "common/probe_world.hlsli"
8using namespace bicameral::multires;
27 return cell & ~(MR_BLOCK_EDGE - 1);
31 return static_cast<uint32_t
>(tick & 1u);
37 const int64_t halfCell = int64_t{1} << (PEEK_POINT_LEVEL - 1);
38 const auto center = [halfCell](uint32_t value) {
39 return (int64_t{value} << PEEK_POINT_LEVEL) + halfCell;
42 return {.x = center(cell.
x), .y = center(cell.
y), .z = center(cell.
z), .level = PEEK_POINT_LEVEL};
85 return std::unexpected(nest.error());
93 return std::unexpected(mirror.error());
96 return std::unexpected(extract.error());
101 return std::unexpected(
"覗き窓のパイプラインを作れない");
115 m_nest.SetExternalViews(context.
cells->GetGPUVirtualAddress(), context.
extraction->GetGPUVirtualAddress());
123 const std::array<uint32_t, 4> mirrorConstants = {Generation(context.
tick), BlockOrigin(plan.
cell.
x),
124 BlockOrigin(plan.
cell.
y), BlockOrigin(plan.
cell.
z)};
126 MR_BLOCK_CELLS / PEEK_GROUP_THREADS, mirrorConstants);
153 FX_ASSERT(world.size() == PROBE_CELL_COUNT);
160 const uint32_t originX = BlockOrigin(plan.
cell.
x);
161 const uint32_t originY = BlockOrigin(plan.
cell.
y);
162 const uint32_t originZ = BlockOrigin(plan.
cell.
z);
163 std::vector<RxCell> cells(MR_BLOCK_CELLS);
164 for (uint32_t index = 0; index < MR_BLOCK_CELLS; ++index) {
165 cells[index] = world[ProbeCellIndex(originX + MrCellX(index), originY + MrCellY(index),
166 originZ + MrCellZ(index))];
186 std::vector<uint32_t> words(PROBE_EXTRACTION_PEEK_WORDS, 0);
189 uint32_t levelCount = 0;
194 words[0] = levelCount;
195 for (uint32_t level = 0; level < levelCount; ++level) {
197 const MrBlock& block =
m_nest.blocks[slot];
198 const uint32_t header = PROBE_PEEK_LEVEL_WORDS + (level * PROBE_PEEK_LEVEL_WORDS);
199 words[header] =
static_cast<uint32_t
>(block.level);
200 words[header + 1] =
static_cast<uint32_t
>(
static_cast<int32_t
>(block.originX));
201 words[header + 2] =
static_cast<uint32_t
>(
static_cast<int32_t
>(block.originY));
202 words[header + 3] =
static_cast<uint32_t
>(
static_cast<int32_t
>(block.originZ));
204 for (uint32_t index = 0; index < MR_BLOCK_CELLS; ++index) {
206 const uint32_t base = PROBE_PEEK_HEADER_WORDS +
207 (((level * PROBE_PEEK_BLOCK_CELLS) + index) * PROBE_EXTRACTION_CELL_WORDS);
208 words[base] = ProbeMakeCache(table, cell).temperature;
209 for (uint32_t view = 0; view < PROBE_VIEW_SPECIES_COUNT; ++view)
210 words[base + 1 + view] = ProbeViewAmount(cell,
m_viewSpecies[view]);
ID3D12RootSignature * RootSignature() const
static std::expected< GpuMultires, std::string > Create(ID3D12Device5 *device, const BakedReactionTable &table, const MultiresCapacity &capacity, const GpuMultiresOptions &options={})
Plan NextPlan(uint64_t tick)
std::vector< uint32_t > Extraction() const
const BakedReactionTable * m_table
std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > m_viewSpecies
void Advance(std::span< const reaction::RxCell > world, uint64_t tick)
ProbePeekReference(const BakedReactionTable &table)
static std::expected< ProbePeek, std::string > Create(ID3D12Device5 *device, const BakedReactionTable &table)
ComPtr< ID3D12PipelineState > m_extractPipeline
ProbePeek(GpuMultires &&nest, const std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > &viewSpecies)
ComPtr< ID3D12PipelineState > m_mirrorPipeline
void RecordAfterExtract(ID3D12GraphicsCommandList10 *list, const ProbeExtractContext &context)
std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > m_viewSpecies
std::expected< std::vector< std::byte >, std::string > LoadShader(std::string_view relativePath)
ComPtr< ID3D12PipelineState > CreateComputePipeline(ID3D12Device *device, ID3D12RootSignature *rootSignature, std::span< const std::byte > bytecode)
uint32_t BlockOrigin(uint32_t cell)
uint32_t Generation(uint64_t tick)
constexpr int32_t PEEK_POINT_LEVEL
constexpr MultiresCapacity PEEK_CAPACITY
constexpr uint32_t PEEK_GROUP_THREADS
void PlaceMirrorBlock(MultiresNest &nest, uint32_t slot, int32_t level, int64_t originX, int64_t originY, int64_t originZ, std::span< const RxCell > cells)
void PullBackShadowChain(MultiresNest &nest, const BakedReactionTable &table, uint32_t firstShadowSlot, uint32_t levelCount)
void RemoveShadowChain(MultiresNest &nest, uint32_t firstSlot, uint32_t levelCount)
MultiresPoint PeekPointOfCell(PeekCell cell)
std::array< uint32_t, PROBE_VIEW_SPECIES_COUNT > ProbeViewSpecies(const BakedReactionTable &table)
constexpr uint32_t PEEK_LEVEL_COUNT
MultiresNest MakeMultiresNest(const MultiresCapacity &capacity)
constexpr uint32_t PEEK_FIRST_SHADOW_SLOT
constexpr uint32_t PEEK_MIRROR_SLOT
void RefineShadowChain(MultiresNest &nest, uint32_t parentSlot, uint32_t firstChildSlot, uint32_t levelCount, const MultiresPoint &point)
RxCell LoadNestCell(const MultiresNest &nest, uint32_t slot, uint32_t index)
constexpr uint32_t PEEK_BLOCK_CAPACITY
void StepNest(MultiresNest &nest, const BakedReactionTable &table, uint64_t worldSeed, uint64_t tick, const MultiresStepOptions &options)