Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_displace.cc
- This file was moved from source/blender/modifiers/intern/MOD_displace.c.
| Show First 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | static void updateDepsgraph(ModifierData *md, const ModifierUpdateDepsgraphContext *ctx) | ||||
| 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 && | ||||
| 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; | ||||
| } | } | ||||
| if (dmd->texture != NULL) { | if (dmd->texture != nullptr) { | ||||
| DEG_add_generic_id_relation(ctx->node, &dmd->texture->id, "Displace Modifier"); | DEG_add_generic_id_relation(ctx->node, &dmd->texture->id, "Displace Modifier"); | ||||
| if (dmd->map_object != NULL && dmd->texmapping == MOD_DISP_MAP_OBJECT) { | if (dmd->map_object != nullptr && dmd->texmapping == MOD_DISP_MAP_OBJECT) { | ||||
| MOD_depsgraph_update_object_bone_relation( | MOD_depsgraph_update_object_bone_relation( | ||||
| ctx->node, dmd->map_object, dmd->map_bone, "Displace Modifier"); | ctx->node, dmd->map_object, dmd->map_bone, "Displace Modifier"); | ||||
| need_transform_relation = true; | need_transform_relation = true; | ||||
| } | } | ||||
| if (dmd->texmapping == MOD_DISP_MAP_GLOBAL) { | if (dmd->texmapping == MOD_DISP_MAP_GLOBAL) { | ||||
| need_transform_relation = true; | need_transform_relation = true; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 127 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| Object *ob = ctx->object; | Object *ob = ctx->object; | ||||
| MVert *mvert; | MVert *mvert; | ||||
| const MDeformVert *dvert; | const MDeformVert *dvert; | ||||
| int direction = dmd->direction; | int direction = dmd->direction; | ||||
| int defgrp_index; | int defgrp_index; | ||||
| float(*tex_co)[3]; | float(*tex_co)[3]; | ||||
| 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] = nullptr; | ||||
| float local_mat[4][4] = {{0}}; | float local_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; | ||||
| if (dmd->texture == NULL && dmd->direction == MOD_DISP_DIR_RGB_XYZ) { | if (dmd->texture == nullptr && dmd->direction == MOD_DISP_DIR_RGB_XYZ) { | ||||
| return; | return; | ||||
| } | } | ||||
| if (dmd->strength == 0.0f) { | if (dmd->strength == 0.0f) { | ||||
| return; | return; | ||||
| } | } | ||||
| mvert = BKE_mesh_verts_for_write(mesh); | mvert = BKE_mesh_verts_for_write(mesh); | ||||
| MOD_get_vgroup(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index); | MOD_get_vgroup(ob, mesh, dmd->defgrp_name, &dvert, &defgrp_index); | ||||
| if (defgrp_index >= 0 && dvert == NULL) { | if (defgrp_index >= 0 && dvert == nullptr) { | ||||
| /* There is a vertex group, but it has no vertices. */ | /* There is a vertex group, but it has no vertices. */ | ||||
| return; | return; | ||||
| } | } | ||||
| Tex *tex_target = dmd->texture; | Tex *tex_target = dmd->texture; | ||||
| if (tex_target != NULL) { | if (tex_target != nullptr) { | ||||
| tex_co = MEM_calloc_arrayN((size_t)verts_num, sizeof(*tex_co), "displaceModifier_do tex_co"); | tex_co = static_cast<float(*)[3]>( | ||||
| MEM_calloc_arrayN((size_t)verts_num, sizeof(*tex_co), "displaceModifier_do tex_co")); | |||||
| MOD_get_texture_coords((MappingInfoModifierData *)dmd, ctx, ob, mesh, vertexCos, tex_co); | MOD_get_texture_coords((MappingInfoModifierData *)dmd, ctx, ob, mesh, vertexCos, tex_co); | ||||
| MOD_init_texture((MappingInfoModifierData *)dmd, ctx); | MOD_init_texture((MappingInfoModifierData *)dmd, ctx); | ||||
| } | } | ||||
| else { | else { | ||||
| tex_co = NULL; | tex_co = nullptr; | ||||
| } | } | ||||
| if (direction == MOD_DISP_DIR_CLNOR) { | if (direction == MOD_DISP_DIR_CLNOR) { | ||||
| CustomData *ldata = &mesh->ldata; | CustomData *ldata = &mesh->ldata; | ||||
| if (CustomData_has_layer(ldata, CD_CUSTOMLOOPNORMAL)) { | if (CustomData_has_layer(ldata, CD_CUSTOMLOOPNORMAL)) { | ||||
| if (!CustomData_has_layer(ldata, CD_NORMAL)) { | if (!CustomData_has_layer(ldata, CD_NORMAL)) { | ||||
| BKE_mesh_calc_normals_split(mesh); | BKE_mesh_calc_normals_split(mesh); | ||||
| } | } | ||||
| float(*clnors)[3] = CustomData_get_layer(ldata, CD_NORMAL); | float(*clnors)[3] = static_cast<float(*)[3]>(CustomData_get_layer(ldata, CD_NORMAL)); | ||||
| vert_clnors = MEM_malloc_arrayN(verts_num, sizeof(*vert_clnors), __func__); | vert_clnors = static_cast<float(*)[3]>( | ||||
| MEM_malloc_arrayN(verts_num, sizeof(*vert_clnors), __func__)); | |||||
| BKE_mesh_normals_loop_to_vertex( | BKE_mesh_normals_loop_to_vertex( | ||||
| verts_num, BKE_mesh_loops(mesh), mesh->totloop, (const float(*)[3])clnors, vert_clnors); | verts_num, BKE_mesh_loops(mesh), mesh->totloop, (const float(*)[3])clnors, vert_clnors); | ||||
| } | } | ||||
| else { | else { | ||||
| direction = MOD_DISP_DIR_NOR; | direction = MOD_DISP_DIR_NOR; | ||||
| } | } | ||||
| } | } | ||||
| 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) { | ||||
| copy_m4_m4(local_mat, ob->object_to_world); | copy_m4_m4(local_mat, ob->object_to_world); | ||||
| } | } | ||||
| DisplaceUserdata data = {NULL}; | DisplaceUserdata data = {nullptr}; | ||||
| data.scene = DEG_get_evaluated_scene(ctx->depsgraph); | data.scene = DEG_get_evaluated_scene(ctx->depsgraph); | ||||
| data.dmd = dmd; | data.dmd = dmd; | ||||
| data.dvert = dvert; | data.dvert = dvert; | ||||
| data.weight = weight; | data.weight = weight; | ||||
| 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.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); | ||||
| data.mvert = mvert; | data.mvert = mvert; | ||||
| if (direction == MOD_DISP_DIR_NOR) { | if (direction == MOD_DISP_DIR_NOR) { | ||||
| data.vert_normals = BKE_mesh_vertex_normals_ensure(mesh); | data.vert_normals = BKE_mesh_vertex_normals_ensure(mesh); | ||||
| } | } | ||||
| data.vert_clnors = vert_clnors; | data.vert_clnors = vert_clnors; | ||||
| if (tex_target != NULL) { | if (tex_target != nullptr) { | ||||
| data.pool = BKE_image_pool_new(); | data.pool = BKE_image_pool_new(); | ||||
| BKE_texture_fetch_images_for_pool(tex_target, data.pool); | BKE_texture_fetch_images_for_pool(tex_target, data.pool); | ||||
| } | } | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (verts_num > 512); | settings.use_threading = (verts_num > 512); | ||||
| BLI_task_parallel_range(0, verts_num, &data, displaceModifier_do_task, &settings); | BLI_task_parallel_range(0, verts_num, &data, displaceModifier_do_task, &settings); | ||||
| if (data.pool != NULL) { | if (data.pool != nullptr) { | ||||
| BKE_image_pool_free(data.pool); | BKE_image_pool_free(data.pool); | ||||
| } | } | ||||
| if (tex_co) { | if (tex_co) { | ||||
| MEM_freeN(tex_co); | MEM_freeN(tex_co); | ||||
| } | } | ||||
| if (vert_clnors) { | if (vert_clnors) { | ||||
| MEM_freeN(vert_clnors); | MEM_freeN(vert_clnors); | ||||
| } | } | ||||
| } | } | ||||
| static void deformVerts(ModifierData *md, | static void deformVerts(ModifierData *md, | ||||
| const ModifierEvalContext *ctx, | const ModifierEvalContext *ctx, | ||||
| Mesh *mesh, | Mesh *mesh, | ||||
| float (*vertexCos)[3], | float (*vertexCos)[3], | ||||
| int verts_num) | int verts_num) | ||||
| { | { | ||||
| Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, NULL, mesh, NULL, verts_num, false); | Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, nullptr, mesh, nullptr, verts_num, false); | ||||
| displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); | displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); | ||||
| if (!ELEM(mesh_src, NULL, mesh)) { | if (!ELEM(mesh_src, nullptr, mesh)) { | ||||
| BKE_id_free(NULL, mesh_src); | BKE_id_free(nullptr, mesh_src); | ||||
| } | } | ||||
| } | } | ||||
| static void deformVertsEM(ModifierData *md, | static void deformVertsEM(ModifierData *md, | ||||
| const ModifierEvalContext *ctx, | const ModifierEvalContext *ctx, | ||||
| struct BMEditMesh *editData, | struct BMEditMesh *editData, | ||||
| Mesh *mesh, | Mesh *mesh, | ||||
| float (*vertexCos)[3], | float (*vertexCos)[3], | ||||
| int verts_num) | int verts_num) | ||||
| { | { | ||||
| Mesh *mesh_src = MOD_deform_mesh_eval_get(ctx->object, editData, mesh, NULL, verts_num, false); | Mesh *mesh_src = MOD_deform_mesh_eval_get( | ||||
| ctx->object, editData, mesh, nullptr, verts_num, false); | |||||
| /* TODO(@campbellbarton): use edit-mode data only (remove this line). */ | /* TODO(@campbellbarton): use edit-mode data only (remove this line). */ | ||||
| if (mesh_src != NULL) { | if (mesh_src != nullptr) { | ||||
| BKE_mesh_wrapper_ensure_mdata(mesh_src); | BKE_mesh_wrapper_ensure_mdata(mesh_src); | ||||
| } | } | ||||
| displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); | displaceModifier_do((DisplaceModifierData *)md, ctx, mesh_src, vertexCos, verts_num); | ||||
| if (!ELEM(mesh_src, NULL, mesh)) { | if (!ELEM(mesh_src, nullptr, mesh)) { | ||||
| BKE_id_free(NULL, mesh_src); | BKE_id_free(nullptr, mesh_src); | ||||
| } | } | ||||
| } | } | ||||
| static void panel_draw(const bContext *C, Panel *panel) | static void panel_draw(const bContext *C, Panel *panel) | ||||
| { | { | ||||
| uiLayout *col; | uiLayout *col; | ||||
| uiLayout *layout = panel->layout; | uiLayout *layout = panel->layout; | ||||
| PointerRNA ob_ptr; | PointerRNA ob_ptr; | ||||
| PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); | PointerRNA *ptr = modifier_panel_get_property_pointers(panel, &ob_ptr); | ||||
| PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data"); | PointerRNA obj_data_ptr = RNA_pointer_get(&ob_ptr, "data"); | ||||
| PointerRNA texture_ptr = RNA_pointer_get(ptr, "texture"); | PointerRNA texture_ptr = RNA_pointer_get(ptr, "texture"); | ||||
| bool has_texture = !RNA_pointer_is_null(&texture_ptr); | bool has_texture = !RNA_pointer_is_null(&texture_ptr); | ||||
| int texture_coords = RNA_enum_get(ptr, "texture_coords"); | int texture_coords = RNA_enum_get(ptr, "texture_coords"); | ||||
| uiLayoutSetPropSep(layout, true); | uiLayoutSetPropSep(layout, true); | ||||
| uiTemplateID(layout, C, ptr, "texture", "texture.new", NULL, NULL, 0, ICON_NONE, NULL); | uiTemplateID(layout, C, ptr, "texture", "texture.new", nullptr, nullptr, 0, ICON_NONE, nullptr); | ||||
| col = uiLayoutColumn(layout, false); | col = uiLayoutColumn(layout, false); | ||||
| uiLayoutSetActive(col, has_texture); | uiLayoutSetActive(col, has_texture); | ||||
| uiItemR(col, ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE); | uiItemR(col, ptr, "texture_coords", 0, IFACE_("Coordinates"), ICON_NONE); | ||||
| if (texture_coords == MOD_DISP_MAP_OBJECT) { | if (texture_coords == MOD_DISP_MAP_OBJECT) { | ||||
| uiItemR(col, ptr, "texture_coords_object", 0, IFACE_("Object"), ICON_NONE); | uiItemR(col, ptr, "texture_coords_object", 0, IFACE_("Object"), ICON_NONE); | ||||
| PointerRNA texture_coords_obj_ptr = RNA_pointer_get(ptr, "texture_coords_object"); | PointerRNA texture_coords_obj_ptr = RNA_pointer_get(ptr, "texture_coords_object"); | ||||
| if (!RNA_pointer_is_null(&texture_coords_obj_ptr) && | if (!RNA_pointer_is_null(&texture_coords_obj_ptr) && | ||||
| (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) { | (RNA_enum_get(&texture_coords_obj_ptr, "type") == OB_ARMATURE)) { | ||||
| PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data"); | PointerRNA texture_coords_obj_data_ptr = RNA_pointer_get(&texture_coords_obj_ptr, "data"); | ||||
| uiItemPointerR(col, | uiItemPointerR(col, | ||||
| ptr, | ptr, | ||||
| "texture_coords_bone", | "texture_coords_bone", | ||||
| &texture_coords_obj_data_ptr, | &texture_coords_obj_data_ptr, | ||||
| "bones", | "bones", | ||||
| IFACE_("Bone"), | IFACE_("Bone"), | ||||
| ICON_NONE); | ICON_NONE); | ||||
| } | } | ||||
| } | } | ||||
| else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) { | else if (texture_coords == MOD_DISP_MAP_UV && RNA_enum_get(&ob_ptr, "type") == OB_MESH) { | ||||
| uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", NULL, ICON_NONE); | uiItemPointerR(col, ptr, "uv_layer", &obj_data_ptr, "uv_layers", nullptr, ICON_NONE); | ||||
| } | } | ||||
| uiItemS(layout); | uiItemS(layout); | ||||
| col = uiLayoutColumn(layout, false); | col = uiLayoutColumn(layout, false); | ||||
| uiItemR(col, ptr, "direction", 0, 0, ICON_NONE); | uiItemR(col, ptr, "direction", 0, 0, ICON_NONE); | ||||
| if (ELEM(RNA_enum_get(ptr, "direction"), | if (ELEM(RNA_enum_get(ptr, "direction"), | ||||
| MOD_DISP_DIR_X, | MOD_DISP_DIR_X, | ||||
| MOD_DISP_DIR_Y, | MOD_DISP_DIR_Y, | ||||
| 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, nullptr, ICON_NONE); | ||||
| } | } | ||||
| uiItemS(layout); | uiItemS(layout); | ||||
| col = uiLayoutColumn(layout, false); | col = uiLayoutColumn(layout, false); | ||||
| uiItemR(col, ptr, "strength", 0, NULL, ICON_NONE); | uiItemR(col, ptr, "strength", 0, nullptr, ICON_NONE); | ||||
| uiItemR(col, ptr, "mid_level", 0, NULL, ICON_NONE); | uiItemR(col, ptr, "mid_level", 0, nullptr, ICON_NONE); | ||||
| modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", NULL); | modifier_vgroup_ui(col, ptr, &ob_ptr, "vertex_group", "invert_vertex_group", nullptr); | ||||
| modifier_panel_end(layout, ptr); | modifier_panel_end(layout, ptr); | ||||
| } | } | ||||
| static void panelRegister(ARegionType *region_type) | static void panelRegister(ARegionType *region_type) | ||||
| { | { | ||||
| modifier_panel_register(region_type, eModifierType_Displace, panel_draw); | modifier_panel_register(region_type, eModifierType_Displace, panel_draw); | ||||
| } | } | ||||
| ModifierTypeInfo modifierType_Displace = { | ModifierTypeInfo modifierType_Displace = { | ||||
| /* name */ N_("Displace"), | /* name */ N_("Displace"), | ||||
| /* structName */ "DisplaceModifierData", | /* structName */ "DisplaceModifierData", | ||||
| /* structSize */ sizeof(DisplaceModifierData), | /* structSize */ sizeof(DisplaceModifierData), | ||||
| /* srna */ &RNA_DisplaceModifier, | /* srna */ &RNA_DisplaceModifier, | ||||
| /* type */ eModifierTypeType_OnlyDeform, | /* type */ eModifierTypeType_OnlyDeform, | ||||
| /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, | /* flags */ eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode, | ||||
| /* icon */ ICON_MOD_DISPLACE, | /* icon */ ICON_MOD_DISPLACE, | ||||
| /* copyData */ BKE_modifier_copydata_generic, | /* copyData */ BKE_modifier_copydata_generic, | ||||
| /* deformVerts */ deformVerts, | /* deformVerts */ deformVerts, | ||||
| /* deformMatrices */ NULL, | /* deformMatrices */ nullptr, | ||||
| /* deformVertsEM */ deformVertsEM, | /* deformVertsEM */ deformVertsEM, | ||||
| /* deformMatricesEM */ NULL, | /* deformMatricesEM */ nullptr, | ||||
| /* modifyMesh */ NULL, | /* modifyMesh */ nullptr, | ||||
| /* modifyGeometrySet */ NULL, | /* modifyGeometrySet */ nullptr, | ||||
| /* initData */ initData, | /* initData */ initData, | ||||
| /* requiredDataMask */ requiredDataMask, | /* requiredDataMask */ requiredDataMask, | ||||
| /* freeData */ NULL, | /* freeData */ nullptr, | ||||
| /* isDisabled */ isDisabled, | /* isDisabled */ isDisabled, | ||||
| /* updateDepsgraph */ updateDepsgraph, | /* updateDepsgraph */ updateDepsgraph, | ||||
| /* dependsOnTime */ dependsOnTime, | /* dependsOnTime */ dependsOnTime, | ||||
| /* dependsOnNormals */ dependsOnNormals, | /* dependsOnNormals */ dependsOnNormals, | ||||
| /* foreachIDLink */ foreachIDLink, | /* foreachIDLink */ foreachIDLink, | ||||
| /* foreachTexLink */ foreachTexLink, | /* foreachTexLink */ foreachTexLink, | ||||
| /* freeRuntimeData */ NULL, | /* freeRuntimeData */ nullptr, | ||||
| /* panelRegister */ panelRegister, | /* panelRegister */ panelRegister, | ||||
| /* blendWrite */ NULL, | /* blendWrite */ nullptr, | ||||
| /* blendRead */ NULL, | /* blendRead */ nullptr, | ||||
| }; | }; | ||||