Blender V4.3
SkinInfo.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#pragma once
10
11#include <map>
12#include <vector>
13
14#include "COLLADAFWNode.h"
15#include "COLLADAFWSkinController.h"
16#include "COLLADAFWSkinControllerData.h"
17#include "COLLADAFWTypes.h"
18#include "COLLADAFWUniqueId.h"
19
20#include "BKE_context.hh"
21#include "DNA_object_types.h"
22
23#include "TransformReader.h"
24#include "collada_internal.h"
25
31class SkinInfo {
32 private:
33 /* to build armature bones from inverse bind matrices */
34 struct JointData {
35 float inv_bind_mat[4][4]; /* joint inverse bind matrix */
36 COLLADAFW::UniqueId joint_uid; /* joint node UID */
37 // Object *ob_arm; /* armature object */
38 };
39
40 float bind_shape_matrix[4][4];
41
42 /* data from COLLADAFW::SkinControllerData, each array should be freed */
43 COLLADAFW::UIntValuesArray joints_per_vertex;
44 COLLADAFW::UIntValuesArray weight_indices;
45 COLLADAFW::IntValuesArray joint_indices;
46 // COLLADAFW::FloatOrDoubleArray weights;
47 std::vector<float> weights;
48
49 std::vector<JointData> joint_data; /* index to this vector is joint index */
50
51 UnitConverter *unit_converter;
52
53 Object *ob_arm;
54 COLLADAFW::UniqueId controller_uid;
55 Object *parent;
56
57 public:
59 SkinInfo(const SkinInfo &skin);
61
63 template<typename T> void transfer_array_data(T &src, T &dest);
64
66 void transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src,
67 COLLADAFW::IntValuesArray &dest);
68
69 void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray &src,
70 COLLADAFW::UIntValuesArray &dest);
71
72 void borrow_skin_controller_data(const COLLADAFW::SkinControllerData *skin);
73
74 void free();
75
81 void add_joint(const COLLADABU::Math::Matrix4 &matrix);
82
83 void set_controller(const COLLADAFW::SkinController *co);
84
86 Object *create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer);
87
88 Object *set_armature(Object *ob_arm);
89
90 bool get_joint_inv_bind_matrix(float inv_bind_mat[4][4], COLLADAFW::Node *node);
91
93
94 const COLLADAFW::UniqueId &get_controller_uid();
95
103 bool uses_joint_or_descendant(COLLADAFW::Node *node);
104
105 void link_armature(bContext *C,
106 Object *ob,
107 std::map<COLLADAFW::UniqueId, COLLADAFW::Node *> &joint_by_uid,
108 TransformReader *tm);
109
110 bPoseChannel *get_pose_channel_from_node(COLLADAFW::Node *node);
111
112 void set_parent(Object *_parent);
113
115
116 void find_root_joints(const std::vector<COLLADAFW::Node *> &root_joints,
117 std::map<COLLADAFW::UniqueId, COLLADAFW::Node *> &joint_by_uid,
118 std::vector<COLLADAFW::Node *> &result);
119
120 bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root);
121};
Object is a sort of wrapper for general info.
void find_root_joints(const std::vector< COLLADAFW::Node * > &root_joints, std::map< COLLADAFW::UniqueId, COLLADAFW::Node * > &joint_by_uid, std::vector< COLLADAFW::Node * > &result)
Definition SkinInfo.cpp:291
const COLLADAFW::UniqueId & get_controller_uid()
Definition SkinInfo.cpp:169
void transfer_int_array_data_const(const COLLADAFW::IntValuesArray &src, COLLADAFW::IntValuesArray &dest)
Definition SkinInfo.cpp:71
void set_controller(const COLLADAFW::SkinController *co)
Definition SkinInfo.cpp:116
void link_armature(bContext *C, Object *ob, std::map< COLLADAFW::UniqueId, COLLADAFW::Node * > &joint_by_uid, TransformReader *tm)
Definition SkinInfo.cpp:194
Object * set_armature(Object *ob_arm)
Definition SkinInfo.cpp:140
void borrow_skin_controller_data(const COLLADAFW::SkinControllerData *skin)
Definition SkinInfo.cpp:85
bool uses_joint_or_descendant(COLLADAFW::Node *node)
Definition SkinInfo.cpp:174
Object * BKE_armature_from_object()
Definition SkinInfo.cpp:164
bool get_joint_inv_bind_matrix(float inv_bind_mat[4][4], COLLADAFW::Node *node)
Definition SkinInfo.cpp:150
void add_joint(const COLLADABU::Math::Matrix4 &matrix)
Definition SkinInfo.cpp:109
void transfer_uint_array_data_const(const COLLADAFW::UIntValuesArray &src, COLLADAFW::UIntValuesArray &dest)
Definition SkinInfo.cpp:78
void set_parent(Object *_parent)
Definition SkinInfo.cpp:281
Object * get_parent()
Definition SkinInfo.cpp:286
bool find_node_in_tree(COLLADAFW::Node *node, COLLADAFW::Node *tree_root)
Definition SkinInfo.cpp:317
void transfer_array_data(T &src, T &dest)
Definition SkinInfo.cpp:64
bPoseChannel * get_pose_channel_from_node(COLLADAFW::Node *node)
Definition SkinInfo.cpp:276
Object * create_armature(Main *bmain, Scene *scene, ViewLayer *view_layer)
Definition SkinInfo.cpp:134
void free()
Definition SkinInfo.cpp:101