Commit: 9f505b2d64373394c7a00ee4fccd42d00fc583fe
Author: Kévin Dietrich
Date: Wed Jun 8 14:40:07 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rB9f505b2d64373394c7a00ee4fccd42d00fc583fe
Implement scaling imported/exported objects.
===================================================================
M release/scripts/startup/bl_ui/properties_constraint.py
M source/blender/alembic/ABC_alembic.h
M source/blender/alembic/intern/abc_object.cc
M source/blender/alembic/intern/abc_transform.cc
M source/blender/alembic/intern/abc_util.cc
M source/blender/alembic/intern/abc_util.h
M source/blender/alembic/intern/alembic_capi.cc
M source/blender/blenkernel/intern/constraint.c
M source/blender/makesdna/DNA_constraint_types.h
M source/blender/makesrna/intern/rna_constraint.c
===================================================================
diff --git a/release/scripts/startup/bl_ui/properties_constraint.py
b/release/scripts/startup/bl_ui/properties_constraint.py
index 3af878c..6ae2c8b 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -883,6 +883,7 @@ class ConstraintButtonsPanel:
def TRANSFORMCACHE(self, context, layout, con):
layout.prop(con, "filepath")
layout.prop(con, "abc_object_path")
+ layout.prop(con, "scale")
def SCRIPT(self, context, layout, con):
layout.label("Blender 2.6 doesn't support python constraints yet")
diff --git a/source/blender/alembic/ABC_alembic.h
b/source/blender/alembic/ABC_alembic.h
index 819e487..77ec954 100644
--- a/source/blender/alembic/ABC_alembic.h
+++ b/source/blender/alembic/ABC_alembic.h
@@ -63,7 +63,7 @@ void ABC_get_vertex_cache(const char *filepath, float time,
void *verts, int max
int ABC_check_subobject_valid(const char *filepath, const char *object_path);
-void ABC_get_transform(struct Object *ob, const char *filepath, const char
*object_path, float r_mat[4][4], float time);
+void ABC_get_transform(struct Object *ob, const char *filepath, const char
*object_path, float r_mat[4][4], float time, float scale);
struct DerivedMesh *ABC_read_mesh(struct DerivedMesh *dm, const char
*filepath, const char *object_path, const float time);
diff --git a/source/blender/alembic/intern/abc_object.cc
b/source/blender/alembic/intern/abc_object.cc
index 12c2452..3376a22 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -394,7 +394,7 @@ void AbcObjectReader::readObjectMatrix(const float time)
Alembic::AbcGeom::XformSample xs;
schema.get(xs, sample_sel);
- create_input_transform(sample_sel, ixform, m_object, m_object->obmat);
+ create_input_transform(sample_sel, ixform, m_object, m_object->obmat,
m_settings->scale);
invert_m4_m4(m_object->imat, m_object->obmat);
@@ -405,6 +405,7 @@ void AbcObjectReader::readObjectMatrix(const float time)
bTransformCacheConstraint *data =
static_cast<bTransformCacheConstraint *>(con->data);
BLI_strncpy(data->filepath,
m_iobject.getArchive().getName().c_str(), 1024);
BLI_strncpy(data->abc_object_path,
m_iobject.getFullName().c_str(), 1024);
+ data->scale = m_settings->scale;
}
}
diff --git a/source/blender/alembic/intern/abc_transform.cc
b/source/blender/alembic/intern/abc_transform.cc
index a69c4fa..6fdccd7 100644
--- a/source/blender/alembic/intern/abc_transform.cc
+++ b/source/blender/alembic/intern/abc_transform.cc
@@ -88,6 +88,14 @@ void AbcTransformWriter::do_write()
mul_m4_m4m4(mat, mat, rot_mat);
}
+ if (!m_object->parent) {
+ /* Only apply scaling to root objects, parenting will propagate
it. */
+ float scale_mat[4][4];
+ scale_m4_fl(scale_mat, m_settings.global_scale);
+ mul_m4_m4m4(mat, mat, scale_mat);
+ mul_v3_fl(mat[3], m_settings.global_scale);
+ }
+
m_matrix = convert_matrix(mat);
m_sample.setMatrix(m_matrix);
diff --git a/source/blender/alembic/intern/abc_util.cc
b/source/blender/alembic/intern/abc_util.cc
index 6377a8c..79f8bb5 100644
--- a/source/blender/alembic/intern/abc_util.cc
+++ b/source/blender/alembic/intern/abc_util.cc
@@ -211,23 +211,15 @@ bool is_locator(const Alembic::AbcGeom::IObject &object)
return object.getProperties().getPropertyHeader("locator") != NULL;
}
-static void get_matrix(const Alembic::AbcGeom::ISampleSelector &sample_sel,
- const Alembic::AbcGeom::IXform &leaf, Imath::M44d &m)
-{
- Alembic::AbcGeom::IXformSchema leaf_schema = leaf.getSchema();
- Alembic::AbcGeom::XformSample xs;
- leaf_schema.get(xs, sample_sel);
- m = xs.getMatrix();
-}
-
void create_input_transform(const Alembic::AbcGeom::ISampleSelector
&sample_sel,
const Alembic::AbcGeom::IXform &ixform, Object *ob,
- float r_mat[4][4])
+ float r_mat[4][4], float scale)
{
- Imath::M44d xform;
- xform.makeIdentity();
- get_matrix(sample_sel, ixform, xform);
+ const Alembic::AbcGeom::IXformSchema &ixform_schema =
ixform.getSchema();
+ Alembic::AbcGeom::XformSample xs;
+ ixform_schema.get(xs, sample_sel);
+ const Imath::M44d &xform = xs.getMatrix();
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
@@ -244,17 +236,16 @@ void create_input_transform(const
Alembic::AbcGeom::ISampleSelector &sample_sel,
create_transform_matrix(r_mat);
- /* TODO: apply global scale */
-#if 0
- float global_scale[4][4];
- scale_m4_fl(global_scale, m_settings->scale);
- mul_m4_m4m4(m_object->obmat, m_object->obmat, global_scale);
- mul_v3_fl(m_object->obmat[3], m_settings->scale);
-#endif
-
if (ob->parent) {
mul_m4_m4m4(r_mat, ob->parent->obmat, r_mat);
}
+ else {
+ /* Only apply scaling to root objects, parenting will propagate
it. */
+ float scale_mat[4][4];
+ scale_m4_fl(scale_mat, scale);
+ mul_m4_m4m4(r_mat, r_mat, scale_mat);
+ mul_v3_fl(r_mat[3], scale);
+ }
}
/* recompute transform matrix of object in new coordinate system (from Z-Up to
Y-Up) */
diff --git a/source/blender/alembic/intern/abc_util.h
b/source/blender/alembic/intern/abc_util.h
index 219e190..d538533 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -52,7 +52,7 @@ bool is_locator(const Alembic::AbcGeom::IObject &object);
void create_input_transform(const Alembic::AbcGeom::ISampleSelector
&sample_sel,
const Alembic::AbcGeom::IXform &ixform, Object *ob,
- float r_mat[4][4]);
+ float r_mat[4][4], float scale);
using Alembic::Abc::chrono_t;
diff --git a/source/blender/alembic/intern/alembic_capi.cc
b/source/blender/alembic/intern/alembic_capi.cc
index 1968cbc..349e0d9 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -570,7 +570,7 @@ void ABC_import(bContext *C, const char *filepath, float
scale, bool is_sequence
/* ******************************* */
-void ABC_get_transform(Object *ob, const char *filepath, const char
*object_path, float r_mat[4][4], float time)
+void ABC_get_transform(Object *ob, const char *filepath, const char
*object_path, float r_mat[4][4], float time, float scale)
{
IArchive archive = open_archive(filepath);
@@ -598,7 +598,7 @@ void ABC_get_transform(Object *ob, const char *filepath,
const char *object_path
ISampleSelector sample_sel(time);
- create_input_transform(sample_sel, ixform, ob, r_mat);
+ create_input_transform(sample_sel, ixform, ob, r_mat, scale);
}
/* ***************************************** */
diff --git a/source/blender/blenkernel/intern/constraint.c
b/source/blender/blenkernel/intern/constraint.c
index 70fd0b5..199d950 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -4346,7 +4346,7 @@ static void transformcache_evaluate(bConstraint *con,
bConstraintOb *cob, ListBa
const float ctime = BKE_scene_frame_get(scene) /
(float)scene->r.frs_sec;
- ABC_get_transform(cob->ob, data->filepath, data->abc_object_path,
cob->matrix, ctime);
+ ABC_get_transform(cob->ob, data->filepath, data->abc_object_path,
cob->matrix, ctime, data->scale);
UNUSED_VARS(targets);
}
diff --git a/source/blender/makesdna/DNA_constraint_types.h
b/source/blender/makesdna/DNA_constraint_types.h
index 714bd89..5df2a3f 100644
--- a/source/blender/makesdna/DNA_constraint_types.h
+++ b/source/blender/makesdna/DNA_constraint_types.h
@@ -466,6 +466,9 @@ typedef struct bTransformCacheConstraint {
char forward_axis;
char up_axis;
char pad[2];
+
+ float scale;
+ float pad2;
} bTransformCacheConstraint;
/* ------------------------------------------ */
diff --git a/source/blender/makesrna/intern/rna_constraint.c
b/source/blender/makesrna/intern/rna_constraint.c
index 41f2501..49430ab 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -2605,6 +2605,12 @@ static void
rna_def_constraint_transform_cache(BlenderRNA *brna)
RNA_def_property_enum_items(prop, rna_enum_object_axis_items);
RNA_def_property_ui_text(prop, "Up", "");
RNA_def_property_update(prop, 0, "rna_Constraint_update");
+
+ prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
+ RNA_def_property_float_sdna(prop, NULL, "scale");
+ RNA_def_property_range(prop, 0.0f, 1.0f);
+ RNA_def_property_ui_text(prop, "Scale", "");
+ RNA_def_property_update(prop, 0, "rna_Constraint_update");
}
/* base struct for constraints */
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs