Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_displace.c
| Context not available. | |||||
| #include "DNA_object_types.h" | #include "DNA_object_types.h" | ||||
| #include "DNA_screen_types.h" | #include "DNA_screen_types.h" | ||||
| #include "BKE_action.h" /* BKE_pose_channel_find_name */ | |||||
| #include "BKE_context.h" | #include "BKE_context.h" | ||||
| #include "BKE_customdata.h" | #include "BKE_customdata.h" | ||||
| #include "BKE_deform.h" | #include "BKE_deform.h" | ||||
| Context not available. | |||||
| DisplaceModifierData *dmd = (DisplaceModifierData *)md; | DisplaceModifierData *dmd = (DisplaceModifierData *)md; | ||||
| walk(userData, ob, &dmd->map_object, IDWALK_CB_NOP); | walk(userData, ob, &dmd->map_object, IDWALK_CB_NOP); | ||||
| walk(userData, ob, &dmd->axis_object, IDWALK_CB_NOP); | |||||
| } | } | ||||
| static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) | static void foreachIDLink(ModifierData *md, Object *ob, IDWalkFunc walk, void *userData) | ||||
| Context not available. | |||||
| bool UNUSED(useRenderParams)) | bool UNUSED(useRenderParams)) | ||||
| { | { | ||||
| DisplaceModifierData *dmd = (DisplaceModifierData *)md; | DisplaceModifierData *dmd = (DisplaceModifierData *)md; | ||||
| return ((!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) || dmd->strength == 0.0f); | return ( | ||||
| (!dmd->texture && dmd->direction == MOD_DISP_DIR_RGB_XYZ) || dmd->strength == 0.0f || | |||||
| (ELEM( | |||||
| dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && | |||||
| dmd->space == MOD_DISP_SPACE_OBJECT && !dmd->axis_object)); | |||||
| } | } | ||||
| static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | ||||
| Context not available. | |||||
| DisplaceModifierData *dmd = (DisplaceModifierData *)md; | DisplaceModifierData *dmd = (DisplaceModifierData *)md; | ||||
| bool need_transform_relation = false; | bool need_transform_relation = false; | ||||
| if (dmd->space == MOD_DISP_SPACE_GLOBAL && | if ((dmd->space == MOD_DISP_SPACE_GLOBAL || dmd->space == MOD_DISP_SPACE_OBJECT) && | ||||
| ELEM(dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ)) { | ELEM(dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ)) { | ||||
| need_transform_relation = true; | need_transform_relation = true; | ||||
| } | } | ||||
| Context not available. | |||||
| need_transform_relation = true; | need_transform_relation = true; | ||||
| } | } | ||||
| } | } | ||||
| if (ELEM(dmd->direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && | |||||
| dmd->space == MOD_DISP_SPACE_OBJECT && dmd->axis_object) { | |||||
| MOD_depsgraph_update_object_bone_relation( | |||||
| ctx->node, dmd->axis_object, dmd->axis_bone, "Displace Modifier"); | |||||
| need_transform_relation = true; | |||||
| } | |||||
| if (need_transform_relation) { | if (need_transform_relation) { | ||||
| DEG_add_modifier_to_transform_relation(ctx->node, "Displace Modifier"); | DEG_add_modifier_to_transform_relation(ctx->node, "Displace Modifier"); | ||||
| Context not available. | |||||
| int defgrp_index; | int defgrp_index; | ||||
| int direction; | int direction; | ||||
| bool use_global_direction; | bool use_global_direction; | ||||
| bool use_object_direction; | |||||
| Tex *tex_target; | Tex *tex_target; | ||||
| float (*tex_co)[3]; | float (*tex_co)[3]; | ||||
| float (*vertexCos)[3]; | float (*vertexCos)[3]; | ||||
| float local_mat[4][4]; | float local_mat[4][4]; | ||||
| float axis_mat[4][4]; | |||||
| MVert *mvert; | MVert *mvert; | ||||
| float (*vert_clnors)[3]; | float (*vert_clnors)[3]; | ||||
| } DisplaceUserdata; | } DisplaceUserdata; | ||||
| Context not available. | |||||
| int defgrp_index = data->defgrp_index; | int defgrp_index = data->defgrp_index; | ||||
| int direction = data->direction; | int direction = data->direction; | ||||
| bool use_global_direction = data->use_global_direction; | bool use_global_direction = data->use_global_direction; | ||||
| bool use_object_direction = data->use_object_direction; | |||||
| float(*tex_co)[3] = data->tex_co; | float(*tex_co)[3] = data->tex_co; | ||||
| float(*vertexCos)[3] = data->vertexCos; | float(*vertexCos)[3] = data->vertexCos; | ||||
| MVert *mvert = data->mvert; | MVert *mvert = data->mvert; | ||||
| Context not available. | |||||
| float strength = dmd->strength; | float strength = dmd->strength; | ||||
| float delta; | float delta; | ||||
| float local_vec[3]; | float local_vec[3]; | ||||
| float axis_vec[3] = {0}; | |||||
| if (dvert) { | if (dvert) { | ||||
| weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert + iter, defgrp_index) : | weight = invert_vgroup ? 1.0f - BKE_defvert_find_weight(dvert + iter, defgrp_index) : | ||||
| Context not available. | |||||
| vertexCos[iter][1] += delta * data->local_mat[1][0]; | vertexCos[iter][1] += delta * data->local_mat[1][0]; | ||||
| vertexCos[iter][2] += delta * data->local_mat[2][0]; | vertexCos[iter][2] += delta * data->local_mat[2][0]; | ||||
| } | } | ||||
| else if (use_object_direction) { | |||||
| axis_vec[0] = 1.0f; | |||||
| mul_mat3_m4_v3(data->axis_mat, axis_vec); | |||||
| mul_transposed_mat3_m4_v3(data->local_mat, axis_vec); | |||||
| vertexCos[iter][0] += delta * axis_vec[0]; | |||||
| vertexCos[iter][1] += delta * axis_vec[1]; | |||||
| vertexCos[iter][2] += delta * axis_vec[2]; | |||||
| } | |||||
| else { | else { | ||||
| vertexCos[iter][0] += delta; | vertexCos[iter][0] += delta; | ||||
| } | } | ||||
| Context not available. | |||||
| vertexCos[iter][1] += delta * data->local_mat[1][1]; | vertexCos[iter][1] += delta * data->local_mat[1][1]; | ||||
| vertexCos[iter][2] += delta * data->local_mat[2][1]; | vertexCos[iter][2] += delta * data->local_mat[2][1]; | ||||
| } | } | ||||
| else if (use_object_direction) { | |||||
| axis_vec[1] = 1.0f; | |||||
| mul_mat3_m4_v3(data->axis_mat, axis_vec); | |||||
| mul_transposed_mat3_m4_v3(data->local_mat, axis_vec); | |||||
| vertexCos[iter][0] += delta * axis_vec[0]; | |||||
| vertexCos[iter][1] += delta * axis_vec[1]; | |||||
| vertexCos[iter][2] += delta * axis_vec[2]; | |||||
| } | |||||
| else { | else { | ||||
| vertexCos[iter][1] += delta; | vertexCos[iter][1] += delta; | ||||
| } | } | ||||
| Context not available. | |||||
| vertexCos[iter][1] += delta * data->local_mat[1][2]; | vertexCos[iter][1] += delta * data->local_mat[1][2]; | ||||
| vertexCos[iter][2] += delta * data->local_mat[2][2]; | vertexCos[iter][2] += delta * data->local_mat[2][2]; | ||||
| } | } | ||||
| else if (use_object_direction) { | |||||
| axis_vec[2] = 1.0f; | |||||
| mul_mat3_m4_v3(data->axis_mat, axis_vec); | |||||
| mul_transposed_mat3_m4_v3(data->local_mat, axis_vec); | |||||
| vertexCos[iter][0] += delta * axis_vec[0]; | |||||
| vertexCos[iter][1] += delta * axis_vec[1]; | |||||
| vertexCos[iter][2] += delta * axis_vec[2]; | |||||
| } | |||||
| else { | else { | ||||
| vertexCos[iter][2] += delta; | vertexCos[iter][2] += delta; | ||||
| } | } | ||||
| Context not available. | |||||
| if (use_global_direction) { | if (use_global_direction) { | ||||
| mul_transposed_mat3_m4_v3(data->local_mat, local_vec); | mul_transposed_mat3_m4_v3(data->local_mat, local_vec); | ||||
| } | } | ||||
| else if (use_object_direction) { | |||||
| mul_mat3_m4_v3(data->axis_mat, local_vec); | |||||
| mul_transposed_mat3_m4_v3(data->local_mat, local_vec); | |||||
| } | |||||
| mul_v3_fl(local_vec, strength); | mul_v3_fl(local_vec, strength); | ||||
| add_v3_v3(vertexCos[iter], local_vec); | add_v3_v3(vertexCos[iter], local_vec); | ||||
| break; | break; | ||||
| Context not available. | |||||
| float weight = 1.0f; /* init value unused but some compilers may complain */ | float weight = 1.0f; /* init value unused but some compilers may complain */ | ||||
| float(*vert_clnors)[3] = NULL; | float(*vert_clnors)[3] = NULL; | ||||
| float local_mat[4][4] = {{0}}; | float local_mat[4][4] = {{0}}; | ||||
| float axis_mat[4][4] = {{0}}; | |||||
| const bool use_global_direction = dmd->space == MOD_DISP_SPACE_GLOBAL; | const bool use_global_direction = dmd->space == MOD_DISP_SPACE_GLOBAL; | ||||
| const bool use_object_direction = dmd->space == MOD_DISP_SPACE_OBJECT; | |||||
| if (dmd->texture == NULL && dmd->direction == MOD_DISP_DIR_RGB_XYZ) { | if (dmd->texture == NULL && dmd->direction == MOD_DISP_DIR_RGB_XYZ) { | ||||
| return; | return; | ||||
| Context not available. | |||||
| } | } | ||||
| } | } | ||||
| else if (ELEM(direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && | else if (ELEM(direction, MOD_DISP_DIR_X, MOD_DISP_DIR_Y, MOD_DISP_DIR_Z, MOD_DISP_DIR_RGB_XYZ) && | ||||
| use_global_direction) { | (use_global_direction || use_object_direction)) { | ||||
| /* Get custom object matrix. If no object set then use local matrix. */ | |||||
| copy_m4_m4(local_mat, ob->obmat); | copy_m4_m4(local_mat, ob->obmat); | ||||
| /* Use object matrix if it is set. If not use local matrix. */ | |||||
| if (use_object_direction) { | |||||
| if (dmd->axis_object) { | |||||
| bPoseChannel *pchan = BKE_pose_channel_find_name(dmd->axis_object->pose, dmd->axis_bone); | |||||
| if (pchan) { | |||||
| mul_m4_m4m4(axis_mat, dmd->axis_object->obmat, pchan->pose_mat); | |||||
| } | |||||
| else { | |||||
| copy_m4_m4(axis_mat, dmd->axis_object->obmat); | |||||
| } | |||||
| } | |||||
| else { | |||||
| return; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| DisplaceUserdata data = {NULL}; | DisplaceUserdata data = {NULL}; | ||||
| Context not available. | |||||
| data.defgrp_index = defgrp_index; | data.defgrp_index = defgrp_index; | ||||
| data.direction = direction; | data.direction = direction; | ||||
| data.use_global_direction = use_global_direction; | data.use_global_direction = use_global_direction; | ||||
| data.use_object_direction = use_object_direction; | |||||
| data.tex_target = tex_target; | data.tex_target = tex_target; | ||||
| data.tex_co = tex_co; | data.tex_co = tex_co; | ||||
| data.vertexCos = vertexCos; | data.vertexCos = vertexCos; | ||||
| copy_m4_m4(data.local_mat, local_mat); | copy_m4_m4(data.local_mat, local_mat); | ||||
| copy_m4_m4(data.axis_mat, axis_mat); | |||||
| data.mvert = mvert; | data.mvert = mvert; | ||||
| data.vert_clnors = vert_clnors; | data.vert_clnors = vert_clnors; | ||||
| if (tex_target != NULL) { | if (tex_target != NULL) { | ||||
| Context not available. | |||||
| MOD_DISP_DIR_Z, | MOD_DISP_DIR_Z, | ||||
| MOD_DISP_DIR_RGB_XYZ)) { | MOD_DISP_DIR_RGB_XYZ)) { | ||||
| uiItemR(col, ptr, "space", 0, NULL, ICON_NONE); | uiItemR(col, ptr, "space", 0, NULL, ICON_NONE); | ||||
| if (RNA_enum_get(ptr, "space") == MOD_DISP_SPACE_OBJECT) | |||||
| { | |||||
| uiItemR(col, ptr, "axis_object", 0, NULL, ICON_NONE); | |||||
| PointerRNA space_obj_ptr = RNA_pointer_get(ptr, "axis_object"); | |||||
| if (!RNA_pointer_is_null(&space_obj_ptr) && | |||||
| RNA_enum_get(&space_obj_ptr, "type") == OB_ARMATURE) | |||||
| { | |||||
| PointerRNA space_obj_data_ptr = RNA_pointer_get(&space_obj_ptr, "data"); | |||||
| uiItemPointerR( | |||||
| col, ptr, "axis_bone", &space_obj_data_ptr, "bones", IFACE_("Bone"), ICON_NONE); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| uiItemS(layout); | uiItemS(layout); | ||||
| Context not available. | |||||