# 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-9d2fd5bffc1fpull/5/head
parent
6caf98d945
commit
07841c3e13
|
@ -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++);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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:
|
if is_raw_ptr:
|
||||||
s += Structure_Convert_ptrdecl.format(**locals())
|
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())
|
||||||
|
|
Loading…
Reference in New Issue