[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49310] branches/soc-2012-bratwurst: - bf_assimp: merge https://github.com/acgessler/ assimp-gsoc2012-fbx - this adds a first WIP version of animation support and lots of fixes .
Alexander Gessler
alexander.gessler at gmx.net
Sat Jul 28 00:16:12 CEST 2012
Revision: 49310
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49310
Author: aramis_acg
Date: 2012-07-27 22:16:12 +0000 (Fri, 27 Jul 2012)
Log Message:
-----------
- bf_assimp: merge https://github.com/acgessler/assimp-gsoc2012-fbx - this adds a first WIP version of animation support and lots of fixes. It also merges in the latest assimp trunk with some fixes for obj and ifc.
Modified Paths:
--------------
branches/soc-2012-bratwurst/extern/assimp/CMakeLists.txt
branches/soc-2012-bratwurst/extern/assimp/code/FBXConverter.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXDocument.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXDocument.h
branches/soc-2012-bratwurst/extern/assimp/code/FBXDocumentUtil.h
branches/soc-2012-bratwurst/extern/assimp/code/FBXImportSettings.h
branches/soc-2012-bratwurst/extern/assimp/code/FBXMeshGeometry.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXModel.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXProperties.cpp
branches/soc-2012-bratwurst/extern/assimp/code/IFCCurve.cpp
branches/soc-2012-bratwurst/extern/assimp/code/IFCGeometry.cpp
branches/soc-2012-bratwurst/extern/assimp/code/IFCLoader.cpp
branches/soc-2012-bratwurst/extern/assimp/code/IFCReaderGen.cpp
branches/soc-2012-bratwurst/extern/assimp/code/IFCReaderGen.h
branches/soc-2012-bratwurst/extern/assimp/code/IFCUtil.h
branches/soc-2012-bratwurst/extern/assimp/code/MemoryIOWrapper.h
branches/soc-2012-bratwurst/extern/assimp/code/ObjTools.h
branches/soc-2012-bratwurst/extern/assimp/code/OgreImporter.cpp
branches/soc-2012-bratwurst/extern/assimp/code/OgreMesh.cpp
branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.cpp
branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.cpp
Added Paths:
-----------
branches/soc-2012-bratwurst/extern/assimp/code/FBXAnimation.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXDeformer.cpp
branches/soc-2012-bratwurst/extern/assimp/code/FBXNodeAttribute.cpp
Modified: branches/soc-2012-bratwurst/extern/assimp/CMakeLists.txt
===================================================================
--- branches/soc-2012-bratwurst/extern/assimp/CMakeLists.txt 2012-07-27 21:59:47 UTC (rev 49309)
+++ branches/soc-2012-bratwurst/extern/assimp/CMakeLists.txt 2012-07-27 22:16:12 UTC (rev 49310)
@@ -303,6 +303,9 @@
code/FBXModel.cpp
code/FBXProperties.cpp
code/FBXProperties.h
+ code/FBXNodeAttribute.cpp
+ code/FBXDeformer.cpp
+ code/FBXAnimation.cpp
)
Added: branches/soc-2012-bratwurst/extern/assimp/code/FBXAnimation.cpp
===================================================================
--- branches/soc-2012-bratwurst/extern/assimp/code/FBXAnimation.cpp (rev 0)
+++ branches/soc-2012-bratwurst/extern/assimp/code/FBXAnimation.cpp 2012-07-27 22:16:12 UTC (rev 49310)
@@ -0,0 +1,260 @@
+/*
+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 FBXAnimation.cpp
+ * @brief Assimp::FBX::AnimationCurve, Assimp::FBX::AnimationCurveNode,
+ * Assimp::FBX::AnimationLayer, Assimp::FBX::AnimationStack
+ */
+#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;
+
+// ------------------------------------------------------------------------------------------------
+AnimationCurve::AnimationCurve(uint64_t id, const Element& element, const std::string& name, const Document& doc)
+: Object(id, element, name)
+{
+ const Scope& sc = GetRequiredScope(element);
+ const Element& KeyTime = GetRequiredElement(sc,"KeyTime");
+ const Element& KeyValueFloat = GetRequiredElement(sc,"KeyValueFloat");
+
+ ReadVectorDataArray(keys, KeyTime);
+ ReadVectorDataArray(values, KeyValueFloat);
+
+ if(keys.size() != values.size()) {
+ DOMError("the number of key times does not match the number of keyframe values",&KeyTime);
+ }
+
+ // check if the key times are well-ordered
+ if(!std::equal(keys.begin(), keys.end() - 1, keys.begin() + 1, std::less<KeyTimeList::value_type>())) {
+ DOMError("the keyframes are not in ascending order",&KeyTime);
+ }
+
+ const Element* KeyAttrDataFloat = sc["KeyAttrDataFloat"];
+ if(KeyAttrDataFloat) {
+ ReadVectorDataArray(attributes, *KeyAttrDataFloat);
+ }
+
+ const Element* KeyAttrFlags = sc["KeyAttrFlags"];
+ if(KeyAttrFlags) {
+ ReadVectorDataArray(flags, *KeyAttrFlags);
+ }
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationCurve::~AnimationCurve()
+{
+
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationCurveNode::AnimationCurveNode(uint64_t id, const Element& element, const std::string& name, const Document& doc)
+: Object(id, element, name)
+, target()
+{
+ const Scope& sc = GetRequiredScope(element);
+ props = GetPropertyTable(doc,"AnimationCurveNode.FbxAnimCurveNode",element,sc);
+
+ {
+ // resolve attached animation curves
+ const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(ID(),"AnimationCurve");
+
+ BOOST_FOREACH(const Connection* con, conns) {
+
+ // link should go for a property
+ if (!con->PropertyName().length()) {
+ continue;
+ }
+
+ const Object* const ob = con->SourceObject();
+ if(!ob) {
+ DOMWarning("failed to read source object for AnimationCurve->AnimationCurveNode link, ignoring",&element);
+ continue;
+ }
+
+ const AnimationCurve* const anim = dynamic_cast<const AnimationCurve*>(ob);
+ if(!anim) {
+ DOMWarning("source object for ->AnimationCurveNode link is not an AnimationCurve",&element);
+ continue;
+ }
+
+ curves[con->PropertyName()] = anim;
+ }
+
+ }{
+
+ // find target node
+ const char* whitelist[] = {"Model","NodeAttribute"};
+ const std::vector<const Connection*>& conns = doc.GetConnectionsBySourceSequenced(ID(),whitelist,2);
+
+ BOOST_FOREACH(const Connection* con, conns) {
+
+ // link should go for a property
+ if (!con->PropertyName().length()) {
+ continue;
+ }
+
+ const Object* const ob = con->DestinationObject();
+ if(!ob) {
+ DOMWarning("failed to read destination object for AnimationCurveNode->Model link, ignoring",&element);
+ continue;
+ }
+
+ // XXX support constraints as DOM class
+ //ai_assert(dynamic_cast<const Model*>(ob) || dynamic_cast<const NodeAttribute*>(ob));
+ target = ob;
+ if(!target) {
+ continue;
+ }
+
+ prop = con->PropertyName();
+ break;
+ }
+ }
+ if(!target) {
+ DOMWarning("failed to resolve target Model/NodeAttribute/Constraint for AnimationCurveNode",&element);
+ }
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationCurveNode::~AnimationCurveNode()
+{
+
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationLayer::AnimationLayer(uint64_t id, const Element& element, const std::string& name, const Document& doc)
+: Object(id, element, name)
+{
+ const Scope& sc = GetRequiredScope(element);
+ props = GetPropertyTable(doc,"AnimationLayer.FbxAnimLayer",element,sc);
+
+ // resolve attached animation nodes
+ const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(ID(),"AnimationCurveNode");
+ nodes.reserve(conns.size());
+
+ BOOST_FOREACH(const Connection* con, conns) {
+
+ // link should not go to a property
+ if (con->PropertyName().length()) {
+ continue;
+ }
+
+ const Object* const ob = con->SourceObject();
+ if(!ob) {
+ DOMWarning("failed to read source object for AnimationCurveNode->AnimationLayer link, ignoring",&element);
+ continue;
+ }
+
+ const AnimationCurveNode* const anim = dynamic_cast<const AnimationCurveNode*>(ob);
+ if(!anim) {
+ DOMWarning("source object for ->AnimationLayer link is not an AnimationCurveNode",&element);
+ continue;
+ }
+ nodes.push_back(anim);
+ }
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationLayer::~AnimationLayer()
+{
+
+}
+
+// ------------------------------------------------------------------------------------------------
+AnimationStack::AnimationStack(uint64_t id, const Element& element, const std::string& name, const Document& doc)
+: Object(id, element, name)
+{
+ const Scope& sc = GetRequiredScope(element);
+ props = GetPropertyTable(doc,"AnimationStack.FbxAnimStack",element,sc);
+
+ // resolve attached animation layers
+ const std::vector<const Connection*>& conns = doc.GetConnectionsByDestinationSequenced(ID(),"AnimationLayer");
+ layers.reserve(conns.size());
+
+ BOOST_FOREACH(const Connection* con, conns) {
+
+ // link should not go to a property
+ if (con->PropertyName().length()) {
+ continue;
+ }
+
+ const Object* const ob = con->SourceObject();
+ if(!ob) {
+ DOMWarning("failed to read source object for AnimationLayer->AnimationStack link, ignoring",&element);
+ continue;
+ }
+
+ const AnimationLayer* const anim = dynamic_cast<const AnimationLayer*>(ob);
+ if(!anim) {
+ DOMWarning("source object for ->AnimationStack link is not an AnimationLayer",&element);
+ continue;
+ }
+ layers.push_back(anim);
+ }
+}
+
+
+// ------------------------------------------------------------------------------------------------
+AnimationStack::~AnimationStack()
+{
+
+}
+
+} //!FBX
+} //!Assimp
+
+#endif
Modified: branches/soc-2012-bratwurst/extern/assimp/code/FBXConverter.cpp
===================================================================
--- branches/soc-2012-bratwurst/extern/assimp/code/FBXConverter.cpp 2012-07-27 21:59:47 UTC (rev 49309)
+++ branches/soc-2012-bratwurst/extern/assimp/code/FBXConverter.cpp 2012-07-27 22:16:12 UTC (rev 49310)
@@ -45,6 +45,8 @@
#ifndef ASSIMP_BUILD_NO_FBX_IMPORTER
+#include <boost/tuple/tuple.hpp>
+
#include "FBXParser.h"
#include "FBXConverter.h"
#include "FBXDocument.h"
@@ -57,19 +59,52 @@
using namespace Util;
+
+#define MAGIC_NODE_TAG "_$AssimpFbx$"
+
// XXX vc9's debugger won't step into anonymous namespaces
//namespace {
/** Dummy class to encapsulate the conversion process */
class Converter
{
+public:
+ /** the different parts that make up the final local transformation of a fbx node */
+ enum TransformationComp
+ {
+ TransformationComp_Translation = 0,
+ TransformationComp_RotationOffset,
+ TransformationComp_RotationPivot,
+ TransformationComp_PreRotation,
+ TransformationComp_Rotation,
+ TransformationComp_PostRotation,
+ TransformationComp_RotationPivotInverse,
+ TransformationComp_ScalingOffset,
+ TransformationComp_ScalingPivot,
+ TransformationComp_Scaling,
+ TransformationComp_ScalingPivotInverse,
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list