Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_simpledeform.c
| Context not available. | |||||
| co[axis] = val; | 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 char def_axis, const float dcut[3], float r_co[3]) | ||||
| { | { | ||||
| float x = r_co[0], y = r_co[1], z = r_co[2]; | float x = r_co[0], y = r_co[1], z = r_co[2]; | ||||
| float scale = z * factor; | float scale; | ||||
| switch (def_axis) { | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_X: | |||||
| scale = x * factor; | |||||
| r_co[0] = x; | |||||
| r_co[1] = y + y * scale; | |||||
| r_co[2] = z + z * scale; | |||||
| break; | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_Y: | |||||
| scale = y * factor; | |||||
| r_co[0] = x + x * scale; | |||||
| r_co[1] = y; | |||||
| r_co[2] = z + z * scale; | |||||
| break; | |||||
| default: /* MOD_SIMPLEDEFORM_DEFORM_AXIS_Z */ | |||||
| scale = z * factor; | |||||
| r_co[0] = x + x * scale; | r_co[0] = x + x * scale; | ||||
| r_co[1] = y + y * scale; | r_co[1] = y + y * scale; | ||||
| r_co[2] = z; | r_co[2] = z; | ||||
| break; | |||||
| } | |||||
| { | { | ||||
| r_co[0] += dcut[0]; | r_co[0] += dcut[0]; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| static void simpleDeform_stretch(const float factor, const float dcut[3], float r_co[3]) | static void simpleDeform_stretch(const float factor, const char def_axis, const float dcut[3], float r_co[3]) | ||||
| { | { | ||||
| float x = r_co[0], y = r_co[1], z = r_co[2]; | float x = r_co[0], y = r_co[1], z = r_co[2]; | ||||
| float scale; | float scale; | ||||
| scale = (z * z * factor - factor + 1.0f); | switch (def_axis) { | ||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_X: | |||||
| scale = (x * x * factor - factor + 1.0f); | |||||
| r_co[0] = x * (1.0f + factor); | |||||
| r_co[1] = y * scale; | |||||
| r_co[2] = z * scale; | |||||
| break; | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_Y: | |||||
| scale = (y * y * factor - factor + 1.0f); | |||||
| r_co[0] = x * scale; | |||||
| r_co[1] = y * (1.0f + factor); | |||||
| r_co[2] = z * scale; | |||||
| r_co[0] = x * scale; | break; | ||||
| r_co[1] = y * scale; | default: /* MOD_SIMPLEDEFORM_DEFORM_AXIS_Z */ | ||||
| r_co[2] = z * (1.0f + factor); | scale = (z * z * factor - factor + 1.0f); | ||||
| r_co[0] = x * scale; | |||||
| r_co[1] = y * scale; | |||||
| r_co[2] = z * (1.0f + factor); | |||||
| break; | |||||
| } | |||||
| { | { | ||||
| r_co[0] += dcut[0]; | r_co[0] += dcut[0]; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| static void simpleDeform_twist(const float factor, const float *dcut, float r_co[3]) | static void simpleDeform_twist(const float factor, const char def_axis, const float *dcut, float r_co[3]) | ||||
| { | { | ||||
| float x = r_co[0], y = r_co[1], z = r_co[2]; | float x = r_co[0], y = r_co[1], z = r_co[2]; | ||||
| float theta, sint, cost; | float theta, sint, cost; | ||||
| theta = z * factor; | switch (def_axis) { | ||||
| sint = sinf(theta); | case MOD_SIMPLEDEFORM_DEFORM_AXIS_X: | ||||
| cost = cosf(theta); | theta = x * factor; | ||||
| sint = sinf(theta); | |||||
| r_co[0] = x * cost - y * sint; | cost = cosf(theta); | ||||
| r_co[1] = x * sint + y * cost; | |||||
| r_co[2] = z; | r_co[0] = x; | ||||
| r_co[1] = y * cost - z * sint; | |||||
| r_co[2] = y * sint + z * cost;; | |||||
| break; | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_Y: | |||||
| theta = y * factor; | |||||
| sint = sinf(theta); | |||||
| cost = cosf(theta); | |||||
| r_co[0] = z * sint + x * cost; | |||||
| r_co[1] = y; | |||||
| r_co[2] = z * cost - x * sint; | |||||
| break; | |||||
| default: /* MOD_SIMPLEDEFORM_DEFORM_AXIS_Z */ | |||||
| theta = z * factor; | |||||
| sint = sinf(theta); | |||||
| cost = cosf(theta); | |||||
| r_co[0] = x * cost - y * sint; | |||||
| r_co[1] = x * sint + y * cost; | |||||
| r_co[2] = z; | |||||
| break; | |||||
| } | |||||
| { | { | ||||
| r_co[0] += dcut[0]; | r_co[0] += dcut[0]; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| static void simpleDeform_bend(const float factor, const float dcut[3], float r_co[3]) | static void simpleDeform_bend(const float factor, const char def_axis, const float dcut[3], float r_co[3]) | ||||
| { | { | ||||
| float x = r_co[0], y = r_co[1], z = r_co[2]; | float x = r_co[0], y = r_co[1], z = r_co[2]; | ||||
| float theta, sint, cost; | float theta, sint, cost; | ||||
| BLI_assert(!(fabsf(factor) < BEND_EPS)); | BLI_assert(!(fabsf(factor) < BEND_EPS)); | ||||
| theta = x * factor; | switch (def_axis) { | ||||
| sint = sinf(theta); | case MOD_SIMPLEDEFORM_DEFORM_AXIS_X: | ||||
| cost = cosf(theta); | theta = y * factor; | ||||
| sint = sinf(theta); | |||||
| r_co[0] = -(y - 1.0f / factor) * sint; | cost = cosf(theta); | ||||
| r_co[1] = (y - 1.0f / factor) * cost + 1.0f / factor; | |||||
| r_co[2] = z; | r_co[0] = x; | ||||
| r_co[1] = -(z - 1.0f / factor) * sint; | |||||
| { | r_co[2] = (z - 1.0f / factor) * cost + 1.0f / factor; | ||||
| r_co[0] += cost * dcut[0]; | |||||
| r_co[1] += sint * dcut[0]; | /* limited on Y */ | ||||
| r_co[2] += dcut[2]; | r_co[0] += dcut[0]; | ||||
| r_co[1] += cost * dcut[1]; | |||||
| r_co[2] += sint * dcut[1]; | |||||
| break; | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_Y: | |||||
| theta = z * factor; | |||||
| sint = sinf(theta); | |||||
| cost = cosf(theta); | |||||
| r_co[0] = (x - 1.0f / factor) * cost + 1.0f / factor; | |||||
| r_co[1] = y; | |||||
| r_co[2] = -(x - 1.0f / factor) * sint; | |||||
| /* limited on Z */ | |||||
| r_co[0] += sint * dcut[2]; | |||||
| r_co[1] += dcut[1]; | |||||
| r_co[2] += cost * dcut[2]; | |||||
| break; | |||||
| default: /* MOD_SIMPLEDEFORM_DEFORM_AXIS_Z */ | |||||
| 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; | |||||
| /* limited on X */ | |||||
| r_co[0] += cost * dcut[0]; | |||||
| r_co[1] += sint * dcut[0]; | |||||
| r_co[2] += dcut[2]; | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| Context not available. | |||||
| int i; | int i; | ||||
| int limit_axis = 0; | int limit_axis = 0; | ||||
| int axes_to_lock[2]; /* They are changing with respect to smd->def_axis */ | |||||
| float smd_limit[2], smd_factor; | float smd_limit[2], smd_factor; | ||||
| SpaceTransform *transf = NULL, tmp_transf; | 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 char def_axis, const float dcut[3], float co[3]) = NULL; /* Mode callback */ | ||||
| int vgroup; | int vgroup; | ||||
| MDeformVert *dvert; | MDeformVert *dvert; | ||||
| Context not available. | |||||
| } | } | ||||
| /* Setup vars, | /* Setup vars, | ||||
| * Bend limits on X.. all other modes limit on Z */ | * Bend limits on (projected) X.. all other modes limit on (projected) Z */ | ||||
| limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 0 : 2; | switch (smd->def_axis) { | ||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_X: | |||||
| axes_to_lock[0] = 1; | |||||
| axes_to_lock[1] = 2; | |||||
| limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 1 : 0; | |||||
| break; | |||||
| case MOD_SIMPLEDEFORM_DEFORM_AXIS_Y: | |||||
| axes_to_lock[0] = 2; | |||||
| axes_to_lock[1] = 0; | |||||
| limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 2 : 1; | |||||
| break; | |||||
| default: /* MOD_SIMPLEDEFORM_DEFORM_AXIS_Z */ | |||||
| axes_to_lock[0] = 0; | |||||
| axes_to_lock[1] = 1; | |||||
| limit_axis = (smd->mode == MOD_SIMPLEDEFORM_MODE_BEND) ? 0 : 2; | |||||
| break; | |||||
| } | |||||
| /* Update limits if needed */ | /* Update limits if needed */ | ||||
| { | { | ||||
| Context not available. | |||||
| /* Apply axis limits */ | /* Apply axis limits */ | ||||
| if (smd->mode != MOD_SIMPLEDEFORM_MODE_BEND) { /* Bend mode shoulnt have any lock axis */ | 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_X) axis_limit(axes_to_lock[0], lock_axis, co, dcut); | ||||
| if (smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) axis_limit(1, lock_axis, co, dcut); | if (smd->axis & MOD_SIMPLEDEFORM_LOCK_AXIS_Y) axis_limit(axes_to_lock[1], lock_axis, co, dcut); | ||||
| } | } | ||||
| axis_limit(limit_axis, smd_limit, co, dcut); | axis_limit(limit_axis, smd_limit, co, dcut); | ||||
| simpleDeform_callback(smd_factor, dcut, co); /* apply deform */ | simpleDeform_callback(smd_factor, smd->def_axis, dcut, co); /* apply deform */ | ||||
| interp_v3_v3v3(vertexCos[i], vertexCos[i], co, weight); /* Use vertex weight has coef of linear interpolation */ | interp_v3_v3v3(vertexCos[i], vertexCos[i], co, weight); /* Use vertex weight has coef of linear interpolation */ | ||||
| if (transf) { | if (transf) { | ||||
| Context not available. | |||||
| { | { | ||||
| SimpleDeformModifierData *smd = (SimpleDeformModifierData *) md; | SimpleDeformModifierData *smd = (SimpleDeformModifierData *) md; | ||||
| smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; | smd->mode = MOD_SIMPLEDEFORM_MODE_TWIST; | ||||
| smd->axis = 0; | smd->axis = 0; | ||||
| smd->def_axis = 2; | |||||
| smd->origin = NULL; | smd->origin = NULL; | ||||
| smd->factor = DEG2RADF(45.0f); | smd->factor = DEG2RADF(45.0f); | ||||
| Context not available. | |||||