@@ -54,10 +54,20 @@ namespace tsom
5454
5555 auto & planetComponent = m_planetEntity.get <PlanetComponent>();
5656
57+ ChunkIndices firstChunkIndices (-int (m_chunkCount.x / 2 ), -int (m_chunkCount.y / 2 ), -int (m_chunkCount.z / 2 ));
58+
5759 m_chunkLoadingData = std::make_shared<ChunkLoadingData>();
5860 m_chunkLoadingData->chunkCount = m_chunkCount;
5961 m_chunkLoadingData->planet = planetComponent.planet ;
60- m_chunkLoadingData->remainingChunks .emplace (-int (m_chunkCount.x / 2 ), -int (m_chunkCount.y / 2 ), -int (m_chunkCount.z / 2 ));
62+ m_chunkLoadingData->remainingChunks .emplace (firstChunkIndices);
63+ m_chunkLoadingData->visitedChunks .emplace (firstChunkIndices, true );
64+
65+ GetPlanet ().OnChunkVisibilityMaskUpdated .Connect ([chunkLoadingData = m_chunkLoadingData](Planet* /* planet*/ , Chunk* chunk, DirectionMask oldVisibilityMask, DirectionMask newVisibilityMask)
66+ {
67+ DirectionMask newDirectionMask = newVisibilityMask & ~oldVisibilityMask;
68+ chunkLoadingData->visitedChunks [chunk->GetIndices ()] = true ;
69+ chunkLoadingData->HandleChunkLoaded (chunk->GetIndices (), newDirectionMask);
70+ });
6171
6272 // planetComponent.planet->GeneratePlatform(blockLibrary, Direction::Right, { 65, -18, -39 });
6373 // planetComponent.planet->GeneratePlatform(blockLibrary, Direction::Back, { -34, 2, 53 });
@@ -264,7 +274,8 @@ namespace tsom
264274 if (!chunkFound)
265275 chunkLoadingData->planet ->GenerateChunk (*chunk, seed, chunkCount, generatorName);
266276
267- chunkLoadingData->HandleChunkLoaded (chunk->GetIndices ());
277+ DirectionMask visibilityMask = chunkLoadingData->planet ->GetChunkVisibilityMask (chunk->GetIndices ());
278+ chunkLoadingData->HandleChunkLoaded (chunk->GetIndices (), visibilityMask);
268279
269280 if (--chunkLoadingData->chunkLoadingCount == 0 && chunkLoadingData->remainingChunks .empty ())
270281 spdlog::debug (" planet chunk loading finished, total chunks: {} (out of {})" , chunkLoadingData->visitedChunks .size (), chunkCount.x * chunkCount.y * chunkCount.z );
@@ -344,26 +355,36 @@ namespace tsom
344355 });
345356 }
346357
347- void ServerPlanetEnvironment::ChunkLoadingData::HandleChunkLoaded (const ChunkIndices& chunkIndices)
358+ void ServerPlanetEnvironment::ChunkLoadingData::HandleChunkLoaded (const ChunkIndices& chunkIndices, DirectionMask visibilityMask )
348359 {
349360 ChunkIndices minIndices (-int (chunkCount.x / 2 ), -int (chunkCount.y / 2 ), -int (chunkCount.z / 2 ));
350361 ChunkIndices maxIndices = minIndices + ChunkIndices (chunkCount) - ChunkIndices (1 );
351362
352363 std::unique_lock lock (mutex);
353364
354- DirectionMask visibilityMask = planet->GetChunkVisibilityMask (chunkIndices);
355- for (Direction visibleNeighborDir : visibilityMask)
365+ // Direct neighbor can trigger indirect neighbor
366+ bool isPrimaryChunk = Nz::Retrieve (visitedChunks, chunkIndices);
367+
368+ for (Direction direction : DirectionMask_All)
356369 {
357- ChunkIndices neighborIndices = chunkIndices + s_chunkDirOffset[visibleNeighborDir];
358- if (neighborIndices.x < minIndices.x || neighborIndices.x > maxIndices.x ||
359- neighborIndices.y < minIndices.y || neighborIndices.y > maxIndices.y ||
360- neighborIndices.z < minIndices.z || neighborIndices.z > maxIndices.z )
370+ bool isNeighborPrimaryChunk = visibilityMask.Test (direction);
371+ if (!isPrimaryChunk && !isNeighborPrimaryChunk)
361372 continue ;
362373
363- if (visitedChunks.contains (neighborIndices))
374+ ChunkIndices neighborIndices = chunkIndices + s_chunkDirOffset[direction];
375+ if (neighborIndices.x < minIndices.x || neighborIndices.x > maxIndices.x
376+ || neighborIndices.y < minIndices.y || neighborIndices.y > maxIndices.y
377+ || neighborIndices.z < minIndices.z || neighborIndices.z > maxIndices.z )
364378 continue ;
365379
366- visitedChunks.insert (neighborIndices);
380+ auto it = visitedChunks.find (neighborIndices);
381+ if (it != visitedChunks.end ())
382+ {
383+ it.value () |= isNeighborPrimaryChunk;
384+ continue ;
385+ }
386+
387+ visitedChunks.emplace (neighborIndices, isNeighborPrimaryChunk);
367388 remainingChunks.push (neighborIndices);
368389 }
369390 }
0 commit comments