From 13dabacfd29be78a025c8354309adebcbfe41318 Mon Sep 17 00:00:00 2001 From: Gianpaolo Palma gianpaolopalma Date: Wed, 9 Oct 2013 15:50:54 +0000 Subject: [PATCH] Added support to the node Cylinder --- src/meshlabplugins/io_x3d/import_x3d.h | 38 +++++++++++++++++++++++-- src/meshlabplugins/io_x3d/vrml/Parser.h | 2 +- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/meshlabplugins/io_x3d/import_x3d.h b/src/meshlabplugins/io_x3d/import_x3d.h index 11d3de244..c0b3eed4f 100644 --- a/src/meshlabplugins/io_x3d/import_x3d.h +++ b/src/meshlabplugins/io_x3d/import_x3d.h @@ -79,6 +79,9 @@ #include #include +#include +#include +#include #include #include "util_x3d.h" @@ -777,7 +780,7 @@ namespace io { QString coorTag[] = {"Coordinate", "CoordinateDouble"}; QDomElement coordinate = findNode(coorTag, 2, geometry); //If geometry node is supported, get info on color, normal and texture coordinate (per vertex, per color, or per wedge) - if ((!coordinate.isNull() && ((coordinate.attribute("point")!= "") || coordinate.attribute("USE", "") != "")) || (tagName == "ElevationGrid")) + if ((!coordinate.isNull() && ((coordinate.attribute("point")!= "") || coordinate.attribute("USE", "") != "")) || (tagName == "ElevationGrid") || (tagName == "Cylinder")) { bool copyTextureFile = true; QStringList colorList, normalList, textureList; @@ -1859,6 +1862,33 @@ namespace io { return E_NOERROR; } + + + //Load in the mesh the geometry defined in the node Cylinder + static int LoadCylinder(QDomElement geometry, + OpenMeshType& m, + const vcg::Matrix44f tMatrix, + AdditionalInfoX3D* info, + CallBackPos *cb) + { + QStringList radiusList; + findAndParseAttribute(radiusList, geometry, "radius", "1"); + QStringList heightList; + findAndParseAttribute(heightList, geometry, "height", "2"); + float radius = radiusList[0].toFloat(); + float height = heightList[0].toFloat(); + OpenMeshType newCylinder; + vcg::tri::Cone(newCylinder, radius, radius, height, 100); + if (info->meshColor) + vcg::tri::UpdateColor::PerVertexConstant(newCylinder, info->color, false); + vcg::tri::UpdatePosition::Matrix(newCylinder, tMatrix, false); + vcg::tri::Append::Mesh(m, newCylinder); + info->numvert++; + if (cb !=NULL) (*cb)(10 + 80*info->numvert/info->numface, "Loading X3D Object..."); + return E_NOERROR; + } + + //Load texture info from Appearance node. static int LoadAppearance(const QDomElement& root, std::vector& validTexture, std::vector& textureInfo, QDomNodeList& textTransfList, std::map& defMap, AdditionalInfoX3D* info) @@ -2451,7 +2481,7 @@ namespace io { QDomElement coordinate = findNode(coordTag, 2, geometry); result = solveDefUse(coordinate, defMap, coordinate, info); if (result != E_NOERROR) return result; - if ((!coordinate.isNull() && (coordinate.attribute("point") != "")) || (geometry.tagName() == "ElevationGrid")) + if ((!coordinate.isNull() && (coordinate.attribute("point") != "")) || (geometry.tagName() == "ElevationGrid") || (geometry.tagName() == "Cylinder")) { //Get coordinate QStringList coordList; @@ -2564,7 +2594,9 @@ namespace io { else if (geometry.tagName() == "IndexedFaceSet") return LoadIndexedFaceSet(geometry, m, tMatrix, texture, coordList, colorList, normalList, colorComponent, info, cb); else if (geometry.tagName() == "PointSet") - return LoadPointSet(geometry, m, tMatrix, coordList, colorList, colorComponent, info, cb); + return LoadPointSet(geometry, m, tMatrix, coordList, colorList, colorComponent, info, cb); + else if (geometry.tagName() == "Cylinder") + return LoadCylinder(geometry, m, tMatrix, info, cb); } else if (geometry.tagName() == "Polypoint2D") return LoadPolypoint2D(geometry, m, tMatrix, info, cb); diff --git a/src/meshlabplugins/io_x3d/vrml/Parser.h b/src/meshlabplugins/io_x3d/vrml/Parser.h index b266953b0..68d3e8e6a 100644 --- a/src/meshlabplugins/io_x3d/vrml/Parser.h +++ b/src/meshlabplugins/io_x3d/vrml/Parser.h @@ -160,7 +160,7 @@ QDomDocument *doc; x3dNode.insert("TriangleFanSet"); x3dNode.insert("TriangleSet"); x3dNode.insert("TriangleSet2D"); x3dNode.insert("TriangleStripSet"); x3dNode.insert("TwoSidedMaterial"); x3dNode.insert("UniversalJoint"); x3dNode.insert(" Viewpoint"); x3dNode.insert("ViewpointGroup"); x3dNode.insert("VolumeEmitter"); - x3dNode.insert("VolumePicker"); x3dNode.insert("WindPhysicsModel"); + x3dNode.insert("VolumePicker"); x3dNode.insert("WindPhysicsModel"); x3dNode.insert("Cylinder"); }