Consistent startup

This commit is contained in:
2025-12-19 06:09:07 +03:00
parent 9bb9e2c09b
commit d3c93c5c18
16 changed files with 1884 additions and 860 deletions

View File

@@ -198,10 +198,12 @@ out:
long world_grid_y = world_y + grid_center_y;
float amplitude = 150.0f;
if (world_grid_x < 0 || world_grid_y < 0) {
#if 0
std::cout << "world: " << world_x << " " << world_y
<< " ";
std::cout << "grid: " << world_grid_x << " ";
std::cout << world_grid_y << std::endl;
#endif
return -amplitude;
}
OgreAssert(world_grid_x >= 0, "bad world x");
@@ -263,7 +265,6 @@ public:
void createTerrainChunk(Ogre::TerrainGroup *terrainGroup, long x,
long y)
{
std::lock_guard<std::mutex> guard(mtx);
Ogre::Terrain *terrain = terrainGroup->getTerrain(x, y);
float minH = terrain->getMinHeight();
float maxH = terrain->getMaxHeight();
@@ -277,7 +278,7 @@ public:
float worldSize = terrain->getWorldSize();
float scaled = worldSize / (size - 1);
Ogre::Vector3 bodyPosition = terrain->getPosition();
bodyPosition.y += (maxH + minH) / 2.0f;
// bodyPosition.y += (maxH + minH) / 2.0f;
bodyPosition.x += worldSize / 2.0f;
bodyPosition.z += worldSize / 2.0f;
Ogre::Vector3 offset =
@@ -337,18 +338,29 @@ public:
}
void update()
{
static bool created = false;
std::deque<struct gen_collider> output;
std::lock_guard<std::mutex> guard(mtx);
static bool created = false;
while (!collider_queue.empty()) {
Ogre::TerrainGroup *group =
Ogre::TerrainGroup *group =
collider_queue.front().group;
long x = collider_queue.front().x;
if (group->isDerivedDataUpdateInProgress())
break;
long x = collider_queue.front().x;
long y = collider_queue.front().y;
std::cout << x << " " << y << " "
<< collider_queue.size() << std::endl;
Ogre::Terrain *terrain = group->getTerrain(x, y);
Ogre::Vector3 worldPos;
group->convertTerrainSlotToWorldPosition(x, y,
&worldPos);
if (terrain && terrain->getHeightData() &&
std::cout << "terrain: " << terrain;
if (terrain)
std::cout
<< terrain->getHeightData() << " "
<< terrain->isLoaded() << " "
<< terrain->isDerivedDataUpdateInProgress()
<< std::endl;
if (terrain && terrain->getHeightData() &&
terrain->isLoaded() &&
!terrain->isDerivedDataUpdateInProgress()) {
Ogre::LogManager::getSingleton().logError(
@@ -356,8 +368,8 @@ public:
Ogre::StringConverter::toString(x) +
" " +
Ogre::StringConverter::toString(y));
float minH = terrain->getMinHeight();
float maxH = terrain->getMaxHeight();
// float minH = terrain->getMinHeight();
// float maxH = terrain->getMaxHeight();
int size = terrain->getSize();
float worldSize = terrain->getWorldSize();
{
@@ -404,8 +416,8 @@ public:
created = true;
}
#endif
collider_queue.pop_front();
// FIXME: create entities and components instead
#if 0
Ogre::SceneNode *items =
terrain->_getRootSceneNode()
->createChildSceneNode();
@@ -425,21 +437,25 @@ public:
what->setOrientation(item.rotation);
what->setPosition(item.position);
}
#endif
/* Spawn items */
StaticGeometryModule::addGeometryForSlot(x, y);
collider_queue.pop_front();
} else {
output.push_back(collider_queue.front());
/* Terrain data not ready maybe move to next terrain */
gen_collider m = collider_queue.front();
collider_queue.pop_front();
collider_queue.push_back(m);
break; // allow system to move on
}
if (collider_queue.empty() &&
!ECS::get<Terrain>().mTerrainReady) {
ECS::get_mut<Terrain>().mTerrainReady = true;
ECS::modified<Terrain>();
}
}
collider_queue = output;
}
}
if (collider_queue.empty() &&
!ECS::get<Terrain>().mTerrainReady) {
ECS::get_mut<Terrain>().mTerrainReady = true;
ECS::modified<Terrain>();
}
}
};
class DummyPageProvider : public Ogre::PageProvider {
public:
@@ -717,11 +733,12 @@ TerrainModule::TerrainModule(flecs::world &ecs)
ECS::get().add<CanSetPlayerPosition>();
}
});
#if 0
ecs.system<const Terrain>("SetPlayerPosition")
.kind(flecs::OnUpdate)
.with<CanSetPlayerPosition>()
.each([this](const Terrain &terrain) {
flecs::entity player = ECS::player;
flecs::entity player = ECS::get<CharacterM;
if (!player.is_valid())
return;
if (!player.has<CharacterLocation>())
@@ -745,6 +762,7 @@ TerrainModule::TerrainModule(flecs::world &ecs)
player.modified<CharacterLocation>();
ECS::get().remove<CanSetPlayerPosition>();
});
#endif
ecs.system<const Terrain>("UpdateTerrainGroup")
.kind(flecs::OnUpdate)
.interval(2.0f)
@@ -797,4 +815,4 @@ void TerrainModule::defineTerrain(long x, long y)
ECS::get<Terrain>().definer->define(ECS::get<Terrain>().mTerrainGroup,
x, y);
}
}
}