Select Engine: Use C++ vector types for arrays

No functional changes.
This commit is contained in:
Germano Cavalcante 2023-10-04 14:32:18 -03:00
parent 99a3a4a330
commit 72a52520db
4 changed files with 27 additions and 31 deletions

View File

@ -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<Object *> 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<Object *> objects_drawn;
blender::Vector<ObjectOffsets> index_offsets;
/** Total number of element indices `index_offsets[object_drawn_len - 1].vert`. */
uint index_drawn_len;

View File

@ -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();
}
/** \} */

View File

@ -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);
}

View File

@ -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<Object **>(
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<ObjectOffsets *>(
MEM_reallocN(select_ctx->index_offsets, sizeof(*select_ctx->index_offsets) * bases_len));
select_ctx->objects_drawn = static_cast<Object **>(
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));
}