diff --git a/source/blender/draw/DRW_select_buffer.hh b/source/blender/draw/DRW_select_buffer.hh index e6900a2dec4..3ec1533a0c6 100644 --- a/source/blender/draw/DRW_select_buffer.hh +++ b/source/blender/draw/DRW_select_buffer.hh @@ -9,6 +9,7 @@ #pragma once #include "BLI_sys_types.h" /* for bool and uint */ +#include "BLI_vector.hh" struct ARegion; struct Base; @@ -43,15 +44,13 @@ struct ObjectOffsets { struct SELECTID_Context { /* All context objects */ - Object **objects; + blender::Vector objects; /* Array with only drawn objects. When a new object is found within the rect, * it is added to the end of the list. * The list is reset to any viewport or context update. */ - Object **objects_drawn; - ObjectOffsets *index_offsets; - uint objects_len; - uint objects_drawn_len; + blender::Vector objects_drawn; + blender::Vector index_offsets; /** Total number of element indices `index_offsets[object_drawn_len - 1].vert`. */ uint index_drawn_len; diff --git a/source/blender/draw/engines/select/select_engine.cc b/source/blender/draw/engines/select/select_engine.cc index 4e95b151e3d..fc161ab8235 100644 --- a/source/blender/draw/engines/select/select_engine.cc +++ b/source/blender/draw/engines/select/select_engine.cc @@ -192,9 +192,8 @@ static void select_cache_init(void *vedata) if (!e_data.context.is_dirty) { /* Check if any of the drawn objects have been transformed. */ - Object **ob = &e_data.context.objects_drawn[0]; - for (uint i = e_data.context.objects_drawn_len; i--; ob++) { - DrawData *data = DRW_drawdata_get(&(*ob)->id, &draw_engine_select_type); + for (Object *ob : e_data.context.objects_drawn) { + DrawData *data = DRW_drawdata_get(&ob->id, &draw_engine_select_type); if (data && (data->recalc & ID_RECALC_TRANSFORM) != 0) { data->recalc &= ~ID_RECALC_TRANSFORM; e_data.context.is_dirty = true; @@ -205,7 +204,8 @@ static void select_cache_init(void *vedata) if (e_data.context.is_dirty) { /* Remove all tags from drawn or culled objects. */ copy_m4_m4(e_data.context.persmat, persmat); - e_data.context.objects_drawn_len = 0; + e_data.context.objects_drawn.clear(); + e_data.context.index_offsets.clear(); e_data.context.index_drawn_len = 1; select_engine_framebuffer_setup(); GPU_framebuffer_bind(e_data.framebuffer_select_id); @@ -270,10 +270,11 @@ static void select_cache_populate(void *vedata, Object *ob) &ob->id, &draw_engine_select_type, sizeof(SELECTID_ObjectData), nullptr, nullptr); } sel_data->dd.recalc = 0; - sel_data->drawn_index = e_data.context.objects_drawn_len; + sel_data->drawn_index = e_data.context.objects_drawn.size(); sel_data->is_drawn = true; - ObjectOffsets *ob_offsets = &e_data.context.index_offsets[e_data.context.objects_drawn_len]; + e_data.context.index_offsets.increase_size_by_unchecked(1); + ObjectOffsets *ob_offsets = &e_data.context.index_offsets.last(); uint offset = e_data.context.index_drawn_len; select_id_draw_object(vedata, @@ -287,8 +288,7 @@ static void select_cache_populate(void *vedata, Object *ob) ob_offsets->offset = offset; e_data.context.index_drawn_len = ob_offsets->vert; - e_data.context.objects_drawn[e_data.context.objects_drawn_len] = ob; - e_data.context.objects_drawn_len++; + e_data.context.objects_drawn.append(ob); e_data.runtime_new_objects++; } else if (sel_data) { @@ -341,9 +341,9 @@ static void select_engine_free() DRW_TEXTURE_FREE_SAFE(e_data.texture_u32); GPU_FRAMEBUFFER_FREE_SAFE(e_data.framebuffer_select_id); - MEM_SAFE_FREE(e_data.context.objects); - MEM_SAFE_FREE(e_data.context.index_offsets); - MEM_SAFE_FREE(e_data.context.objects_drawn); + e_data.context.objects.clear_and_shrink(); + e_data.context.objects_drawn.clear_and_shrink(); + e_data.context.index_offsets.clear_and_shrink(); } /** \} */ diff --git a/source/blender/draw/intern/draw_manager_c.cc b/source/blender/draw/intern/draw_manager_c.cc index 12bfc5aa716..64410fea284 100644 --- a/source/blender/draw/intern/draw_manager_c.cc +++ b/source/blender/draw/intern/draw_manager_c.cc @@ -2760,7 +2760,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons /* Selection engine requires a viewport. * TODO(@germano): This should be done internally in the engine. */ sel_ctx->is_dirty = true; - sel_ctx->objects_drawn_len = 0; + sel_ctx->objects_drawn.clear(); sel_ctx->index_drawn_len = 1; return; } @@ -2799,9 +2799,8 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons { drw_engines_cache_init(); - Object **obj = &sel_ctx->objects[0]; - for (uint remaining = sel_ctx->objects_len; remaining--; obj++) { - Object *obj_eval = DEG_get_evaluated_object(depsgraph, *obj); + for (Object *obj : sel_ctx->objects) { + Object *obj_eval = DEG_get_evaluated_object(depsgraph, obj); drw_engines_cache_populate(obj_eval); } diff --git a/source/blender/draw/intern/draw_select_buffer.cc b/source/blender/draw/intern/draw_select_buffer.cc index b8de060f2a1..6fd50e5569d 100644 --- a/source/blender/draw/intern/draw_select_buffer.cc +++ b/source/blender/draw/intern/draw_select_buffer.cc @@ -375,7 +375,7 @@ bool DRW_select_buffer_elem_get(const uint sel_id, uint elem_id = 0; uint base_index = 0; - for (; base_index < select_ctx->objects_drawn_len; base_index++) { + for (; base_index < select_ctx->objects_drawn.size(); base_index++) { ObjectOffsets *base_ofs = &select_ctx->index_offsets[base_index]; if (base_ofs->face > sel_id) { @@ -395,7 +395,7 @@ bool DRW_select_buffer_elem_get(const uint sel_id, } } - if (base_index == select_ctx->objects_drawn_len) { + if (base_index == select_ctx->objects_drawn.size()) { return false; } @@ -453,24 +453,22 @@ void DRW_select_buffer_context_create(Base **bases, const uint bases_len, short { SELECTID_Context *select_ctx = DRW_select_engine_context_get(); - select_ctx->objects = static_cast( - MEM_reallocN(select_ctx->objects, sizeof(*select_ctx->objects) * bases_len)); + select_ctx->objects.clear(); + select_ctx->objects_drawn.clear(); + select_ctx->index_offsets.clear(); - select_ctx->index_offsets = static_cast( - MEM_reallocN(select_ctx->index_offsets, sizeof(*select_ctx->index_offsets) * bases_len)); - - select_ctx->objects_drawn = static_cast( - MEM_reallocN(select_ctx->objects_drawn, sizeof(*select_ctx->objects_drawn) * bases_len)); + select_ctx->objects.reserve(bases_len); + select_ctx->objects_drawn.reserve(bases_len); + select_ctx->index_offsets.reserve(bases_len); for (uint base_index = 0; base_index < bases_len; base_index++) { Object *obj = bases[base_index]->object; - select_ctx->objects[base_index] = obj; + select_ctx->objects.append(obj); /* Weak but necessary for `DRW_select_buffer_elem_get`. */ obj->runtime.select_id = base_index; } - select_ctx->objects_len = bases_len; select_ctx->select_mode = select_mode; memset(select_ctx->persmat, 0, sizeof(select_ctx->persmat)); }