Select Engine: Use C++ vector types for arrays
No functional changes.
This commit is contained in:
parent
99a3a4a330
commit
72a52520db
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue