diff options
| author | Marijn Tamis <[email protected]> | 2018-05-03 18:22:48 +0200 |
|---|---|---|
| committer | Marijn Tamis <[email protected]> | 2018-05-03 18:22:48 +0200 |
| commit | ca32c59a58d37c1822e185a2d5f3d0d3e8943593 (patch) | |
| tree | b06b9eec03f34344ef8fc31aa147b2714d3962ee /NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp | |
| parent | Forced rename of platform folders in cmake dir. Git didn't pick this up before. (diff) | |
| download | nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.tar.xz nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.zip | |
NvCloth 1.1.4 Release. (24070740)
Diffstat (limited to 'NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp')
| -rw-r--r-- | NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp b/NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp new file mode 100644 index 0000000..5038176 --- /dev/null +++ b/NvCloth/samples/external/assimp-4.1.0/code/OFFLoader.cpp @@ -0,0 +1,254 @@ +/* +--------------------------------------------------------------------------- +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. +--------------------------------------------------------------------------- +*/ + +/** @file OFFLoader.cpp + * @brief Implementation of the OFF importer class + */ + + +#ifndef ASSIMP_BUILD_NO_OFF_IMPORTER + +// internal headers +#include "OFFLoader.h" +#include "ParsingUtils.h" +#include "fast_atof.h" +#include <memory> +#include <assimp/IOSystem.hpp> +#include <assimp/scene.h> +#include <assimp/DefaultLogger.hpp> +#include <assimp/importerdesc.h> + +using namespace Assimp; + +static const aiImporterDesc desc = { + "OFF Importer", + "", + "", + "", + aiImporterFlags_SupportBinaryFlavour, + 0, + 0, + 0, + 0, + "off" +}; + +// ------------------------------------------------------------------------------------------------ +// Constructor to be privately used by Importer +OFFImporter::OFFImporter() +{} + +// ------------------------------------------------------------------------------------------------ +// Destructor, private as well +OFFImporter::~OFFImporter() +{} + +// ------------------------------------------------------------------------------------------------ +// Returns whether the class can handle the format of the given file. +bool OFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const +{ + const std::string extension = GetExtension(pFile); + + if (extension == "off") + return true; + else if (!extension.length() || checkSig) + { + if (!pIOHandler)return true; + const char* tokens[] = {"off"}; + return SearchFileHeaderForToken(pIOHandler,pFile,tokens,1,3); + } + return false; +} + +// ------------------------------------------------------------------------------------------------ +const aiImporterDesc* OFFImporter::GetInfo () const +{ + return &desc; +} + +// ------------------------------------------------------------------------------------------------ +// Imports the given file into the given scene structure. +void OFFImporter::InternReadFile( const std::string& pFile, + aiScene* pScene, IOSystem* pIOHandler) +{ + std::unique_ptr<IOStream> file( pIOHandler->Open( pFile, "rb")); + + // Check whether we can read from the file + if( file.get() == NULL) { + throw DeadlyImportError( "Failed to open OFF file " + pFile + "."); + } + + // allocate storage and copy the contents of the file to a memory buffer + std::vector<char> mBuffer2; + TextFileToBuffer(file.get(),mBuffer2); + const char* buffer = &mBuffer2[0]; + + char line[4096]; + GetNextLine(buffer,line); + if ('O' == line[0]) { + GetNextLine(buffer,line); // skip the 'OFF' line + } + + const char* sz = line; SkipSpaces(&sz); + const unsigned int numVertices = strtoul10(sz,&sz);SkipSpaces(&sz); + const unsigned int numFaces = strtoul10(sz,&sz); + + if (!numVertices) { + throw DeadlyImportError("OFF: There are no valid vertices"); + } + if (!numFaces) { + throw DeadlyImportError("OFF: There are no valid faces"); + } + + pScene->mNumMeshes = 1; + pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ]; + + aiMesh* mesh = new aiMesh(); + pScene->mMeshes[0] = mesh; + + mesh->mNumFaces = numFaces; + aiFace* faces = new aiFace [mesh->mNumFaces]; + mesh->mFaces = faces; + + std::vector<aiVector3D> tempPositions(numVertices); + + // now read all vertex lines + for (unsigned int i = 0; i< numVertices;++i) + { + if(!GetNextLine(buffer,line)) + { + DefaultLogger::get()->error("OFF: The number of verts in the header is incorrect"); + break; + } + aiVector3D& v = tempPositions[i]; + + sz = line; SkipSpaces(&sz); + sz = fast_atoreal_move<ai_real>(sz,(ai_real&)v.x); SkipSpaces(&sz); + sz = fast_atoreal_move<ai_real>(sz,(ai_real&)v.y); SkipSpaces(&sz); + fast_atoreal_move<ai_real>(sz,(ai_real&)v.z); + } + + + // First find out how many vertices we'll need + const char* old = buffer; + for (unsigned int i = 0; i< mesh->mNumFaces;++i) + { + if(!GetNextLine(buffer,line)) + { + DefaultLogger::get()->error("OFF: The number of faces in the header is incorrect"); + break; + } + sz = line;SkipSpaces(&sz); + faces->mNumIndices = strtoul10(sz,&sz); + if(!(faces->mNumIndices) || faces->mNumIndices > 9) + { + DefaultLogger::get()->error("OFF: Faces with zero indices aren't allowed"); + --mesh->mNumFaces; + continue; + } + mesh->mNumVertices += faces->mNumIndices; + ++faces; + } + + if (!mesh->mNumVertices) + throw DeadlyImportError("OFF: There are no valid faces"); + + // allocate storage for the output vertices + std::vector<aiVector3D> verts; + verts.reserve(mesh->mNumVertices); + + // second: now parse all face indices + buffer = old; + faces = mesh->mFaces; + for (unsigned int i = 0, p = 0; i< mesh->mNumFaces;) + { + if(!GetNextLine(buffer,line))break; + + unsigned int idx; + sz = line;SkipSpaces(&sz); + idx = strtoul10(sz,&sz); + if(!(idx) || idx > 9) + continue; + + faces->mIndices = new unsigned int [faces->mNumIndices]; + for (unsigned int m = 0; m < faces->mNumIndices;++m) + { + SkipSpaces(&sz); + idx = strtoul10(sz,&sz); + if ((idx) >= numVertices) + { + DefaultLogger::get()->error("OFF: Vertex index is out of range"); + idx = numVertices-1; + } + faces->mIndices[m] = p++; + verts.push_back(tempPositions[idx]); + } + ++i; + ++faces; + } + + if (mesh->mNumVertices != verts.size()) { + throw DeadlyImportError("OFF: Vertex count mismatch"); + } + mesh->mVertices = new aiVector3D[verts.size()]; + memcpy(mesh->mVertices, &verts[0], verts.size() * sizeof(aiVector3D)); + // generate the output node graph + pScene->mRootNode = new aiNode(); + pScene->mRootNode->mName.Set("<OFFRoot>"); + pScene->mRootNode->mNumMeshes = 1; + pScene->mRootNode->mMeshes = new unsigned int [pScene->mRootNode->mNumMeshes]; + pScene->mRootNode->mMeshes[0] = 0; + + // generate a default material + pScene->mNumMaterials = 1; + pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials]; + aiMaterial* pcMat = new aiMaterial(); + + aiColor4D clr( ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 0.6 ), ai_real( 1.0 ) ); + pcMat->AddProperty(&clr,1,AI_MATKEY_COLOR_DIFFUSE); + pScene->mMaterials[0] = pcMat; + + const int twosided =1; + pcMat->AddProperty(&twosided,1,AI_MATKEY_TWOSIDED); +} + +#endif // !! ASSIMP_BUILD_NO_OFF_IMPORTER |