- fbx: refactor code for fetching property templates.

pull/14/head
Alexander Gessler 2012-07-03 14:40:45 +02:00
parent ec50632f2e
commit 97b69364ad
3 changed files with 38 additions and 21 deletions

View File

@ -327,6 +327,35 @@ void ReadVectorDataArray(std::vector<unsigned int>& out, const Element& el)
out.push_back(static_cast<unsigned int>(ival));
}
}
// ------------------------------------------------------------------------------------------------
// fetch a property table and the corresponding property template
boost::shared_ptr<const PropertyTable> GetPropertyTable(const Document& doc,
const std::string& templateName,
const Element &element,
const Scope& sc)
{
const Element* const Properties70 = sc["Properties70"];
boost::shared_ptr<const PropertyTable> templateProps = boost::shared_ptr<const PropertyTable>(NULL);
if(templateName.length()) {
PropertyTemplateMap::const_iterator it = doc.Templates().find(templateName);
if(it != doc.Templates().end()) {
templateProps = (*it).second;
}
}
if(!Properties70) {
DOMWarning("material property table (Properties70) not found",&element);
if(templateProps) {
return templateProps;
}
else {
return boost::make_shared<const PropertyTable>();
}
}
return boost::make_shared<const PropertyTable>(*Properties70,templateProps);
}
} // !Util
using namespace Util;

View File

@ -91,6 +91,14 @@ void ReadVectorDataArray(std::vector<int>& out, const Element& el);
// read an array of uints
void ReadVectorDataArray(std::vector<unsigned int>& out, const Element& el);
// fetch a property table and the corresponding property template
boost::shared_ptr<const PropertyTable> GetPropertyTable(const Document& doc,
const std::string& templateName,
const Element &element,
const Scope& sc);
} //!Util
} //!FBX
} //!Assimp

View File

@ -65,7 +65,6 @@ Material::Material(const Element& element, const Document& doc, const std::strin
const Element* const ShadingModel = sc["ShadingModel"];
const Element* const MultiLayer = sc["MultiLayer"];
const Element* const Properties70 = sc["Properties70"];
if(MultiLayer) {
multilayer = !!ParseTokenAsInt(GetRequiredToken(*MultiLayer,0));
@ -92,26 +91,7 @@ Material::Material(const Element& element, const Document& doc, const std::strin
DOMWarning("shading mode not recognized: " + shading,&element);
}
boost::shared_ptr<const PropertyTable> templateProps = boost::shared_ptr<const PropertyTable>(NULL);
if(templateName.length()) {
PropertyTemplateMap::const_iterator it = doc.Templates().find(templateName);
if(it != doc.Templates().end()) {
templateProps = (*it).second;
}
}
if(!Properties70) {
DOMWarning("material property table (Properties70) not found",&element);
if(templateProps) {
props = templateProps;
}
else {
props = boost::make_shared<const PropertyTable>();
}
}
else {
props = boost::make_shared<const PropertyTable>(*Properties70,templateProps);
}
props = GetPropertyTable(doc,templateName,element,sc);
}