aboutsummaryrefslogtreecommitdiff
path: root/NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp
diff options
context:
space:
mode:
authorMarijn Tamis <[email protected]>2018-05-03 18:22:48 +0200
committerMarijn Tamis <[email protected]>2018-05-03 18:22:48 +0200
commitca32c59a58d37c1822e185a2d5f3d0d3e8943593 (patch)
treeb06b9eec03f34344ef8fc31aa147b2714d3962ee /NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp
parentForced rename of platform folders in cmake dir. Git didn't pick this up before. (diff)
downloadnvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.tar.xz
nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.zip
NvCloth 1.1.4 Release. (24070740)
Diffstat (limited to 'NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp')
-rw-r--r--NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp334
1 files changed, 334 insertions, 0 deletions
diff --git a/NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp b/NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp
new file mode 100644
index 0000000..372416d
--- /dev/null
+++ b/NvCloth/samples/external/assimp-4.1.0/code/D3MFImporter.cpp
@@ -0,0 +1,334 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2017, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+*/
+
+#ifndef ASSIMP_BUILD_NO_3MF_IMPORTER
+
+#include "D3MFImporter.h"
+
+#include <assimp/scene.h>
+#include <assimp/IOSystem.hpp>
+#include <assimp/DefaultLogger.hpp>
+#include <assimp/importerdesc.h>
+#include "StringComparison.h"
+#include "StringUtils.h"
+
+#include <string>
+#include <vector>
+#include <map>
+#include <cassert>
+#include <memory>
+
+#include "D3MFOpcPackage.h"
+#include <contrib/unzip/unzip.h>
+#include "irrXMLWrapper.h"
+#include "3MFXmlTags.h"
+
+namespace Assimp {
+namespace D3MF {
+
+class XmlSerializer {
+public:
+ XmlSerializer(XmlReader* xmlReader)
+ : xmlReader(xmlReader) {
+ // empty
+ }
+
+ ~XmlSerializer() {
+ // empty
+ }
+
+ void ImportXml(aiScene* scene) {
+ scene->mRootNode = new aiNode();
+ std::vector<aiNode*> children;
+
+ while(ReadToEndElement(D3MF::XmlTag::model)) {
+ if(xmlReader->getNodeName() == D3MF::XmlTag::object) {
+ children.push_back(ReadObject(scene));
+ } else if(xmlReader->getNodeName() == D3MF::XmlTag::build) {
+
+ }
+ }
+
+ if ( scene->mRootNode->mName.length == 0 ) {
+ scene->mRootNode->mName.Set( "3MF" );
+ }
+
+ scene->mNumMeshes = static_cast<unsigned int>(meshes.size());
+ scene->mMeshes = new aiMesh*[scene->mNumMeshes]();
+
+ std::copy(meshes.begin(), meshes.end(), scene->mMeshes);
+
+ scene->mRootNode->mNumChildren = static_cast<unsigned int>(children.size());
+ scene->mRootNode->mChildren = new aiNode*[scene->mRootNode->mNumChildren]();
+
+ std::copy(children.begin(), children.end(), scene->mRootNode->mChildren);
+ }
+
+private:
+ aiNode* ReadObject(aiScene* scene)
+ {
+ std::unique_ptr<aiNode> node(new aiNode());
+
+ std::vector<unsigned long> meshIds;
+
+ const char *attrib( nullptr );
+ std::string name, type;
+ attrib = xmlReader->getAttributeValue( D3MF::XmlTag::name.c_str() );
+ if ( nullptr != attrib ) {
+ name = attrib;
+ }
+ attrib = xmlReader->getAttributeValue( D3MF::XmlTag::name.c_str() );
+ if ( nullptr != attrib ) {
+ type = attrib;
+ }
+
+ node->mParent = scene->mRootNode;
+ node->mName.Set(name);
+
+ size_t meshIdx = meshes.size();
+
+ while(ReadToEndElement(D3MF::XmlTag::object))
+ {
+ if(xmlReader->getNodeName() == D3MF::XmlTag::mesh)
+ {
+ auto mesh = ReadMesh();
+
+ mesh->mName.Set(name);
+ meshes.push_back(mesh);
+ meshIds.push_back(static_cast<unsigned long>(meshIdx));
+ meshIdx++;
+
+ }
+ }
+
+ node->mNumMeshes = static_cast<unsigned int>(meshIds.size());
+
+ node->mMeshes = new unsigned int[node->mNumMeshes];
+
+ std::copy(meshIds.begin(), meshIds.end(), node->mMeshes);
+
+ return node.release();
+
+ }
+
+ aiMesh* ReadMesh() {
+ aiMesh* mesh = new aiMesh();
+ while(ReadToEndElement(D3MF::XmlTag::mesh))
+ {
+ if(xmlReader->getNodeName() == D3MF::XmlTag::vertices)
+ {
+ ImportVertices(mesh);
+ }
+ else if(xmlReader->getNodeName() == D3MF::XmlTag::triangles)
+ {
+ ImportTriangles(mesh);
+ }
+ }
+
+ return mesh;
+ }
+
+ void ImportVertices(aiMesh* mesh)
+ {
+ std::vector<aiVector3D> vertices;
+
+ while(ReadToEndElement(D3MF::XmlTag::vertices))
+ {
+ if(xmlReader->getNodeName() == D3MF::XmlTag::vertex)
+ {
+ vertices.push_back(ReadVertex());
+ }
+ }
+ mesh->mNumVertices = static_cast<unsigned int>(vertices.size());
+ mesh->mVertices = new aiVector3D[mesh->mNumVertices];
+
+ std::copy(vertices.begin(), vertices.end(), mesh->mVertices);
+
+ }
+
+ aiVector3D ReadVertex()
+ {
+ aiVector3D vertex;
+
+ vertex.x = ai_strtof(xmlReader->getAttributeValue(D3MF::XmlTag::x.c_str()), nullptr);
+ vertex.y = ai_strtof(xmlReader->getAttributeValue(D3MF::XmlTag::y.c_str()), nullptr);
+ vertex.z = ai_strtof(xmlReader->getAttributeValue(D3MF::XmlTag::z.c_str()), nullptr);
+
+ return vertex;
+ }
+
+ void ImportTriangles(aiMesh* mesh)
+ {
+ std::vector<aiFace> faces;
+
+
+ while(ReadToEndElement(D3MF::XmlTag::triangles))
+ {
+ if(xmlReader->getNodeName() == D3MF::XmlTag::triangle)
+ {
+ faces.push_back(ReadTriangle());
+ }
+ }
+
+ mesh->mNumFaces = static_cast<unsigned int>(faces.size());
+ mesh->mFaces = new aiFace[mesh->mNumFaces];
+ mesh->mPrimitiveTypes = aiPrimitiveType_TRIANGLE;
+
+ std::copy(faces.begin(), faces.end(), mesh->mFaces);
+ }
+
+ aiFace ReadTriangle()
+ {
+ aiFace face;
+
+ face.mNumIndices = 3;
+ face.mIndices = new unsigned int[face.mNumIndices];
+ face.mIndices[0] = static_cast<unsigned int>(std::atoi(xmlReader->getAttributeValue(D3MF::XmlTag::v1.c_str())));
+ face.mIndices[1] = static_cast<unsigned int>(std::atoi(xmlReader->getAttributeValue(D3MF::XmlTag::v2.c_str())));
+ face.mIndices[2] = static_cast<unsigned int>(std::atoi(xmlReader->getAttributeValue(D3MF::XmlTag::v3.c_str())));
+
+ return face;
+ }
+
+private:
+ bool ReadToStartElement(const std::string& startTag)
+ {
+ while(xmlReader->read())
+ {
+ if (xmlReader->getNodeType() == irr::io::EXN_ELEMENT && xmlReader->getNodeName() == startTag)
+ {
+ return true;
+ }
+ else if (xmlReader->getNodeType() == irr::io::EXN_ELEMENT_END &&
+ xmlReader->getNodeName() == startTag)
+ {
+ return false;
+ }
+ }
+ //DefaultLogger::get()->error("unexpected EOF, expected closing <" + closeTag + "> tag");
+ return false;
+ }
+
+ bool ReadToEndElement(const std::string& closeTag)
+ {
+ while(xmlReader->read())
+ {
+ if (xmlReader->getNodeType() == irr::io::EXN_ELEMENT) {
+ return true;
+ }
+ else if (xmlReader->getNodeType() == irr::io::EXN_ELEMENT_END
+ && xmlReader->getNodeName() == closeTag)
+ {
+ return false;
+ }
+ }
+ DefaultLogger::get()->error("unexpected EOF, expected closing <" + closeTag + "> tag");
+ return false;
+ }
+
+
+private:
+ std::vector<aiMesh*> meshes;
+ XmlReader* xmlReader;
+};
+
+} //namespace D3MF
+
+static const std::string Extension = "3mf";
+
+static const aiImporterDesc desc = {
+ "3mf Importer",
+ "",
+ "",
+ "http://3mf.io/",
+ aiImporterFlags_SupportBinaryFlavour | aiImporterFlags_SupportCompressedFlavour,
+ 0,
+ 0,
+ 0,
+ 0,
+ Extension.c_str()
+};
+
+
+D3MFImporter::D3MFImporter()
+: BaseImporter() {
+ // empty
+}
+
+D3MFImporter::~D3MFImporter() {
+ // empty
+}
+
+bool D3MFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const {
+ const std::string extension = GetExtension(pFile);
+ if(extension == Extension ) {
+ return true;
+ } else if ( !extension.length() || checkSig ) {
+ if (nullptr == pIOHandler ) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void D3MFImporter::SetupProperties(const Importer * /*pImp*/) {
+ // empty
+}
+
+const aiImporterDesc *D3MFImporter::GetInfo() const {
+ return &desc;
+}
+
+void D3MFImporter::InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler) {
+ D3MF::D3MFOpcPackage opcPackage(pIOHandler, pFile);
+
+ std::unique_ptr<CIrrXML_IOStreamReader> xmlStream(new CIrrXML_IOStreamReader(opcPackage.RootStream()));
+ std::unique_ptr<D3MF::XmlReader> xmlReader(irr::io::createIrrXMLReader(xmlStream.get()));
+
+ D3MF::XmlSerializer xmlSerializer(xmlReader.get());
+
+ xmlSerializer.ImportXml(pScene);
+}
+
+} // Namespace Assimp
+
+#endif // ASSIMP_BUILD_NO_3MF_IMPORTER