From f121e2eb66c3d07a9bc0546bec55c3b76fcefcf8 Mon Sep 17 00:00:00 2001 From: Kim Kulling Date: Thu, 19 Jan 2017 11:18:33 +0100 Subject: [PATCH] Fixes https://github.com/assimp/assimp/issues/1143: fix build. --- code/CMakeLists.txt | 1 + code/scene.cpp | 139 +++++++++++++++++++++++++++++++++++++++++ include/assimp/scene.h | 108 ++++---------------------------- 3 files changed, 151 insertions(+), 97 deletions(-) create mode 100644 code/scene.cpp diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index c3ae86aa4..92199c234 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -163,6 +163,7 @@ SET( Common_SRCS RemoveComments.h Subdivision.cpp Subdivision.h + scene.cpp Vertex.h LineSplitter.h TinyFormatter.h diff --git a/code/scene.cpp b/code/scene.cpp new file mode 100644 index 000000000..91404652a --- /dev/null +++ b/code/scene.cpp @@ -0,0 +1,139 @@ +/* +--------------------------------------------------------------------------- +Open Asset Import Library (assimp) +--------------------------------------------------------------------------- + +Copyright (c) 2006-2016, 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. +--------------------------------------------------------------------------- +*/ +#include + +aiNode::aiNode() +: mName("") +, mParent(NULL) +, mNumChildren(0) +, mChildren(NULL) +, mNumMeshes(0) +, mMeshes(NULL) +, mMetaData(NULL) { + // empty +} + + +aiNode::aiNode(const std::string& name) +: mName(name) +, mParent(NULL) +, mNumChildren(0) +, mChildren(NULL) +, mNumMeshes(0) +, mMeshes(NULL) +, mMetaData(NULL) { + // empty +} + +/** Destructor */ +aiNode::~aiNode() { + // delete all children recursively + // to make sure we won't crash if the data is invalid ... + if (mChildren && mNumChildren) + { + for (unsigned int a = 0; a < mNumChildren; a++) + delete mChildren[a]; + } + delete[] mChildren; + delete[] mMeshes; + delete mMetaData; +} + +const aiNode *aiNode::FindNode(const char* name) const { + if (nullptr == name) { + return nullptr; + } + if (!::strcmp(mName.data, name)) { + return this; + } + for (unsigned int i = 0; i < mNumChildren; ++i) { + const aiNode* const p = mChildren[i]->FindNode(name); + if (p) { + return p; + } + } + // there is definitely no sub-node with this name + return nullptr; +} + +aiNode *aiNode::FindNode(const char* name) { + if (!::strcmp(mName.data, name))return this; + for (unsigned int i = 0; i < mNumChildren; ++i) + { + aiNode* const p = mChildren[i]->FindNode(name); + if (p) { + return p; + } + } + // there is definitely no sub-node with this name + return nullptr; +} + +void aiNode::addChildren(unsigned int numChildren, aiNode **children) { + if (nullptr == children || 0 == numChildren) { + return; + } + + for (unsigned int i = 0; i < numChildren; i++) { + aiNode *child = children[i]; + if (nullptr != child) { + child->mParent = this; + } + } + + if (mNumChildren > 0) { + aiNode **tmp(new aiNode*[mNumChildren]); + ::memcpy(tmp, mChildren, sizeof(aiNode*) * mNumChildren); + delete[] mChildren; + mChildren = new aiNode*[mNumChildren + numChildren]; + ::memcpy(mChildren, tmp, sizeof(aiNode*) * mNumChildren); + ::memcpy(&mChildren[mNumChildren], children, sizeof(aiNode*)* numChildren); + mNumChildren += numChildren; + delete[] tmp; + } + else { + mChildren = new aiNode*[numChildren]; + for (unsigned int i = 0; i < numChildren; i++) { + mChildren[i] = children[i]; + } + mNumChildren = numChildren; + } +} diff --git a/include/assimp/scene.h b/include/assimp/scene.h index 02cbbbb5b..fae31f242 100644 --- a/include/assimp/scene.h +++ b/include/assimp/scene.h @@ -124,47 +124,13 @@ struct aiNode #ifdef __cplusplus /** Constructor */ - aiNode() - // set all members to zero by default - : mName("") - , mParent(NULL) - , mNumChildren(0) - , mChildren(NULL) - , mNumMeshes(0) - , mMeshes(NULL) - , mMetaData(NULL) - { - } - + aiNode(); /** Construction from a specific name */ - explicit aiNode(const std::string& name) - // set all members to zero by default - : mName(name) - , mParent(NULL) - , mNumChildren(0) - , mChildren(NULL) - , mNumMeshes(0) - , mMeshes(NULL) - , mMetaData(NULL) - { - } + explicit aiNode(const std::string& name); /** Destructor */ - ~aiNode() - { - // delete all children recursively - // to make sure we won't crash if the data is invalid ... - if (mChildren && mNumChildren) - { - for( unsigned int a = 0; a < mNumChildren; a++) - delete mChildren[a]; - } - delete [] mChildren; - delete [] mMeshes; - delete mMetaData; - } - + ~aiNode(); /** Searches for a node with a specific name, beginning at this * nodes. Normally you will call this method on the root node @@ -183,68 +149,16 @@ struct aiNode return FindNode(name.data); } + const aiNode* FindNode(const char* name) const; - inline - const aiNode* FindNode(const char* name) const { - if ( nullptr == name ) { - return nullptr; - } - if ( !::strcmp( mName.data, name ) ) { - return this; - } - for (unsigned int i = 0; i < mNumChildren;++i) { - const aiNode* const p = mChildren[i]->FindNode(name); - if (p) { - return p; - } - } - // there is definitely no sub-node with this name - return nullptr; - } + aiNode* FindNode(const char* name); - inline - aiNode* FindNode(const char* name) { - if (!::strcmp( mName.data,name))return this; - for (unsigned int i = 0; i < mNumChildren;++i) - { - aiNode* const p = mChildren[i]->FindNode(name); - if (p) { - return p; - } - } - // there is definitely no sub-node with this name - return nullptr; - } - - inline void addChildren( unsigned int numChildren, aiNode **children ) { - if ( nullptr == children || 0 == numChildren ) { - return; - } - - for ( unsigned int i = 0; i < numChildren; i++ ) { - aiNode *child = children[ i ]; - if ( nullptr != child ) { - child->mParent = this; - } - } - - if ( mNumChildren > 0 ) { - aiNode **tmp( new aiNode*[ mNumChildren ] ); - ::memcpy( tmp, mChildren, sizeof( aiNode* ) * mNumChildren ); - delete[] mChildren; - mChildren = new aiNode*[ mNumChildren + numChildren ]; - ::memcpy( mChildren, tmp, sizeof( aiNode* ) * mNumChildren ); - ::memcpy( &mChildren[ mNumChildren ], children, sizeof( aiNode* )* numChildren ); - mNumChildren += numChildren; - delete[] tmp; - } else { - mChildren = new aiNode*[ numChildren ]; - for ( unsigned int i = 0; i < numChildren; i++ ) { - mChildren[ i ] = children[ i ]; - } - mNumChildren = numChildren; - } - } + /** + * @brief Will add new children. + * @param numChildren Number of children to add. + * @param children The array with pointers showing to the children. + */ + void addChildren(unsigned int numChildren, aiNode **children); #endif // __cplusplus };