tracing Ogre frame, making sure all furniture use the same material

This commit is contained in:
2026-02-14 13:44:05 +03:00
parent 884a310033
commit 5d5d04b690
2 changed files with 121 additions and 6 deletions

View File

@@ -21,6 +21,7 @@
#include "physics.h"
#include "sound.h"
#include <tracy/Tracy.hpp>
#include <tracy/TracyC.h>
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;

View File

@@ -5524,6 +5524,7 @@ struct TownDecorateDoors : TownTask {
};
struct TownDecorateFurniture : TownTask {
std::shared_future<bool> 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<Ogre::String>();
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<EngineData>()
.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<EngineData>()
.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<FurnitureInstance>(
{ node });
};
if (furniture.find("mesh") !=
furniture.end()) {
Ogre::String meshName =
furniture["mesh"]
.get<Ogre::String>();
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<FurnitureInstance>(
{ node });
#endif
#if 0
if (furniture.find(
"sensors") !=