diff options
author | Brecht Van Lommel <brecht@blender.org> | 2020-04-22 14:54:35 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2020-04-22 14:59:14 +0300 |
commit | bc83fc9c04bef0e151518e8da299243999363799 (patch) | |
tree | 9528b342b647cf14f19f538b5c207bbabf17fb59 /source/blender/draw/intern | |
parent | b2cc2dda9c37775b04b6a9b4e07a25a51c74c693 (diff) |
Fix T75981: crash in sculpt mode with mesh that used to have multiple materials
The material indices in a mesh can exceed the number of available materials
slots in the object or mesh, sculpt drawing was not taking that into account.
Diffstat (limited to 'source/blender/draw/intern')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 5 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index de4bf0303fe..663567fd51e 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -411,7 +411,10 @@ void DRW_shgroup_call_instances_with_attrs(DRWShadingGroup *shgroup, struct GPUBatch *inst_attributes); void DRW_shgroup_call_sculpt(DRWShadingGroup *sh, Object *ob, bool wire, bool mask, bool vcol); -void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **sh, Object *ob, bool vcol); +void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **sh, + int num_sh, + Object *ob, + bool vcol); DRWCallBuffer *DRW_shgroup_call_buffer(DRWShadingGroup *shading_group, struct GPUVertFormat *format, diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 0544bb3c49b..1d0fe957631 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -858,6 +858,7 @@ void DRW_shgroup_call_instances_with_attrs(DRWShadingGroup *shgroup, typedef struct DRWSculptCallbackData { Object *ob; DRWShadingGroup **shading_groups; + int num_shading_groups; bool use_wire; bool use_mats; bool use_mask; @@ -896,6 +897,9 @@ static void sculpt_draw_cb(DRWSculptCallbackData *scd, GPU_PBVH_Buffers *buffers if (scd->use_mats) { index = GPU_pbvh_buffers_material_index_get(buffers); + if (index >= scd->num_shading_groups) { + index = 0; + } } DRWShadingGroup *shgrp = scd->shading_groups[index]; @@ -1035,6 +1039,7 @@ void DRW_shgroup_call_sculpt( DRWSculptCallbackData scd = { .ob = ob, .shading_groups = &shgroup, + .num_shading_groups = 1, .use_wire = use_wire, .use_mats = false, .use_mask = use_mask, @@ -1042,11 +1047,15 @@ void DRW_shgroup_call_sculpt( drw_sculpt_generate_calls(&scd, use_vcol); } -void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups, Object *ob, bool use_vcol) +void DRW_shgroup_call_sculpt_with_materials(DRWShadingGroup **shgroups, + int num_shgroups, + Object *ob, + bool use_vcol) { DRWSculptCallbackData scd = { .ob = ob, .shading_groups = shgroups, + .num_shading_groups = num_shgroups, .use_wire = false, .use_mats = true, .use_mask = false, |