diff --git a/code/FBXConverter.cpp b/code/FBXConverter.cpp index af4b11cf7..dadf80be6 100644 --- a/code/FBXConverter.cpp +++ b/code/FBXConverter.cpp @@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER #include +#include #include #include "FBXParser.h" @@ -94,14 +95,6 @@ public: TransformationComp_MAXIMUM }; - enum MetadataKeys - { - MetadataKeys_UserProperties = 0, - MetadataKeys_IsNull, - - MetadataKeys_MAXIMUM - }; - public: Converter(aiScene* out, const Document& doc) @@ -760,21 +753,56 @@ private: void SetupNodeMetadata(const Model& model, aiNode& nd) { const PropertyTable& props = model.Props(); + DirectPropertyMap unparsedProperties = props.GetUnparsedProperties(); - //create metadata on node + // create metadata on node + std::size_t numStaticMetaData = 2; aiMetadata* data = new aiMetadata(); - data->mNumProperties = MetadataKeys_MAXIMUM; + data->mNumProperties = unparsedProperties.size() + numStaticMetaData; data->mKeys = new aiString[data->mNumProperties](); data->mValues = new aiString[data->mNumProperties](); nd.mMetaData = data; + int index = 0; - // find user defined properties - data->mKeys[MetadataKeys_UserProperties].Set("UserProperties"); - data->mValues[MetadataKeys_UserProperties].Set(PropertyGet(props, "UDP3DSMAX", "")); + // find user defined properties (3ds Max) + data->mKeys[index].Set("UserProperties"); + data->mValues[index].Set(PropertyGet(props, "UDP3DSMAX", "")); + ++index; // preserve the info that a node was marked as Null node in the original file. - data->mKeys[MetadataKeys_IsNull].Set("IsNull"); - data->mValues[MetadataKeys_IsNull].Set(model.IsNull() ? "true" : "false"); + data->mKeys[index].Set("IsNull"); + data->mValues[index].Set(model.IsNull() ? "true" : "false"); + ++index; + + // add unparsed properties to the node's metadata + BOOST_FOREACH(const DirectPropertyMap::value_type& prop, unparsedProperties) { + + // all values are converted to strings using the following stringstream + std::stringstream ss; + bool parse_succeeded = false; + + // Interpret the property as a concrete type + if (const TypedProperty* interpreted = prop.second->As >()) + ss << interpreted->Value(); + else if (const TypedProperty* interpreted = prop.second->As >()) + ss << interpreted->Value(); + else if (const TypedProperty* interpreted = prop.second->As >()) + ss << interpreted->Value(); + else if (const TypedProperty* interpreted = prop.second->As >()) + ss << interpreted->Value(); + else if (const TypedProperty* interpreted = prop.second->As >()) + ss << interpreted->Value(); + else if (const TypedProperty* interpreted = prop.second->As >()) + { + aiVector3D v = interpreted->Value(); + ss << v.x << ";" << v.y << ";" << v.z; + } + + // add property to meta data + data->mKeys[index].Set(prop.first); + data->mValues[index].Set(ss.str()); + ++index; + } } // ------------------------------------------------------------------------------------------------ diff --git a/code/FBXProperties.cpp b/code/FBXProperties.cpp index 6c5433d74..48bdb4f40 100644 --- a/code/FBXProperties.cpp +++ b/code/FBXProperties.cpp @@ -201,6 +201,33 @@ const Property* PropertyTable::Get(const std::string& name) const return (*it).second; } +DirectPropertyMap PropertyTable::GetUnparsedProperties() const +{ + DirectPropertyMap result; + + // Loop through all the lazy properties (which is all the properties) + BOOST_FOREACH(const LazyPropertyMap::value_type& element, lazyProps) { + + // Skip parsed properties + if (props.end() != props.find(element.first)) continue; + + // Read the element's value. + // Wrap the naked pointer (since the call site is required to acquire ownership) + // std::unique_ptr from C++11 would be preferred both as a wrapper and a return value. + boost::shared_ptr prop = boost::shared_ptr(ReadTypedProperty(*element.second)); + + // Element could not be read. Skip it. + if (!prop) continue; + + // Add to result + result[element.first] = prop; + } + + return result; +} + + + } //! FBX } //! Assimp diff --git a/code/FBXProperties.h b/code/FBXProperties.h index 5e386444d..9219c3eea 100644 --- a/code/FBXProperties.h +++ b/code/FBXProperties.h @@ -101,6 +101,7 @@ private: }; +typedef std::fbx_unordered_map > DirectPropertyMap; typedef std::fbx_unordered_map PropertyMap; typedef std::fbx_unordered_map LazyPropertyMap; @@ -128,6 +129,8 @@ public: return templateProps.get(); } + DirectPropertyMap GetUnparsedProperties() const; + private: LazyPropertyMap lazyProps; diff --git a/code/ObjExporter.cpp b/code/ObjExporter.cpp index b680abb74..ff9fa4b25 100644 --- a/code/ObjExporter.cpp +++ b/code/ObjExporter.cpp @@ -152,6 +152,9 @@ void ObjExporter :: WriteMaterialFile() if(AI_SUCCESS == mat->Get(AI_MATKEY_COLOR_SPECULAR,c)) { mOutputMat << "ks " << c.r << " " << c.g << " " << c.b << endl; } + if(AI_SUCCESS == mat->Get(AI_MATKEY_COLOR_EMISSIVE,c)) { + mOutputMat << "ke " << c.r << " " << c.g << " " << c.b << endl; + } float o; if(AI_SUCCESS == mat->Get(AI_MATKEY_OPACITY,o)) { diff --git a/code/ObjFileData.h b/code/ObjFileData.h index 79605ef00..76448b763 100755 --- a/code/ObjFileData.h +++ b/code/ObjFileData.h @@ -183,6 +183,8 @@ struct Material aiColor3D diffuse; //! Specular color aiColor3D specular; + //! Emissive color + aiColor3D emissive; //! Alpha value float alpha; //! Shineness factor diff --git a/code/ObjFileImporter.cpp b/code/ObjFileImporter.cpp index 1eec92f70..b1d93202c 100644 --- a/code/ObjFileImporter.cpp +++ b/code/ObjFileImporter.cpp @@ -550,6 +550,7 @@ void ObjFileImporter::createMaterials(const ObjFile::Model* pModel, aiScene* pSc mat->AddProperty( &pCurrentMaterial->ambient, 1, AI_MATKEY_COLOR_AMBIENT ); mat->AddProperty( &pCurrentMaterial->diffuse, 1, AI_MATKEY_COLOR_DIFFUSE ); mat->AddProperty( &pCurrentMaterial->specular, 1, AI_MATKEY_COLOR_SPECULAR ); + mat->AddProperty( &pCurrentMaterial->emissive, 1, AI_MATKEY_COLOR_EMISSIVE ); mat->AddProperty( &pCurrentMaterial->shineness, 1, AI_MATKEY_SHININESS ); mat->AddProperty( &pCurrentMaterial->alpha, 1, AI_MATKEY_OPACITY ); diff --git a/code/ObjFileMtlImporter.cpp b/code/ObjFileMtlImporter.cpp index 8ba19efd2..8424995c0 100644 --- a/code/ObjFileMtlImporter.cpp +++ b/code/ObjFileMtlImporter.cpp @@ -146,6 +146,11 @@ void ObjFileMtlImporter::load() ++m_DataIt; getColorRGBA( &m_pModel->m_pCurrentMaterial->specular ); } + else if (*m_DataIt == 'e') + { + ++m_DataIt; + getColorRGBA( &m_pModel->m_pCurrentMaterial->emissive ); + } m_DataIt = skipLine( m_DataIt, m_DataItEnd, m_uiLine ); } break; diff --git a/port/PyAssimp/pyassimp/helper.py b/port/PyAssimp/pyassimp/helper.py index 1cff1b0c8..21cefdfc5 100644 --- a/port/PyAssimp/pyassimp/helper.py +++ b/port/PyAssimp/pyassimp/helper.py @@ -27,6 +27,8 @@ if os.name=='posix': # currently there's always a symlink called # libassimp.so in /usr/local/lib. ext_whitelist.append('.so') + # libassimp.dylib in /usr/local/lib + ext_whitelist.append('.dylib') elif os.name=='nt': ext_whitelist.append('.dll')