Browse Source

# Blender: fix memory leaking due to cycle refs. Thanks to Vitalii Trubchaninov for pointing this out.

git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@1230 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
aramis_acg 13 năm trước cách đây
mục cha
commit
07841c3e13

+ 1 - 1
code/BlenderLoader.cpp

@@ -881,7 +881,7 @@ aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, Convers
 	std::deque<const Object*> children;
 	std::deque<const Object*> children;
 	for(std::set<const Object*>::iterator it = conv_data.objects.begin(); it != conv_data.objects.end() ;) {
 	for(std::set<const Object*>::iterator it = conv_data.objects.begin(); it != conv_data.objects.end() ;) {
 		const Object* object = *it;
 		const Object* object = *it;
-		if (object->parent.get() == obj) {
+		if (object->parent == obj) {
 			children.push_back(object);
 			children.push_back(object);
 
 
 			conv_data.objects.erase(it++);
 			conv_data.objects.erase(it++);

+ 14 - 6
code/BlenderScene.cpp

@@ -1,8 +1,8 @@
 /*
 /*
-Open Asset Import Library (assimp)
+Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 
 
-Copyright (c) 2006-2012, assimp team
+Copyright (c) 2006-2010, ASSIMP Development Team
 All rights reserved.
 All rights reserved.
 
 
 Redistribution and use of this software in source and binary forms, 
 Redistribution and use of this software in source and binary forms, 
@@ -18,10 +18,10 @@ following conditions are met:
   following disclaimer in the documentation and/or other
   following disclaimer in the documentation and/or other
   materials provided with the distribution.
   materials provided with the distribution.
 
 
-* Neither the name of the assimp team, nor the names of its
+* Neither the name of the ASSIMP team, nor the names of its
   contributors may be used to endorse or promote products
   contributors may be used to endorse or promote products
   derived from this software without specific prior
   derived from this software without specific prior
-  written permission of the assimp team.
+  written permission of the ASSIMP Development Team.
 
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
@@ -63,7 +63,11 @@ template <> void Structure :: Convert<Object> (
     ReadFieldArray2<ErrorPolicy_Warn>(dest.obmat,"obmat",db);
     ReadFieldArray2<ErrorPolicy_Warn>(dest.obmat,"obmat",db);
     ReadFieldArray2<ErrorPolicy_Warn>(dest.parentinv,"parentinv",db);
     ReadFieldArray2<ErrorPolicy_Warn>(dest.parentinv,"parentinv",db);
     ReadFieldArray<ErrorPolicy_Warn>(dest.parsubstr,"parsubstr",db);
     ReadFieldArray<ErrorPolicy_Warn>(dest.parsubstr,"parsubstr",db);
-    ReadFieldPtr<ErrorPolicy_Warn>(dest.parent,"*parent",db);
+    {
+        boost::shared_ptr<Object> parent;
+        ReadFieldPtr<ErrorPolicy_Warn>(parent,"*parent",db);
+        dest.parent = parent.get();
+    }
     ReadFieldPtr<ErrorPolicy_Warn>(dest.track,"*track",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.track,"*track",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy,"*proxy",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy,"*proxy",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy_from,"*proxy_from",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy_from,"*proxy_from",db);
@@ -238,7 +242,11 @@ template <> void Structure :: Convert<Base> (
     ) const
     ) const
 { 
 { 
 
 
-    ReadFieldPtr<ErrorPolicy_Warn>(dest.prev,"*prev",db);
+    {
+        boost::shared_ptr<Base> prev;
+        ReadFieldPtr<ErrorPolicy_Warn>(prev,"*prev",db);
+        dest.prev = prev.get();
+    }
     ReadFieldPtr<ErrorPolicy_Warn>(dest.next,"*next",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.next,"*next",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.object,"*object",db);
     ReadFieldPtr<ErrorPolicy_Warn>(dest.object,"*object",db);
 
 

+ 5 - 4
code/BlenderScene.h

@@ -71,9 +71,10 @@ namespace Assimp	{
 //
 //
 // * Pointers to other structures or primitive types are allowed.
 // * Pointers to other structures or primitive types are allowed.
 //   No references or double pointers or arrays of pointers.
 //   No references or double pointers or arrays of pointers.
-//   A pointer to a T is written as boost::shared_ptr, while a
+//   A pointer to a T is normally written as boost::shared_ptr, while a
 //   pointer to an array of elements is written as boost::
 //   pointer to an array of elements is written as boost::
-//   shared_array.
+//   shared_array. To avoid cyclic pointers, use raw pointers in
+//   one direction.
 //
 //
 // * Arrays can have maximally two-dimensions. Any non-pointer
 // * Arrays can have maximally two-dimensions. Any non-pointer
 //   type can form them.
 //   type can form them.
@@ -477,7 +478,7 @@ struct Object : ElemBase  {
 	float parentinv[4][4] WARN;
 	float parentinv[4][4] WARN;
 	char parsubstr[32] WARN;
 	char parsubstr[32] WARN;
 	
 	
-	boost::shared_ptr<Object> parent WARN;
+	Object* parent WARN;
 	boost::shared_ptr<Object> track WARN;
 	boost::shared_ptr<Object> track WARN;
 
 
 	boost::shared_ptr<Object> proxy,proxy_from,proxy_group WARN;
 	boost::shared_ptr<Object> proxy,proxy_from,proxy_group WARN;
@@ -490,7 +491,7 @@ struct Object : ElemBase  {
 
 
 // -------------------------------------------------------------------------------
 // -------------------------------------------------------------------------------
 struct Base : ElemBase {
 struct Base : ElemBase {
-	boost::shared_ptr<Base> prev WARN;
+	Base* prev WARN;
 	boost::shared_ptr<Base> next WARN;
 	boost::shared_ptr<Base> next WARN;
 	boost::shared_ptr<Object> object WARN;
 	boost::shared_ptr<Object> object WARN;
 };
 };

+ 4 - 4
code/BlenderSceneGen.h

@@ -1,8 +1,8 @@
 /*
 /*
-Open Asset Import Library (assimp)
+Open Asset Import Library (ASSIMP)
 ----------------------------------------------------------------------
 ----------------------------------------------------------------------
 
 
-Copyright (c) 2006-2012, assimp team
+Copyright (c) 2006-2010, ASSIMP Development Team
 All rights reserved.
 All rights reserved.
 
 
 Redistribution and use of this software in source and binary forms, 
 Redistribution and use of this software in source and binary forms, 
@@ -18,10 +18,10 @@ following conditions are met:
   following disclaimer in the documentation and/or other
   following disclaimer in the documentation and/or other
   materials provided with the distribution.
   materials provided with the distribution.
 
 
-* Neither the name of the assimp team, nor the names of its
+* Neither the name of the ASSIMP team, nor the names of its
   contributors may be used to endorse or promote products
   contributors may be used to endorse or promote products
   derived from this software without specific prior
   derived from this software without specific prior
-  written permission of the assimp team.
+  written permission of the ASSIMP Development Team.
 
 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 

+ 25 - 6
scripts/BlenderImporter/genblenddna.py

@@ -67,6 +67,13 @@ template <> void Structure :: Convert<{a}> (
 Structure_Convert_ptrdecl = """
 Structure_Convert_ptrdecl = """
     ReadFieldPtr<{policy}>({destcast}dest.{name_canonical},"{name_dna}",db);"""
     ReadFieldPtr<{policy}>({destcast}dest.{name_canonical},"{name_dna}",db);"""
 
 
+Structure_Convert_rawptrdecl = """
+    {{
+        boost::shared_ptr<{type}> {name_canonical};
+        ReadFieldPtr<{policy}>({destcast}{name_canonical},"{name_dna}",db);
+        dest.{name_canonical} = {name_canonical}.get();
+    }}"""
+
 Structure_Convert_arraydecl = """
 Structure_Convert_arraydecl = """
     ReadFieldArray<{policy}>({destcast}dest.{name_canonical},"{name_dna}",db);"""
     ReadFieldArray<{policy}>({destcast}dest.{name_canonical},"{name_dna}",db);"""
 
 
@@ -103,11 +110,12 @@ def main():
     getstruct = re.compile(r"struct\s+(\w+?)\s*(:\s*ElemBase)?\s*\{(.*?)^\}\s*;",flags)
     getstruct = re.compile(r"struct\s+(\w+?)\s*(:\s*ElemBase)?\s*\{(.*?)^\}\s*;",flags)
     getsmartx = re.compile(r"(std\s*::\s*)?(vector)\s*<\s*(boost\s*::\s*)?shared_(ptr)\s*<\s*(\w+)\s*>\s*>\s*",flags)
     getsmartx = re.compile(r"(std\s*::\s*)?(vector)\s*<\s*(boost\s*::\s*)?shared_(ptr)\s*<\s*(\w+)\s*>\s*>\s*",flags)
     getsmartp = re.compile(r"(boost\s*::\s*)?shared_(ptr)\s*<\s*(\w+)\s*>\s*",flags)
     getsmartp = re.compile(r"(boost\s*::\s*)?shared_(ptr)\s*<\s*(\w+)\s*>\s*",flags)
+    getrawp   = re.compile(r"(\w+)\s*\*\s*",flags)
     getsmarta = re.compile(r"(std\s*::\s*)?(vector)\s*<\s*(\w+)\s*>\s*",flags)
     getsmarta = re.compile(r"(std\s*::\s*)?(vector)\s*<\s*(\w+)\s*>\s*",flags)
     getpolicy = re.compile(r"\s*(WARN|FAIL|IGNO)",flags)
     getpolicy = re.compile(r"\s*(WARN|FAIL|IGNO)",flags)
     stripenum = re.compile(r"enum\s+(\w+)\s*{.*?\}\s*;",flags)
     stripenum = re.compile(r"enum\s+(\w+)\s*{.*?\}\s*;",flags)
 
 
-    assert getsmartx and getsmartp and getsmarta and getpolicy and stripenum
+    assert getsmartx and getsmartp and getsmarta and getrawp and getpolicy and stripenum
     
     
     enums = set()
     enums = set()
     #re.sub(stripcoms," ",input)
     #re.sub(stripcoms," ",input)
@@ -146,14 +154,20 @@ def main():
                 policy = py.groups()[0]
                 policy = py.groups()[0]
                 line = re.sub(getpolicy,"",line)
                 line = re.sub(getpolicy,"",line)
 
 
-            ty = re.match(getsmartx,line) or re.match(getsmartp,line)  or re.match(getsmarta,line) 
+            ty = re.match(getsmartx,line) or re.match(getsmartp,line)  or\
+                re.match(getsmarta,line) or re.match(getrawp,line)
+
             if ty is None:
             if ty is None:
                 ty = line.split(None,1)[0]
                 ty = line.split(None,1)[0]
             else:
             else:
-                if ty.groups()[1] == "ptr":
+                if len(ty.groups()) == 1:
+                    ty = ty.groups()[-1] + "$" 
+                elif ty.groups()[1] == "ptr":
                     ty = ty.groups()[2] + "*"
                     ty = ty.groups()[2] + "*"
                 elif ty.groups()[1] == "vector":
                 elif ty.groups()[1] == "vector":
                     ty = ty.groups()[-1] + ("*" if len(ty.groups()) == 3 else "**")
                     ty = ty.groups()[-1] + ("*" if len(ty.groups()) == 3 else "**")
+                else:
+                    assert False
 
 
             #print(line)
             #print(line)
             sp = line.split(',')
             sp = line.split(',')
@@ -190,7 +204,9 @@ def main():
             splits = name.split("[",1)
             splits = name.split("[",1)
             name_canonical = splits[0]
             name_canonical = splits[0]
             #array_part = "" if len(splits)==1 else "["+splits[1]
             #array_part = "" if len(splits)==1 else "["+splits[1]
-            ptr_decl = "*"*type.count("*")
+            is_raw_ptr = not not type.count("$")
+            ptr_decl = "*"*(type.count("*") + (1 if is_raw_ptr else 0))
+            
             name_dna = ptr_decl+name_canonical #+array_part
             name_dna = ptr_decl+name_canonical #+array_part
 
 
             #required  = "false"
             #required  = "false"
@@ -198,8 +214,11 @@ def main():
             destcast = "(int&)" if type in enums else ""
             destcast = "(int&)" if type in enums else ""
 
 
             # POINTER
             # POINTER
-            if ptr_decl:
-               s += Structure_Convert_ptrdecl.format(**locals())
+            if is_raw_ptr:
+                type = type.replace('$','')
+                s += Structure_Convert_rawptrdecl.format(**locals())
+            elif ptr_decl:
+                s += Structure_Convert_ptrdecl.format(**locals())
             # ARRAY MEMBER
             # ARRAY MEMBER
             elif name.count('[')==1:
             elif name.count('[')==1:
                 s += Structure_Convert_arraydecl.format(**locals())
                 s += Structure_Convert_arraydecl.format(**locals())