#include "modelsplittercomponent.h" #include "visitors.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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 &eids, std::vector &heights, std::vector &floors, dtEntity::StringId layerName) { dtEntityOSG::StaticMeshComponent *smc; if (!mEntity->GetComponent(smc)) { LOG_ERROR("Cannot split: Has no staticmeshcomponent"); return; } osg::ref_ptr 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 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(em) { } }