126 lines
3.9 KiB
C++
Executable File
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)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
}
|