[Bf-blender-cvs] [623fe9412e1] collada: feature: Collada Exporter implement Export option for global axis rotation (wip)
Gaia Clary
noreply at git.blender.org
Wed Apr 10 22:40:42 CEST 2019
Commit: 623fe9412e1e371bbab57d9e72a0b15708ae9aeb
Author: Gaia Clary
Date: Mon Apr 8 19:16:00 2019 +0200
Branches: collada
https://developer.blender.org/rB623fe9412e1e371bbab57d9e72a0b15708ae9aeb
feature: Collada Exporter implement Export option for global axis rotation (wip)
===================================================================
M source/blender/collada/ArmatureExporter.cpp
M source/blender/collada/ControllerExporter.cpp
M source/blender/collada/ControllerExporter.h
M source/blender/collada/GeometryExporter.cpp
M source/blender/collada/GeometryExporter.h
M source/blender/collada/SceneExporter.cpp
M source/blender/collada/TransformWriter.cpp
===================================================================
diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp
index 2da3373725e..e8e87b75072 100644
--- a/source/blender/collada/ArmatureExporter.cpp
+++ b/source/blender/collada/ArmatureExporter.cpp
@@ -44,8 +44,6 @@ extern "C" {
#include "ArmatureExporter.h"
#include "SceneExporter.h"
-#include "collada_utils.h"
-
// write bone nodes
void ArmatureExporter::add_armature_bones(
Object *ob_arm,
@@ -181,9 +179,19 @@ void ArmatureExporter::add_bone_node(
}
if (bc_is_leaf_bone(bone))
{
- node.addExtraTechniqueParameter("blender", "tip_x", bone->arm_tail[0] - bone->arm_head[0]);
- node.addExtraTechniqueParameter("blender", "tip_y", bone->arm_tail[1] - bone->arm_head[1]);
- node.addExtraTechniqueParameter("blender", "tip_z", bone->arm_tail[2] - bone->arm_head[2]);
+ Vector head, tail;
+ const BCMatrix &global_transform = this->export_settings.get_global_transform();
+ if (this->export_settings.get_apply_global_orientation()) {
+ bc_add_global_transform(head, bone->arm_head, global_transform);
+ bc_add_global_transform(tail, bone->arm_tail, global_transform);
+ }
+ else {
+ copy_v3_v3(head, bone->arm_head);
+ copy_v3_v3(tail, bone->arm_tail);
+ }
+ node.addExtraTechniqueParameter("blender", "tip_x", tail[0] - head[0]);
+ node.addExtraTechniqueParameter("blender", "tip_y", tail[1] - head[1]);
+ node.addExtraTechniqueParameter("blender", "tip_z", tail[2] - head[2]);
}
}
@@ -269,39 +277,42 @@ void ArmatureExporter::add_bone_transform(Object *ob_arm, Bone *bone, COLLADASW:
bc_create_restpose_mat(this->export_settings, bone, bone_rest_mat, bone->arm_mat, true);
- if (bone->parent) {
- // get bone-space matrix from parent pose
- /*bPoseChannel *parchan = BKE_pose_channel_find_name(ob_arm->pose, bone->parent->name);
- float invpar[4][4];
- invert_m4_m4(invpar, parchan->pose_mat);
- mul_m4_m4m4(mat, invpar, pchan->pose_mat);*/
- float invpar[4][4];
- bc_create_restpose_mat(this->export_settings, bone->parent, parent_rest_mat, bone->parent->arm_mat, true);
-
- invert_m4_m4(invpar, parent_rest_mat);
- mul_m4_m4m4(mat, invpar, bone_rest_mat);
-
+ if (is_export_root(bone)) {
+ copy_m4_m4(mat, bone_rest_mat);
}
else {
- copy_m4_m4(mat, bone_rest_mat);
+ Matrix parent_inverse;
+ bc_create_restpose_mat(this->export_settings, bone->parent, parent_rest_mat, bone->parent->arm_mat, true);
+
+ invert_m4_m4(parent_inverse, parent_rest_mat);
+ mul_m4_m4m4(mat, parent_inverse, bone_rest_mat);
}
// OPEN_SIM_COMPATIBILITY
if (export_settings.get_open_sim()) {
// Remove rotations vs armature from transform
// parent_rest_rot * mat * irest_rot
- float temp[4][4];
- copy_m4_m4(temp, bone_rest_mat);
- temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
- invert_m4(temp);
+ Matrix workmat;
+ copy_m4_m4(workmat, bone_rest_mat);
- mul_m4_m4m4(mat, mat, temp);
+ workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
+ invert_m4(workmat);
- if (bone->parent) {
- copy_m4_m4(temp, parent_rest_mat);
- temp[3][0] = temp[3][1] = temp[3][2] = 0.0f;
+ mul_m4_m4m4(mat, mat, workmat);
+
+ if (!is_export_root(bone)) {
+ copy_m4_m4(workmat, parent_rest_mat);
+ workmat[3][0] = workmat[3][1] = workmat[3][2] = 0.0f;
+
+ mul_m4_m4m4(mat, workmat, mat);
+
+ if (this->export_settings.get_apply_global_orientation()) {
+ Vector v;
+ copy_v3_v3(v, mat[3]);
+ bc_add_global_transform(v, this->export_settings.get_global_transform());
+ copy_v3_v3(mat[3], v);
+ }
- mul_m4_m4m4(mat, temp, mat);
}
}
}
diff --git a/source/blender/collada/ControllerExporter.cpp b/source/blender/collada/ControllerExporter.cpp
index 0fa9910e891..16d99cf7a7a 100644
--- a/source/blender/collada/ControllerExporter.cpp
+++ b/source/blender/collada/ControllerExporter.cpp
@@ -417,6 +417,12 @@ void ControllerExporter::add_bind_shape_mat(Object *ob)
float f_obmat[4][4];
BKE_object_matrix_local_get(ob, f_obmat);
+ if (export_settings.get_apply_global_orientation()) {
+ }
+ else {
+ bc_add_global_transform(f_obmat, export_settings.get_global_transform());
+ }
+
//UnitConverter::mat4_to_dae_double(bind_mat, ob->obmat);
UnitConverter::mat4_to_dae_double(bind_mat, f_obmat);
if (this->export_settings.get_limit_precision())
@@ -529,6 +535,16 @@ std::string ControllerExporter::add_inv_bind_mats_source(Object *ob_arm, ListBas
// make world-space matrix (bind_mat is armature-space)
mul_m4_m4m4(world, ob_arm->obmat, bind_mat);
+ if (export_settings.get_apply_global_orientation()) {
+ Vector loc;
+ copy_v3_v3(loc,world[3]);
+ bc_add_global_transform(loc, export_settings.get_global_transform());
+ copy_v3_v3(world[3], loc);
+ }
+ else {
+ bc_add_global_transform(world, export_settings.get_global_transform());
+ }
+
invert_m4_m4(mat, world);
UnitConverter::mat4_to_dae(inv_bind_mat, mat);
if (this->export_settings.get_limit_precision())
diff --git a/source/blender/collada/ControllerExporter.h b/source/blender/collada/ControllerExporter.h
index a301bd9dbce..183e008a3d5 100644
--- a/source/blender/collada/ControllerExporter.h
+++ b/source/blender/collada/ControllerExporter.h
@@ -63,8 +63,8 @@ public:
ControllerExporter(BlenderContext &blender_context, COLLADASW::StreamWriter *sw, BCExportSettings &export_settings) :
COLLADASW::LibraryControllers(sw),
blender_context(blender_context),
- export_settings(export_settings) {
- }
+ export_settings(export_settings)
+ {}
bool is_skinned_mesh(Object *ob);
diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp
index 79f381d9f4f..b4dab9e5b8d 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -473,7 +473,14 @@ void GeometryExporter::createVertsSource(std::string geom_id, Mesh *me)
//appends data to <float_array>
int i = 0;
for (i = 0; i < totverts; i++) {
- source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);
+ Vector co;
+ if (export_settings.get_apply_global_orientation()) {
+ bc_add_global_transform(co, verts[i].co, export_settings.get_global_transform());
+ }
+ else {
+ copy_v3_v3(co, verts[i].co);
+ }
+ source.appendValues(co[0], co[1], co[2]);
}
source.finish();
@@ -619,7 +626,13 @@ void GeometryExporter::createNormalsSource(std::string geom_id, Mesh *me, std::v
std::vector<Normal>::iterator it;
for (it = nor.begin(); it != nor.end(); it++) {
Normal& n = *it;
- source.appendValues(n.x, n.y, n.z);
+
+ Vector no{ n.x, n.y, n.z };
+ if (export_settings.get_apply_global_orientation()) {
+ bc_add_global_transform(no, export_settings.get_global_transform());
+ }
+ source.appendValues(no[0], no[1], no[2]);
+
}
source.finish();
diff --git a/source/blender/collada/GeometryExporter.h b/source/blender/collada/GeometryExporter.h
index eb2d3a6aa10..c66d769ea13 100644
--- a/source/blender/collada/GeometryExporter.h
+++ b/source/blender/collada/GeometryExporter.h
@@ -41,8 +41,6 @@
struct Depsgraph;
-extern Object *bc_get_highest_selected_ancestor_or_self(Object *ob);
-
class Normal
{
public:
diff --git a/source/blender/collada/SceneExporter.cpp b/source/blender/collada/SceneExporter.cpp
index 1447fc8acf2..6b1f633ceef 100644
--- a/source/blender/collada/SceneExporter.cpp
+++ b/source/blender/collada/SceneExporter.cpp
@@ -23,10 +23,12 @@ extern "C" {
#include "BKE_collection.h"
#include "BKE_object.h"
#include "BLI_listbase.h"
+ #include "BKE_library.h"
}
#include "SceneExporter.h"
#include "collada_utils.h"
+#include "BCSampleData.h"
void SceneExporter::exportScene()
{
@@ -43,7 +45,7 @@ void SceneExporter::exportScene()
void SceneExporter::exportHierarchy()
{
LinkNode *node;
- std::vector<Object *> base_objects;
+ ColladaBaseNodes base_objects;
// Ensure all objects in the export_set are marked
for (node = this->export_settings.get_export_set(); node; node = node->next) {
@@ -56,24 +58,24 @@ void SceneExporter::exportHierarchy()
Object *ob = (Object *)node->link;
if (this->export_settings.is_export_root(ob)) {
switch (ob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_EMPTY:
- case OB_GPENCIL:
- case OB_ARMATURE:
- base_objects.push_back(ob);
- break;
+ case OB_MESH:
+ case OB_CAMERA:
+ case OB_LAMP:
+ case OB_EMPTY:
+ case OB_GPENCIL:
+ case OB_ARMATURE:
+ base_objects.add(ob);
+ break;
}
}
}
// And now export the base objects:
for (int index = 0; index < base_objects.size(); index++) {
- Object *ob = base_objects[index];
+ Object *ob = base_objects.get(index);
+ writeNode(ob);
if (bc_is_marked(ob)) {
bc_remove_mark(ob);
- writeNode(ob);
}
}
}
@@ -89,9 +91,9 @@ void SceneExporter::writeNodeList(std::vector<Object *> &child_objects, Object *
*/
for (int i = 0; i < child_objects.size(); ++i) {
Object *child = child_objects[i];
+ writeNode(child);
if (bc_is_marked(child)) {
bc_remove_mark(child);
- writeNode(child);
}
}
}
@@ -111,8 +113,8 @@ void SceneExporter::writeNode(Object *ob)
if (ob_arm != NULL) {
armature_exported = bc_is_in_Export_set(this->export_settings.get_export_set(), ob_arm, view_layer);
if (armature_exported && bc_is_marked(ob_arm)) {
- bc_remove_mark(ob_arm);
writeNode(ob_arm);
+ bc_remove_mark(ob_arm);
armature_exported = true;
}
}
@@ -227,7 +229,12 @@ void SceneExporter::writeNode(Object *ob)
}
}
}
+ bc_remove_mark(ob);
writeNodeList(child_objects, ob);
colladaNode.end();
}
+ else {
+ writeNodeList(child_objects, ob);
+ }
}
+
diff --git a/source/blender/collada/TransformWriter.cpp b/source/blender/collada/TransformWriter.cpp
index 2fdd479cbd2..c4199b374a3 100644
--- a/source/blender/collada/TransformWriter.cpp
+++ b/source/blender/collada/TransformWriter.cpp
@@ -70,9 +70,13 @@ void TransformWriter::add_node_transform_ob(
Matrix f_obmat;
BKE_object_matrix_local_get(ob, f_obmat);
- if (false) {
- }
- else {
+ if (export_settings.is_export_root(ob)) {
+ if (export_settings.get_apply_global_orientation()) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list