Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/io/collada/ArmatureImporter.h')
-rw-r--r--source/blender/io/collada/ArmatureImporter.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/source/blender/io/collada/ArmatureImporter.h b/source/blender/io/collada/ArmatureImporter.h
new file mode 100644
index 00000000000..da92c04e5dc
--- /dev/null
+++ b/source/blender/io/collada/ArmatureImporter.h
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+/** \file
+ * \ingroup collada
+ */
+
+#ifndef __ARMATUREIMPORTER_H__
+#define __ARMATUREIMPORTER_H__
+
+#include "COLLADAFWNode.h"
+#include "COLLADAFWUniqueId.h"
+#include "COLLADAFWMorphController.h"
+
+extern "C" {
+#include "BKE_context.h"
+#include "BKE_key.h"
+
+#include "DNA_armature_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_key_types.h"
+
+#include "ED_armature.h"
+}
+
+#include "AnimationImporter.h"
+#include "MeshImporter.h"
+#include "SkinInfo.h"
+#include "TransformReader.h"
+#include "ExtraTags.h"
+
+#include <map>
+#include <vector>
+
+#include "collada_internal.h"
+#include "collada_utils.h"
+#include "ImportSettings.h"
+
+#define UNLIMITED_CHAIN_MAX INT_MAX
+#define MINIMUM_BONE_LENGTH 0.000001f
+
+class ArmatureImporter : private TransformReader {
+ private:
+ Main *m_bmain;
+ Scene *scene;
+ ViewLayer *view_layer;
+ UnitConverter *unit_converter;
+ const ImportSettings *import_settings;
+
+ // std::map<int, JointData> joint_index_to_joint_info_map;
+ // std::map<COLLADAFW::UniqueId, int> joint_id_to_joint_index_map;
+ BoneExtensionManager bone_extension_manager;
+ // int bone_direction_row; // XXX not used
+ float leaf_bone_length;
+ int totbone;
+ // XXX not used
+ // float min_angle; // minimum angle between bone head-tail and a row of bone matrix
+
+#if 0
+ struct ArmatureJoints {
+ Object *ob_arm;
+ std::vector<COLLADAFW::Node *> root_joints;
+ };
+ std::vector<ArmatureJoints> armature_joints;
+#endif
+
+ Object *empty; // empty for leaf bones
+
+ std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
+ std::map<COLLADAFW::UniqueId, COLLADAFW::Node *> joint_by_uid; // contains all joints
+ std::vector<COLLADAFW::Node *> root_joints;
+ std::vector<COLLADAFW::Node *> finished_joints;
+ std::vector<COLLADAFW::MorphController *> morph_controllers;
+ std::map<COLLADAFW::UniqueId, Object *> joint_parent_map;
+ std::map<COLLADAFW::UniqueId, Object *> unskinned_armature_map;
+
+ MeshImporterBase *mesh_importer;
+
+ // This is used to store data passed in write_controller_data.
+ // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this class members
+ // so that arrays don't get freed until we free them explicitly.
+
+ std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = skin controller data UID
+#if 0
+ JointData *get_joint_data(COLLADAFW::Node *node);
+#endif
+
+ int create_bone(SkinInfo *skin,
+ COLLADAFW::Node *node,
+ EditBone *parent,
+ int totchild,
+ float parent_mat[4][4],
+ bArmature *arm,
+ std::vector<std::string> &layer_labels);
+
+ BoneExtended &add_bone_extended(EditBone *bone,
+ COLLADAFW::Node *node,
+ int sibcount,
+ std::vector<std::string> &layer_labels,
+ BoneExtensionMap &extended_bones);
+
+ void fix_leaf_bone_hierarchy(bArmature *armature, Bone *bone, bool fix_orientation);
+ void fix_leaf_bone(bArmature *armature, EditBone *ebone, BoneExtended *be, bool fix_orientation);
+ void fix_parent_connect(bArmature *armature, Bone *bone);
+ void connect_bone_chains(bArmature *armature, Bone *bone, const int max_chain_length);
+
+ void set_pose(Object *ob_arm,
+ COLLADAFW::Node *root_node,
+ const char *parentname,
+ float parent_mat[4][4]);
+
+ void set_bone_transformation_type(const COLLADAFW::Node *node, Object *ob_arm);
+ bool node_is_decomposed(const COLLADAFW::Node *node);
+#if 0
+ void set_leaf_bone_shapes(Object *ob_arm);
+ void set_euler_rotmode();
+#endif
+
+ Object *get_empty_for_leaves();
+
+#if 0
+ Object *find_armature(COLLADAFW::Node *node);
+
+ ArmatureJoints &get_armature_joints(Object *ob_arm);
+#endif
+
+ Object *create_armature_bones(Main *bmain, SkinInfo &skin);
+ void create_armature_bones(Main *bmain, std::vector<Object *> &arm_objs);
+
+ /** TagsMap typedef for uid_tags_map. */
+ typedef std::map<std::string, ExtraTags *> TagsMap;
+ TagsMap uid_tags_map;
+
+ public:
+ ArmatureImporter(UnitConverter *conv,
+ MeshImporterBase *mesh,
+ Main *bmain,
+ Scene *sce,
+ ViewLayer *view_layer,
+ const ImportSettings *import_settings);
+ ~ArmatureImporter();
+
+ void add_root_joint(COLLADAFW::Node *node, Object *parent);
+
+ // here we add bones to armatures, having armatures previously created in write_controller
+ void make_armatures(bContext *C, std::vector<Object *> &objects_to_scale);
+
+ void make_shape_keys(bContext *C);
+
+#if 0
+ // link with meshes, create vertex groups, assign weights
+ void link_armature(Object *ob_arm,
+ const COLLADAFW::UniqueId &geom_id,
+ const COLLADAFW::UniqueId &controller_data_id);
+#endif
+
+ bool write_skin_controller_data(const COLLADAFW::SkinControllerData *data);
+
+ bool write_controller(const COLLADAFW::Controller *controller);
+
+ COLLADAFW::UniqueId *get_geometry_uid(const COLLADAFW::UniqueId &controller_uid);
+
+ Object *get_armature_for_joint(COLLADAFW::Node *node);
+
+ void get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count);
+
+ // gives a world-space mat
+ bool get_joint_bind_mat(float m[4][4], COLLADAFW::Node *joint);
+
+ void set_tags_map(TagsMap &tags_map);
+};
+
+#endif