diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index a3760910d25..c1ba2a3ab25 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -1254,7 +1254,11 @@ compile_Boost() { #### Build OCIO #### _init_ocio() { _src=$SRC/OpenColorIO-$OCIO_VERSION - _git=false + if [ "$OCIO_USE_REPO" = true ]; then + _git=true + else + _git=false + fi _inst=$INST/ocio-$OCIO_VERSION _inst_shortcut=$INST/ocio } diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index e93d509338b..e4296f98f65 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -848,10 +848,18 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.label(text="Axis, Origin:") col.prop(md, "origin", text="") + col.prop(md, "deform_axis") + if md.deform_method in {'TAPER', 'STRETCH', 'TWIST'}: - col.label(text="Lock:") - col.prop(md, "lock_x") - col.prop(md, "lock_y") + row = col.row(align=True) + row.label(text="Lock:") + deform_axis = md.deform_axis + if deform_axis != 'X': + row.prop(md, "lock_x") + if deform_axis != 'Y': + row.prop(md, "lock_y") + if deform_axis != 'Z': + row.prop(md, "lock_z") col = split.column() col.label(text="Deform:") diff --git a/source/blender/blenloader/intern/versioning_270.c b/source/blender/blenloader/intern/versioning_270.c index bf2d5c8e326..48e91885499 100644 --- a/source/blender/blenloader/intern/versioning_270.c +++ b/source/blender/blenloader/intern/versioning_270.c @@ -1786,6 +1786,26 @@ void blo_do_versions_270(FileData *fd, Library *UNUSED(lib), Main *main) } } } + + /* Simple deform modifier no longer assumes Z axis (X for bend type). + * Must set previous defaults. */ + if (!DNA_struct_elem_find(fd->filesdna, "SimpleDeformModifierData", "char", "deform_axis")) { + for (Object *ob = main->object.first; ob; ob = ob->id.next) { + for (ModifierData *md = ob->modifiers.first; md; md = md->next) { + if (md->type == eModifierType_SimpleDeform) { + SimpleDeformModifierData *smd = (SimpleDeformModifierData *)md; + switch (smd->mode) { + case MOD_SIMPLEDEFORM_MODE_BEND: + smd->deform_axis = 0; + break; + default: + smd->deform_axis = 2; + break; + } + } + } + } + } } } diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c index 4dd96a838e0..4ca2b54eaaf 100644 --- a/source/blender/editors/space_clip/tracking_ops.c +++ b/source/blender/editors/space_clip/tracking_ops.c @@ -1859,6 +1859,10 @@ static bool is_track_clean(MovieTrackingTrack *track, int frames, int del) } } + if (count == 0) { + ok = 0; + } + if (del) { MEM_freeN(track->markers); diff --git a/source/blender/editors/space_clip/tracking_select.c b/source/blender/editors/space_clip/tracking_select.c index eddd65475a2..4ee85ace271 100644 --- a/source/blender/editors/space_clip/tracking_select.c +++ b/source/blender/editors/space_clip/tracking_select.c @@ -906,7 +906,7 @@ void CLIP_OT_select_all(wmOperatorType *ot) /********************** select grouped operator *********************/ -static int select_groped_exec(bContext *C, wmOperator *op) +static int select_grouped_exec(bContext *C, wmOperator *op) { SpaceClip *sc = CTX_wm_space_clip(C); MovieClip *clip = ED_space_clip_get_clip(sc); @@ -989,7 +989,7 @@ void CLIP_OT_select_grouped(wmOperatorType *ot) ot->idname = "CLIP_OT_select_grouped"; /* api callbacks */ - ot->exec = select_groped_exec; + ot->exec = select_grouped_exec; ot->poll = ED_space_clip_tracking_poll; /* flags */ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 5dbfbaadf75..5df7e49c2f3 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -868,8 +868,8 @@ typedef struct SimpleDeformModifierData { char mode; /* deform function */ char axis; /* lock axis (for taper and strech) */ + char deform_axis; /* axis to perform the deform on (default is X, but can be overridden by origin */ char flag; - char pad; } SimpleDeformModifierData; @@ -889,6 +889,7 @@ enum { enum { MOD_SIMPLEDEFORM_LOCK_AXIS_X = (1 << 0), MOD_SIMPLEDEFORM_LOCK_AXIS_Y = (1 << 1), + MOD_SIMPLEDEFORM_LOCK_AXIS_Z = (1 << 2), }; typedef struct ShapeKeyModifierData { diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index 1858b6db997..e721a04bd2a 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -3236,6 +3236,11 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna) RNA_def_property_string_funcs(prop, NULL, NULL, "rna_SimpleDeformModifier_vgroup_name_set"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop = RNA_def_property(srna, "deform_axis", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_items(prop, rna_enum_axis_xyz_items); + RNA_def_property_ui_text(prop, "Axis", "Deform around local axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + prop = RNA_def_property(srna, "origin", PROP_POINTER, PROP_NONE); RNA_def_property_ui_text(prop, "Origin", "Offset the origin and orientation of the deformation"); RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK); @@ -3265,12 +3270,17 @@ static void rna_def_modifier_simpledeform(BlenderRNA *brna) prop = RNA_def_property(srna, "lock_x", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_X); - RNA_def_property_ui_text(prop, "Lock X Axis", "Do not allow deformation along the X axis"); + RNA_def_property_ui_text(prop, "X", "Do not allow deformation along the X axis"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop = RNA_def_property(srna, "lock_y", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_Y); - RNA_def_property_ui_text(prop, "Lock Y Axis", "Do not allow deformation along the Y axis"); + RNA_def_property_ui_text(prop, "Y", "Do not allow deformation along the Y axis"); + RNA_def_property_update(prop, 0, "rna_Modifier_update"); + + prop = RNA_def_property(srna, "lock_z", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "axis", MOD_SIMPLEDEFORM_LOCK_AXIS_Z); + RNA_def_property_ui_text(prop, "Z", "Do not allow deformation along the Z axis"); RNA_def_property_update(prop, 0, "rna_Modifier_update"); prop = RNA_def_property(srna, "invert_vertex_group", PROP_BOOLEAN, PROP_NONE); diff --git a/source/blender/modifiers/intern/MOD_simpledeform.c b/source/blender/modifiers/intern/MOD_simpledeform.c index 146e882a6b6..6116e49d07d 100644 --- a/source/blender/modifiers/intern/MOD_simpledeform.c +++ b/source/blender/modifiers/intern/MOD_simpledeform.c @@ -32,7 +32,6 @@ * \ingroup modifiers */ - #include "DNA_meshdata_types.h" #include "DNA_object_types.h" @@ -48,9 +47,33 @@ #define BEND_EPS 0.000001f +/* Re-maps the indicies for X Y Z by shifting them up and wrapping, such that + * X = Y, Y = Z, Z = X (for X axis), and X = Z, Y = X, Z = Y (for Y axis). This + * exists because the deformations (excluding bend) are based on the Z axis. + * Having this helps avoid long, drawn out switches. */ +static const uint axis_map_table[3][3] = { + {1, 2, 0}, + {2, 0, 1}, + {0, 1, 2}, +}; + +BLI_INLINE void copy_v3_v3_map(float a[3], const float b[3], const uint map[3]) +{ + a[0] = b[map[0]]; + a[1] = b[map[1]]; + a[2] = b[map[2]]; +} + +BLI_INLINE void copy_v3_v3_unmap(float a[3], const float b[3], const uint map[3]) +{ + a[map[0]] = b[0]; + a[map[1]] = b[1]; + a[map[2]] = b[2]; +} + /* Clamps/Limits the given coordinate to: limits[0] <= co[axis] <= limits[1] * The amount of clamp is saved on dcut */ -static void axis_limit(int axis, const float limits[2], float co[3], float dcut[3]) +static void axis_limit(const int axis, const float limits[2], float co[3], float dcut[3]) { float val = co[axis]; if (limits[0] > val) val = limits[0]; @@ -60,7 +83,7 @@ static void axis_limit(int axis, const float limits[2], float co[3], float dcut[ co[axis] = val; } -static void simpleDeform_taper(const float factor, const float dcut[3], float r_co[3]) +static void simpleDeform_taper(const float factor, const int UNUSED(axis), const float dcut[3], float r_co[3]) { float x = r_co[0], y = r_co[1], z = r_co[2]; float scale = z * factor; @@ -69,14 +92,10 @@ static void simpleDeform_taper(const float factor, const float dcut[3], float r_ r_co[1] = y + y * scale; r_co[2] = z; - { - r_co[0] += dcut[0]; - r_co[1] += dcut[1]; - r_co[2] += dcut[2]; - } + add_v3_v3(r_co, dcut); } -static void simpleDeform_stretch(const float factor, const float dcut[3], float r_co[3]) +static void simpleDeform_stretch(const float factor, const int UNUSED(axis), const float dcut[3], float r_co[3]) { float x = r_co[0], y = r_co[1], z = r_co[2]; float scale; @@ -87,14 +106,10 @@ static void simpleDeform_stretch(const float factor, const float dcut[3], float r_co[1] = y * scale; r_co[2] = z * (1.0f + factor); - { - r_co[0] += dcut[0]; - r_co[1] += dcut[1]; - r_co[2] += dcut[2]; - } + add_v3_v3(r_co, dcut); } -static void simpleDeform_twist(const float factor, const float *dcut, float r_co[3]) +static void simpleDeform_twist(const float factor, const int UNUSED(axis), const float *dcut, float r_co[3]) { float x = r_co[0], y = r_co[1], z = r_co[2]; float theta, sint, cost; @@ -107,32 +122,58 @@ static void simpleDeform_twist(const float factor, const float *dcut, float r_co r_co[1] = x * sint + y * cost; r_co[2] = z; - { - r_co[0] += dcut[0]; - r_co[1] += dcut[1]; - r_co[2] += dcut[2]; - } + add_v3_v3(r_co, dcut); } -static void simpleDeform_bend(const float factor, const float dcut[3], float r_co[3]) +static void simpleDeform_bend(const float factor, const int axis, const float dcut[3], float r_co[3]) { float x = r_co[0], y = r_co[1], z = r_co[2]; float theta, sint, cost; BLI_assert(!(fabsf(factor) < BEND_EPS)); - theta = x * factor; + switch (axis) { + case 0: + ATTR_FALLTHROUGH; + case 1: + theta = z * factor; + break; + default: + theta = x * factor; + } sint = sinf(theta); cost = cosf(theta); - r_co[0] = -(y - 1.0f / factor) * sint; - r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; - r_co[2] = z; - - { - r_co[0] += cost * dcut[0]; - r_co[1] += sint * dcut[0]; - r_co[2] += dcut[2]; + switch (axis) { + case 0: + r_co[0] = x; + r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[2] = -(y - 1.0f / factor) * sint; + { + r_co[0] += dcut[0]; + r_co[1] += sint * dcut[2]; + r_co[2] += cost * dcut[2]; + } + break; + case 1: + r_co[0] = (x - 1.0f / factor) * cost + 1.0f / factor; + r_co[1] = y; + r_co[2] = -(x - 1.0f / factor) * sint; + { + r_co[0] += sint * dcut[2]; + r_co[1] += dcut[1]; + r_co[2] += cost * dcut[2]; + } + break; + default: + r_co[0] = -(y - 1.0f / factor) * sint; + r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; + r_co[2] = z; + { + r_co[0] += cost * dcut[0]; + r_co[1] += sint * dcut[0]; + r_co[2] += dcut[2]; + } } } @@ -142,16 +183,36 @@ static void simpleDeform_bend(const float factor, const float dcut[3], float r_c static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object *ob, struct DerivedMesh *dm, float (*vertexCos)[3], int numVerts) { - static const float lock_axis[2] = {0.0f, 0.0f}; + const float base_limit[2] = {0.0f, 0.0f}; int i; - int limit_axis = 0; float smd_limit[2], smd_factor; SpaceTransform *transf = NULL, tmp_transf; - void (*simpleDeform_callback)(const float factor, const float dcut[3], float co[3]) = NULL; /* Mode callback */ + void (*simpleDeform_callback)(const float factor, const int axis, const float dcut[3], float co[3]) = NULL; /* Mode callback */ int vgroup; MDeformVert *dvert; + /* This is historically the lock axis, _not_ the deform axis as the name would imply */ + const int deform_axis = smd->deform_axis; + int lock_axis = smd->axis; + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shouln't have any lock axis */ + lock_axis = 0; + } + else { + /* Don't lock axis if it is the chosen deform axis, as this flattens + * the geometry */ + if (deform_axis == 0) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_X; + } + if (deform_axis == 1) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Y; + } + if (deform_axis == 2) { + lock_axis &= ~MOD_SIMPLEDEFORM_LOCK_AXIS_Z; + } + } + + /* Safe-check */ if (smd->origin == ob) smd->origin = NULL; /* No self references */ @@ -166,11 +227,21 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object BLI_SPACE_TRANSFORM_SETUP(transf, ob, smd->origin); } - /* Setup vars, - * Bend limits on X.. all other modes limit on Z */ - limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 0 : 2; - /* Update limits if needed */ + int limit_axis = deform_axis; + if (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) { + /* Bend is a special case. */ + switch (deform_axis) { + case 0: + ATTR_FALLTHROUGH; + case 1: + limit_axis = 2; + break; + default: + limit_axis = 0; + } + } + { float lower = FLT_MAX; float upper = -FLT_MAX; @@ -212,6 +283,7 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object modifier_get_vgroup(ob, dm, smd->vgroup_name, &dvert, &vgroup); const bool invert_vgroup = (smd->flag & MOD_SIMPLEDEFORM_FLAG_INVERT_VGROUP) != 0; + const uint *axis_map = axis_map_table[(smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) ? deform_axis : 2]; for (i = 0; i < numVerts; i++) { float weight = defvert_array_find_weight_safe(dvert, i, vgroup); @@ -229,14 +301,26 @@ static void SimpleDeformModifier_do(SimpleDeformModifierData *smd, struct Object copy_v3_v3(co, vertexCos[i]); - /* Apply axis limits */ - if (smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shoulnt have any lock axis */ - if (smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) axis_limit(0, lock_axis, co, dcut); - if (smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) axis_limit(1, lock_axis, co, dcut); + /* Apply axis limits, and axis mappings */ + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_X) { + axis_limit(0, base_limit, co, dcut); + } + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) { + axis_limit(1, base_limit, co, dcut); + } + if (lock_axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Z) { + axis_limit(2, base_limit, co, dcut); } axis_limit(limit_axis, smd_limit, co, dcut); - simpleDeform_callback(smd_factor, dcut, co); /* apply deform */ + /* apply the deform to a mapped copy of the vertex, and then re-map it back. */ + float co_remap[3]; + float dcut_remap[3]; + copy_v3_v3_map(co_remap, co, axis_map); + copy_v3_v3_map(dcut_remap, dcut, axis_map); + simpleDeform_callback(smd_factor, deform_axis, dcut_remap, co_remap); /* apply deform */ + copy_v3_v3_unmap(co, co_remap, axis_map); + interp_v3_v3v3(vertexCos[i], vertexCos[i], co, weight); /* Use vertex weight has coef of linear interpolation */ if (transf) { @@ -254,6 +338,7 @@ static void initData(ModifierData *md) smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; smd->axis = 0; + smd->deform_axis = 0; smd->origin = NULL; smd->factor = DEG2RADF(45.0f);