Files
qt5-legatus-legacy/Lts/Plugins/BuildingViewer/Common/BgViewer/viewerCtrl/modelsplittercomponent.cpp
T
2026-08-13 18:33:10 +02:00

126 lines
3.9 KiB
C++
Executable File

#include "modelsplittercomponent.h"
#include "visitors.h"
#include <dtEntity/mapcomponent.h>
#include <dtEntity/systemmessages.h>
#include <dtEntityOSG/layercomponent.h>
#include <dtEntityOSG/layerattachpointcomponent.h>
#include <dtEntityOSG/staticmeshcomponent.h>
#include <dtEntityOSG/positionattitudetransformcomponent.h>
#include <osg/NodeVisitor>
#include <osg/Geode>
#include <osg/Geometry>
#include <osg/Group>
#include <osg/MatrixTransform>
#include <osgDB/ReadFile>
#include <QtCore/QString>
#include <QtCore/QStringList>
#include <QtCore/QSet>
namespace VCtrl
{
////////////////////////////////////////////////////////////////////////////////
const dtEntity::StringId ModelSplitterComponent::TYPE(dtEntity::SID("ModelSplitter"));
const dtEntity::StringId ModelSplitterComponent::VerticalDisplaceId(dtEntity::SID("VerticalDisplace"));
const dtEntity::StringId ModelSplitterComponent::HorizontalDisplaceId(dtEntity::SID("HorizontalDisplace"));
////////////////////////////////////////////////////////////////////////////
ModelSplitterComponent::ModelSplitterComponent()
{
Register(VerticalDisplaceId, &mVerticalDisplace);
Register(HorizontalDisplaceId, &mHorizontalDisplace);
}
////////////////////////////////////////////////////////////////////////////
void ModelSplitterComponent::OnAddedToEntity(dtEntity::Entity &entity)
{
BaseClass::OnAddedToEntity(entity);
mEntity = &entity;
}
////////////////////////////////////////////////////////////////////////////
void ModelSplitterComponent::Split(std::vector<dtEntity::EntityId> &eids, std::vector<float> &heights, std::vector<int> &floors, dtEntity::StringId layerName)
{
dtEntityOSG::StaticMeshComponent *smc;
if (!mEntity->GetComponent(smc))
{
LOG_ERROR("Cannot split: Has no staticmeshcomponent");
return;
}
osg::ref_ptr<osg::Node> mesh = osgDB::readNodeFile(smc->GetMesh());
if (mesh == nullptr) return;
SplitVisitor v;
mesh->accept(v);
heights = v._heights;
mesh = nullptr;
for (const auto &part : v._parts)
{
osg::ref_ptr<osg::Node> node = osg::clone(part.get(), osg::CopyOp(
osg::CopyOp::DEEP_COPY_OBJECTS |
osg::CopyOp::DEEP_COPY_NODES |
osg::CopyOp::DEEP_COPY_USERDATA
));
dtEntity::Entity *e;
if (!mEntity->GetEntityManager().CreateEntity(e))
continue;
eids.push_back(e->GetId());
std::string nname = node->getName();
std::string floorstr = nname.substr(6, nname.size() - 1);
int floor = QString::fromStdString(floorstr).toInt();
floors.push_back(floor);
std::ostringstream entityname;
entityname << dtEntity::GetStringFromSID(layerName) << "_" << floorstr;
dtEntity::MapComponent *mc;
if (!e->CreateComponent(mc))
continue;
mc->SetEntityName(entityname.str());
mc->SetUniqueId(entityname.str());
mc->SetMapName("parts");
dtEntityOSG::StaticMeshComponent *smcFloor;
if (!e->CreateComponent(smcFloor))
continue;
smcFloor->SetStaticMesh(node);
dtEntityOSG::PositionAttitudeTransformComponent *pc;
if (!e->CreateComponent(pc))
continue;
pc->AddChildComponent(smcFloor->GetType());
dtEntityOSG::LayerComponent *lc;
if (!e->CreateComponent(lc))
continue;
lc->SetAttachedComponent(pc->GetType());
lc->SetLayer(layerName);
lc->Finished();
}
// sort
std::sort(floors.begin(), floors.end());
}
////////////////////////////////////////////////////////////////////////////
const dtEntity::StringId ModelSplitterSystem::TYPE(dtEntity::SID("ModelSplitter"));
////////////////////////////////////////////////////////////////////////////
ModelSplitterSystem::ModelSplitterSystem(dtEntity::EntityManager &em)
: dtEntity::DefaultEntitySystem<ModelSplitterComponent>(em)
{
}
}