diff --git a/code/BaseImporter.cpp b/code/BaseImporter.cpp index ca5264d3d..20321d0ad 100644 --- a/code/BaseImporter.cpp +++ b/code/BaseImporter.cpp @@ -56,7 +56,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include - using namespace Assimp; // ------------------------------------------------------------------------------------------------ @@ -461,29 +460,32 @@ void BaseImporter::TextFileToBuffer(IOStream* stream, } // ------------------------------------------------------------------------------------------------ -namespace Assimp -{ +namespace Assimp { // Represents an import request - struct LoadRequest - { + struct LoadRequest { LoadRequest(const std::string& _file, unsigned int _flags,const BatchLoader::PropertyMap* _map, unsigned int _id) - : file(_file), flags(_flags), refCnt(1),scene(NULL), loaded(false), id(_id) - { - if (_map) + : file(_file) + , flags(_flags) + , refCnt(1) + , scene(NULL) + , loaded(false) + , id(_id) { + if ( _map ) { map = *_map; + } } - const std::string file; - unsigned int flags; - unsigned int refCnt; - aiScene* scene; - bool loaded; - BatchLoader::PropertyMap map; - unsigned int id; - - bool operator== (const std::string& f) const { + bool operator== ( const std::string& f ) const { return file == f; } + + const std::string file; + unsigned int flags; + unsigned int refCnt; + aiScene *scene; + bool loaded; + BatchLoader::PropertyMap map; + unsigned int id; }; } diff --git a/code/X3DImporter_Node.hpp b/code/X3DImporter_Node.hpp index 87ee73866..f1f4bc57e 100644 --- a/code/X3DImporter_Node.hpp +++ b/code/X3DImporter_Node.hpp @@ -130,37 +130,35 @@ public: public: std::string ID;///< ID of the element. Can be empty. In X3D synonym for "ID" attribute. - CX3DImporter_NodeElement* Parent;///< Parrent element. If nullptr then this node is root. + CX3DImporter_NodeElement* Parent;///< Parent element. If nullptr then this node is root. std::list Child;///< Child elements. /***********************************************/ /****************** Functions ******************/ /***********************************************/ -private: + /// @brief The destructor, virtual. + virtual ~CX3DImporter_NodeElement() { + // empty + } - /// \fn CX3DImporter_NodeElement(const CX3DImporter_NodeElement& pNodeElement) +private: /// Disabled copy constructor. CX3DImporter_NodeElement(const CX3DImporter_NodeElement& pNodeElement); - /// \fn CX3DImporter_NodeElement& operator=(const CX3DImporter_NodeElement& pNodeElement) /// Disabled assign operator. CX3DImporter_NodeElement& operator=(const CX3DImporter_NodeElement& pNodeElement); - /// \fn CX3DImporter_NodeElement() /// Disabled default constructor. CX3DImporter_NodeElement(); protected: - - /// \fn CX3DImporter_NodeElement(const EType pType, CX3DImporter_NodeElement* pParent) /// In constructor inheritor must set element type. /// \param [in] pType - element type. /// \param [in] pParent - parent element. CX3DImporter_NodeElement(const EType pType, CX3DImporter_NodeElement* pParent) : Type(pType), Parent(pParent) {} - };// class IX3DImporter_NodeElement /// \class CX3DImporter_NodeElement_Group diff --git a/code/glTFAsset.h b/code/glTFAsset.h index 2e49b0d8f..b0f1b99f0 100644 --- a/code/glTFAsset.h +++ b/code/glTFAsset.h @@ -744,6 +744,10 @@ namespace glTF SExtension(const EType pType) : Type(pType) {} + + virtual ~SExtension() { + // empty + } }; #ifdef ASSIMP_IMPORTER_GLTF_USE_OPEN3DGC @@ -765,8 +769,13 @@ namespace glTF /// \fn SCompression_Open3DGC /// Constructor. SCompression_Open3DGC() - : SExtension(Compression_Open3DGC) - {} + : SExtension(Compression_Open3DGC) { + // empty + } + + virtual ~SCompression_Open3DGC() { + // empty + } }; #endif diff --git a/code/glTFAsset.inl b/code/glTFAsset.inl index a7afb3424..cf419e0d7 100644 --- a/code/glTFAsset.inl +++ b/code/glTFAsset.inl @@ -1005,6 +1005,12 @@ Ref buf = pAsset_Root.buffers.Get(pCompression_Open3DGC.Buffer); size_t tval = ifs.GetNIntAttribute(idx); switch( ifs.GetIntAttributeType( idx ) ) { + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_UNKOWN: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_INDEX: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_JOINT_ID: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_INDEX_BUFFER_ID: + break; + default: throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: " + to_string(ifs.GetIntAttributeType(idx))); } @@ -1049,10 +1055,14 @@ Ref buf = pAsset_Root.buffers.Get(pCompression_Open3DGC.Buffer); } } - for(size_t idx = 0, idx_end = size_intattr.size(); idx < idx_end; idx++) - { - switch(ifs.GetIntAttributeType(idx)) - { + for(size_t idx = 0, idx_end = size_intattr.size(); idx < idx_end; idx++) { + switch(ifs.GetIntAttributeType(idx)) { + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_UNKOWN: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_INDEX: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_JOINT_ID: + case o3dgc::O3DGC_IFS_INT_ATTRIBUTE_TYPE_INDEX_BUFFER_ID: + break; + // ifs.SetIntAttribute(idx, (long* const)(decoded_data + get_buf_offset(primitives[0].attributes.joint))); default: throw DeadlyImportError("GLTF: Open3DGC. Unsupported type of int attribute: " + to_string(ifs.GetIntAttributeType(idx))); @@ -1062,7 +1072,9 @@ Ref buf = pAsset_Root.buffers.Get(pCompression_Open3DGC.Buffer); // // Decode data // - if(decoder.DecodePayload(ifs, bstream) != o3dgc::O3DGC_OK) throw DeadlyImportError("GLTF: can not decode Open3DGC data."); + if ( decoder.DecodePayload( ifs, bstream ) != o3dgc::O3DGC_OK ) { + throw DeadlyImportError( "GLTF: can not decode Open3DGC data." ); + } // Set encoded region for "buffer". buf->EncodedRegion_Mark(pCompression_Open3DGC.Offset, pCompression_Open3DGC.Count, decoded_data, decoded_data_size, id); diff --git a/code/glTFExporter.cpp b/code/glTFExporter.cpp index f2203929c..4f02f4bb1 100644 --- a/code/glTFExporter.cpp +++ b/code/glTFExporter.cpp @@ -37,9 +37,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ---------------------------------------------------------------------- */ - - - #ifndef ASSIMP_BUILD_NO_EXPORT #ifndef ASSIMP_BUILD_NO_GLTF_EXPORTER @@ -94,8 +91,6 @@ namespace Assimp { } // end of namespace Assimp - - glTFExporter::glTFExporter(const char* filename, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties, bool isBinary) : mFilename(filename) @@ -419,17 +414,18 @@ Ref FindSkeletonRootJoint(Ref& skinRef) return parentNodeRef; } -void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref& meshRef, Ref& bufferRef, Ref& skinRef, std::vector& inverseBindMatricesData) +void ExportSkin(Asset& mAsset, const aiMesh* aimesh, Ref& meshRef, Ref& bufferRef, Ref& skinRef, std::vector& inverseBindMatricesData) { - if (aim->mNumBones < 1) { + if (aimesh->mNumBones < 1) { return; } // Store the vertex joint and weight data. - vec4* vertexJointData = new vec4[aim->mNumVertices]; - vec4* vertexWeightData = new vec4[aim->mNumVertices]; - int* jointsPerVertex = new int[aim->mNumVertices]; - for (size_t i = 0; i < aim->mNumVertices; ++i) { + const size_t NumVerts( aimesh->mNumVertices ); + vec4* vertexJointData = new vec4[ NumVerts ]; + vec4* vertexWeightData = new vec4[ NumVerts ]; + int* jointsPerVertex = new int[ NumVerts ]; + for (size_t i = 0; i < NumVerts; ++i) { jointsPerVertex[i] = 0; for (size_t j = 0; j < 4; ++j) { vertexJointData[i][j] = 0; @@ -437,8 +433,8 @@ void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref& meshRef, RefmNumBones; ++idx_bone) { - const aiBone* aib = aim->mBones[idx_bone]; + for (unsigned int idx_bone = 0; idx_bone < aimesh->mNumBones; ++idx_bone) { + const aiBone* aib = aimesh->mBones[idx_bone]; // aib->mName =====> skinRef->jointNames // Find the node with id = mName. @@ -470,7 +466,9 @@ void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref& meshRef, RefmWeights[idx_weights].mWeight; // A vertex can only have at most four joint weights. Ignore all others. - if (jointsPerVertex[vertexId] > 3) { continue; } + if (jointsPerVertex[vertexId] > 3) { + continue; + } vertexJointData[vertexId][jointsPerVertex[vertexId]] = jointNamesIndex; vertexWeightData[vertexId][jointsPerVertex[vertexId]] = vertWeight; @@ -481,11 +479,15 @@ void ExportSkin(Asset& mAsset, const aiMesh* aim, Ref& meshRef, Refprimitives.back(); - Ref vertexJointAccessor = ExportData(mAsset, skinRef->id, bufferRef, aim->mNumVertices, vertexJointData, AttribType::VEC4, AttribType::VEC4, ComponentType_FLOAT); - if (vertexJointAccessor) p.attributes.joint.push_back(vertexJointAccessor); + Ref vertexJointAccessor = ExportData(mAsset, skinRef->id, bufferRef, aimesh->mNumVertices, vertexJointData, AttribType::VEC4, AttribType::VEC4, ComponentType_FLOAT); + if ( vertexJointAccessor ) { + p.attributes.joint.push_back( vertexJointAccessor ); + } - Ref vertexWeightAccessor = ExportData(mAsset, skinRef->id, bufferRef, aim->mNumVertices, vertexWeightData, AttribType::VEC4, AttribType::VEC4, ComponentType_FLOAT); - if (vertexWeightAccessor) p.attributes.weight.push_back(vertexWeightAccessor); + Ref vertexWeightAccessor = ExportData(mAsset, skinRef->id, bufferRef, aimesh->mNumVertices, vertexWeightData, AttribType::VEC4, AttribType::VEC4, ComponentType_FLOAT); + if ( vertexWeightAccessor ) { + p.attributes.weight.push_back( vertexWeightAccessor ); + } } void glTFExporter::ExportMeshes() diff --git a/test/unit/utObjImportExport.cpp b/test/unit/utObjImportExport.cpp index 44b0a6e11..70c4310e5 100644 --- a/test/unit/utObjImportExport.cpp +++ b/test/unit/utObjImportExport.cpp @@ -186,4 +186,6 @@ TEST_F( utObjImportExport, obj_import_test ) { SceneDiffer differ; EXPECT_TRUE( differ.isEqual( expected, scene ) ); differ.showReport(); + + m_im->FreeScene(); }