7 #include "COLLADASWBaseInputElement.h"
8 #include "COLLADASWInstanceController.h"
9 #include "COLLADASWPrimitves.h"
10 #include "COLLADASWSource.h"
32 std::vector<Object *> &child_objects)
38 bool is_edited = armature->
edbo !=
nullptr;
45 add_bone_node(bone, ob_arm, se, child_objects);
53 void ArmatureExporter::write_bone_URLs(COLLADASW::InstanceController &ins,
57 if (
bc_is_root_bone(bone, this->export_settings.get_deform_bones_only())) {
63 write_bone_URLs(ins, ob_arm, child);
73 const std::string &controller_id = get_controller_id(ob_arm, ob);
75 COLLADASW::InstanceController ins(mSW);
86 write_bone_URLs(ins, ob_arm, bone);
90 ins.getBindMaterial(), ob, this->export_settings.get_active_uv_only());
102 bool ArmatureExporter::already_written(
Object *ob_arm)
104 return std::find(written_armatures.begin(), written_armatures.end(), ob_arm) !=
105 written_armatures.end();
108 void ArmatureExporter::wrote(
Object *ob_arm)
110 written_armatures.push_back(ob_arm);
113 void ArmatureExporter::find_objects_using_armature(
Object *ob_arm,
114 std::vector<Object *> &objects,
119 Base *base = (
Base *)sce->base.first;
123 if (ob->
type ==
OB_MESH && get_assigned_armature(ob) == ob_arm) {
124 objects.push_back(ob);
132 void ArmatureExporter::add_bone_node(
Bone *bone,
135 std::vector<Object *> &child_objects)
137 if (can_export(bone)) {
139 std::string node_name = std::string(bone->
name);
142 COLLADASW::Node
node(mSW);
144 node.setType(COLLADASW::Node::JOINT);
145 node.setNodeId(node_id);
146 node.setNodeName(node_name);
147 node.setNodeSid(node_sid);
149 if (this->export_settings.get_use_blender_profile()) {
150 if (!is_export_root(bone)) {
152 node.addExtraTechniqueParameter(
"blender",
"connect",
true);
156 node.addExtraTechniqueParameter(
"blender",
"layer", layers);
160 if (ebone && ebone->roll != 0) {
161 node.addExtraTechniqueParameter(
"blender",
"roll", ebone->roll);
165 const BCMatrix &global_transform = this->export_settings.get_global_transform();
166 if (this->export_settings.get_apply_global_orientation()) {
174 node.addExtraTechniqueParameter(
"blender",
"tip_x", tail[0] - head[0]);
175 node.addExtraTechniqueParameter(
"blender",
"tip_y", tail[1] - head[1]);
176 node.addExtraTechniqueParameter(
"blender",
"tip_z", tail[2] - head[2]);
182 add_bone_transform(ob_arm, bone,
node);
185 std::vector<Object *>::iterator iter = child_objects.begin();
187 while (iter != child_objects.end()) {
190 float backup_parinv[4][4];
205 if (export_settings.get_open_sim()) {
210 temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
217 iter = child_objects.erase(iter);
225 add_bone_node(child, ob_arm, se, child_objects);
231 add_bone_node(child, ob_arm, se, child_objects);
236 bool ArmatureExporter::is_export_root(
Bone *bone)
240 if (can_export(entry)) {
245 return can_export(bone);
248 void ArmatureExporter::add_bone_transform(
Object *ob_arm,
Bone *bone, COLLADASW::Node &
node)
253 float bone_rest_mat[4][4];
254 float parent_rest_mat[4][4];
264 if (is_export_root(bone)) {
268 Matrix parent_inverse;
278 if (export_settings.get_open_sim()) {
284 workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
289 if (!is_export_root(bone)) {
291 workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
298 if (this->export_settings.get_limit_precision()) {
305 std::string ArmatureExporter::get_controller_id(
Object *ob_arm,
Object *ob)
308 SKIN_CONTROLLER_ID_SUFFIX;
Blender kernel action and pose functionality.
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
bool invert_m4(float R[4][4])
bool invert_m4_m4(float R[4][4], const float A[4][4])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
void ED_armature_edit_free(struct bArmature *arm)
void ED_armature_to_edit(bArmature *arm)
bool add_instance_controller(Object *ob)
void add_armature_bones(Object *ob_arm, ViewLayer *view_layer, SceneExporter *se, std::vector< Object * > &child_objects)
static void sanitize(Matrix &matrix, int precision)
void add_material_bindings(COLLADASW::BindMaterial &bind_material, Object *ob, bool active_uv_only)
std::string get_joint_sid(Bone *bone)
std::string translate_id(const char *idString)
std::string id_name(void *id)
bool bc_is_root_bone(Bone *aBone, bool deform_bones_only)
void bc_add_global_transform(Matrix &to_mat, const Matrix &from_mat, const BCMatrix &global_transform, const bool invert)
EditBone * bc_get_edit_bone(bArmature *armature, char *name)
void bc_create_restpose_mat(BCExportSettings &export_settings, Bone *bone, float to_mat[4][4], float from_mat[4][4], bool use_local_space)
bool bc_get_property_matrix(Bone *bone, std::string key, float mat[4][4])
Object * bc_get_assigned_armature(Object *ob)
bool bc_is_leaf_bone(Bone *bone)
constexpr int LIMITTED_PRECISION
@ Vector
Vector data type.
struct MDeformVert * dvert