diff options
author | Hans Goudey <h.goudey@me.com> | 2022-03-02 18:55:21 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-03-02 18:55:21 +0300 |
commit | d86f80f42ad8bb40aeb154980e5e0e2fa77412e2 (patch) | |
tree | 29b4fe08845fecfce794441838170ed0e0c6b73d /source | |
parent | 1e1d1f15e8750642c29e4d04e09462cc4e4d2baa (diff) | |
parent | 216a215ba58ac67af5e7bfa334bbcef4e812ea3f (diff) |
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/overlay/overlay_engine.c | 6 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 26 |
2 files changed, 32 insertions, 0 deletions
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c index ad0d939e99a..f9fec171ddd 100644 --- a/source/blender/draw/engines/overlay/overlay_engine.c +++ b/source/blender/draw/engines/overlay/overlay_engine.c @@ -290,6 +290,11 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob) const bool renderable = DRW_object_is_renderable(ob); const bool in_pose_mode = ob->type == OB_ARMATURE && OVERLAY_armature_is_pose_mode(ob, draw_ctx); const bool in_edit_mode = overlay_object_is_edit_mode(pd, ob); + const bool is_instance = (ob->base_flag & BASE_FROM_DUPLI); + const bool instance_parent_in_edit_mode = is_instance ? + overlay_object_is_edit_mode( + pd, DRW_object_get_dupli_parent(ob)) : + false; const bool in_particle_edit_mode = (ob->mode == OB_MODE_PARTICLE_EDIT) && (pd->ctx_mode == CTX_MODE_PARTICLE); const bool in_paint_mode = (ob == draw_ctx->obact) && @@ -316,6 +321,7 @@ static void OVERLAY_cache_populate(void *vedata, Object *ob) const bool draw_wires = draw_surface && has_surface && (pd->wireframe_mode || !pd->hide_overlays); const bool draw_outlines = !in_edit_mode && !in_paint_mode && renderable && has_surface && + !instance_parent_in_edit_mode && (pd->v3d_flag & V3D_SELECT_OUTLINE) && (ob->base_flag & BASE_SELECTED); const bool draw_bone_selection = (ob->type == OB_MESH) && pd->armature.do_pose_fade_geom && diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 210a7edac54..13ffc8e921d 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -1246,8 +1246,34 @@ static void modifyGeometry(ModifierData *md, return; } + bool use_orig_index_verts = false; + bool use_orig_index_edges = false; + bool use_orig_index_polys = false; + if (geometry_set.has_mesh()) { + const Mesh &mesh = *geometry_set.get_mesh_for_read(); + use_orig_index_verts = CustomData_has_layer(&mesh.vdata, CD_ORIGINDEX); + use_orig_index_edges = CustomData_has_layer(&mesh.edata, CD_ORIGINDEX); + use_orig_index_polys = CustomData_has_layer(&mesh.pdata, CD_ORIGINDEX); + } + geometry_set = compute_geometry( tree, input_nodes, output_node, std::move(geometry_set), nmd, ctx); + + if (geometry_set.has_mesh()) { + /* Add #CD_ORIGINDEX layers if they don't exist already. This is required because the + * #eModifierTypeFlag_SupportsMapping flag is set. If the layers did not exist before, it is + * assumed that the output mesh does not have a mapping to the original mesh. */ + Mesh &mesh = *geometry_set.get_mesh_for_write(); + if (use_orig_index_verts) { + CustomData_add_layer(&mesh.vdata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totvert); + } + if (use_orig_index_edges) { + CustomData_add_layer(&mesh.edata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totedge); + } + if (use_orig_index_polys) { + CustomData_add_layer(&mesh.pdata, CD_ORIGINDEX, CD_DEFAULT, nullptr, mesh.totpoly); + } + } } static Mesh *modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh) |