[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47981] branches/soc-2012-bratwurst/source /blender/assimp: - bf_assimp: first version of my ArmatureImporter in which the result looks at least halfway right .

Alexander Gessler alexander.gessler at gmx.net
Sat Jun 16 01:54:52 CEST 2012


Revision: 47981
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47981
Author:   aramis_acg
Date:     2012-06-15 23:54:51 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
- bf_assimp: first version of my ArmatureImporter in which the result looks at least halfway right.
- bf_assimp: slight refactoring, move ai matrix to blend matrix conversion to util.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/assimp/CMakeLists.txt
    branches/soc-2012-bratwurst/source/blender/assimp/MaterialImporter.h
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h
    branches/soc-2012-bratwurst/source/blender/assimp/bassimp_internal.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/bassimp_internal.h

Added Paths:
-----------
    branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.h
    branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.h

Added: branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.cpp
===================================================================
Added: branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.h	                        (rev 0)
+++ branches/soc-2012-bratwurst/source/blender/assimp/AnimationImporter.h	2012-06-15 23:54:51 UTC (rev 47981)
@@ -0,0 +1,67 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Gessler
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file MaterialImporter.h
+ *  \ingroup assimp
+ */
+
+#ifndef INCLUDED_ANIMATIONIMPORTER_H
+#define INCLUDED_ANIMATIONIMPORTER_H
+
+#include <string>
+#include "bassimp_shared.h"
+
+namespace bassimp {
+
+
+
+class AnimationImporter 
+{
+private:
+
+	bArmature* armature;
+	Scene* out_scene;
+	const aiAnimation* in_anim;
+	unsigned int in_anim_index;
+	const aiScene* in_scene;
+
+	const SceneImporter& scene_imp;
+	
+
+private:
+
+	void error(const char* message);
+	void verbose(const char* message);
+
+public:
+
+	AnimationImporter(const SceneImporter& scene_imp, const aiAnimation* in_anim, const aiScene* in_scene, Scene* out_scene, unsigned int in_anim_index);
+	~AnimationImporter();
+
+	// run conversion
+	void convert();
+
+};
+
+}
+
+#endif

Added: branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.cpp	                        (rev 0)
+++ branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.cpp	2012-06-15 23:54:51 UTC (rev 47981)
@@ -0,0 +1,218 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Gessler
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/assimp/MeshImporter.cpp
+ *  \ingroup assimp
+ */
+
+#include <cassert>
+#include <sstream>
+
+#include "SceneImporter.h"
+#include "ArmatureImporter.h"
+#include "bassimp_internal.h"
+#include "ED_armature.h"
+
+extern "C" {
+#	include "BKE_global.h"
+#	include "BKE_main.h"
+#	include "BKE_mesh.h"
+#	include "BKE_displist.h"
+#	include "BKE_library.h"
+#	include "BKE_material.h"
+#	include "BKE_texture.h"
+#	include "BKE_armature.h"
+#	include "BKE_depsgraph.h"
+
+#	include "MEM_guardedalloc.h"
+
+#	include "BLI_listbase.h"
+#	include "BLI_math.h"
+#	include "BLI_string.h"
+}
+
+namespace bassimp {
+
+ArmatureImporter::ArmatureImporter(const SceneImporter& scene_imp,  const aiScene* in_scene, Scene *out_scene)
+: out_scene(out_scene)
+, armature()
+, in_scene(in_scene)
+, scene_imp(scene_imp)
+{
+	assert(out_scene);
+	assert(in_scene);
+}
+
+
+ArmatureImporter::~ArmatureImporter()
+{
+	if (ob_armature) {
+		BKE_libblock_free(&G.main->armature,armature);
+	}
+}
+
+
+void ArmatureImporter::error(const char* message)
+{
+	scene_imp.error((message + std::string(" (armature)")).c_str());
+}
+
+
+void ArmatureImporter::verbose(const char* message)
+{
+	scene_imp.verbose((message + std::string(" (armature)")).c_str());
+}
+
+Object* ArmatureImporter::get_armature() const
+{
+	return ob_armature;
+}
+
+
+Object* ArmatureImporter::disown_armature()
+{
+	Object* m = ob_armature;
+	ob_armature = NULL;
+	return m;
+}
+
+
+void ArmatureImporter::compute_world_matrix(const aiNode* node, const aiMatrix4x4& parentWorld)
+{
+	// "the limit of my matrix means the limit of my world" or something like that.
+	const aiMatrix4x4 myWorld = parentWorld * node->mTransformation;
+	node_to_world_matrix[node] = myWorld;
+	
+	for (unsigned int i = 0; i < node->mNumChildren; ++i) {
+		compute_world_matrix(node->mChildren[i],myWorld);
+	}
+}
+
+
+void ArmatureImporter::get_world_matrix(const aiNode* node, float out[4][4])
+{
+	assert(node_to_world_matrix.find(node) != node_to_world_matrix.end());
+	copy_ai_matrix(out, node_to_world_matrix[node] );
+}
+
+
+void ArmatureImporter::convert_node(const aiNode* node, EditBone* parent, const aiNode* parentNode, unsigned int totchild)
+{
+	EditBone* const bone = ED_armature_edit_bone_add(armature, (char *)node->mName.data);
+	if(parent != NULL)
+	{
+		bone->parent = parent;
+	}
+	else {
+		// make this the active bone for the armature
+		armature->act_edbone = bone;
+	}
+
+	float obmat[4][4];
+	if(parentNode != NULL)
+	{
+		get_world_matrix(parentNode,obmat);
+	}
+	else {
+		for (unsigned int y = 0; y < 4; ++y) {
+			for (unsigned int x = 0; x < 4; ++x)	{
+				obmat[x][y] = (x == y ? 1.0f : 0.0f);
+			}
+		}
+	}
+
+	float loc[3], size[3], rot[3][3], angle;
+	mat4_to_loc_rot_size(loc, rot, size, obmat);
+	mat3_to_vec_roll(rot, NULL, &angle);
+	bone->roll = angle;
+
+	// set head
+	copy_v3_v3(bone->head, obmat[3]);
+
+	// set tail, don't set it to head because 0-length bones are not allowed
+	float vec[3] = {0.0f, 0.5f, 0.0f};
+	add_v3_v3v3(bone->tail, bone->head, vec);
+
+	// set parent tail
+	if (parent && totchild == 1) {
+		copy_v3_v3(parent->tail, bone->head);
+
+		// not setting BONE_CONNECTED because this would lock child bone location with respect to parent
+		// bone->flag |= BONE_CONNECTED;
+
+		// XXX increase this to prevent "very" small bones?
+		const float epsilon = 0.000001f;
+
+	
+		/*// derive leaf bone length
+		float length = len_v3v3(parent->head, parent->tail);
+		if ((length < leaf_bone_length || totbone == 0) && length > epsilon) {
+			leaf_bone_length = length;
+		}
+
+		// treat zero-sized bone like a leaf bone
+		if (length <= epsilon) {
+			add_leaf_bone(parent_mat, parent, node);
+		} */
+	}
+
+	for(unsigned int i = 0; i < node->mNumChildren; ++i) {
+		convert_node(node->mChildren[i],bone,node,node->mNumChildren);
+	}
+
+	/*
+	// in second case it's not a leaf bone, but we handle it the same way
+	if (!children.getCount() || children.getCount() > 1) {
+		add_leaf_bone(mat, bone, node);
+	} */
+}
+
+
+void ArmatureImporter::convert()
+{
+	// first cache world matrices for all nodes
+	compute_world_matrix(in_scene->mRootNode,aiMatrix4x4());
+
+	// create a new object and attach a also new armature
+	ob_armature = util_add_object(out_scene, OB_ARMATURE, NULL);
+
+	armature = BKE_armature_add("armature");
+	verbose("converting armature");
+
+	bArmature* const old_armature = static_cast<bArmature*>(ob_armature->data);
+	ob_armature->data = armature;
+	if (--old_armature->id.us == 0) {
+		BKE_libblock_free(&G.main->armature, old_armature);
+	}
+
+	// enter armature edit mode
+	ED_armature_to_edit(ob_armature);
+
+	convert_node(in_scene->mRootNode,NULL,NULL,1);
+
+	// exit armature edit mode
+	ED_armature_from_edit(ob_armature);
+	ED_armature_edit_free(ob_armature);
+	DAG_id_tag_update(&ob_armature->id, OB_RECALC_OB | OB_RECALC_DATA);
+}
+
+}

Added: branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.h	                        (rev 0)
+++ branches/soc-2012-bratwurst/source/blender/assimp/ArmatureImporter.h	2012-06-15 23:54:51 UTC (rev 47981)
@@ -0,0 +1,79 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Gessler
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file MaterialImporter.h
+ *  \ingroup assimp
+ */
+
+#ifndef INCLUDED_ARMATUREIMPORTER_H
+#define INCLUDED_ARMATUREIMPORTER_H
+
+#include <string>
+#include <map>
+
+#include "bassimp_shared.h"
+
+struct EditBone;
+
+namespace bassimp {
+
+class ArmatureImporter 
+{
+private:
+
+	Object* ob_armature;
+	bArmature* armature;
+	Scene* out_scene;
+	const aiScene* in_scene;
+
+	const SceneImporter& scene_imp;
+
+	std::map<const aiNode*,aiMatrix4x4> node_to_world_matrix;
+
+private:
+
+	void error(const char* message);
+	void verbose(const char* message);
+
+	void compute_world_matrix(const aiNode* node, const aiMatrix4x4& parentWorld);
+	void get_world_matrix(const aiNode* node, float out[4][4]);
+
+	void convert_node(const aiNode* node, EditBone* parent, const aiNode* node_parent, unsigned int totchild);
+
+public:
+
+	ArmatureImporter(const SceneImporter& scene_imp, const aiScene* in_scene, Scene* out_scene);
+	~ArmatureImporter();
+
+	// run conversion
+	void convert();
+
+	// get converted armature, but ownership of the object stays here

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list