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/collada/collada_utils.cpp')
-rw-r--r--source/blender/collada/collada_utils.cpp183
1 files changed, 65 insertions, 118 deletions
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index c0e3ab2ca47..9e8896c2b9f 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -60,6 +60,7 @@ extern "C" {
#include "ED_armature.h"
#include "ED_screen.h"
#include "ED_node.h"
+#include "ED_object.h"
#include "MEM_guardedalloc.h"
@@ -104,26 +105,6 @@ int bc_test_parent_loop(Object *par, Object *ob)
return bc_test_parent_loop(par->parent, ob);
}
-void bc_get_children(std::vector<Object *> &child_set, Object *ob, ViewLayer *view_layer)
-{
- Base *base;
- for (base = (Base *)view_layer->object_bases.first; base; base = base->next) {
- Object *cob = base->object;
- if (cob->parent == ob) {
- switch (ob->type) {
- case OB_MESH:
- case OB_CAMERA:
- case OB_LAMP:
- case OB_EMPTY:
- case OB_ARMATURE:
- child_set.push_back(cob);
- default:
- break;
- }
- }
- }
-}
-
bool bc_validateConstraints(bConstraint *con)
{
const bConstraintTypeInfo *cti = BKE_constraint_typeinfo_get(con);
@@ -146,43 +127,19 @@ bool bc_validateConstraints(bConstraint *con)
return true;
}
-/* a shortened version of parent_set_exec()
- * if is_parent_space is true then ob->obmat will be multiplied by par->obmat before parenting */
-int bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space)
+bool bc_set_parent(Object *ob, Object *par, bContext *C, bool is_parent_space)
{
- Object workob;
- Depsgraph *depsgraph = CTX_data_depsgraph(C);
- Scene *sce = CTX_data_scene(C);
-
- if (!par || bc_test_parent_loop(par, ob))
- return false;
-
- ob->parent = par;
- ob->partype = PAROBJECT;
+ Scene *scene = CTX_data_scene(C);
+ int partype = PAR_OBJECT;
+ const bool xmirror = false;
+ const bool keep_transform = false;
- ob->parsubstr[0] = 0;
-
- if (is_parent_space) {
- float mat[4][4];
- /* calc par->obmat */
- BKE_object_where_is_calc(depsgraph, sce, par);
-
- /* move child obmat into world space */
- mul_m4_m4m4(mat, par->obmat, ob->obmat);
- copy_m4_m4(ob->obmat, mat);
+ if (par && is_parent_space) {
+ mul_m4_m4m4(ob->obmat, par->obmat, ob->obmat);
}
- /* apply child obmat (i.e. decompose it into rot/loc/size) */
- BKE_object_apply_mat4(ob, ob->obmat, 0, 0);
-
- /* compute parentinv */
- BKE_object_workob_calc_parent(depsgraph, sce, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
-
- DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
- DEG_id_tag_update(&par->id, ID_RECALC_TRANSFORM);
-
- return true;
+ bool ok = ED_object_parent_set(NULL, C, scene, ob, par, partype, xmirror, keep_transform, NULL);
+ return ok;
}
std::vector<bAction *> bc_getSceneActions(const bContext *C, Object *ob, bool all_actions)
@@ -309,49 +266,6 @@ Object *bc_get_assigned_armature(Object *ob)
return ob_arm;
}
-/**
- * Returns the highest selected ancestor
- * returns NULL if no ancestor is selected
- * IMPORTANT: This function expects that all exported objects have set:
- * ob->id.tag & LIB_TAG_DOIT
- */
-Object *bc_get_highest_selected_ancestor_or_self(LinkNode *export_set, Object *ob)
-
-{
- Object *ancestor = ob;
- while (ob->parent && bc_is_marked(ob->parent)) {
- ob = ob->parent;
- ancestor = ob;
- }
- return ancestor;
-}
-
-bool bc_is_base_node(LinkNode *export_set, Object *ob)
-{
- Object *root = bc_get_highest_selected_ancestor_or_self(export_set, ob);
- return (root == ob);
-}
-
-bool bc_is_in_Export_set(LinkNode *export_set, Object *ob, ViewLayer *view_layer)
-{
- bool to_export = (BLI_linklist_index(export_set, ob) != -1);
-
- if (!to_export) {
- /* Mark this object as to_export even if it is not in the
- * export list, but it contains children to export. */
-
- std::vector<Object *> children;
- bc_get_children(children, ob, view_layer);
- for (int i = 0; i < children.size(); i++) {
- if (bc_is_in_Export_set(export_set, children[i], view_layer)) {
- to_export = true;
- break;
- }
- }
- }
- return to_export;
-}
-
bool bc_has_object_type(LinkNode *export_set, short obtype)
{
LinkNode *node;
@@ -366,21 +280,6 @@ bool bc_has_object_type(LinkNode *export_set, short obtype)
return false;
}
-int bc_is_marked(Object *ob)
-{
- return ob && (ob->id.tag & LIB_TAG_DOIT);
-}
-
-void bc_remove_mark(Object *ob)
-{
- ob->id.tag &= ~LIB_TAG_DOIT;
-}
-
-void bc_set_mark(Object *ob)
-{
- ob->id.tag |= LIB_TAG_DOIT;
-}
-
/* Use bubble sort algorithm for sorting the export set */
void bc_bubble_sort_by_Object_name(LinkNode *export_set)
{
@@ -1040,13 +939,61 @@ bool bc_has_animations(Scene *sce, LinkNode *export_set)
return false;
}
+void bc_add_global_transform(Matrix &to_mat,
+ const Matrix &from_mat,
+ const BCMatrix &global_transform,
+ const bool invert)
+{
+ copy_m4_m4(to_mat, from_mat);
+ bc_add_global_transform(to_mat, global_transform, invert);
+}
+
+void bc_add_global_transform(Vector &to_vec,
+ const Vector &from_vec,
+ const BCMatrix &global_transform,
+ const bool invert)
+{
+ copy_v3_v3(to_vec, from_vec);
+ bc_add_global_transform(to_vec, global_transform, invert);
+}
+
+void bc_add_global_transform(Matrix &to_mat, const BCMatrix &global_transform, const bool invert)
+{
+ BCMatrix mat(to_mat);
+ mat.add_transform(global_transform, invert);
+ mat.get_matrix(to_mat);
+}
+
+void bc_add_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert)
+{
+ Matrix mat;
+ Vector from_vec;
+ copy_v3_v3(from_vec, to_vec);
+ global_transform.get_matrix(mat, false, 6, invert);
+ mul_v3_m4v3(to_vec, mat, from_vec);
+}
+
+void bc_apply_global_transform(Matrix &to_mat, const BCMatrix &global_transform, const bool invert)
+{
+ BCMatrix mat(to_mat);
+ mat.apply_transform(global_transform, invert);
+ mat.get_matrix(to_mat);
+}
+
+void bc_apply_global_transform(Vector &to_vec, const BCMatrix &global_transform, const bool invert)
+{
+ Matrix transform;
+ global_transform.get_matrix(transform);
+ mul_v3_m4v3(to_vec, transform, to_vec);
+}
+
/**
* Check if custom information about bind matrix exists and modify the from_mat
* accordingly.
*
* Note: This is old style for Blender <= 2.78 only kept for compatibility
*/
-void bc_create_restpose_mat(const ExportSettings *export_settings,
+void bc_create_restpose_mat(BCExportSettings &export_settings,
Bone *bone,
float to_mat[4][4],
float from_mat[4][4],
@@ -1057,9 +1004,9 @@ void bc_create_restpose_mat(const ExportSettings *export_settings,
float scale[3];
static const float V0[3] = {0, 0, 0};
- if (!has_custom_props(bone, export_settings->keep_bind_info, "restpose_loc") &&
- !has_custom_props(bone, export_settings->keep_bind_info, "restpose_rot") &&
- !has_custom_props(bone, export_settings->keep_bind_info, "restpose_scale")) {
+ if (!has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_loc") &&
+ !has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_rot") &&
+ !has_custom_props(bone, export_settings.get_keep_bind_info(), "restpose_scale")) {
/* No need */
copy_m4_m4(to_mat, from_mat);
return;
@@ -1068,7 +1015,7 @@ void bc_create_restpose_mat(const ExportSettings *export_settings,
bc_decompose(from_mat, loc, rot, NULL, scale);
loc_eulO_size_to_mat4(to_mat, loc, rot, scale, 6);
- if (export_settings->keep_bind_info) {
+ if (export_settings.get_keep_bind_info()) {
bc_get_property_vector(bone, "restpose_loc", loc, loc);
if (use_local_space && bone->parent) {
@@ -1084,7 +1031,7 @@ void bc_create_restpose_mat(const ExportSettings *export_settings,
}
}
- if (export_settings->keep_bind_info) {
+ if (export_settings.get_keep_bind_info()) {
if (bc_get_IDProperty(bone, "restpose_rot_x"))
rot[0] = DEG2RADF(bc_get_property(bone, "restpose_rot_x", 0));
if (bc_get_IDProperty(bone, "restpose_rot_y"))
@@ -1093,7 +1040,7 @@ void bc_create_restpose_mat(const ExportSettings *export_settings,
rot[2] = DEG2RADF(bc_get_property(bone, "restpose_rot_z", 0));
}
- if (export_settings->keep_bind_info) {
+ if (export_settings.get_keep_bind_info()) {
bc_get_property_vector(bone, "restpose_scale", scale, scale);
}