Browse Source

Fixes https://github.com/assimp/assimp/issues/1143: fix build.

Kim Kulling 8 years ago
parent
commit
f121e2eb66
3 changed files with 151 additions and 97 deletions
  1. 1 0
      code/CMakeLists.txt
  2. 139 0
      code/scene.cpp
  3. 11 97
      include/assimp/scene.h

+ 1 - 0
code/CMakeLists.txt

@@ -163,6 +163,7 @@ SET( Common_SRCS
   RemoveComments.h
   Subdivision.cpp
   Subdivision.h
+  scene.cpp
   Vertex.h
   LineSplitter.h
   TinyFormatter.h

+ 139 - 0
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 <assimp/scene.h>
+
+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;
+    }
+}

+ 11 - 97
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;
-    }
-
-    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;
-    }
+    aiNode* FindNode(const char* name);
 
-    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
 };