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:
-rw-r--r--source/blender/blenkernel/intern/constraint.c3
-rw-r--r--source/blender/blenloader/intern/versioning_280.c9
-rw-r--r--source/blender/io/alembic/ABC_alembic.h5
-rw-r--r--source/blender/io/alembic/intern/alembic_capi.cc23
4 files changed, 34 insertions, 6 deletions
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 9719704967e..f38810322a8 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -5314,9 +5314,6 @@ static bConstraint *add_new_constraint(Object *ob,
}
break;
}
- case CONSTRAINT_TYPE_TRANSFORM_CACHE:
- con->ownspace = CONSTRAINT_SPACE_LOCAL;
- break;
}
return con;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 2035ee3590f..28f59b6ab07 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -4802,5 +4802,14 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
}
}
+
+ /* Alembic Transform Cache changed from local to world space. */
+ LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
+ LISTBASE_FOREACH (bConstraint *, con, &ob->constraints) {
+ if (con->type == CONSTRAINT_TYPE_TRANSFORM_CACHE) {
+ con->ownspace = CONSTRAINT_SPACE_WORLD;
+ }
+ }
+ }
}
}
diff --git a/source/blender/io/alembic/ABC_alembic.h b/source/blender/io/alembic/ABC_alembic.h
index 878dbfc2a53..ccc53c589fb 100644
--- a/source/blender/io/alembic/ABC_alembic.h
+++ b/source/blender/io/alembic/ABC_alembic.h
@@ -110,7 +110,10 @@ AbcArchiveHandle *ABC_create_handle(struct Main *bmain,
void ABC_free_handle(AbcArchiveHandle *handle);
-void ABC_get_transform(struct CacheReader *reader, float r_mat[4][4], float time, float scale);
+void ABC_get_transform(struct CacheReader *reader,
+ float r_mat_world[4][4],
+ float time,
+ float scale);
/* Either modifies current_mesh in-place or constructs a new mesh. */
struct Mesh *ABC_read_mesh(struct CacheReader *reader,
diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc
index c6f9e284d53..ced5791e0e8 100644
--- a/source/blender/io/alembic/intern/alembic_capi.cc
+++ b/source/blender/io/alembic/intern/alembic_capi.cc
@@ -53,6 +53,7 @@ extern "C" {
#include "BKE_global.h"
#include "BKE_layer.h"
#include "BKE_lib_id.h"
+#include "BKE_object.h"
#include "BKE_scene.h"
#include "DEG_depsgraph.h"
@@ -931,7 +932,7 @@ bool ABC_import(bContext *C,
/* ************************************************************************** */
-void ABC_get_transform(CacheReader *reader, float r_mat[4][4], float time, float scale)
+void ABC_get_transform(CacheReader *reader, float r_mat_world[4][4], float time, float scale)
{
if (!reader) {
return;
@@ -940,7 +941,25 @@ void ABC_get_transform(CacheReader *reader, float r_mat[4][4], float time, float
AbcObjectReader *abc_reader = reinterpret_cast<AbcObjectReader *>(reader);
bool is_constant = false;
- abc_reader->read_matrix(r_mat, time, scale, is_constant);
+
+ /* Convert from the local matrix we obtain from Alembic to world coordinates
+ * for Blender. This conversion is done here rather than by Blender due to
+ * work around the non-standard interpretation of CONSTRAINT_SPACE_LOCAL in
+ * BKE_constraint_mat_convertspace(). */
+ Object *object = abc_reader->object();
+ if (object->parent == nullptr) {
+ /* No parent, so local space is the same as world space. */
+ abc_reader->read_matrix(r_mat_world, time, scale, is_constant);
+ return;
+ }
+
+ float mat_parent[4][4];
+ BKE_object_get_parent_matrix(object, object->parent, mat_parent);
+
+ float mat_local[4][4];
+ abc_reader->read_matrix(mat_local, time, scale, is_constant);
+ mul_m4_m4m4(r_mat_world, mat_parent, object->parentinv);
+ mul_m4_m4m4(r_mat_world, r_mat_world, mat_local);
}
/* ************************************************************************** */