diff --git a/code/CMakeLists.txt b/code/CMakeLists.txt index 0278b8e6e..61b592bd8 100644 --- a/code/CMakeLists.txt +++ b/code/CMakeLists.txt @@ -415,6 +415,7 @@ SET(FBX_SRCS FBXMaterial.cpp FBXModel.cpp FBXAnimation.cpp + FBXNodeAttribute.cpp ) SOURCE_GROUP( FBX FILES ${FBX_SRCS}) diff --git a/code/FBXDocument.h b/code/FBXDocument.h index d69544e2e..d6c502846 100644 --- a/code/FBXDocument.h +++ b/code/FBXDocument.h @@ -148,6 +148,60 @@ protected: }; + +/** DOM class for generic FBX NoteAttribute blocks. NoteAttributes just hold a property table, + * actualy members are added by deriving classes. */ +class NodeAttribute : public Object +{ +public: + + NodeAttribute(uint64_t id, const Element& element, const Document& doc, const std::string& name); + ~NodeAttribute(); + +public: + + const PropertyTable& Props() const { + ai_assert(props.get()); + return *props.get(); + } + +private: + + boost::shared_ptr props; +}; + + +/** DOM base class for FBX camera settings attached to a node */ +class Camera : public NodeAttribute +{ +public: + + Camera(uint64_t id, const Element& element, const Document& doc, const std::string& name); + ~Camera(); + +public: + + int CameraID() const { + return cameraId; + } + + const std::string& CameraName() const { + return cameraName; + } + + + const std::string& CameraIndexName() const { + return cameraIndexName; + } + +private: + + int cameraId; + std::string cameraName; + std::string cameraIndexName; +}; + + /** DOM base class for FBX models (even though its semantics are more "node" than "model" */ class Model : public Object { diff --git a/code/FBXNodeAttribute.cpp b/code/FBXNodeAttribute.cpp new file mode 100644 index 000000000..76ec8dfe4 --- /dev/null +++ b/code/FBXNodeAttribute.cpp @@ -0,0 +1,110 @@ +/* +Open Asset Import Library (assimp) +---------------------------------------------------------------------- + +Copyright (c) 2006-2012, assimp 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 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 FBXNoteAttribute.cpp + * @brief Assimp::FBX::NodeAttribute (and subclasses) implementation + */ +#include "AssimpPCH.h" + +#ifndef ASSIMP_BUILD_NO_FBX_IMPORTER + +#include "FBXParser.h" +#include "FBXDocument.h" +#include "FBXImporter.h" +#include "FBXImportSettings.h" +#include "FBXDocumentUtil.h" +#include "FBXProperties.h" + +namespace Assimp { +namespace FBX { + + using namespace Util; + +// ------------------------------------------------------------------------------------------------ +NodeAttribute::NodeAttribute(uint64_t id, const Element& element, const Document& doc, const std::string& name) + : Object(id,element,name) +{ + const Scope& sc = GetRequiredScope(element); + + const std::string& classname = ParseTokenAsString(GetRequiredToken(element,2)); + props = GetPropertyTable(doc,"NodeAttribute.Fbx" + classname,element,sc); +} + + +// ------------------------------------------------------------------------------------------------ +NodeAttribute::~NodeAttribute() +{ + +} + + +// ------------------------------------------------------------------------------------------------ +Camera::Camera(uint64_t id, const Element& element, const Document& doc, const std::string& name) + : NodeAttribute(id,element,doc,name) +{ + const Scope& sc = GetRequiredScope(element); + const Element* const CameraId = sc["CameraId"]; + const Element* const CameraName = sc["CameraName"]; + const Element* const CameraIndexName = sc["CameraIndexName"]; + + if(CameraId) { + cameraId = ParseTokenAsInt(GetRequiredToken(*CameraId,0)); + } + + if(CameraName) { + cameraName = GetRequiredToken(*CameraName,0).StringContents(); + } + + if(CameraIndexName) { + cameraIndexName = GetRequiredToken(*CameraIndexName,0).StringContents(); + } +} + + +// ------------------------------------------------------------------------------------------------ +Camera::~Camera() +{ + +} + +} +} + +#endif diff --git a/workspaces/vc9/assimp.vcproj b/workspaces/vc9/assimp.vcproj index 1e6e03d5c..763c51df0 100644 --- a/workspaces/vc9/assimp.vcproj +++ b/workspaces/vc9/assimp.vcproj @@ -2107,6 +2107,10 @@ RelativePath="..\..\code\FBXModel.cpp" > + +