Added a matrix for the parent node and a better id.

This commit is contained in:
Tristan Zimpfer
2017-04-19 11:48:52 +02:00
parent 79e1e0ec04
commit 9f362853d6
2 changed files with 54 additions and 15 deletions
+26 -9
View File
@@ -220,16 +220,33 @@ void ColladaSerializer::ColladaExporter::ColladaScene::add(
node.end(); node.end();
} }
void ColladaSerializer::ColladaExporter::ColladaScene::addParent(const std::string& node_name){ void ColladaSerializer::ColladaExporter::ColladaScene::addParent(const IfcGeom::Element<real_t>& parent){
if (!scene_opened) { if (!scene_opened) {
openVisualScene(scene_id); openVisualScene(scene_id);
scene_opened = true; scene_opened = true;
} }
const std::vector<real_t> matrix = parent.transformation().matrix().data();
double matrix_array[4][4] = {
{ (double)matrix[0], (double)matrix[3], (double)matrix[6], (double)matrix[9] },
{ (double)matrix[1], (double)matrix[4], (double)matrix[7], (double)matrix[10] },
{ (double)matrix[2], (double)matrix[5], (double)matrix[8], (double)matrix[11] },
{ 0, 0, 0, 1 }
};
matrix_array[0][3] += serializer->settings().offset[0];
matrix_array[1][3] += serializer->settings().offset[1];
matrix_array[2][3] += serializer->settings().offset[2];
const std::string id = "representation-" + boost::lexical_cast<std::string>(parent.id());
current_node = new COLLADASW::Node(mSW); current_node = new COLLADASW::Node(mSW);
current_node->setNodeId(node_name); current_node->setNodeId(id);
current_node->setNodeName(node_name); current_node->setNodeName(parent.name());
current_node->addMatrix(matrix_array);
current_node->setType(COLLADASW::Node::NODE); current_node->setType(COLLADASW::Node::NODE);
current_node->start(); current_node->start();
} }
@@ -338,7 +355,7 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme
deferreds.push_back( deferreds.push_back(
DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(), DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(),
mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs(), "") mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs())
); );
} }
@@ -361,7 +378,7 @@ void ColladaSerializer::ColladaExporter::write(const IfcGeom::TriangulationEleme
deferreds.push_back( deferreds.push_back(
DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(), DeferredObject(name, representation_id, o->type(), o->transformation().matrix().data(), mesh.verts(), mesh.normals(),
mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs(), parent->name()) mesh.faces(), mesh.edges(), mesh.material_ids(), mesh.materials(), material_references, mesh.uvs(), *parent)
); );
} }
@@ -379,17 +396,17 @@ void ColladaSerializer::ColladaExporter::endDocument() {
geometries.write(it->representation_id, it->type, it->vertices, it->normals, it->faces, it->edges, it->material_ids, it->materials, it->uvs); geometries.write(it->representation_id, it->type, it->vertices, it->normals, it->faces, it->edges, it->material_ids, it->materials, it->uvs);
} }
geometries.close(); geometries.close();
std::string parent_name; int parent_id;
bool is_parent_empty = true; bool is_parent_empty = true;
for (std::vector<DeferredObject>::const_iterator it = deferreds.begin(); it != deferreds.end(); ++it) { for (std::vector<DeferredObject>::const_iterator it = deferreds.begin(); it != deferreds.end(); ++it) {
const std::string object_name = it->unique_id; const std::string object_name = it->unique_id;
if (parent_name != it->parent){ if (parent_id != it->parent->id()){
if (!is_parent_empty){ if (!is_parent_empty){
scene.closeParent(); scene.closeParent();
} }
parent_name = it->parent; parent_id = it->parent->id();
scene.addParent(parent_name); scene.addParent(*it->parent);
is_parent_empty = false; is_parent_empty = false;
} }
+28 -6
View File
@@ -89,7 +89,7 @@ private:
{} {}
void add(const std::string& node_id, const std::string& node_name, const std::string& geom_name, void add(const std::string& node_id, const std::string& node_name, const std::string& geom_name,
const std::vector<std::string>& material_ids, const std::vector<real_t>& matrix); const std::vector<std::string>& material_ids, const std::vector<real_t>& matrix);
void addParent(const std::string& node_name); void addParent(const IfcGeom::Element<real_t>& parent);
void closeParent(); void closeParent();
void write(); void write();
ColladaSerializer *serializer; ColladaSerializer *serializer;
@@ -127,7 +127,9 @@ private:
class DeferredObject { class DeferredObject {
friend bool operator < (const DeferredObject & def_obj1, const DeferredObject & def_obj2) friend bool operator < (const DeferredObject & def_obj1, const DeferredObject & def_obj2)
{ {
return (def_obj1.parent < def_obj2.parent ? true : false); const IfcGeom::Element<real_t> parent1 = *def_obj1.parent;
const IfcGeom::Element<real_t> parent2 = *def_obj2.parent;
return (parent1.name() < parent2.name() ? true : false);
} }
public: public:
std::string unique_id, representation_id, type; std::string unique_id, representation_id, type;
@@ -140,11 +142,11 @@ private:
std::vector<IfcGeom::Material> materials; std::vector<IfcGeom::Material> materials;
std::vector<std::string> material_references; std::vector<std::string> material_references;
std::vector<real_t> uvs; std::vector<real_t> uvs;
std::string parent; const IfcGeom::Element<real_t>* parent;
DeferredObject(const std::string& unique_id, const std::string& representation_id, const std::string& type, const std::vector<real_t>& matrix, DeferredObject(const std::string& unique_id, const std::string& representation_id, const std::string& type, const std::vector<real_t>& matrix,
const std::vector<real_t>& vertices, const std::vector<real_t>& normals, const std::vector<int>& faces, const std::vector<real_t>& vertices, const std::vector<real_t>& normals, const std::vector<int>& faces,
const std::vector<int>& edges, const std::vector<int>& material_ids, const std::vector<IfcGeom::Material>& materials, const std::vector<int>& edges, const std::vector<int>& material_ids, const std::vector<IfcGeom::Material>& materials,
const std::vector<std::string>& material_references, const std::vector<real_t>& uvs, const std::string& parent) const std::vector<std::string>& material_references, const std::vector<real_t>& uvs, const IfcGeom::Element<real_t>& _parent)
: unique_id(unique_id) : unique_id(unique_id)
, representation_id(representation_id) , representation_id(representation_id)
, type(type) , type(type)
@@ -157,8 +159,28 @@ private:
, materials(materials) , materials(materials)
, material_references(material_references) , material_references(material_references)
, uvs(uvs) , uvs(uvs)
, parent(parent) {
{} parent = &_parent;
}
DeferredObject(const std::string& unique_id, const std::string& representation_id, const std::string& type, const std::vector<real_t>& matrix,
const std::vector<real_t>& vertices, const std::vector<real_t>& normals, const std::vector<int>& faces,
const std::vector<int>& edges, const std::vector<int>& material_ids, const std::vector<IfcGeom::Material>& materials,
const std::vector<std::string>& material_references, const std::vector<real_t>& uvs)
: unique_id(unique_id)
, representation_id(representation_id)
, type(type)
, matrix(matrix)
, vertices(vertices)
, normals(normals)
, faces(faces)
, edges(edges)
, material_ids(material_ids)
, materials(materials)
, material_references(material_references)
, uvs(uvs)
{
}
}; };
COLLADABU::NativeString filename; COLLADABU::NativeString filename;
COLLADASW::StreamWriter stream; COLLADASW::StreamWriter stream;