nuclear@0: /* nuclear@0: Open Asset Import Library (assimp) nuclear@0: ---------------------------------------------------------------------- nuclear@0: nuclear@0: Copyright (c) 2006-2012, assimp team nuclear@0: All rights reserved. nuclear@0: nuclear@0: Redistribution and use of this software in source and binary forms, nuclear@0: with or without modification, are permitted provided that the nuclear@0: following conditions are met: nuclear@0: nuclear@0: * Redistributions of source code must retain the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer. nuclear@0: nuclear@0: * Redistributions in binary form must reproduce the above nuclear@0: copyright notice, this list of conditions and the nuclear@0: following disclaimer in the documentation and/or other nuclear@0: materials provided with the distribution. nuclear@0: nuclear@0: * Neither the name of the assimp team, nor the names of its nuclear@0: contributors may be used to endorse or promote products nuclear@0: derived from this software without specific prior nuclear@0: written permission of the assimp team. nuclear@0: nuclear@0: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS nuclear@0: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT nuclear@0: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR nuclear@0: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT nuclear@0: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, nuclear@0: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT nuclear@0: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, nuclear@0: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY nuclear@0: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT nuclear@0: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE nuclear@0: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. nuclear@0: nuclear@0: ---------------------------------------------------------------------- nuclear@0: */ nuclear@0: nuclear@0: /** @file FBXModel.cpp nuclear@0: * @brief Assimp::FBX::Model implementation nuclear@0: */ nuclear@0: #include "AssimpPCH.h" nuclear@0: nuclear@0: #ifndef ASSIMP_BUILD_NO_FBX_IMPORTER nuclear@0: nuclear@0: #include "FBXParser.h" nuclear@0: #include "FBXDocument.h" nuclear@0: #include "FBXImporter.h" nuclear@0: #include "FBXImportSettings.h" nuclear@0: #include "FBXDocumentUtil.h" nuclear@0: #include "FBXProperties.h" nuclear@0: nuclear@0: namespace Assimp { nuclear@0: namespace FBX { nuclear@0: nuclear@0: using namespace Util; nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: Model::Model(uint64_t id, const Element& element, const Document& doc, const std::string& name) nuclear@0: : Object(id,element,name) nuclear@0: , shading("Y") nuclear@0: { nuclear@0: const Scope& sc = GetRequiredScope(element); nuclear@0: const Element* const Shading = sc["Shading"]; nuclear@0: const Element* const Culling = sc["Culling"]; nuclear@0: nuclear@0: if(Shading) { nuclear@0: shading = GetRequiredToken(*Shading,0).StringContents(); nuclear@0: } nuclear@0: nuclear@0: if (Culling) { nuclear@0: culling = ParseTokenAsString(GetRequiredToken(*Culling,0)); nuclear@0: } nuclear@0: nuclear@0: props = GetPropertyTable(doc,"Model.FbxNode",element,sc); nuclear@0: ResolveLinks(element,doc); nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: Model::~Model() nuclear@0: { nuclear@0: nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: void Model::ResolveLinks(const Element& element, const Document& doc) nuclear@0: { nuclear@0: const char* const arr[] = {"Geometry","Material","NodeAttribute"}; nuclear@0: nuclear@0: // resolve material nuclear@0: const std::vector& conns = doc.GetConnectionsByDestinationSequenced(ID(),arr, 3); nuclear@0: nuclear@0: materials.reserve(conns.size()); nuclear@0: geometry.reserve(conns.size()); nuclear@0: attributes.reserve(conns.size()); nuclear@0: BOOST_FOREACH(const Connection* con, conns) { nuclear@0: nuclear@0: // material and geometry links should be Object-Object connections nuclear@0: if (con->PropertyName().length()) { nuclear@0: continue; nuclear@0: } nuclear@0: nuclear@0: const Object* const ob = con->SourceObject(); nuclear@0: if(!ob) { nuclear@0: DOMWarning("failed to read source object for incoming Model link, ignoring",&element); nuclear@0: continue; nuclear@0: } nuclear@0: nuclear@0: const Material* const mat = dynamic_cast(ob); nuclear@0: if(mat) { nuclear@0: materials.push_back(mat); nuclear@0: continue; nuclear@0: } nuclear@0: nuclear@0: const Geometry* const geo = dynamic_cast(ob); nuclear@0: if(geo) { nuclear@0: geometry.push_back(geo); nuclear@0: continue; nuclear@0: } nuclear@0: nuclear@0: const NodeAttribute* const att = dynamic_cast(ob); nuclear@0: if(att) { nuclear@0: attributes.push_back(att); nuclear@0: continue; nuclear@0: } nuclear@0: nuclear@0: DOMWarning("source object for model link is neither Material, NodeAttribute nor Geometry, ignoring",&element); nuclear@0: continue; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: nuclear@0: // ------------------------------------------------------------------------------------------------ nuclear@0: bool Model::IsNull() const nuclear@0: { nuclear@0: const std::vector& attrs = GetAttributes(); nuclear@0: BOOST_FOREACH(const NodeAttribute* att, attrs) { nuclear@0: nuclear@0: const Null* null_tag = dynamic_cast(att); nuclear@0: if(null_tag) { nuclear@0: return true; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: return false; nuclear@0: } nuclear@0: nuclear@0: nuclear@0: } //!FBX nuclear@0: } //!Assimp nuclear@0: nuclear@0: #endif