From 5d5d04b690879492e385994b553c44b5d200ddc6 Mon Sep 17 00:00:00 2001 From: Sergey Lapin Date: Sat, 14 Feb 2026 13:44:05 +0300 Subject: [PATCH] tracing Ogre frame, making sure all furniture use the same material --- Game.cpp | 32 ++++++++++++- src/gamedata/items/town.cpp | 95 +++++++++++++++++++++++++++++++++++-- 2 files changed, 121 insertions(+), 6 deletions(-) diff --git a/Game.cpp b/Game.cpp index 41b3562..ec1fa60 100644 --- a/Game.cpp +++ b/Game.cpp @@ -21,6 +21,7 @@ #include "physics.h" #include "sound.h" #include +#include class App; class SkyRenderer : public Ogre::SceneManager::Listener { protected: @@ -171,6 +172,32 @@ public: mSkyBoxGenParameters.skyBoxDistance = distance; } }; +class FrameListenerTrace : public Ogre::FrameListener { +public: + TracyCZoneCtx mzone; + FrameListenerTrace() + : initialized(false) + { + } + bool frameStarted(const Ogre::FrameEvent &evt) override + { + TracyCZoneN(ctx, "OgreFrame", true); + mzone = ctx; + return true; + } + bool frameRenderingQueued(const Ogre::FrameEvent &evt) override + { + TracyCZoneEnd(mzone); + return true; + } + bool frameEnded(const Ogre::FrameEvent &evt) override + { + return true; + } + +private: + bool initialized; +}; class App; class KeyboardListener : public OgreBites::InputListener { App *mApp; @@ -333,6 +360,8 @@ public: mScnMgr->addRenderQueueListener(pOverlaySystem); mScnMgrInterior->addRenderQueueListener(pOverlaySystem); mScnMgrInventory->addRenderQueueListener(pOverlaySystem); + FrameListenerTrace *trace = OGRE_NEW FrameListenerTrace; + root->addFrameListener(trace); // mTrayMgr = new OgreBites::TrayManager("AppTrays", // getRenderWindow()); } @@ -432,6 +461,7 @@ public: Ogre::RTShader::ShaderGenerator *shadergen = Ogre::RTShader::ShaderGenerator::getSingletonPtr(); shadergen->addSceneManager(scnMgr); + scnMgr->setShadowTechnique(Ogre::SHADOWTYPE_NONE); setWindowGrab(true); std::cout << "Init camera" << "\n"; @@ -633,7 +663,7 @@ end: void createContent() { int i; - mJolt = new JoltPhysicsWrapper(mScnMgr, mCameraNode); + mJolt = new JoltPhysicsWrapper(mScnMgr, mCameraNode); sky = new SkyBoxRenderer(getSceneManager()); bool drawFirst = true; diff --git a/src/gamedata/items/town.cpp b/src/gamedata/items/town.cpp index 73ee0ac..93b9e6b 100644 --- a/src/gamedata/items/town.cpp +++ b/src/gamedata/items/town.cpp @@ -5524,6 +5524,7 @@ struct TownDecorateDoors : TownTask { }; struct TownDecorateFurniture : TownTask { std::shared_future townDecorateFurnitureComplete; + /* here we place all the furniture as scene objects */ void createDecorateFurniture(flecs::entity e, const nlohmann::json &jdistrict, int index, Ogre::SceneNode *sceneNode, @@ -5601,11 +5602,11 @@ struct TownDecorateFurniture : TownTask { Ogre::Vector3::UNIT_Z * (float)z * 2.0f; Ogre::Vector3 offsetY(0, y * 4.0f, 0); - if (furniture.find("mesh") != - furniture.end()) { - Ogre::String meshName = - furniture["mesh"] - .get(); + static Ogre::String materialName1 = ""; + static Ogre::String materialName2 = ""; + auto getFurnitureMesh = + [](const Ogre::String &meshName) + -> Ogre::MeshPtr { Ogre::MeshPtr mesh = Ogre::MeshManager::getSingleton() .getByName( @@ -5624,6 +5625,70 @@ struct TownDecorateFurniture : TownTask { meshconf); } } + return mesh; + }; + auto placeFurnitureMesh = [](flecs::entity + e, + Ogre::MeshPtr + mesh, + const Ogre::Vector3 + &position, + const Ogre::Quaternion + &rotation) { + Ogre::Entity *ent = + ECS::get() + .mScnMgr + ->createEntity( + mesh->getName()); + Ogre::String tmpMatName = + mesh->getSubMesh(0) + ->getMaterialName(); + if (tmpMatName.substr(0, 14) == + "furniture-sofa") { + if (materialName2 == "") + materialName2 = + tmpMatName; + else + ent->setMaterialName( + + materialName2); + } else { + if (materialName1 == "") + materialName1 = + tmpMatName; + else + ent->setMaterialName( + materialName1); + } + Ogre::SceneNode *node = + ECS::get() + .mScnMgr + ->getRootSceneNode() + ->createChildSceneNode(); + node->_setDerivedPosition( + position); + node->_setDerivedOrientation( + rotation); + node->attachObject(ent); + ent->setRenderingDistance( + 60.0f); + addStaticBodyMesh(e, mesh, + position, + rotation); + ECS::get() + .entity() + .child_of(e) + .set( + { node }); + }; + if (furniture.find("mesh") != + furniture.end()) { + Ogre::String meshName = + furniture["mesh"] + .get(); + Ogre::MeshPtr mesh = + getFurnitureMesh( + meshName); if (mesh) { int rotation = 2; if (jfcell.find( @@ -5638,6 +5703,25 @@ struct TownDecorateFurniture : TownTask { Ogre::Vector3:: UNIT_Z * 0.0f; + Ogre::Vector3 furniturePosition = + worldCenterPosition + + offsetX + + offsetZ + + offsetY + + offset; + Ogre::Quaternion furnitureOrientation = + worldCenterOrientation * + Ogre::Quaternion( + Ogre::Degree( + 90.0f * + (float)rotation), + Ogre::Vector3:: + UNIT_Y); + placeFurnitureMesh( + e, mesh, + furniturePosition, + furnitureOrientation); +#if 0 Ogre::Entity *ent = ECS::get< EngineData>() @@ -5686,6 +5770,7 @@ struct TownDecorateFurniture : TownTask { .child_of(e) .set( { node }); +#endif #if 0 if (furniture.find( "sensors") !=