BLENDER: Fix potential stack overflow caused by a DOM object referencing itself.
Add general infrastructure to apply modifiers. Implement mirror and subdivision modifiers using existing stuff. Update BlenderDNA with related structures. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@763 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
393a08943b
commit
d082330cea
|
@ -274,12 +274,25 @@ boost::shared_ptr< ElemBase > DNA :: ConvertBlobToStructure(
|
||||||
const FileDatabase& db
|
const FileDatabase& db
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
std::map<std::string, ConvertProcPtr>::const_iterator it = converters.find(structure.name);
|
std::map<std::string, FactoryPair >::const_iterator it = converters.find(structure.name);
|
||||||
if (it == converters.end()) {
|
if (it == converters.end()) {
|
||||||
return boost::shared_ptr< ElemBase >();
|
return boost::shared_ptr< ElemBase >();
|
||||||
}
|
}
|
||||||
|
|
||||||
return (structure.*((*it).second))(db);
|
boost::shared_ptr< ElemBase > ret = (structure.*((*it).second.first))();
|
||||||
|
(structure.*((*it).second.second))(ret,db);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
DNA::FactoryPair DNA :: GetBlobToStructureConverter(
|
||||||
|
const Structure& structure,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
std::map<std::string, FactoryPair>::const_iterator it = converters.find(structure.name);
|
||||||
|
return it == converters.end() ? FactoryPair(NULL,NULL) : (*it).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
// basing on http://www.blender.org/development/architecture/notes-on-sdna/
|
// basing on http://www.blender.org/development/architecture/notes-on-sdna/
|
||||||
|
|
|
@ -94,7 +94,7 @@ struct ElemBase
|
||||||
* as the DNA is not modified. The dna_type is only set if the
|
* as the DNA is not modified. The dna_type is only set if the
|
||||||
* data type is not static, i.e. a boost::shared_ptr<ElemBase>
|
* data type is not static, i.e. a boost::shared_ptr<ElemBase>
|
||||||
* in the scene description would have its type resolved
|
* in the scene description would have its type resolved
|
||||||
* at runtime. */
|
* at runtime, so this member is always set. */
|
||||||
const char* dna_type;
|
const char* dna_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -219,8 +219,10 @@ public:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
/** Access a field of the structure by its canonical name */
|
/** Access a field of the structure by its canonical name. The pointer version
|
||||||
|
* returns NULL on failure while the reference version raises an import error. */
|
||||||
inline const Field& operator [] (const std::string& ss) const;
|
inline const Field& operator [] (const std::string& ss) const;
|
||||||
|
inline const Field* Get (const std::string& ss) const;
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
/** Access a field of the structure by its index */
|
/** Access a field of the structure by its index */
|
||||||
|
@ -248,10 +250,18 @@ public:
|
||||||
template <typename T> inline void Convert (T& dest,
|
template <typename T> inline void Convert (T& dest,
|
||||||
const FileDatabase& db) const;
|
const FileDatabase& db) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
// generic converter
|
||||||
template <typename T>
|
template <typename T>
|
||||||
boost::shared_ptr<ElemBase> Convert(
|
void Convert(boost::shared_ptr<ElemBase> in,const FileDatabase& db) const;
|
||||||
const FileDatabase& db) const;
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// generic allocator
|
||||||
|
template <typename T> boost::shared_ptr<ElemBase> Allocate() const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// field parsing for 1d arrays
|
// field parsing for 1d arrays
|
||||||
|
@ -391,17 +401,29 @@ class DNA
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
typedef boost::shared_ptr<ElemBase> (Structure::*ConvertProcPtr) (const FileDatabase& ) const;
|
typedef void (Structure::*ConvertProcPtr) (
|
||||||
|
boost::shared_ptr<ElemBase> in,
|
||||||
|
const FileDatabase&
|
||||||
|
) const;
|
||||||
|
|
||||||
std::map<std::string, ConvertProcPtr> converters;
|
typedef boost::shared_ptr<ElemBase> (
|
||||||
|
Structure::*AllocProcPtr) () const;
|
||||||
|
|
||||||
|
typedef std::pair< AllocProcPtr, ConvertProcPtr > FactoryPair;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
std::map<std::string, FactoryPair > converters;
|
||||||
vector<Structure > structures;
|
vector<Structure > structures;
|
||||||
std::map<std::string, size_t> indices;
|
std::map<std::string, size_t> indices;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
/** Access a structure by its canonical name */
|
/** Access a structure by its canonical name, the pointer version returns NULL on failure
|
||||||
|
* while the reference version raises an error. */
|
||||||
inline const Structure& operator [] (const std::string& ss) const;
|
inline const Structure& operator [] (const std::string& ss) const;
|
||||||
|
inline const Structure* Get (const std::string& ss) const;
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
/** Access a structure by its index */
|
/** Access a structure by its index */
|
||||||
|
@ -425,8 +447,9 @@ public:
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
/** Take an input blob, interpret it according to a its structure name and
|
/** Take an input blob from the stream, interpret it according to
|
||||||
* convert it to the intermediate representation.
|
* a its structure name and convert it to the intermediate
|
||||||
|
* representation.
|
||||||
* @param structure Destination structure definition
|
* @param structure Destination structure definition
|
||||||
* @param db File database.
|
* @param db File database.
|
||||||
* @return A null pointer if no appropriate converter is available.*/
|
* @return A null pointer if no appropriate converter is available.*/
|
||||||
|
@ -435,6 +458,19 @@ public:
|
||||||
const FileDatabase& db
|
const FileDatabase& db
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
/** Find a suitable conversion function for a given Structure.
|
||||||
|
* Such a converter function takes a blob from the input
|
||||||
|
* stream, reads as much as it needs, and builds up a
|
||||||
|
* complete object in intermediate representation.
|
||||||
|
* @param structure Destination structure definition
|
||||||
|
* @param db File database.
|
||||||
|
* @return A null pointer in .first if no appropriate converter is available.*/
|
||||||
|
FactoryPair GetBlobToStructureConverter(
|
||||||
|
const Structure& structure,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
#ifdef ASSIMP_BUILD_BLENDER_DEBUG
|
#ifdef ASSIMP_BUILD_BLENDER_DEBUG
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
|
|
|
@ -61,6 +61,13 @@ const Field& Structure :: operator [] (const std::string& ss) const
|
||||||
return fields[(*it).second];
|
return fields[(*it).second];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
const Field* Structure :: Get (const std::string& ss) const
|
||||||
|
{
|
||||||
|
std::map<std::string, size_t>::const_iterator it = indices.find(ss);
|
||||||
|
return it == indices.end() ? NULL : &fields[(*it).second];
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
const Field& Structure :: operator [] (const size_t i) const
|
const Field& Structure :: operator [] (const size_t i) const
|
||||||
{
|
{
|
||||||
|
@ -74,14 +81,17 @@ const Field& Structure :: operator [] (const size_t i) const
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
template <typename T> boost::shared_ptr<ElemBase> Structure :: Convert(
|
template <typename T> boost::shared_ptr<ElemBase> Structure :: Allocate() const
|
||||||
|
{
|
||||||
|
return boost::shared_ptr<T>(new T());
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
template <typename T> void Structure :: Convert(
|
||||||
|
boost::shared_ptr<ElemBase> in,
|
||||||
const FileDatabase& db) const
|
const FileDatabase& db) const
|
||||||
{
|
{
|
||||||
// FIXME: use boost::make_shared
|
Convert<T> (*static_cast<T*> ( in.get() ),db);
|
||||||
boost::shared_ptr<T> s = boost::shared_ptr<T>(new T());
|
|
||||||
Convert<T> (*s.get(),db);
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
|
@ -422,9 +432,8 @@ template <> void Structure :: ResolvePointer<boost::shared_ptr,ElemBase>(boost::
|
||||||
// I really ought to improve StreamReader to work with 64 bit indices exclusively.
|
// I really ought to improve StreamReader to work with 64 bit indices exclusively.
|
||||||
|
|
||||||
// continue conversion after allocating the required storage
|
// continue conversion after allocating the required storage
|
||||||
out = db.dna.ConvertBlobToStructure(s,db);
|
DNA::FactoryPair builders = db.dna.GetBlobToStructureConverter(s,db);
|
||||||
db.reader->SetCurrentPos(pold);
|
if (!builders.first) {
|
||||||
if (!out) {
|
|
||||||
// this might happen if DNA::RegisterConverters hasn't been called so far
|
// this might happen if DNA::RegisterConverters hasn't been called so far
|
||||||
// or if the target type is not contained in `our` DNA.
|
// or if the target type is not contained in `our` DNA.
|
||||||
out.reset();
|
out.reset();
|
||||||
|
@ -434,14 +443,23 @@ template <> void Structure :: ResolvePointer<boost::shared_ptr,ElemBase>(boost::
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// allocate the object hull
|
||||||
|
out = (s.*builders.first)();
|
||||||
|
|
||||||
|
// cache the object immediately to prevent infinite recursion in a
|
||||||
|
// circular list with a single element (i.e. a self-referencing element).
|
||||||
|
db.cache(out).set(s,out,ptrval);
|
||||||
|
|
||||||
|
// and do the actual conversion
|
||||||
|
(s.*builders.second)(out,db);
|
||||||
|
db.reader->SetCurrentPos(pold);
|
||||||
|
|
||||||
// store a pointer to the name string of the actual type
|
// store a pointer to the name string of the actual type
|
||||||
// in the object itself. This allows the conversion code
|
// in the object itself. This allows the conversion code
|
||||||
// to perform additional type checking.
|
// to perform additional type checking.
|
||||||
out->dna_type = s.name.c_str();
|
out->dna_type = s.name.c_str();
|
||||||
|
|
||||||
// cache the object now that construction is complete
|
|
||||||
// FIXME we need to do this in ConvertBlobToStructure
|
|
||||||
db.cache(out).set(s,out,ptrval);
|
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_BLENDER_NO_STATS
|
#ifndef ASSIMP_BUILD_BLENDER_NO_STATS
|
||||||
++db.stats().pointers_resolved;
|
++db.stats().pointers_resolved;
|
||||||
|
@ -612,6 +630,13 @@ const Structure& DNA :: operator [] (const std::string& ss) const
|
||||||
return structures[(*it).second];
|
return structures[(*it).second];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
const Structure* DNA :: Get (const std::string& ss) const
|
||||||
|
{
|
||||||
|
std::map<std::string, size_t>::const_iterator it = indices.find(ss);
|
||||||
|
return it == indices.end() ? NULL : &structures[(*it).second];
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
const Structure& DNA :: operator [] (const size_t i) const
|
const Structure& DNA :: operator [] (const size_t i) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,183 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2010, ASSIMP Development 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 Development 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.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file BlenderIntermediate.h
|
||||||
|
* @brief Internal utility structures for the BlenderLoader. It also serves
|
||||||
|
* as master include file for the whole (internal) Blender subsystem.
|
||||||
|
*/
|
||||||
|
#ifndef INCLUDED_AI_BLEND_INTERMEDIATE_H
|
||||||
|
#define INCLUDED_AI_BLEND_INTERMEDIATE_H
|
||||||
|
|
||||||
|
#include "BlenderLoader.h"
|
||||||
|
#include "BlenderDNA.h"
|
||||||
|
#include "BlenderScene.h"
|
||||||
|
#include "BlenderSceneGen.h"
|
||||||
|
|
||||||
|
#define for_each(x,y) BOOST_FOREACH(x,y)
|
||||||
|
|
||||||
|
namespace Assimp {
|
||||||
|
namespace Blender {
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
/** Mini smart-array to avoid pulling in even more boost stuff. usable with vector and deque */
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
template <template <typename,typename> class TCLASS, typename T>
|
||||||
|
struct TempArray {
|
||||||
|
typedef TCLASS< T*,std::allocator<T*> > mywrap;
|
||||||
|
|
||||||
|
TempArray() {
|
||||||
|
}
|
||||||
|
|
||||||
|
~TempArray () {
|
||||||
|
for_each(T* elem, arr) {
|
||||||
|
delete elem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dismiss() {
|
||||||
|
arr.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
mywrap* operator -> () {
|
||||||
|
return &arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator mywrap& () {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator const mywrap& () const {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
mywrap& get () {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mywrap& get () const {
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
T* operator[] (size_t idx) const {
|
||||||
|
return arr[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
T*& operator[] (size_t idx) {
|
||||||
|
return arr[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// no copy semantics
|
||||||
|
void operator= (const TempArray&) {
|
||||||
|
}
|
||||||
|
|
||||||
|
TempArray(const TempArray& arr) {
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mywrap arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(disable:4351)
|
||||||
|
#endif
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
/** ConversionData acts as intermediate storage location for
|
||||||
|
* the various ConvertXXX routines in BlenderImporter.*/
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
struct ConversionData
|
||||||
|
{
|
||||||
|
ConversionData(const FileDatabase& db)
|
||||||
|
: sentinel_cnt()
|
||||||
|
, next_texture()
|
||||||
|
, db(db)
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::set<const Object*> objects;
|
||||||
|
|
||||||
|
TempArray <std::vector, aiMesh> meshes;
|
||||||
|
TempArray <std::vector, aiCamera> cameras;
|
||||||
|
TempArray <std::vector, aiLight> lights;
|
||||||
|
TempArray <std::vector, aiMaterial> materials;
|
||||||
|
TempArray <std::vector, aiTexture> textures;
|
||||||
|
|
||||||
|
// set of all materials referenced by at least one mesh in the scene
|
||||||
|
std::deque< boost::shared_ptr< Material > > materials_raw;
|
||||||
|
|
||||||
|
// counter to name sentinel textures inserted as substitutes for procedural textures.
|
||||||
|
unsigned int sentinel_cnt;
|
||||||
|
|
||||||
|
// next texture ID for each texture type, respectively
|
||||||
|
unsigned int next_texture[aiTextureType_UNKNOWN+1];
|
||||||
|
|
||||||
|
// original file data
|
||||||
|
const FileDatabase& db;
|
||||||
|
};
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# pragma warning(default:4351)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
inline const char* GetTextureTypeDisplayString(Tex::Type t)
|
||||||
|
{
|
||||||
|
switch (t) {
|
||||||
|
case Tex::Type_CLOUDS : return "Clouds";
|
||||||
|
case Tex::Type_WOOD : return "Wood";
|
||||||
|
case Tex::Type_MARBLE : return "Marble";
|
||||||
|
case Tex::Type_MAGIC : return "Magic";
|
||||||
|
case Tex::Type_BLEND : return "Blend";
|
||||||
|
case Tex::Type_STUCCI : return "Stucci";
|
||||||
|
case Tex::Type_NOISE : return "Noise";
|
||||||
|
case Tex::Type_PLUGIN : return "Plugin";
|
||||||
|
case Tex::Type_MUSGRAVE : return "Musgrave";
|
||||||
|
case Tex::Type_VORONOI : return "Voronoi";
|
||||||
|
case Tex::Type_DISTNOISE : return "DistortedNoise";
|
||||||
|
case Tex::Type_ENVMAP : return "EnvMap";
|
||||||
|
case Tex::Type_IMAGE : return "Image";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "<Unknown>";
|
||||||
|
}
|
||||||
|
|
||||||
|
} // ! Blender
|
||||||
|
} // ! Assimp
|
||||||
|
|
||||||
|
#endif // ! INCLUDED_AI_BLEND_INTERMEDIATE_H
|
|
@ -47,10 +47,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// Uncomment this to disable support for (gzip)compressed .BLEND files
|
// Uncomment this to disable support for (gzip)compressed .BLEND files
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
|
||||||
#include "BlenderLoader.h"
|
|
||||||
#include "BlenderDNA.h"
|
#include "BlenderIntermediate.h"
|
||||||
#include "BlenderScene.h"
|
#include "BlenderModifier.h"
|
||||||
#include "BlenderSceneGen.h"
|
|
||||||
|
|
||||||
#include "StreamReader.h"
|
#include "StreamReader.h"
|
||||||
#include "TinyFormatter.h"
|
#include "TinyFormatter.h"
|
||||||
|
@ -65,8 +64,6 @@ using namespace Assimp;
|
||||||
using namespace Assimp::Blender;
|
using namespace Assimp::Blender;
|
||||||
using namespace Assimp::Formatter;
|
using namespace Assimp::Formatter;
|
||||||
|
|
||||||
#define for_each(x,y) BOOST_FOREACH(x,y)
|
|
||||||
|
|
||||||
static const aiLoaderDesc blenderDesc = {
|
static const aiLoaderDesc blenderDesc = {
|
||||||
"Blender 3D Importer \nhttp://www.blender3d.org",
|
"Blender 3D Importer \nhttp://www.blender3d.org",
|
||||||
"Alexander Gessler <alexander.gessler@gmx.net>",
|
"Alexander Gessler <alexander.gessler@gmx.net>",
|
||||||
|
@ -79,139 +76,18 @@ static const aiLoaderDesc blenderDesc = {
|
||||||
50
|
50
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Assimp {
|
|
||||||
namespace Blender {
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
/** Mini smart-array to avoid pulling in even more boost stuff. usable with vector and deque */
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
template <template <typename,typename> class TCLASS, typename T>
|
|
||||||
struct TempArray {
|
|
||||||
typedef TCLASS< T*,std::allocator<T*> > mywrap;
|
|
||||||
|
|
||||||
TempArray() {
|
|
||||||
}
|
|
||||||
|
|
||||||
~TempArray () {
|
|
||||||
for_each(T* elem, arr) {
|
|
||||||
delete elem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void dismiss() {
|
|
||||||
arr.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
mywrap* operator -> () {
|
|
||||||
return &arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator mywrap& () {
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
operator const mywrap& () const {
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
mywrap& get () {
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
const mywrap& get () const {
|
|
||||||
return arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
T* operator[] (size_t idx) const {
|
|
||||||
return arr[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
// no copy semantics
|
|
||||||
void operator= (const TempArray&) {
|
|
||||||
}
|
|
||||||
|
|
||||||
TempArray(const TempArray& arr) {
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
mywrap arr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# pragma warning(disable:4351)
|
|
||||||
#endif
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
/** ConversionData acts as intermediate storage location for
|
|
||||||
* the various ConvertXXX routines in BlenderImporter.*/
|
|
||||||
// --------------------------------------------------------------------
|
|
||||||
struct ConversionData
|
|
||||||
{
|
|
||||||
ConversionData(const FileDatabase& db)
|
|
||||||
: sentinel_cnt()
|
|
||||||
, next_texture()
|
|
||||||
, db(db)
|
|
||||||
{}
|
|
||||||
|
|
||||||
std::set<const Object*> objects;
|
|
||||||
|
|
||||||
TempArray <std::vector, aiMesh> meshes;
|
|
||||||
TempArray <std::vector, aiCamera> cameras;
|
|
||||||
TempArray <std::vector, aiLight> lights;
|
|
||||||
TempArray <std::vector, aiMaterial> materials;
|
|
||||||
TempArray <std::vector, aiTexture> textures;
|
|
||||||
|
|
||||||
// set of all materials referenced by at least one mesh in the scene
|
|
||||||
std::deque< boost::shared_ptr< Material > > materials_raw;
|
|
||||||
|
|
||||||
// counter to name sentinel textures inserted as substitutes for procedural textures.
|
|
||||||
unsigned int sentinel_cnt;
|
|
||||||
|
|
||||||
// next texture ID for each texture type, respectively
|
|
||||||
unsigned int next_texture[aiTextureType_UNKNOWN+1];
|
|
||||||
|
|
||||||
// original file data
|
|
||||||
const FileDatabase& db;
|
|
||||||
};
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
# pragma warning(default:4351)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
|
||||||
const char* GetTextureTypeDisplayString(Tex::Type t)
|
|
||||||
{
|
|
||||||
switch (t) {
|
|
||||||
case Tex::Type_CLOUDS : return "Clouds";
|
|
||||||
case Tex::Type_WOOD : return "Wood";
|
|
||||||
case Tex::Type_MARBLE : return "Marble";
|
|
||||||
case Tex::Type_MAGIC : return "Magic";
|
|
||||||
case Tex::Type_BLEND : return "Blend";
|
|
||||||
case Tex::Type_STUCCI : return "Stucci";
|
|
||||||
case Tex::Type_NOISE : return "Noise";
|
|
||||||
case Tex::Type_PLUGIN : return "Plugin";
|
|
||||||
case Tex::Type_MUSGRAVE : return "Musgrave";
|
|
||||||
case Tex::Type_VORONOI : return "Voronoi";
|
|
||||||
case Tex::Type_DISTNOISE : return "DistortedNoise";
|
|
||||||
case Tex::Type_ENVMAP : return "EnvMap";
|
|
||||||
case Tex::Type_IMAGE : return "Image";
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return "<Unknown>";
|
|
||||||
}
|
|
||||||
|
|
||||||
} // ! Blender
|
|
||||||
} // ! Assimp
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Constructor to be privately used by Importer
|
// Constructor to be privately used by Importer
|
||||||
BlenderImporter::BlenderImporter()
|
BlenderImporter::BlenderImporter()
|
||||||
|
: modifier_cache(new BlenderModifierShowcase())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Destructor, private as well
|
// Destructor, private as well
|
||||||
BlenderImporter::~BlenderImporter()
|
BlenderImporter::~BlenderImporter()
|
||||||
{}
|
{
|
||||||
|
delete modifier_cache;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Returns whether the class can handle the format of the given file.
|
// Returns whether the class can handle the format of the given file.
|
||||||
|
@ -1080,6 +956,9 @@ aiNode* BlenderImporter::ConvertNode(const Scene& in, const Object* obj, Convers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// apply modifiers
|
||||||
|
modifier_cache->ApplyModifiers(*node,conv_data,in,*obj);
|
||||||
|
|
||||||
return node.dismiss();
|
return node.dismiss();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,12 +71,17 @@ namespace Assimp {
|
||||||
struct Material;
|
struct Material;
|
||||||
}
|
}
|
||||||
|
|
||||||
// BlenderLoader.cpp
|
// BlenderIntermediate.h
|
||||||
namespace Blender {
|
namespace Blender {
|
||||||
struct ConversionData;
|
struct ConversionData;
|
||||||
template <template <typename,typename> class TCLASS, typename T> struct TempArray;
|
template <template <typename,typename> class TCLASS, typename T> struct TempArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BlenderModifier.h
|
||||||
|
namespace Blender {
|
||||||
|
class BlenderModifierShowcase;
|
||||||
|
class BlenderModifier;
|
||||||
|
}
|
||||||
|
|
||||||
enum aiLoaderFlags
|
enum aiLoaderFlags
|
||||||
{
|
{
|
||||||
|
@ -248,6 +253,8 @@ private: // static stuff, mostly logging and error reporting.
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
Blender::BlenderModifierShowcase* modifier_cache;
|
||||||
|
|
||||||
}; // !class BlenderImporter
|
}; // !class BlenderImporter
|
||||||
|
|
||||||
} // end of namespace Assimp
|
} // end of namespace Assimp
|
||||||
|
|
|
@ -0,0 +1,309 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2010, ASSIMP Development 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 Development 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.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file BlenderModifier.cpp
|
||||||
|
* @brief Implementation of some blender modifiers (i.e subdivision, mirror).
|
||||||
|
*/
|
||||||
|
#include "AssimpPCH.h"
|
||||||
|
|
||||||
|
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
|
||||||
|
#include "BlenderModifier.h"
|
||||||
|
#include "SceneCombiner.h"
|
||||||
|
#include "Subdivision.h"
|
||||||
|
|
||||||
|
using namespace Assimp;
|
||||||
|
using namespace Assimp::Blender;
|
||||||
|
|
||||||
|
template <typename T> BlenderModifier* god() {
|
||||||
|
return new T();
|
||||||
|
}
|
||||||
|
|
||||||
|
// add all available modifiers here
|
||||||
|
typedef BlenderModifier* (*fpCreateModifier)();
|
||||||
|
static const fpCreateModifier creators[] = {
|
||||||
|
&god<BlenderModifier_Mirror>,
|
||||||
|
&god<BlenderModifier_Subdivision>,
|
||||||
|
|
||||||
|
NULL // sentinel
|
||||||
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
// just testing out some new macros to simplify logging
|
||||||
|
#define ASSIMP_LOG_WARN_F(string,...)\
|
||||||
|
DefaultLogger::get()->warn((Formatter::format(string),__VA_ARGS__))
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_ERROR_F(string,...)\
|
||||||
|
DefaultLogger::get()->error((Formatter::format(string),__VA_ARGS__))
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_DEBUG_F(string,...)\
|
||||||
|
DefaultLogger::get()->debug((Formatter::format(string),__VA_ARGS__))
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_INFO_F(string,...)\
|
||||||
|
DefaultLogger::get()->info((Formatter::format(string),__VA_ARGS__))
|
||||||
|
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_WARN(string)\
|
||||||
|
DefaultLogger::get()->warn(string)
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_ERROR(string)\
|
||||||
|
DefaultLogger::get()->error(string)
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_DEBUG(string)\
|
||||||
|
DefaultLogger::get()->debug(string)
|
||||||
|
|
||||||
|
#define ASSIMP_LOG_INFO(string)\
|
||||||
|
DefaultLogger::get()->info(string)
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
struct SharedModifierData : ElemBase
|
||||||
|
{
|
||||||
|
ModifierData modifier;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void BlenderModifierShowcase::ApplyModifiers(aiNode& out, ConversionData& conv_data, const Scene& in, const Object& orig_object )
|
||||||
|
{
|
||||||
|
size_t cnt = 0u, ful = 0u;
|
||||||
|
|
||||||
|
// NOTE: this cast is potentially unsafe by design, so we need to perform type checks before
|
||||||
|
// we're allowed to dereference the pointers without risking to crash. We might still be
|
||||||
|
// invoking UB btw - we're assuming that the ModifierData member of the respective modifier
|
||||||
|
// structures is at offset sizeof(vftable) with no padding.
|
||||||
|
const SharedModifierData* cur = boost::static_pointer_cast<const SharedModifierData> ( orig_object.modifiers.first.get() );
|
||||||
|
for (; cur; cur = boost::static_pointer_cast<const SharedModifierData> ( cur->modifier.next.get() ), ++ful) {
|
||||||
|
ai_assert(cur->dna_type);
|
||||||
|
|
||||||
|
const Structure* s = conv_data.db.dna.Get( cur->dna_type );
|
||||||
|
if (!s) {
|
||||||
|
ASSIMP_LOG_WARN_F("BlendModifier: could not resolve DNA name: ",cur->dna_type);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this is a common trait of all XXXMirrorData structures in BlenderDNA
|
||||||
|
const Field* f = s->Get("modifier");
|
||||||
|
if (!f || f->offset != 0) {
|
||||||
|
ASSIMP_LOG_WARN("BlendModifier: expected a `modifier` member at offset 0");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
s = conv_data.db.dna.Get( f->type );
|
||||||
|
if (!s || s->name != "ModifierData") {
|
||||||
|
ASSIMP_LOG_WARN("BlendModifier: expected a ModifierData structure as first member");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// now, we can be sure that we should be fine to dereference *cur* as
|
||||||
|
// ModifierData (with the above note).
|
||||||
|
const ModifierData& dat = cur->modifier;
|
||||||
|
|
||||||
|
const fpCreateModifier* curgod = creators;
|
||||||
|
std::vector< BlenderModifier* >::iterator curmod = cached_modifiers->begin(), endmod = cached_modifiers->end();
|
||||||
|
|
||||||
|
for (;*curgod;++curgod,++curmod) { // allocate modifiers on the fly
|
||||||
|
if (curmod == endmod) {
|
||||||
|
cached_modifiers->push_back((*curgod)());
|
||||||
|
|
||||||
|
endmod = cached_modifiers->end();
|
||||||
|
curmod = endmod-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlenderModifier* const modifier = *curmod;
|
||||||
|
if(modifier->IsActive(dat)) {
|
||||||
|
modifier->DoIt(out,conv_data,*boost::static_pointer_cast<const ElemBase>(cur),in,orig_object);
|
||||||
|
cnt++;
|
||||||
|
|
||||||
|
curgod = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (curgod) {
|
||||||
|
ASSIMP_LOG_WARN_F("Couldn't find a handler for modifier: ",dat.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Even though we managed to resolve some or all of the modifiers on this
|
||||||
|
// object, we still can't say whether our modifier implementations were
|
||||||
|
// able to fully do their job.
|
||||||
|
if (ful) {
|
||||||
|
ASSIMP_LOG_DEBUG_F("BlendModifier: found handlers for ",cnt," of ",ful," modifiers on `",orig_object.id.name,
|
||||||
|
"`, check log messages above for errors");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
bool BlenderModifier_Mirror :: IsActive (const ModifierData& modin)
|
||||||
|
{
|
||||||
|
return modin.type == ModifierData::eModifierType_Mirror;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void BlenderModifier_Mirror :: DoIt(aiNode& out, ConversionData& conv_data, const ElemBase& orig_modifier,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object )
|
||||||
|
{
|
||||||
|
// hijacking the ABI, see the big note in BlenderModifierShowcase::ApplyModifiers()
|
||||||
|
const MirrorModifierData& mir = static_cast<const MirrorModifierData&>(orig_modifier);
|
||||||
|
ai_assert(mir.modifier.type == ModifierData::eModifierType_Mirror);
|
||||||
|
|
||||||
|
// take all input meshes and clone them
|
||||||
|
for (unsigned int i = 0; i < out.mNumMeshes; ++i) {
|
||||||
|
aiMesh* mesh;
|
||||||
|
SceneCombiner::Copy(&mesh,conv_data.meshes[out.mMeshes[i]]);
|
||||||
|
|
||||||
|
const float xs = mir.flag & MirrorModifierData::Flags_AXIS_X ? -1.f : 1.f;
|
||||||
|
const float ys = mir.flag & MirrorModifierData::Flags_AXIS_Y ? -1.f : 1.f;
|
||||||
|
const float zs = mir.flag & MirrorModifierData::Flags_AXIS_Z ? -1.f : 1.f;
|
||||||
|
|
||||||
|
if (mir.mirror_ob) {
|
||||||
|
const aiVector3D center( mir.mirror_ob->obmat[3][0],mir.mirror_ob->obmat[3][1],mir.mirror_ob->obmat[3][2] );
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mVertices[i];
|
||||||
|
|
||||||
|
v.x = center.x + xs*(center.x - v.x);
|
||||||
|
v.y = center.y + ys*(center.y - v.y);
|
||||||
|
v.z = center.z + zs*(center.z - v.z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mVertices[i];
|
||||||
|
v.x *= xs;v.y *= ys;v.z *= zs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->mNormals) {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mNormals[i];
|
||||||
|
v.x *= xs;v.y *= ys;v.z *= zs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->mTangents) {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mTangents[i];
|
||||||
|
v.x *= xs;v.y *= ys;v.z *= zs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mesh->mBitangents) {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mBitangents[i];
|
||||||
|
v.x *= xs;v.y *= ys;v.z *= zs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const float us = mir.flag & MirrorModifierData::Flags_MIRROR_U ? -1.f : 1.f;
|
||||||
|
const float vs = mir.flag & MirrorModifierData::Flags_MIRROR_V ? -1.f : 1.f;
|
||||||
|
|
||||||
|
for (unsigned int n = 0; mesh->HasTextureCoords(n); ++n) {
|
||||||
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
|
aiVector3D& v = mesh->mTextureCoords[n][i];
|
||||||
|
v.x *= us;v.y *= vs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
conv_data.meshes->push_back(mesh);
|
||||||
|
}
|
||||||
|
unsigned int* nind = new unsigned int[out.mNumMeshes*2];
|
||||||
|
|
||||||
|
std::copy(out.mMeshes,out.mMeshes+out.mNumMeshes,nind);
|
||||||
|
std::transform(out.mMeshes,out.mMeshes+out.mNumMeshes,nind+out.mNumMeshes,
|
||||||
|
std::bind1st(std::plus< unsigned int >(),out.mNumMeshes));
|
||||||
|
|
||||||
|
delete[] out.mMeshes;
|
||||||
|
out.mMeshes = nind;
|
||||||
|
out.mNumMeshes *= 2;
|
||||||
|
|
||||||
|
ASSIMP_LOG_INFO_F("BlendModifier: Applied the `Mirror` modifier to `",
|
||||||
|
orig_object.id.name,"`");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
bool BlenderModifier_Subdivision :: IsActive (const ModifierData& modin)
|
||||||
|
{
|
||||||
|
return modin.type == ModifierData::eModifierType_Subsurf;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void BlenderModifier_Subdivision :: DoIt(aiNode& out, ConversionData& conv_data, const ElemBase& orig_modifier,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object )
|
||||||
|
{
|
||||||
|
// hijacking the ABI, see the big note in BlenderModifierShowcase::ApplyModifiers()
|
||||||
|
const SubsurfModifierData& mir = static_cast<const SubsurfModifierData&>(orig_modifier);
|
||||||
|
ai_assert(mir.modifier.type == ModifierData::eModifierType_Subsurf);
|
||||||
|
|
||||||
|
Subdivider::Algorithm algo;
|
||||||
|
switch (mir.subdivType)
|
||||||
|
{
|
||||||
|
case SubsurfModifierData::TYPE_CatmullClarke:
|
||||||
|
algo = Subdivider::CATMULL_CLARKE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SubsurfModifierData::TYPE_Simple:
|
||||||
|
ASSIMP_LOG_WARN("BlendModifier: The `SIMPLE` subdivision algorithm is not currently implemented, using Catmull-Clarke");
|
||||||
|
algo = Subdivider::CATMULL_CLARKE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ASSIMP_LOG_WARN_F("BlendModifier: Unrecognized subdivision algorithm: ",mir.subdivType);
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::scoped_ptr<Subdivider> subd(Subdivider::Create(algo));
|
||||||
|
ai_assert(subd);
|
||||||
|
|
||||||
|
aiMesh** const meshes = &conv_data.meshes[conv_data.meshes->size() - out.mNumMeshes];
|
||||||
|
boost::scoped_array<aiMesh*> tempmeshes(new aiMesh*[out.mNumMeshes]());
|
||||||
|
|
||||||
|
subd->Subdivide(meshes,out.mNumMeshes,tempmeshes.get(),std::max( mir.renderLevels, mir.levels ),true);
|
||||||
|
std::copy(tempmeshes.get(),tempmeshes.get()+out.mNumMeshes,meshes);
|
||||||
|
|
||||||
|
ASSIMP_LOG_INFO_F("BlendModifier: Applied the `Subdivision` modifier to `",
|
||||||
|
orig_object.id.name,"`");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2010, ASSIMP Development 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 Development 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.
|
||||||
|
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file BlenderModifier.h
|
||||||
|
* @brief Declare dedicated helper classes to simulate some blender modifiers (i.e. mirror)
|
||||||
|
*/
|
||||||
|
#ifndef INCLUDED_AI_BLEND_MODIFIER_H
|
||||||
|
#define INCLUDED_AI_BLEND_MODIFIER_H
|
||||||
|
|
||||||
|
#include "BlenderIntermediate.h"
|
||||||
|
#include "TinyFormatter.h"
|
||||||
|
namespace Assimp {
|
||||||
|
namespace Blender {
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
/** Dummy base class for all blender modifiers. Modifiers are reused between imports, so
|
||||||
|
* they should be stateless and not try to cache model data. */
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
class BlenderModifier
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual ~BlenderModifier() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
/** Check if *this* modifier is active, given a ModifierData& block.*/
|
||||||
|
virtual bool IsActive( const ModifierData& modin) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
/** Apply the modifier to a given output node. The original data used
|
||||||
|
* to construct the node is given as well. Not called unless IsActive()
|
||||||
|
* was called and gave positive response. */
|
||||||
|
virtual void DoIt(aiNode& out,
|
||||||
|
ConversionData& conv_data,
|
||||||
|
const ElemBase& orig_modifier,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object
|
||||||
|
) {
|
||||||
|
DefaultLogger::get()->warn((Formatter::format("This modifier is not supported, skipping: "),orig_modifier.dna_type));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
/** Manage all known modifiers and instance and apply them if necessary */
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
class BlenderModifierShowcase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
/** Apply all requested modifiers provided we support them. */
|
||||||
|
void ApplyModifiers(aiNode& out,
|
||||||
|
ConversionData& conv_data,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object
|
||||||
|
);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
TempArray< std::vector,BlenderModifier > cached_modifiers;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// MODIFIERS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
/** Mirror modifier. Status: implemented. */
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
class BlenderModifier_Mirror : public BlenderModifier
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
virtual bool IsActive( const ModifierData& modin);
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
virtual void DoIt(aiNode& out,
|
||||||
|
ConversionData& conv_data,
|
||||||
|
const ElemBase& orig_modifier,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object
|
||||||
|
) ;
|
||||||
|
};
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
/** Subdivision modifier. Status: dummy. */
|
||||||
|
// -------------------------------------------------------------------------------------------
|
||||||
|
class BlenderModifier_Subdivision : public BlenderModifier
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
virtual bool IsActive( const ModifierData& modin);
|
||||||
|
|
||||||
|
// --------------------
|
||||||
|
virtual void DoIt(aiNode& out,
|
||||||
|
ConversionData& conv_data,
|
||||||
|
const ElemBase& orig_modifier,
|
||||||
|
const Scene& in,
|
||||||
|
const Object& orig_object
|
||||||
|
) ;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}}
|
||||||
|
#endif // !INCLUDED_AI_BLEND_MODIFIER_H
|
|
@ -70,6 +70,7 @@ template <> void Structure :: Convert<Object> (
|
||||||
ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy_group,"*proxy_group",db);
|
ReadFieldPtr<ErrorPolicy_Warn>(dest.proxy_group,"*proxy_group",db);
|
||||||
ReadFieldPtr<ErrorPolicy_Warn>(dest.dup_group,"*dup_group",db);
|
ReadFieldPtr<ErrorPolicy_Warn>(dest.dup_group,"*dup_group",db);
|
||||||
ReadFieldPtr<ErrorPolicy_Fail>(dest.data,"*data",db);
|
ReadFieldPtr<ErrorPolicy_Fail>(dest.data,"*data",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.modifiers,"modifiers",db);
|
||||||
|
|
||||||
db.reader->IncPtr(size);
|
db.reader->IncPtr(size);
|
||||||
}
|
}
|
||||||
|
@ -142,6 +143,22 @@ template <> void Structure :: Convert<TFace> (
|
||||||
db.reader->IncPtr(size);
|
db.reader->IncPtr(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
template <> void Structure :: Convert<SubsurfModifierData> (
|
||||||
|
SubsurfModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
|
||||||
|
ReadField<ErrorPolicy_Fail>(dest.modifier,"modifier",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.subdivType,"subdivType",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.levels,"levels",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.renderLevels,"renderLevels",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.flags,"flags",db);
|
||||||
|
|
||||||
|
db.reader->IncPtr(size);
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
template <> void Structure :: Convert<MFace> (
|
template <> void Structure :: Convert<MFace> (
|
||||||
MFace& dest,
|
MFace& dest,
|
||||||
|
@ -390,6 +407,22 @@ template <> void Structure :: Convert<ListBase> (
|
||||||
db.reader->IncPtr(size);
|
db.reader->IncPtr(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
template <> void Structure :: Convert<ModifierData> (
|
||||||
|
ModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
|
||||||
|
ReadFieldPtr<ErrorPolicy_Warn>(dest.next,"*next",db);
|
||||||
|
ReadFieldPtr<ErrorPolicy_Warn>(dest.prev,"*prev",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.type,"type",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.mode,"mode",db);
|
||||||
|
ReadFieldArray<ErrorPolicy_Igno>(dest.name,"name",db);
|
||||||
|
|
||||||
|
db.reader->IncPtr(size);
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
template <> void Structure :: Convert<ID> (
|
template <> void Structure :: Convert<ID> (
|
||||||
ID& dest,
|
ID& dest,
|
||||||
|
@ -510,34 +543,53 @@ template <> void Structure :: Convert<Camera> (
|
||||||
db.reader->IncPtr(size);
|
db.reader->IncPtr(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------
|
||||||
|
template <> void Structure :: Convert<MirrorModifierData> (
|
||||||
|
MirrorModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
|
||||||
|
ReadField<ErrorPolicy_Fail>(dest.modifier,"modifier",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.axis,"axis",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.flag,"flag",db);
|
||||||
|
ReadField<ErrorPolicy_Igno>(dest.tolerance,"tolerance",db);
|
||||||
|
ReadFieldPtr<ErrorPolicy_Igno>(dest.mirror_ob,"*mirror_ob",db);
|
||||||
|
|
||||||
|
db.reader->IncPtr(size);
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------
|
||||||
void DNA::RegisterConverters() {
|
void DNA::RegisterConverters() {
|
||||||
|
|
||||||
converters["Object"] = &Structure::Convert<Object>;
|
converters["Object"] = DNA::FactoryPair( &Structure::Allocate<Object>, &Structure::Convert<Object> );
|
||||||
converters["Group"] = &Structure::Convert<Group>;
|
converters["Group"] = DNA::FactoryPair( &Structure::Allocate<Group>, &Structure::Convert<Group> );
|
||||||
converters["MTex"] = &Structure::Convert<MTex>;
|
converters["MTex"] = DNA::FactoryPair( &Structure::Allocate<MTex>, &Structure::Convert<MTex> );
|
||||||
converters["TFace"] = &Structure::Convert<TFace>;
|
converters["TFace"] = DNA::FactoryPair( &Structure::Allocate<TFace>, &Structure::Convert<TFace> );
|
||||||
converters["MFace"] = &Structure::Convert<MFace>;
|
converters["SubsurfModifierData"] = DNA::FactoryPair( &Structure::Allocate<SubsurfModifierData>, &Structure::Convert<SubsurfModifierData> );
|
||||||
converters["Lamp"] = &Structure::Convert<Lamp>;
|
converters["MFace"] = DNA::FactoryPair( &Structure::Allocate<MFace>, &Structure::Convert<MFace> );
|
||||||
converters["MDeformWeight"] = &Structure::Convert<MDeformWeight>;
|
converters["Lamp"] = DNA::FactoryPair( &Structure::Allocate<Lamp>, &Structure::Convert<Lamp> );
|
||||||
converters["PackedFile"] = &Structure::Convert<PackedFile>;
|
converters["MDeformWeight"] = DNA::FactoryPair( &Structure::Allocate<MDeformWeight>, &Structure::Convert<MDeformWeight> );
|
||||||
converters["Base"] = &Structure::Convert<Base>;
|
converters["PackedFile"] = DNA::FactoryPair( &Structure::Allocate<PackedFile>, &Structure::Convert<PackedFile> );
|
||||||
converters["MTFace"] = &Structure::Convert<MTFace>;
|
converters["Base"] = DNA::FactoryPair( &Structure::Allocate<Base>, &Structure::Convert<Base> );
|
||||||
converters["Material"] = &Structure::Convert<Material>;
|
converters["MTFace"] = DNA::FactoryPair( &Structure::Allocate<MTFace>, &Structure::Convert<MTFace> );
|
||||||
converters["Mesh"] = &Structure::Convert<Mesh>;
|
converters["Material"] = DNA::FactoryPair( &Structure::Allocate<Material>, &Structure::Convert<Material> );
|
||||||
converters["MDeformVert"] = &Structure::Convert<MDeformVert>;
|
converters["Mesh"] = DNA::FactoryPair( &Structure::Allocate<Mesh>, &Structure::Convert<Mesh> );
|
||||||
converters["World"] = &Structure::Convert<World>;
|
converters["MDeformVert"] = DNA::FactoryPair( &Structure::Allocate<MDeformVert>, &Structure::Convert<MDeformVert> );
|
||||||
converters["MVert"] = &Structure::Convert<MVert>;
|
converters["World"] = DNA::FactoryPair( &Structure::Allocate<World>, &Structure::Convert<World> );
|
||||||
converters["MEdge"] = &Structure::Convert<MEdge>;
|
converters["MVert"] = DNA::FactoryPair( &Structure::Allocate<MVert>, &Structure::Convert<MVert> );
|
||||||
converters["GroupObject"] = &Structure::Convert<GroupObject>;
|
converters["MEdge"] = DNA::FactoryPair( &Structure::Allocate<MEdge>, &Structure::Convert<MEdge> );
|
||||||
converters["ListBase"] = &Structure::Convert<ListBase>;
|
converters["GroupObject"] = DNA::FactoryPair( &Structure::Allocate<GroupObject>, &Structure::Convert<GroupObject> );
|
||||||
converters["ID"] = &Structure::Convert<ID>;
|
converters["ListBase"] = DNA::FactoryPair( &Structure::Allocate<ListBase>, &Structure::Convert<ListBase> );
|
||||||
converters["MCol"] = &Structure::Convert<MCol>;
|
converters["ModifierData"] = DNA::FactoryPair( &Structure::Allocate<ModifierData>, &Structure::Convert<ModifierData> );
|
||||||
converters["Image"] = &Structure::Convert<Image>;
|
converters["ID"] = DNA::FactoryPair( &Structure::Allocate<ID>, &Structure::Convert<ID> );
|
||||||
converters["Scene"] = &Structure::Convert<Scene>;
|
converters["MCol"] = DNA::FactoryPair( &Structure::Allocate<MCol>, &Structure::Convert<MCol> );
|
||||||
converters["Library"] = &Structure::Convert<Library>;
|
converters["Image"] = DNA::FactoryPair( &Structure::Allocate<Image>, &Structure::Convert<Image> );
|
||||||
converters["Tex"] = &Structure::Convert<Tex>;
|
converters["Scene"] = DNA::FactoryPair( &Structure::Allocate<Scene>, &Structure::Convert<Scene> );
|
||||||
converters["Camera"] = &Structure::Convert<Camera>;
|
converters["Library"] = DNA::FactoryPair( &Structure::Allocate<Library>, &Structure::Convert<Library> );
|
||||||
|
converters["Tex"] = DNA::FactoryPair( &Structure::Allocate<Tex>, &Structure::Convert<Tex> );
|
||||||
|
converters["Camera"] = DNA::FactoryPair( &Structure::Allocate<Camera>, &Structure::Convert<Camera> );
|
||||||
|
converters["MirrorModifierData"] = DNA::FactoryPair( &Structure::Allocate<MirrorModifierData>, &Structure::Convert<MirrorModifierData> );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -366,6 +366,92 @@ struct Lamp : ElemBase {
|
||||||
//struct PreviewImage *preview;
|
//struct PreviewImage *preview;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
struct ModifierData : ElemBase {
|
||||||
|
enum ModifierType {
|
||||||
|
eModifierType_None = 0,
|
||||||
|
eModifierType_Subsurf,
|
||||||
|
eModifierType_Lattice,
|
||||||
|
eModifierType_Curve,
|
||||||
|
eModifierType_Build,
|
||||||
|
eModifierType_Mirror,
|
||||||
|
eModifierType_Decimate,
|
||||||
|
eModifierType_Wave,
|
||||||
|
eModifierType_Armature,
|
||||||
|
eModifierType_Hook,
|
||||||
|
eModifierType_Softbody,
|
||||||
|
eModifierType_Boolean,
|
||||||
|
eModifierType_Array,
|
||||||
|
eModifierType_EdgeSplit,
|
||||||
|
eModifierType_Displace,
|
||||||
|
eModifierType_UVProject,
|
||||||
|
eModifierType_Smooth,
|
||||||
|
eModifierType_Cast,
|
||||||
|
eModifierType_MeshDeform,
|
||||||
|
eModifierType_ParticleSystem,
|
||||||
|
eModifierType_ParticleInstance,
|
||||||
|
eModifierType_Explode,
|
||||||
|
eModifierType_Cloth,
|
||||||
|
eModifierType_Collision,
|
||||||
|
eModifierType_Bevel,
|
||||||
|
eModifierType_Shrinkwrap,
|
||||||
|
eModifierType_Fluidsim,
|
||||||
|
eModifierType_Mask,
|
||||||
|
eModifierType_SimpleDeform,
|
||||||
|
eModifierType_Multires,
|
||||||
|
eModifierType_Surface,
|
||||||
|
eModifierType_Smoke,
|
||||||
|
eModifierType_ShapeKey
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::shared_ptr<ElemBase> next WARN;
|
||||||
|
boost::shared_ptr<ElemBase> prev WARN;
|
||||||
|
|
||||||
|
int type, mode;
|
||||||
|
char name[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
struct SubsurfModifierData : ElemBase {
|
||||||
|
|
||||||
|
enum Type {
|
||||||
|
|
||||||
|
TYPE_CatmullClarke = 0x0,
|
||||||
|
TYPE_Simple = 0x1
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Flags {
|
||||||
|
// some ommitted
|
||||||
|
FLAGS_SubsurfUV =1<<3
|
||||||
|
};
|
||||||
|
|
||||||
|
ModifierData modifier FAIL;
|
||||||
|
short subdivType WARN;
|
||||||
|
short levels FAIL;
|
||||||
|
short renderLevels ;
|
||||||
|
short flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------------
|
||||||
|
struct MirrorModifierData : ElemBase {
|
||||||
|
|
||||||
|
enum Flags {
|
||||||
|
Flags_CLIPPING =1<<0,
|
||||||
|
Flags_MIRROR_U =1<<1,
|
||||||
|
Flags_MIRROR_V =1<<2,
|
||||||
|
Flags_AXIS_X =1<<3,
|
||||||
|
Flags_AXIS_Y =1<<4,
|
||||||
|
Flags_AXIS_Z =1<<5,
|
||||||
|
Flags_VGROUP =1<<6
|
||||||
|
};
|
||||||
|
|
||||||
|
ModifierData modifier FAIL;
|
||||||
|
|
||||||
|
short axis, flag;
|
||||||
|
float tolerance;
|
||||||
|
boost::shared_ptr<Object> mirror_ob;
|
||||||
|
};
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
struct Object : ElemBase {
|
struct Object : ElemBase {
|
||||||
ID id FAIL;
|
ID id FAIL;
|
||||||
|
@ -396,6 +482,8 @@ struct Object : ElemBase {
|
||||||
boost::shared_ptr<Object> proxy,proxy_from,proxy_group WARN;
|
boost::shared_ptr<Object> proxy,proxy_from,proxy_group WARN;
|
||||||
boost::shared_ptr<Group> dup_group WARN;
|
boost::shared_ptr<Group> dup_group WARN;
|
||||||
boost::shared_ptr<ElemBase> data FAIL;
|
boost::shared_ptr<ElemBase> data FAIL;
|
||||||
|
|
||||||
|
ListBase modifiers;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,12 @@ template <> void Structure :: Convert<TFace> (
|
||||||
) const
|
) const
|
||||||
;
|
;
|
||||||
|
|
||||||
|
template <> void Structure :: Convert<SubsurfModifierData> (
|
||||||
|
SubsurfModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
;
|
||||||
|
|
||||||
template <> void Structure :: Convert<MFace> (
|
template <> void Structure :: Convert<MFace> (
|
||||||
MFace& dest,
|
MFace& dest,
|
||||||
const FileDatabase& db
|
const FileDatabase& db
|
||||||
|
@ -156,6 +162,12 @@ template <> void Structure :: Convert<ListBase> (
|
||||||
) const
|
) const
|
||||||
;
|
;
|
||||||
|
|
||||||
|
template <> void Structure :: Convert<ModifierData> (
|
||||||
|
ModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
;
|
||||||
|
|
||||||
template <> void Structure :: Convert<ID> (
|
template <> void Structure :: Convert<ID> (
|
||||||
ID& dest,
|
ID& dest,
|
||||||
const FileDatabase& db
|
const FileDatabase& db
|
||||||
|
@ -198,6 +210,12 @@ template <> void Structure :: Convert<Camera> (
|
||||||
) const
|
) const
|
||||||
;
|
;
|
||||||
|
|
||||||
|
template <> void Structure :: Convert<MirrorModifierData> (
|
||||||
|
MirrorModifierData& dest,
|
||||||
|
const FileDatabase& db
|
||||||
|
) const
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -314,6 +314,9 @@ SOURCE_GROUP(BLENDER FILES
|
||||||
BlenderScene.cpp
|
BlenderScene.cpp
|
||||||
BlenderScene.h
|
BlenderScene.h
|
||||||
BlenderSceneGen.h
|
BlenderSceneGen.h
|
||||||
|
BlenderIntermediate.h
|
||||||
|
BlenderModifier.h
|
||||||
|
BlenderModifier.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
SOURCE_GROUP( PostProcessing FILES
|
SOURCE_GROUP( PostProcessing FILES
|
||||||
|
@ -714,6 +717,9 @@ ADD_LIBRARY( assimp SHARED
|
||||||
BlenderScene.cpp
|
BlenderScene.cpp
|
||||||
BlenderScene.h
|
BlenderScene.h
|
||||||
BlenderSceneGen.h
|
BlenderSceneGen.h
|
||||||
|
BlenderIntermediate.h
|
||||||
|
BlenderModifier.h
|
||||||
|
BlenderModifier.cpp
|
||||||
|
|
||||||
# Necessary to show the headers in the project when using the VC++ generator:
|
# Necessary to show the headers in the project when using the VC++ generator:
|
||||||
BoostWorkaround/boost/math/common_factor_rt.hpp
|
BoostWorkaround/boost/math/common_factor_rt.hpp
|
||||||
|
|
|
@ -171,6 +171,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef ASSIMP_BUILD_NO_COB_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_COB_IMPORTER
|
||||||
# include "BlenderLoader.h"
|
# include "BlenderLoader.h"
|
||||||
#endif
|
#endif
|
||||||
|
//#ifndef ASSIMP_BUILD_NO_SWORDOFMOONLIGHT_IMPORTER
|
||||||
|
//# include "SomLoader.h"
|
||||||
|
//#endif
|
||||||
#ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_Q3BSP_IMPORTER
|
||||||
# include "Q3BSPFileImporter.h"
|
# include "Q3BSPFileImporter.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -407,6 +410,9 @@ Importer::Importer()
|
||||||
#if (!defined ASSIMP_BUILD_NO_BLEND_IMPORTER)
|
#if (!defined ASSIMP_BUILD_NO_BLEND_IMPORTER)
|
||||||
pimpl->mImporter.push_back( new BlenderImporter());
|
pimpl->mImporter.push_back( new BlenderImporter());
|
||||||
#endif
|
#endif
|
||||||
|
//#if (!defined ASSIMP_BUILD_NO_SWORDOFMOONLIGHT_IMPORTER)
|
||||||
|
// pimpl->mImporter.push_back( new SomImporter());
|
||||||
|
//#endif
|
||||||
#if (!defined ASSIMP_BUILD_NO_Q3BSP_IMPORTER)
|
#if (!defined ASSIMP_BUILD_NO_Q3BSP_IMPORTER)
|
||||||
pimpl->mImporter.push_back( new Q3BSPFileImporter );
|
pimpl->mImporter.push_back( new Q3BSPFileImporter );
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -56,6 +56,11 @@ public:
|
||||||
CATMULL_CLARKE = 0x1
|
CATMULL_CLARKE = 0x1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual ~Subdivider() {
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// ---------------------------------------------------------------
|
// ---------------------------------------------------------------
|
||||||
|
@ -92,13 +97,14 @@ public:
|
||||||
* verbose format.
|
* verbose format.
|
||||||
* @param nmesh Number of meshes in smesh.
|
* @param nmesh Number of meshes in smesh.
|
||||||
* @param out Receives the output meshes. The array must be
|
* @param out Receives the output meshes. The array must be
|
||||||
* sufficiently large (at least @c nmesh elements). Output meshes
|
* sufficiently large (at least @c nmesh elements) and may not
|
||||||
* map one-to-one to their corresponding input meshes. The
|
* overlap the input array. Output meshes map one-to-one to
|
||||||
* meshes are allocated by the function.
|
* their corresponding input meshes. The meshes are allocated
|
||||||
|
* by the function.
|
||||||
* @param discard_input If true is passed, input meshes are
|
* @param discard_input If true is passed, input meshes are
|
||||||
* deleted after the subdivision is complete. This can
|
* deleted after the subdivision is complete. This can
|
||||||
* improve performance because it allows the optimization
|
* improve performance because it allows the optimization
|
||||||
* to reuse existing meshes for intermediate results.
|
* of reusing existing meshes for intermediate results.
|
||||||
* @param num Number of subdivisions to perform.
|
* @param num Number of subdivisions to perform.
|
||||||
* @pre nmesh != 0, smesh and out may not overlap*/
|
* @pre nmesh != 0, smesh and out may not overlap*/
|
||||||
virtual void Subdivide (
|
virtual void Subdivide (
|
||||||
|
|
|
@ -81,7 +81,7 @@ DNA_RegisterConverters_decl = """
|
||||||
void DNA::RegisterConverters() """
|
void DNA::RegisterConverters() """
|
||||||
|
|
||||||
DNA_RegisterConverters_add = """
|
DNA_RegisterConverters_add = """
|
||||||
converters["{a}"] = &Structure::Convert<{a}>;"""
|
converters["{a}"] = DNA::FactoryPair( &Structure::Allocate<{a}>, &Structure::Convert<{a}> );"""
|
||||||
|
|
||||||
|
|
||||||
map_policy = {
|
map_policy = {
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
HUMAN.blend (c) 2010, Tobias Rittig
|
||||||
|
|
||||||
|
Redistribution and reuse allowed, credits appreciated.
|
File diff suppressed because it is too large
Load Diff
|
@ -1,188 +0,0 @@
|
||||||

|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
|
||||||
# Visual Studio 2005
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimpview", "assimp_view.vcproj", "{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}"
|
|
||||||
ProjectSection(WebsiteProperties) = preProject
|
|
||||||
Debug.AspNetCompiler.Debug = "True"
|
|
||||||
Release.AspNetCompiler.Debug = "False"
|
|
||||||
EndProjectSection
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp", "assimp.vcproj", "{5691E159-2D9B-407F-971F-EA5C592DC524}"
|
|
||||||
ProjectSection(WebsiteProperties) = preProject
|
|
||||||
Debug.AspNetCompiler.Debug = "True"
|
|
||||||
Release.AspNetCompiler.Debug = "False"
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "unit", "UnitTest.vcproj", "{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}"
|
|
||||||
ProjectSection(WebsiteProperties) = preProject
|
|
||||||
Debug.AspNetCompiler.Debug = "True"
|
|
||||||
Release.AspNetCompiler.Debug = "False"
|
|
||||||
EndProjectSection
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "assimp_cmd", "assimp_cmd.vcproj", "{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}"
|
|
||||||
ProjectSection(WebsiteProperties) = preProject
|
|
||||||
Debug.AspNetCompiler.Debug = "True"
|
|
||||||
Release.AspNetCompiler.Debug = "False"
|
|
||||||
EndProjectSection
|
|
||||||
ProjectSection(ProjectDependencies) = postProject
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524} = {5691E159-2D9B-407F-971F-EA5C592DC524}
|
|
||||||
EndProjectSection
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
debug|Win32 = debug|Win32
|
|
||||||
debug|x64 = debug|x64
|
|
||||||
debug-dll|Win32 = debug-dll|Win32
|
|
||||||
debug-dll|x64 = debug-dll|x64
|
|
||||||
debug-noboost-st|Win32 = debug-noboost-st|Win32
|
|
||||||
debug-noboost-st|x64 = debug-noboost-st|x64
|
|
||||||
debug-st|Win32 = debug-st|Win32
|
|
||||||
debug-st|x64 = debug-st|x64
|
|
||||||
release|Win32 = release|Win32
|
|
||||||
release|x64 = release|x64
|
|
||||||
release-dll|Win32 = release-dll|Win32
|
|
||||||
release-dll|x64 = release-dll|x64
|
|
||||||
release-noboost-st|Win32 = release-noboost-st|Win32
|
|
||||||
release-noboost-st|x64 = release-noboost-st|x64
|
|
||||||
release-st|Win32 = release-st|Win32
|
|
||||||
release-st|x64 = release-st|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|Win32.ActiveCfg = debug|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|Win32.Build.0 = debug|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|x64.ActiveCfg = debug|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug|x64.Build.0 = debug|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-dll|x64.Build.0 = debug-dll|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|Win32.Build.0 = debug-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|x64.ActiveCfg = debug-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.debug-st|x64.Build.0 = debug-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|Win32.ActiveCfg = release|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|Win32.Build.0 = release|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|x64.ActiveCfg = release|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release|x64.Build.0 = release|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|Win32.Build.0 = release-dll|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.ActiveCfg = release-dll|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-dll|x64.Build.0 = release-dll|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.ActiveCfg = release-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|Win32.Build.0 = release-st|Win32
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.ActiveCfg = release-st|x64
|
|
||||||
{B17B959B-BB8A-4596-AF0F-A8C8DBBC3C5E}.release-st|x64.Build.0 = release-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|Win32.ActiveCfg = debug|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|Win32.Build.0 = debug|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|x64.ActiveCfg = debug|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug|x64.Build.0 = debug|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-dll|x64.Build.0 = debug-dll|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|Win32.Build.0 = debug-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|x64.ActiveCfg = debug-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.debug-st|x64.Build.0 = debug-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|Win32.ActiveCfg = release|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|Win32.Build.0 = release|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|x64.ActiveCfg = release|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release|x64.Build.0 = release|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|Win32.Build.0 = release-dll|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.ActiveCfg = release-dll|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-dll|x64.Build.0 = release-dll|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.ActiveCfg = release-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|Win32.Build.0 = release-st|Win32
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|x64.ActiveCfg = release-st|x64
|
|
||||||
{5691E159-2D9B-407F-971F-EA5C592DC524}.release-st|x64.Build.0 = release-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|Win32.ActiveCfg = debug|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|Win32.Build.0 = debug|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|x64.ActiveCfg = debug|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug|x64.Build.0 = debug|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-dll|x64.Build.0 = debug-dll|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-noboost-st|x64.Build.0 = debug-noboost-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|Win32.Build.0 = debug-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|x64.ActiveCfg = debug-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.debug-st|x64.Build.0 = debug-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|Win32.ActiveCfg = release|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|Win32.Build.0 = release|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|x64.ActiveCfg = release|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release|x64.Build.0 = release|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|Win32.Build.0 = release-dll|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.ActiveCfg = release-dll|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-dll|x64.Build.0 = release-dll|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.ActiveCfg = release-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|Win32.Build.0 = release-st|Win32
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.ActiveCfg = release-st|x64
|
|
||||||
{9B9D1C90-8A03-409A-B547-AE7B48B90F1A}.release-st|x64.Build.0 = release-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|Win32.ActiveCfg = Debug|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|Win32.Build.0 = Debug|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|x64.ActiveCfg = Debug|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug|x64.Build.0 = Debug|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|Win32.ActiveCfg = debug-dll|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|Win32.Build.0 = debug-dll|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|x64.ActiveCfg = debug-dll|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-dll|x64.Build.0 = debug-dll|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|Win32.ActiveCfg = debug-noboost-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|Win32.Build.0 = debug-noboost-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-noboost-st|x64.ActiveCfg = debug-noboost-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|Win32.ActiveCfg = debug-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|Win32.Build.0 = debug-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|x64.ActiveCfg = debug-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.debug-st|x64.Build.0 = debug-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|Win32.ActiveCfg = Release|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|Win32.Build.0 = Release|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|x64.ActiveCfg = Release|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release|x64.Build.0 = Release|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|Win32.ActiveCfg = release-dll|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|Win32.Build.0 = release-dll|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|x64.ActiveCfg = release-dll|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-dll|x64.Build.0 = release-dll|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|Win32.ActiveCfg = release-noboost-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|Win32.Build.0 = release-noboost-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|x64.ActiveCfg = release-noboost-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-noboost-st|x64.Build.0 = release-noboost-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|Win32.ActiveCfg = release-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|Win32.Build.0 = release-st|Win32
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|x64.ActiveCfg = release-st|x64
|
|
||||||
{7C8F7B44-C990-4EA8-A2A5-9028472E0AD3}.release-st|x64.Build.0 = release-st|x64
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="DllShared"
|
|
||||||
OutputDirectory="./../../bin/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
|
||||||
IntermediateDirectory="./../../obj/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="ASSIMP_BUILD_DLL_EXPORT"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine=""
|
|
||||||
/>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="FastSTL"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="_HAS_ITERATOR_DEBUGGING=0;_SECURE_SCL=0"
|
|
||||||
/>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,9 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="LibShared"
|
|
||||||
OutputDirectory="./../../lib/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
|
||||||
IntermediateDirectory="./../../obj/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
|
||||||
>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="NoBoostShared"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="ASSIMP_BUILD_BOOST_WORKAROUND;ASSIMP_BUILD_SINGLETHREADED"
|
|
||||||
/>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,11 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="SingleThreadedShared"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="ASSIMP_BUILD_SINGLETHREADED"
|
|
||||||
/>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,17 +0,0 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioPropertySheet
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8.00"
|
|
||||||
Name="UnitTest"
|
|
||||||
OutputDirectory="./../../lib/$(ProjectName)_$(ConfigurationName)_$(PlatformName)"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories=""..\..\contrib\cppunit-1.12.1\include""
|
|
||||||
PreprocessorDefinitions="_CRT_SECURE_NO_WARNINGS"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalLibraryDirectories=""..\..\contrib\cppunit-1.12.1\lib""
|
|
||||||
/>
|
|
||||||
</VisualStudioPropertySheet>
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
<VisualStudioProject
|
<VisualStudioProject
|
||||||
ProjectType="Visual C++"
|
ProjectType="Visual C++"
|
||||||
Version="9,00"
|
Version="9.00"
|
||||||
Name="assimp"
|
Name="assimp"
|
||||||
ProjectGUID="{5691E159-2D9B-407F-971F-EA5C592DC524}"
|
ProjectGUID="{5691E159-2D9B-407F-971F-EA5C592DC524}"
|
||||||
RootNamespace="assimp"
|
RootNamespace="assimp"
|
||||||
|
@ -427,7 +427,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
CommandLine="mkdir $(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)
mkdir $(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)

copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)\"
"
|
CommandLine="mkdir "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)"
mkdir "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)"
mkdir "$(SolutionDir)..\..\bin\assimpcmd_$(ConfigurationName)_$(PlatformName)"

copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpcmd_$(ConfigurationName)_$(PlatformName)\"
"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
|
@ -574,7 +574,7 @@
|
||||||
/>
|
/>
|
||||||
<Tool
|
<Tool
|
||||||
Name="VCPostBuildEventTool"
|
Name="VCPostBuildEventTool"
|
||||||
CommandLine="mkdir $(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)
mkdir $(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)

copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)\"
"
|
CommandLine="mkdir "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)"
mkdir "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)"
mkdir "$(SolutionDir)..\..\bin\assimpcmd_$(ConfigurationName)_$(PlatformName)"

copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\unit_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpview_$(ConfigurationName)_$(PlatformName)\"
copy "$(OutDir)\$(TargetFileName)" "$(SolutionDir)..\..\bin\assimpcmd_$(ConfigurationName)_$(PlatformName)\"
"
|
||||||
/>
|
/>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration
|
<Configuration
|
||||||
|
@ -1353,26 +1353,6 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
|
||||||
Name="md2"
|
|
||||||
>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\code\MD2FileData.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\code\MD2Loader.cpp"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\code\MD2Loader.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\..\code\MD2NormalTable.h"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
<Filter
|
||||||
Name="md3"
|
Name="md3"
|
||||||
>
|
>
|
||||||
|
@ -1664,6 +1644,26 @@
|
||||||
RelativePath="..\..\code\LWSLoader.h"
|
RelativePath="..\..\code\LWSLoader.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<Filter
|
||||||
|
Name="md2"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\MD2FileData.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\MD2Loader.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\MD2Loader.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\MD2NormalTable.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="bvh"
|
Name="bvh"
|
||||||
|
@ -1856,6 +1856,10 @@
|
||||||
RelativePath="..\..\code\BlenderDNA.inl"
|
RelativePath="..\..\code\BlenderDNA.inl"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\BlenderIntermediate.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\code\BlenderLoader.cpp"
|
RelativePath="..\..\code\BlenderLoader.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1864,6 +1868,14 @@
|
||||||
RelativePath="..\..\code\BlenderLoader.h"
|
RelativePath="..\..\code\BlenderLoader.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\BlenderModifier.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\BlenderModifier.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\code\BlenderScene.cpp"
|
RelativePath="..\..\code\BlenderScene.cpp"
|
||||||
>
|
>
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue