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

@@ -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") !=