diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-05-11 15:42:26 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-05-14 11:57:03 +0300 |
commit | ad0e95688d254abee315622ebdc3aeb0d2ba979d (patch) | |
tree | fe08a1fdd16b3bdd4e9e645b4a8f3e39a5856066 | |
parent | 2d28df783a029ee5b64da005b2fa400e4e8de976 (diff) |
Cleanup: DRW: Remove pointers to materials
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 22 | ||||
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_deferred.c | 13 | ||||
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_forward.c | 7 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 7 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.h | 16 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 21 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 12 |
7 files changed, 43 insertions, 55 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 35e1ff8a9c1..541511d2439 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1180,21 +1180,21 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) } } -#define ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata) \ +#define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) \ do { \ if (oedata) { \ DRW_shgroup_call_object_add_with_callback( \ - shgrp, geom, ob, ma, EEVEE_lightprobes_obj_visibility_cb, oedata); \ + shgrp, geom, ob, EEVEE_lightprobes_obj_visibility_cb, oedata); \ } \ else { \ - DRW_shgroup_call_object_add_ex(shgrp, geom, ob, ma, false); \ + DRW_shgroup_call_object_add_ex(shgrp, geom, ob, false); \ } \ } while (0) -#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, ma, geom, oedata) \ +#define ADD_SHGROUP_CALL_SAFE(shgrp, ob, geom, oedata) \ do { \ if (shgrp) { \ - ADD_SHGROUP_CALL(shgrp, ob, ma, geom, oedata); \ + ADD_SHGROUP_CALL(shgrp, ob, geom, oedata); \ } \ } while (0) @@ -1691,9 +1691,9 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, if (is_sculpt_mode) { /* Vcol is not supported in the modes that require PBVH drawing. */ bool use_vcol = false; - DRW_shgroup_call_sculpt_with_materials_add(shgrp_array, ma_array, ob, use_vcol); - DRW_shgroup_call_sculpt_with_materials_add(shgrp_depth_array, ma_array, ob, use_vcol); - DRW_shgroup_call_sculpt_with_materials_add(shgrp_depth_clip_array, ma_array, ob, use_vcol); + DRW_shgroup_call_sculpt_with_materials_add(shgrp_array, ob, use_vcol); + DRW_shgroup_call_sculpt_with_materials_add(shgrp_depth_array, ob, use_vcol); + DRW_shgroup_call_sculpt_with_materials_add(shgrp_depth_clip_array, ob, use_vcol); /* TODO(fclem): Support shadows in sculpt mode. */ } else if (mat_geom) { @@ -1718,9 +1718,9 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, oedata->test_data = &sldata->probes->vis_data; } - ADD_SHGROUP_CALL(shgrp_array[i], ob, ma_array[i], mat_geom[i], oedata); - ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, ma_array[i], mat_geom[i], oedata); - ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, ma_array[i], mat_geom[i], oedata); + ADD_SHGROUP_CALL(shgrp_array[i], ob, mat_geom[i], oedata); + ADD_SHGROUP_CALL_SAFE(shgrp_depth_array[i], ob, mat_geom[i], oedata); + ADD_SHGROUP_CALL_SAFE(shgrp_depth_clip_array[i], ob, mat_geom[i], oedata); char *name = auto_layer_names; for (int j = 0; j < auto_layer_count; ++j) { diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index bcce507da24..b19db4566dd 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -1036,24 +1036,23 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) /* Draw material color */ if (is_sculpt_mode) { struct DRWShadingGroup **shgrps = BLI_array_alloca(shgrps, materials_len); - struct Material **mats = BLI_array_alloca(mats, materials_len); for (int i = 0; i < materials_len; ++i) { - mats[i] = give_current_material(ob, i + 1); - if (mats[i] != NULL && mats[i]->a < 1.0f) { + struct Material *mat = give_current_material(ob, i + 1); + if (mat != NULL && mat->a < 1.0f) { /* Hack */ - wpd->shading.xray_alpha = mats[i]->a; + wpd->shading.xray_alpha = mat->a; material = workbench_forward_get_or_create_material_data( - vedata, ob, mats[i], NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); + vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); has_transp_mat = true; } else { material = get_or_create_material_data( - vedata, ob, mats[i], NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); + vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); } shgrps[i] = material->shgrp; } - DRW_shgroup_call_sculpt_with_materials_add(shgrps, mats, ob, false); + DRW_shgroup_call_sculpt_with_materials_add(shgrps, ob, false); } else { struct GPUBatch **geoms; diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 13bd6fe9e4d..2011afb723a 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -623,18 +623,17 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) /* Draw material color */ if (is_sculpt_mode) { struct DRWShadingGroup **shgrps = BLI_array_alloca(shgrps, materials_len); - struct Material **mats = BLI_array_alloca(mats, materials_len); for (int i = 0; i < materials_len; ++i) { - mats[i] = give_current_material(ob, i + 1); + struct Material *mat = give_current_material(ob, i + 1); material = workbench_forward_get_or_create_material_data( - vedata, ob, mats[i], NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); + vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); shgrps[i] = material->shgrp; } /* TODO(fclem) make this call optional */ DRW_shgroup_call_sculpt_add(material->shgrp_object_outline, ob, false, false, false); if (!is_wire) { - DRW_shgroup_call_sculpt_with_materials_add(shgrps, mats, ob, false); + DRW_shgroup_call_sculpt_with_materials_add(shgrps, ob, false); } } else { diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 38458dd48f0..6f9f15a7aba 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -421,16 +421,14 @@ void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, - struct Material *ma, bool bypass_culling); #define DRW_shgroup_call_object_add(shgroup, geom, ob) \ - DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, false) + DRW_shgroup_call_object_add_ex(shgroup, geom, ob, false) #define DRW_shgroup_call_object_add_no_cull(shgroup, geom, ob) \ - DRW_shgroup_call_object_add_ex(shgroup, geom, ob, NULL, true) + DRW_shgroup_call_object_add_ex(shgroup, geom, ob, true) void DRW_shgroup_call_object_add_with_callback(DRWShadingGroup *shgroup, struct GPUBatch *geom, struct Object *ob, - struct Material *ma, DRWCallVisibilityFn *callback, void *user_data); @@ -440,7 +438,6 @@ void DRW_shgroup_call_sculpt_add(DRWShadingGroup *shading_group, bool use_mask, bool use_vert_color); void DRW_shgroup_call_sculpt_with_materials_add(DRWShadingGroup **shgroups, - Material **materials, Object *ob, bool use_vcol); diff --git a/source/blender/draw/intern/draw_manager.h b/source/blender/draw/intern/draw_manager.h index 20dfe8bc057..d4a5c4b996b 100644 --- a/source/blender/draw/intern/draw_manager.h +++ b/source/blender/draw/intern/draw_manager.h @@ -100,9 +100,9 @@ enum { /* Used by DRWCallState.matflag */ enum { DRW_CALL_MODELINVERSE = (1 << 0), - DRW_CALL_MODELVIEWPROJECTION = (1 << 3), - DRW_CALL_ORCOTEXFAC = (1 << 7), - DRW_CALL_OBJECTINFO = (1 << 8), + DRW_CALL_MODELVIEWPROJECTION = (1 << 1), + DRW_CALL_ORCOTEXFAC = (1 << 2), + DRW_CALL_OBJECTINFO = (1 << 3), }; typedef struct DRWCallState { @@ -110,8 +110,9 @@ typedef struct DRWCallState { void *user_data; uchar flag; - uchar cache_id; /* Compared with DST.state_cache_id to see if matrices are still valid. */ - uint16_t matflag; /* Which matrices to compute. */ + uchar cache_id; /* Compared with DST.state_cache_id to see if matrices are still valid. */ + uchar matflag; /* Which matrices to compute. */ + short ob_index; /* Culling: Using Bounding Sphere for now for faster culling. * Not ideal for planes. */ BoundSphere bsphere; @@ -120,7 +121,7 @@ typedef struct DRWCallState { float modelinverse[4][4]; float modelviewprojection[4][4]; float orcotexfac[2][3]; /* Not view dependent */ - float objectinfo[2]; + float ob_random; } DRWCallState; typedef enum { @@ -141,7 +142,6 @@ typedef struct DRWCall { union { struct { /* type == DRW_CALL_SINGLE */ GPUBatch *geometry; - short ma_index; } single; struct { /* type == DRW_CALL_RANGE */ GPUBatch *geometry; @@ -250,7 +250,7 @@ struct DRWShadingGroup { int orcotexfac; int callid; int objectinfo; - uint16_t matflag; /* Matrices needed, same as DRWCall.flag */ + uchar matflag; /* Matrices needed, same as DRWCall.flag */ DRWPass *pass_parent; /* backlink to pass we're in */ #ifndef NDEBUG diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 5d5e81ebbe2..0eac9512d0f 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -386,7 +386,7 @@ static void drw_call_state_update_matflag(DRWCallState *state, } if (new_flags & DRW_CALL_OBJECTINFO) { - state->objectinfo[0] = ob ? ob->index : 0; + state->ob_index = ob ? ob->index : 0; uint random; if (DST.dupli_source) { random = DST.dupli_source->random_id; @@ -394,7 +394,7 @@ static void drw_call_state_update_matflag(DRWCallState *state, else { random = BLI_hash_int_2d(BLI_hash_string(ob->id.name + 2), 0); } - state->objectinfo[1] = random * (1.0f / (float)0xFFFFFFFF); + state->ob_random = random * (1.0f / (float)0xFFFFFFFF); } } @@ -528,8 +528,10 @@ void DRW_shgroup_call_procedural_triangles_add(DRWShadingGroup *shgroup, } /* These calls can be culled and are optimized for redraw */ -void DRW_shgroup_call_object_add_ex( - DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, Material *ma, bool bypass_culling) +void DRW_shgroup_call_object_add_ex(DRWShadingGroup *shgroup, + GPUBatch *geom, + Object *ob, + bool bypass_culling) { BLI_assert(geom != NULL); BLI_assert(ELEM(shgroup->type, DRW_SHG_NORMAL, DRW_SHG_FEEDBACK_TRANSFORM)); @@ -542,7 +544,6 @@ void DRW_shgroup_call_object_add_ex( call->state->flag |= (bypass_culling) ? DRW_CALL_BYPASS_CULLING : 0; call->type = DRW_CALL_SINGLE; call->single.geometry = geom; - call->single.ma_index = ma ? ma->index : 0; #ifdef USE_GPU_SELECT call->select_id = DST.select_id; #endif @@ -551,7 +552,6 @@ void DRW_shgroup_call_object_add_ex( void DRW_shgroup_call_object_add_with_callback(DRWShadingGroup *shgroup, GPUBatch *geom, Object *ob, - Material *ma, DRWCallVisibilityFn *callback, void *user_data) { @@ -566,7 +566,6 @@ void DRW_shgroup_call_object_add_with_callback(DRWShadingGroup *shgroup, call->state->user_data = user_data; call->type = DRW_CALL_SINGLE; call->single.geometry = geom; - call->single.ma_index = ma ? ma->index : 0; #ifdef USE_GPU_SELECT call->select_id = DST.select_id; #endif @@ -618,7 +617,6 @@ void DRW_shgroup_call_object_instances_add(DRWShadingGroup *shgroup, typedef struct DRWSculptCallbackData { Object *ob; DRWShadingGroup **shading_groups; - Material **materials; bool use_wire; bool use_mats; bool use_mask; @@ -646,7 +644,6 @@ static float sculpt_debug_colors[9][4] = { static void sculpt_draw_cb(DRWSculptCallbackData *scd, GPU_PBVH_Buffers *buffers) { GPUBatch *geom = GPU_pbvh_buffers_batch_get(buffers, scd->fast_mode, scd->use_wire); - Material *ma = NULL; short index = 0; /* Meh... use_mask is a bit misleading here. */ @@ -656,7 +653,6 @@ static void sculpt_draw_cb(DRWSculptCallbackData *scd, GPU_PBVH_Buffers *buffers if (scd->use_mats) { index = GPU_pbvh_buffers_material_index_get(buffers); - ma = scd->materials[index]; } DRWShadingGroup *shgrp = scd->shading_groups[index]; @@ -668,7 +664,7 @@ static void sculpt_draw_cb(DRWSculptCallbackData *scd, GPU_PBVH_Buffers *buffers #endif /* DRW_shgroup_call_object_add_ex reuses matrices calculations for all the drawcalls of this * object. */ - DRW_shgroup_call_object_add_ex(shgrp, geom, scd->ob, ma, true); + DRW_shgroup_call_object_add_ex(shgrp, geom, scd->ob, true); } } @@ -735,7 +731,6 @@ void DRW_shgroup_call_sculpt_add( DRWSculptCallbackData scd = { .ob = ob, .shading_groups = &shgroup, - .materials = NULL, .use_wire = use_wire, .use_mats = false, .use_mask = use_mask, @@ -744,14 +739,12 @@ void DRW_shgroup_call_sculpt_add( } void DRW_shgroup_call_sculpt_with_materials_add(DRWShadingGroup **shgroups, - Material **materials, Object *ob, bool use_vcol) { DRWSculptCallbackData scd = { .ob = ob, .shading_groups = shgroups, - .materials = materials, .use_wire = false, .use_mats = true, .use_mask = false, diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index efea155d35d..a1532243381 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -818,12 +818,12 @@ static void draw_geometry_prepare(DRWShadingGroup *shgroup, DRWCall *call) (float *)state->modelviewprojection); } if (shgroup->objectinfo != -1) { - float objectinfo[4]; - objectinfo[0] = state->objectinfo[0]; - objectinfo[1] = call->single.ma_index; /* WATCH this is only valid for single drawcalls. */ - objectinfo[2] = state->objectinfo[1]; - objectinfo[3] = (state->flag & DRW_CALL_NEGSCALE) ? -1.0f : 1.0f; - GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 4, 1, (float *)objectinfo); + float infos[4]; + infos[0] = state->ob_index; + // infos[1]; /* UNUSED. */ + infos[2] = state->ob_random; + infos[3] = (state->flag & DRW_CALL_NEGSCALE) ? -1.0f : 1.0f; + GPU_shader_uniform_vector(shgroup->shader, shgroup->objectinfo, 4, 1, (float *)infos); } if (shgroup->orcotexfac != -1) { GPU_shader_uniform_vector( |