From b70650e9a47a2144027bb831610b67dda087db27 Mon Sep 17 00:00:00 2001 From: acgessler Date: Wed, 2 Oct 2013 14:16:09 +0200 Subject: [PATCH] Blender: new DNA loading code generated by genblenddna.py script, now machine-generates the previously hand-written fix. --- code/BlenderScene.cpp | 1330 ++++++++++++++++++++-------------------- code/BlenderSceneGen.h | 396 ++++++------ 2 files changed, 863 insertions(+), 863 deletions(-) diff --git a/code/BlenderScene.cpp b/code/BlenderScene.cpp index fda069565..21b8a5670 100644 --- a/code/BlenderScene.cpp +++ b/code/BlenderScene.cpp @@ -51,671 +51,671 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using namespace Assimp; using namespace Assimp::Blender; -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Object& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField((int&)dest.type,"type",db); - ReadFieldArray2(dest.obmat,"obmat",db); - ReadFieldArray2(dest.parentinv,"parentinv",db); - ReadFieldArray(dest.parsubstr,"parsubstr",db); - { - boost::shared_ptr parent; - ReadFieldPtr(parent,"*parent",db); - dest.parent = parent.get(); - } - ReadFieldPtr(dest.track,"*track",db); - ReadFieldPtr(dest.proxy,"*proxy",db); - ReadFieldPtr(dest.proxy_from,"*proxy_from",db); - ReadFieldPtr(dest.proxy_group,"*proxy_group",db); - ReadFieldPtr(dest.dup_group,"*dup_group",db); - ReadFieldPtr(dest.data,"*data",db); - ReadField(dest.modifiers,"modifiers",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Group& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField(dest.layer,"layer",db); - ReadFieldPtr(dest.gobject,"*gobject",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MTex& dest, - const FileDatabase& db - ) const -{ - - ReadField((int&)dest.blendtype,"blendtype",db); - ReadFieldPtr(dest.object,"*object",db); - ReadFieldPtr(dest.tex,"*tex",db); - ReadFieldArray(dest.uvname,"uvname",db); - ReadField((int&)dest.projx,"projx",db); - ReadField((int&)dest.projy,"projy",db); - ReadField((int&)dest.projz,"projz",db); - ReadField(dest.mapping,"mapping",db); - ReadFieldArray(dest.ofs,"ofs",db); - ReadFieldArray(dest.size,"size",db); - ReadField(dest.rot,"rot",db); - ReadField(dest.texflag,"texflag",db); - ReadField(dest.colormodel,"colormodel",db); - ReadField(dest.pmapto,"pmapto",db); - ReadField(dest.pmaptoneg,"pmaptoneg",db); - ReadField(dest.r,"r",db); - ReadField(dest.g,"g",db); - ReadField(dest.b,"b",db); - ReadField(dest.k,"k",db); - ReadField(dest.colspecfac,"colspecfac",db); - ReadField(dest.mirrfac,"mirrfac",db); - ReadField(dest.alphafac,"alphafac",db); - ReadField(dest.difffac,"difffac",db); - ReadField(dest.specfac,"specfac",db); - ReadField(dest.emitfac,"emitfac",db); - ReadField(dest.hardfac,"hardfac",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - TFace& dest, - const FileDatabase& db - ) const -{ - - ReadFieldArray2(dest.uv,"uv",db); - ReadFieldArray(dest.col,"col",db); - ReadField(dest.flag,"flag",db); - ReadField(dest.mode,"mode",db); - ReadField(dest.tile,"tile",db); - ReadField(dest.unwrap,"unwrap",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - SubsurfModifierData& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.modifier,"modifier",db); - ReadField(dest.subdivType,"subdivType",db); - ReadField(dest.levels,"levels",db); - ReadField(dest.renderLevels,"renderLevels",db); - ReadField(dest.flags,"flags",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MFace& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.v1,"v1",db); - ReadField(dest.v2,"v2",db); - ReadField(dest.v3,"v3",db); - ReadField(dest.v4,"v4",db); - ReadField(dest.mat_nr,"mat_nr",db); - ReadField(dest.flag,"flag",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Lamp& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField((int&)dest.type,"type",db); - ReadField(dest.flags,"flags",db); - ReadField(dest.colormodel,"colormodel",db); - ReadField(dest.totex,"totex",db); - ReadField(dest.r,"r",db); - ReadField(dest.g,"g",db); - ReadField(dest.b,"b",db); - ReadField(dest.k,"k",db); - ReadField(dest.energy,"energy",db); - ReadField(dest.dist,"dist",db); - ReadField(dest.spotsize,"spotsize",db); - ReadField(dest.spotblend,"spotblend",db); - ReadField(dest.att1,"att1",db); - ReadField(dest.att2,"att2",db); - ReadField((int&)dest.falloff_type,"falloff_type",db); - ReadField(dest.sun_brightness,"sun_brightness",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MDeformWeight& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.def_nr,"def_nr",db); - ReadField(dest.weight,"weight",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - PackedFile& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.size,"size",db); - ReadField(dest.seek,"seek",db); - ReadFieldPtr(dest.data,"*data",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Base& dest, - const FileDatabase& db - ) const -{ - // note: as per https://github.com/assimp/assimp/issues/128, - // reading the Object linked list recursively is prone to stack overflow. - // This structure converter is therefore an hand-written exception that - // does it iteratively. - - const int initial_pos = db.reader->GetCurrentPos(); - - std::pair todo = std::make_pair(&dest, initial_pos); - - Base* saved_prev = NULL; - - while(true) { - - Base& cur_dest = *todo.first; - db.reader->SetCurrentPos(todo.second); - - // we know that this is a double-linked, circular list which we never - // traverse backwards, so don't bother resolving the back links. - cur_dest.prev = NULL; - - ReadFieldPtr(cur_dest.object,"*object",db); - - // just record the offset of the blob data and allocate storage. - // Does _not_ invoke Convert() recursively. - const int old = db.reader->GetCurrentPos(); - - // the return value of ReadFieldPtr indicates whether the object - // was already cached. In this case, we don't need to resolve - // it again. - if(!ReadFieldPtr(cur_dest.next,"*next",db, true) && cur_dest.next) { - todo = std::make_pair(&*cur_dest.next, db.reader->GetCurrentPos()); - continue; - } - break; - } - - db.reader->SetCurrentPos(initial_pos + size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MTFace& dest, - const FileDatabase& db - ) const -{ - - ReadFieldArray2(dest.uv,"uv",db); - ReadField(dest.flag,"flag",db); - ReadField(dest.mode,"mode",db); - ReadField(dest.tile,"tile",db); - ReadField(dest.unwrap,"unwrap",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Material& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField(dest.r,"r",db); - ReadField(dest.g,"g",db); - ReadField(dest.b,"b",db); - ReadField(dest.specr,"specr",db); - ReadField(dest.specg,"specg",db); - ReadField(dest.specb,"specb",db); - ReadField(dest.har,"har",db); - ReadField(dest.ambr,"ambr",db); - ReadField(dest.ambg,"ambg",db); - ReadField(dest.ambb,"ambb",db); - ReadField(dest.mirr,"mirr",db); - ReadField(dest.mirg,"mirg",db); - ReadField(dest.mirb,"mirb",db); - ReadField(dest.emit,"emit",db); - ReadField(dest.alpha,"alpha",db); - ReadField(dest.ref,"ref",db); - ReadField(dest.translucency,"translucency",db); - ReadField(dest.roughness,"roughness",db); - ReadField(dest.darkness,"darkness",db); - ReadField(dest.refrac,"refrac",db); - ReadFieldPtr(dest.group,"*group",db); - ReadField(dest.diff_shader,"diff_shader",db); - ReadField(dest.spec_shader,"spec_shader",db); - ReadFieldPtr(dest.mtex,"*mtex",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MTexPoly& dest, - const FileDatabase& db - ) const -{ - - { - boost::shared_ptr tpage; - ReadFieldPtr(tpage,"*tpage",db); - dest.tpage = tpage.get(); - } - ReadField(dest.flag,"flag",db); - ReadField(dest.transp,"transp",db); - ReadField(dest.mode,"mode",db); - ReadField(dest.tile,"tile",db); - ReadField(dest.pad,"pad",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Mesh& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField(dest.totface,"totface",db); - ReadField(dest.totedge,"totedge",db); - ReadField(dest.totvert,"totvert",db); - ReadField(dest.totloop,"totloop",db); - ReadField(dest.totpoly,"totpoly",db); - ReadField(dest.subdiv,"subdiv",db); - ReadField(dest.subdivr,"subdivr",db); - ReadField(dest.subsurftype,"subsurftype",db); - ReadField(dest.smoothresh,"smoothresh",db); - ReadFieldPtr(dest.mface,"*mface",db); - ReadFieldPtr(dest.mtface,"*mtface",db); - ReadFieldPtr(dest.tface,"*tface",db); - ReadFieldPtr(dest.mvert,"*mvert",db); - ReadFieldPtr(dest.medge,"*medge",db); - ReadFieldPtr(dest.mloop,"*mloop",db); - ReadFieldPtr(dest.mloopuv,"*mloopuv",db); - ReadFieldPtr(dest.mloopcol,"*mloopcol",db); - ReadFieldPtr(dest.mpoly,"*mpoly",db); - ReadFieldPtr(dest.mtpoly,"*mtpoly",db); - ReadFieldPtr(dest.dvert,"*dvert",db); - ReadFieldPtr(dest.mcol,"*mcol",db); - ReadFieldPtr(dest.mat,"**mat",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MDeformVert& dest, - const FileDatabase& db - ) const -{ - - ReadFieldPtr(dest.dw,"*dw",db); - ReadField(dest.totweight,"totweight",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - World& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MLoopCol& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.r,"r",db); - ReadField(dest.g,"g",db); - ReadField(dest.b,"b",db); - ReadField(dest.a,"a",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MVert& dest, - const FileDatabase& db - ) const -{ - - ReadFieldArray(dest.co,"co",db); - ReadFieldArray(dest.no,"no",db); - ReadField(dest.flag,"flag",db); - ReadField(dest.mat_nr,"mat_nr",db); - ReadField(dest.bweight,"bweight",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MEdge& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.v1,"v1",db); - ReadField(dest.v2,"v2",db); - ReadField(dest.crease,"crease",db); - ReadField(dest.bweight,"bweight",db); - ReadField(dest.flag,"flag",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MLoopUV& dest, - const FileDatabase& db - ) const -{ - - ReadFieldArray(dest.uv,"uv",db); - ReadField(dest.flag,"flag",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - GroupObject& dest, - const FileDatabase& db - ) const -{ - - ReadFieldPtr(dest.prev,"*prev",db); - ReadFieldPtr(dest.next,"*next",db); - ReadFieldPtr(dest.ob,"*ob",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - ListBase& dest, - const FileDatabase& db - ) const -{ - - ReadFieldPtr(dest.first,"*first",db); - ReadFieldPtr(dest.last,"*last",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MLoop& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.v,"v",db); - ReadField(dest.e,"e",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - ModifierData& dest, - const FileDatabase& db - ) const -{ - - ReadFieldPtr(dest.next,"*next",db); - ReadFieldPtr(dest.prev,"*prev",db); - ReadField(dest.type,"type",db); - ReadField(dest.mode,"mode",db); - ReadFieldArray(dest.name,"name",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - ID& dest, - const FileDatabase& db - ) const -{ - - ReadFieldArray(dest.name,"name",db); - ReadField(dest.flag,"flag",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MCol& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.r,"r",db); - ReadField(dest.g,"g",db); - ReadField(dest.b,"b",db); - ReadField(dest.a,"a",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MPoly& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.loopstart,"loopstart",db); - ReadField(dest.totloop,"totloop",db); - ReadField(dest.mat_nr,"mat_nr",db); - ReadField(dest.flag,"flag",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Scene& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadFieldPtr(dest.camera,"*camera",db); - ReadFieldPtr(dest.world,"*world",db); - ReadFieldPtr(dest.basact,"*basact",db); - ReadField(dest.base,"base",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Library& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadFieldArray(dest.name,"name",db); - ReadFieldArray(dest.filename,"filename",db); - ReadFieldPtr(dest.parent,"*parent",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Tex& dest, - const FileDatabase& db - ) const -{ - - ReadField((int&)dest.type,"type",db); - ReadFieldPtr(dest.ima,"*ima",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Camera& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadField((int&)dest.type,"type",db); - ReadField((int&)dest.flag,"flag",db); - ReadField(dest.angle,"angle",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - MirrorModifierData& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.modifier,"modifier",db); - ReadField(dest.axis,"axis",db); - ReadField(dest.flag,"flag",db); - ReadField(dest.tolerance,"tolerance",db); - ReadFieldPtr(dest.mirror_ob,"*mirror_ob",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -template <> void Structure :: Convert ( - Image& dest, - const FileDatabase& db - ) const -{ - - ReadField(dest.id,"id",db); - ReadFieldArray(dest.name,"name",db); - ReadField(dest.ok,"ok",db); - ReadField(dest.flag,"flag",db); - ReadField(dest.source,"source",db); - ReadField(dest.type,"type",db); - ReadField(dest.pad,"pad",db); - ReadField(dest.pad1,"pad1",db); - ReadField(dest.lastframe,"lastframe",db); - ReadField(dest.tpageflag,"tpageflag",db); - ReadField(dest.totbind,"totbind",db); - ReadField(dest.xrep,"xrep",db); - ReadField(dest.yrep,"yrep",db); - ReadField(dest.twsta,"twsta",db); - ReadField(dest.twend,"twend",db); - ReadFieldPtr(dest.packedfile,"*packedfile",db); - ReadField(dest.lastupdate,"lastupdate",db); - ReadField(dest.lastused,"lastused",db); - ReadField(dest.animspeed,"animspeed",db); - ReadField(dest.gen_x,"gen_x",db); - ReadField(dest.gen_y,"gen_y",db); - ReadField(dest.gen_type,"gen_type",db); - - db.reader->IncPtr(size); -} - -//-------------------------------------------------------------------------------- -void DNA::RegisterConverters() { - - converters["Object"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Group"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MTex"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["TFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["SubsurfModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Lamp"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MDeformWeight"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["PackedFile"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Base"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MTFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Material"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MTexPoly"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Mesh"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MDeformVert"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["World"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MLoopCol"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MVert"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MEdge"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MLoopUV"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["GroupObject"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["ListBase"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MLoop"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["ModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["ID"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MCol"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MPoly"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Scene"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Library"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Tex"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Camera"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["MirrorModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); - converters["Image"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); -} +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Object& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField((int&)dest.type,"type",db); + ReadFieldArray2(dest.obmat,"obmat",db); + ReadFieldArray2(dest.parentinv,"parentinv",db); + ReadFieldArray(dest.parsubstr,"parsubstr",db); + { + boost::shared_ptr parent; + ReadFieldPtr(parent,"*parent",db); + dest.parent = parent.get(); + } + ReadFieldPtr(dest.track,"*track",db); + ReadFieldPtr(dest.proxy,"*proxy",db); + ReadFieldPtr(dest.proxy_from,"*proxy_from",db); + ReadFieldPtr(dest.proxy_group,"*proxy_group",db); + ReadFieldPtr(dest.dup_group,"*dup_group",db); + ReadFieldPtr(dest.data,"*data",db); + ReadField(dest.modifiers,"modifiers",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Group& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField(dest.layer,"layer",db); + ReadFieldPtr(dest.gobject,"*gobject",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MTex& dest, + const FileDatabase& db + ) const +{ + + ReadField((int&)dest.blendtype,"blendtype",db); + ReadFieldPtr(dest.object,"*object",db); + ReadFieldPtr(dest.tex,"*tex",db); + ReadFieldArray(dest.uvname,"uvname",db); + ReadField((int&)dest.projx,"projx",db); + ReadField((int&)dest.projy,"projy",db); + ReadField((int&)dest.projz,"projz",db); + ReadField(dest.mapping,"mapping",db); + ReadFieldArray(dest.ofs,"ofs",db); + ReadFieldArray(dest.size,"size",db); + ReadField(dest.rot,"rot",db); + ReadField(dest.texflag,"texflag",db); + ReadField(dest.colormodel,"colormodel",db); + ReadField(dest.pmapto,"pmapto",db); + ReadField(dest.pmaptoneg,"pmaptoneg",db); + ReadField(dest.r,"r",db); + ReadField(dest.g,"g",db); + ReadField(dest.b,"b",db); + ReadField(dest.k,"k",db); + ReadField(dest.colspecfac,"colspecfac",db); + ReadField(dest.mirrfac,"mirrfac",db); + ReadField(dest.alphafac,"alphafac",db); + ReadField(dest.difffac,"difffac",db); + ReadField(dest.specfac,"specfac",db); + ReadField(dest.emitfac,"emitfac",db); + ReadField(dest.hardfac,"hardfac",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + TFace& dest, + const FileDatabase& db + ) const +{ + + ReadFieldArray2(dest.uv,"uv",db); + ReadFieldArray(dest.col,"col",db); + ReadField(dest.flag,"flag",db); + ReadField(dest.mode,"mode",db); + ReadField(dest.tile,"tile",db); + ReadField(dest.unwrap,"unwrap",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + SubsurfModifierData& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.modifier,"modifier",db); + ReadField(dest.subdivType,"subdivType",db); + ReadField(dest.levels,"levels",db); + ReadField(dest.renderLevels,"renderLevels",db); + ReadField(dest.flags,"flags",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MFace& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.v1,"v1",db); + ReadField(dest.v2,"v2",db); + ReadField(dest.v3,"v3",db); + ReadField(dest.v4,"v4",db); + ReadField(dest.mat_nr,"mat_nr",db); + ReadField(dest.flag,"flag",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Lamp& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField((int&)dest.type,"type",db); + ReadField(dest.flags,"flags",db); + ReadField(dest.colormodel,"colormodel",db); + ReadField(dest.totex,"totex",db); + ReadField(dest.r,"r",db); + ReadField(dest.g,"g",db); + ReadField(dest.b,"b",db); + ReadField(dest.k,"k",db); + ReadField(dest.energy,"energy",db); + ReadField(dest.dist,"dist",db); + ReadField(dest.spotsize,"spotsize",db); + ReadField(dest.spotblend,"spotblend",db); + ReadField(dest.att1,"att1",db); + ReadField(dest.att2,"att2",db); + ReadField((int&)dest.falloff_type,"falloff_type",db); + ReadField(dest.sun_brightness,"sun_brightness",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MDeformWeight& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.def_nr,"def_nr",db); + ReadField(dest.weight,"weight",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + PackedFile& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.size,"size",db); + ReadField(dest.seek,"seek",db); + ReadFieldPtr(dest.data,"*data",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Base& dest, + const FileDatabase& db + ) const +{ + // note: as per https://github.com/assimp/assimp/issues/128, + // reading the Object linked list recursively is prone to stack overflow. + // This structure converter is therefore an hand-written exception that + // does it iteratively. + + const int initial_pos = db.reader->GetCurrentPos(); + + std::pair todo = std::make_pair(&dest, initial_pos); + + Base* saved_prev = NULL; + + while(true) { + + Base& cur_dest = *todo.first; + db.reader->SetCurrentPos(todo.second); + + // we know that this is a double-linked, circular list which we never + // traverse backwards, so don't bother resolving the back links. + cur_dest.prev = NULL; + + ReadFieldPtr(cur_dest.object,"*object",db); + + // just record the offset of the blob data and allocate storage. + // Does _not_ invoke Convert() recursively. + const int old = db.reader->GetCurrentPos(); + + // the return value of ReadFieldPtr indicates whether the object + // was already cached. In this case, we don't need to resolve + // it again. + if(!ReadFieldPtr(cur_dest.next,"*next",db, true) && cur_dest.next) { + todo = std::make_pair(&*cur_dest.next, db.reader->GetCurrentPos()); + continue; + } + break; + } + + db.reader->SetCurrentPos(initial_pos + size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MTFace& dest, + const FileDatabase& db + ) const +{ + + ReadFieldArray2(dest.uv,"uv",db); + ReadField(dest.flag,"flag",db); + ReadField(dest.mode,"mode",db); + ReadField(dest.tile,"tile",db); + ReadField(dest.unwrap,"unwrap",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Material& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField(dest.r,"r",db); + ReadField(dest.g,"g",db); + ReadField(dest.b,"b",db); + ReadField(dest.specr,"specr",db); + ReadField(dest.specg,"specg",db); + ReadField(dest.specb,"specb",db); + ReadField(dest.har,"har",db); + ReadField(dest.ambr,"ambr",db); + ReadField(dest.ambg,"ambg",db); + ReadField(dest.ambb,"ambb",db); + ReadField(dest.mirr,"mirr",db); + ReadField(dest.mirg,"mirg",db); + ReadField(dest.mirb,"mirb",db); + ReadField(dest.emit,"emit",db); + ReadField(dest.alpha,"alpha",db); + ReadField(dest.ref,"ref",db); + ReadField(dest.translucency,"translucency",db); + ReadField(dest.roughness,"roughness",db); + ReadField(dest.darkness,"darkness",db); + ReadField(dest.refrac,"refrac",db); + ReadFieldPtr(dest.group,"*group",db); + ReadField(dest.diff_shader,"diff_shader",db); + ReadField(dest.spec_shader,"spec_shader",db); + ReadFieldPtr(dest.mtex,"*mtex",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MTexPoly& dest, + const FileDatabase& db + ) const +{ + + { + boost::shared_ptr tpage; + ReadFieldPtr(tpage,"*tpage",db); + dest.tpage = tpage.get(); + } + ReadField(dest.flag,"flag",db); + ReadField(dest.transp,"transp",db); + ReadField(dest.mode,"mode",db); + ReadField(dest.tile,"tile",db); + ReadField(dest.pad,"pad",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Mesh& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField(dest.totface,"totface",db); + ReadField(dest.totedge,"totedge",db); + ReadField(dest.totvert,"totvert",db); + ReadField(dest.totloop,"totloop",db); + ReadField(dest.totpoly,"totpoly",db); + ReadField(dest.subdiv,"subdiv",db); + ReadField(dest.subdivr,"subdivr",db); + ReadField(dest.subsurftype,"subsurftype",db); + ReadField(dest.smoothresh,"smoothresh",db); + ReadFieldPtr(dest.mface,"*mface",db); + ReadFieldPtr(dest.mtface,"*mtface",db); + ReadFieldPtr(dest.tface,"*tface",db); + ReadFieldPtr(dest.mvert,"*mvert",db); + ReadFieldPtr(dest.medge,"*medge",db); + ReadFieldPtr(dest.mloop,"*mloop",db); + ReadFieldPtr(dest.mloopuv,"*mloopuv",db); + ReadFieldPtr(dest.mloopcol,"*mloopcol",db); + ReadFieldPtr(dest.mpoly,"*mpoly",db); + ReadFieldPtr(dest.mtpoly,"*mtpoly",db); + ReadFieldPtr(dest.dvert,"*dvert",db); + ReadFieldPtr(dest.mcol,"*mcol",db); + ReadFieldPtr(dest.mat,"**mat",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MDeformVert& dest, + const FileDatabase& db + ) const +{ + + ReadFieldPtr(dest.dw,"*dw",db); + ReadField(dest.totweight,"totweight",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + World& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MLoopCol& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.r,"r",db); + ReadField(dest.g,"g",db); + ReadField(dest.b,"b",db); + ReadField(dest.a,"a",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MVert& dest, + const FileDatabase& db + ) const +{ + + ReadFieldArray(dest.co,"co",db); + ReadFieldArray(dest.no,"no",db); + ReadField(dest.flag,"flag",db); + ReadField(dest.mat_nr,"mat_nr",db); + ReadField(dest.bweight,"bweight",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MEdge& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.v1,"v1",db); + ReadField(dest.v2,"v2",db); + ReadField(dest.crease,"crease",db); + ReadField(dest.bweight,"bweight",db); + ReadField(dest.flag,"flag",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MLoopUV& dest, + const FileDatabase& db + ) const +{ + + ReadFieldArray(dest.uv,"uv",db); + ReadField(dest.flag,"flag",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + GroupObject& dest, + const FileDatabase& db + ) const +{ + + ReadFieldPtr(dest.prev,"*prev",db); + ReadFieldPtr(dest.next,"*next",db); + ReadFieldPtr(dest.ob,"*ob",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + ListBase& dest, + const FileDatabase& db + ) const +{ + + ReadFieldPtr(dest.first,"*first",db); + ReadFieldPtr(dest.last,"*last",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MLoop& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.v,"v",db); + ReadField(dest.e,"e",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + ModifierData& dest, + const FileDatabase& db + ) const +{ + + ReadFieldPtr(dest.next,"*next",db); + ReadFieldPtr(dest.prev,"*prev",db); + ReadField(dest.type,"type",db); + ReadField(dest.mode,"mode",db); + ReadFieldArray(dest.name,"name",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + ID& dest, + const FileDatabase& db + ) const +{ + + ReadFieldArray(dest.name,"name",db); + ReadField(dest.flag,"flag",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MCol& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.r,"r",db); + ReadField(dest.g,"g",db); + ReadField(dest.b,"b",db); + ReadField(dest.a,"a",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MPoly& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.loopstart,"loopstart",db); + ReadField(dest.totloop,"totloop",db); + ReadField(dest.mat_nr,"mat_nr",db); + ReadField(dest.flag,"flag",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Scene& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadFieldPtr(dest.camera,"*camera",db); + ReadFieldPtr(dest.world,"*world",db); + ReadFieldPtr(dest.basact,"*basact",db); + ReadField(dest.base,"base",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Library& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadFieldArray(dest.name,"name",db); + ReadFieldArray(dest.filename,"filename",db); + ReadFieldPtr(dest.parent,"*parent",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Tex& dest, + const FileDatabase& db + ) const +{ + + ReadField((int&)dest.type,"type",db); + ReadFieldPtr(dest.ima,"*ima",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Camera& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadField((int&)dest.type,"type",db); + ReadField((int&)dest.flag,"flag",db); + ReadField(dest.angle,"angle",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + MirrorModifierData& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.modifier,"modifier",db); + ReadField(dest.axis,"axis",db); + ReadField(dest.flag,"flag",db); + ReadField(dest.tolerance,"tolerance",db); + ReadFieldPtr(dest.mirror_ob,"*mirror_ob",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +template <> void Structure :: Convert ( + Image& dest, + const FileDatabase& db + ) const +{ + + ReadField(dest.id,"id",db); + ReadFieldArray(dest.name,"name",db); + ReadField(dest.ok,"ok",db); + ReadField(dest.flag,"flag",db); + ReadField(dest.source,"source",db); + ReadField(dest.type,"type",db); + ReadField(dest.pad,"pad",db); + ReadField(dest.pad1,"pad1",db); + ReadField(dest.lastframe,"lastframe",db); + ReadField(dest.tpageflag,"tpageflag",db); + ReadField(dest.totbind,"totbind",db); + ReadField(dest.xrep,"xrep",db); + ReadField(dest.yrep,"yrep",db); + ReadField(dest.twsta,"twsta",db); + ReadField(dest.twend,"twend",db); + ReadFieldPtr(dest.packedfile,"*packedfile",db); + ReadField(dest.lastupdate,"lastupdate",db); + ReadField(dest.lastused,"lastused",db); + ReadField(dest.animspeed,"animspeed",db); + ReadField(dest.gen_x,"gen_x",db); + ReadField(dest.gen_y,"gen_y",db); + ReadField(dest.gen_type,"gen_type",db); + + db.reader->IncPtr(size); +} + +//-------------------------------------------------------------------------------- +void DNA::RegisterConverters() { + + converters["Object"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Group"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MTex"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["TFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["SubsurfModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Lamp"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MDeformWeight"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["PackedFile"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Base"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MTFace"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Material"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MTexPoly"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Mesh"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MDeformVert"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["World"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MLoopCol"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MVert"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MEdge"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MLoopUV"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["GroupObject"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["ListBase"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MLoop"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["ModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["ID"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MCol"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MPoly"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Scene"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Library"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Tex"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Camera"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["MirrorModifierData"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); + converters["Image"] = DNA::FactoryPair( &Structure::Allocate, &Structure::Convert ); +} #endif diff --git a/code/BlenderSceneGen.h b/code/BlenderSceneGen.h index 4420ce358..9e2f4b3ac 100644 --- a/code/BlenderSceneGen.h +++ b/code/BlenderSceneGen.h @@ -47,204 +47,204 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. namespace Assimp { namespace Blender { - -template <> void Structure :: Convert ( - Object& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Group& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MTex& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - TFace& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - SubsurfModifierData& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MFace& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Lamp& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MDeformWeight& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - PackedFile& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Base& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MTFace& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Material& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MTexPoly& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Mesh& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MDeformVert& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - World& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MLoopCol& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MVert& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MEdge& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MLoopUV& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - GroupObject& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - ListBase& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MLoop& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - ModifierData& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - ID& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MCol& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MPoly& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Scene& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Library& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Tex& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Camera& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - MirrorModifierData& dest, - const FileDatabase& db - ) const -; - -template <> void Structure :: Convert ( - Image& dest, - const FileDatabase& db - ) const -; + +template <> void Structure :: Convert ( + Object& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Group& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MTex& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + TFace& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + SubsurfModifierData& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MFace& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Lamp& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MDeformWeight& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + PackedFile& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Base& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MTFace& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Material& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MTexPoly& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Mesh& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MDeformVert& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + World& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MLoopCol& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MVert& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MEdge& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MLoopUV& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + GroupObject& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + ListBase& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MLoop& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + ModifierData& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + ID& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MCol& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MPoly& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Scene& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Library& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Tex& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Camera& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + MirrorModifierData& dest, + const FileDatabase& db + ) const +; + +template <> void Structure :: Convert ( + Image& dest, + const FileDatabase& db + ) const +; }