[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