Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2022-03-02 18:55:21 +0300
committerHans Goudey <h.goudey@me.com>2022-03-02 18:55:21 +0300
commitd86f80f42ad8bb40aeb154980e5e0e2fa77412e2 (patch)
tree29b4fe08845fecfce794441838170ed0e0c6b73d /source
parent1e1d1f15e8750642c29e4d04e09462cc4e4d2baa (diff)
parent216a215ba58ac67af5e7bfa334bbcef4e812ea3f (diff)
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/engines/overlay/overlay_engine.c6
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc26
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)