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

Reply via email to