diff options
25 files changed, 186 insertions, 248 deletions
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index a274eda84fe..beff451256d 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -154,7 +154,7 @@ static void basic_cache_populate(void *vedata, Object *ob) if (is_flat_object_viewed_from_side) { /* Avoid losing flat objects when in ortho views (see T56549) */ struct GPUBatch *geom = DRW_cache_object_all_edges_get(ob); - DRW_shgroup_call_object(stl->g_data->depth_shgrp, geom, ob); + DRW_shgroup_call(stl->g_data->depth_shgrp, geom, ob); return; } } @@ -164,7 +164,7 @@ static void basic_cache_populate(void *vedata, Object *ob) const bool do_cull = (draw_ctx->v3d && (draw_ctx->v3d->shading.flag & V3D_SHADING_BACKFACE_CULLING)); /* Depth Prepass */ - DRW_shgroup_call_object( + DRW_shgroup_call( (do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob); } } diff --git a/source/blender/draw/engines/eevee/eevee_depth_of_field.c b/source/blender/draw/engines/eevee/eevee_depth_of_field.c index 4675901b952..8c3e58e76c9 100644 --- a/source/blender/draw/engines/eevee/eevee_depth_of_field.c +++ b/source/blender/draw/engines/eevee/eevee_depth_of_field.c @@ -217,7 +217,7 @@ void EEVEE_depth_of_field_cache_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_ DRW_shgroup_uniform_texture_ref(grp, "cocBuffer", &effects->dof_coc); DRW_shgroup_uniform_vec4(grp, "bokehParams", effects->dof_bokeh, 2); - DRW_shgroup_call_procedural_triangles(grp, sprite_len, NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, sprite_len); DRW_PASS_CREATE(psl->dof_resolve, DRW_STATE_WRITE_COLOR); diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c index 8e670da2ab7..8f2fd633890 100644 --- a/source/blender/draw/engines/eevee/eevee_effects.c +++ b/source/blender/draw/engines/eevee/eevee_effects.c @@ -292,7 +292,7 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "source", &e_data.color_src); DRW_shgroup_uniform_float(grp, "texelSize", &e_data.cube_texel_size, 1); DRW_shgroup_uniform_int_copy(grp, "Layer", 0); - DRW_shgroup_call_instances(grp, quad, NULL, 6); + DRW_shgroup_call_instances(grp, NULL, quad, 6); } { diff --git a/source/blender/draw/engines/eevee/eevee_lightprobes.c b/source/blender/draw/engines/eevee/eevee_lightprobes.c index 6253a9d3808..bbad169f363 100644 --- a/source/blender/draw/engines/eevee/eevee_lightprobes.c +++ b/source/blender/draw/engines/eevee/eevee_lightprobes.c @@ -398,7 +398,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); - DRW_shgroup_call_procedural_triangles(grp, cube_len * 2, NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, cube_len * 2); } /* Grid Display */ @@ -424,7 +424,7 @@ void EEVEE_lightprobes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedat DRW_shgroup_uniform_block(shgrp, "grid_block", sldata->grid_ubo); DRW_shgroup_uniform_block(shgrp, "common_block", sldata->common_ubo); int tri_count = egrid->resolution[0] * egrid->resolution[1] * egrid->resolution[2] * 2; - DRW_shgroup_call_procedural_triangles(shgrp, tri_count, NULL); + DRW_shgroup_call_procedural_triangles(shgrp, NULL, tri_count); } } @@ -787,7 +787,7 @@ void EEVEE_lightprobes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *ved DRW_shgroup_uniform_texture_ref(grp, "source", &txl->planar_pool); DRW_shgroup_uniform_float(grp, "fireflyFactor", &sldata->common_data.ssr_firefly_fac, 1); - DRW_shgroup_call_procedural_triangles(grp, pinfo->num_planar, NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, pinfo->num_planar); } } diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index e966fadbcdb..24d35e2bd45 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -453,7 +453,7 @@ void EEVEE_lights_cache_shcaster_add(EEVEE_ViewLayerData *UNUSED(sldata), struct GPUBatch *geom, Object *ob) { - DRW_shgroup_call_object(stl->g_data->shadow_shgrp, geom, ob); + DRW_shgroup_call(stl->g_data->shadow_shgrp, geom, ob); } void EEVEE_lights_cache_shcaster_material_add(EEVEE_ViewLayerData *sldata, @@ -483,7 +483,7 @@ void EEVEE_lights_cache_shcaster_material_add(EEVEE_ViewLayerData *sldata, DRW_shgroup_uniform_float(grp, "alphaThreshold", alpha_threshold, 1); } - DRW_shgroup_call_object(grp, geom, ob); + DRW_shgroup_call(grp, geom, ob); } /* Make that object update shadow casting lights inside its influence bounding box. */ diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index cd75cce89a9..3b78d8718ef 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1126,10 +1126,10 @@ void EEVEE_materials_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) #define ADD_SHGROUP_CALL(shgrp, ob, geom, oedata) \ do { \ if (oedata) { \ - DRW_shgroup_call_object_with_callback(shgrp, geom, ob, oedata); \ + DRW_shgroup_call_with_callback(shgrp, geom, ob, oedata); \ } \ else { \ - DRW_shgroup_call_object(shgrp, geom, ob); \ + DRW_shgroup_call(shgrp, geom, ob); \ } \ } while (0) diff --git a/source/blender/draw/engines/eevee/eevee_volumes.c b/source/blender/draw/engines/eevee/eevee_volumes.c index 47a02a285f5..e3afa91a5a9 100644 --- a/source/blender/draw/engines/eevee/eevee_volumes.c +++ b/source/blender/draw/engines/eevee/eevee_volumes.c @@ -356,7 +356,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_texture(grp, "sampflame", e_data.dummy_flame); DRW_shgroup_uniform_vec2_copy(grp, "unftemperature", (float[2]){0.0f, 1.0f}); - DRW_shgroup_call_procedural_triangles(grp, common_data->vol_tex_size[2], NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); } @@ -367,7 +367,7 @@ void EEVEE_volumes_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) grp = DRW_shgroup_create(e_data.volumetric_clear_sh, psl->volumetric_world_ps); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); - DRW_shgroup_call_procedural_triangles(grp, common_data->vol_tex_size[2], NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); } } @@ -462,7 +462,7 @@ void EEVEE_volumes_cache_object_add(EEVEE_ViewLayerData *sldata, /* TODO Reduce to number of slices intersecting. */ /* TODO Preemptive culling. */ - DRW_shgroup_call_procedural_triangles(grp, sldata->common_data.vol_tex_size[2], ob->obmat); + DRW_shgroup_call_procedural_triangles(grp, ob, sldata->common_data.vol_tex_size[2]); vedata->stl->effects->enabled_effects |= (EFFECT_VOLUMETRIC | EFFECT_POST_BUFFER); } @@ -495,7 +495,7 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); - DRW_shgroup_call_procedural_triangles(grp, common_data->vol_tex_size[2], NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); DRW_PASS_CREATE(psl->volumetric_integration_ps, DRW_STATE_WRITE_COLOR); grp = DRW_shgroup_create(e_data.volumetric_integration_sh, psl->volumetric_integration_ps); @@ -503,7 +503,7 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "volumeExtinction", &txl->volume_transmit); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); - DRW_shgroup_call_procedural_triangles(grp, common_data->vol_tex_size[2], NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, common_data->vol_tex_size[2]); DRW_PASS_CREATE(psl->volumetric_resolve_ps, DRW_STATE_WRITE_COLOR); grp = DRW_shgroup_create(e_data.volumetric_resolve_sh, psl->volumetric_resolve_ps); @@ -513,7 +513,7 @@ void EEVEE_volumes_cache_finish(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) DRW_shgroup_uniform_texture_ref(grp, "inSceneDepth", &e_data.depth_src); DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); - DRW_shgroup_call_procedural_triangles(grp, 1, NULL); + DRW_shgroup_call_procedural_triangles(grp, NULL, 1); } } diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c index d8748b05f96..9512304b94b 100644 --- a/source/blender/draw/engines/external/external_engine.c +++ b/source/blender/draw/engines/external/external_engine.c @@ -188,7 +188,7 @@ static void external_cache_populate(void *vedata, Object *ob) struct GPUBatch *geom = DRW_cache_object_surface_get(ob); if (geom) { /* Depth Prepass */ - DRW_shgroup_call(stl->g_data->depth_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->depth_shgrp, geom, ob); } } } diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c index 964b7974de3..cd35395064b 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c @@ -1705,6 +1705,7 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, break; } + float(*obmat)[4] = (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : cache_ob->obmat; switch (elm->type) { case eGpencilBatchGroupType_Stroke: { const int len = elm->vertex_idx - start_stroke; @@ -1723,12 +1724,7 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, scale, cache_ob->shading_type); if ((do_onion) || (elm->onion == false)) { - DRW_shgroup_call_range(shgrp, - cache->b_stroke.batch, - (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : - cache_ob->obmat, - start_stroke, - len); + DRW_shgroup_call_range_obmat(shgrp, cache->b_stroke.batch, obmat, start_stroke, len); } stl->storage->shgroup_id++; start_stroke = elm->vertex_idx; @@ -1752,12 +1748,7 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, cache_ob->shading_type); if ((do_onion) || (elm->onion == false)) { - DRW_shgroup_call_range(shgrp, - cache->b_point.batch, - (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : - cache_ob->obmat, - start_point, - len); + DRW_shgroup_call_range_obmat(shgrp, cache->b_point.batch, obmat, start_point, len); } stl->storage->shgroup_id++; start_point = elm->vertex_idx; @@ -1778,12 +1769,7 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, cache_ob->shading_type); if ((do_onion) || (elm->onion == false)) { - DRW_shgroup_call_range(shgrp, - cache->b_fill.batch, - (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : - cache_ob->obmat, - start_fill, - len); + DRW_shgroup_call_range_obmat(shgrp, cache->b_fill.batch, obmat, start_fill, len); } stl->storage->shgroup_id++; start_fill = elm->vertex_idx; @@ -1793,12 +1779,8 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, if (stl->g_data->shgrps_edit_point) { const int len = elm->vertex_idx - start_edit; /* use always the same group */ - DRW_shgroup_call_range(stl->g_data->shgrps_edit_point, - cache->b_edit.batch, - (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : - cache_ob->obmat, - start_edit, - len); + DRW_shgroup_call_range_obmat( + stl->g_data->shgrps_edit_point, cache->b_edit.batch, obmat, start_edit, len); start_edit = elm->vertex_idx; } @@ -1808,12 +1790,8 @@ static void DRW_gpencil_shgroups_create(GPENCIL_e_data *e_data, if (stl->g_data->shgrps_edit_line) { const int len = elm->vertex_idx - start_edlin; /* use always the same group */ - DRW_shgroup_call_range(stl->g_data->shgrps_edit_line, - cache->b_edlin.batch, - (!cache_ob->is_dup_ob) ? gpf->runtime.parent_obmat : - cache_ob->obmat, - start_edlin, - len); + DRW_shgroup_call_range_obmat( + stl->g_data->shgrps_edit_line, cache->b_edlin.batch, obmat, start_edlin, len); start_edlin = elm->vertex_idx; } diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index f597797ae38..f78f7295d24 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -680,7 +680,7 @@ void GPENCIL_cache_populate(void *vedata, Object *ob) copy_v3_v3(grid_matrix[3], ob->obmat[3]); } - DRW_shgroup_call(stl->g_data->shgrps_grid, e_data.batch_grid, grid_matrix); + DRW_shgroup_call_obmat(stl->g_data->shgrps_grid, e_data.batch_grid, grid_matrix); } } } diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c index 3e442ce2125..516d4de897f 100644 --- a/source/blender/draw/engines/workbench/workbench_deferred.c +++ b/source/blender/draw/engines/workbench/workbench_deferred.c @@ -993,7 +993,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) material = get_or_create_material_data( vedata, ob, mat, image, iuser, color_type, interp); } - DRW_shgroup_call_object(material->shgrp, geom_array[i], ob); + DRW_shgroup_call(material->shgrp, geom_array[i], ob); } } } @@ -1030,7 +1030,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) } if (geom) { - DRW_shgroup_call_object(material->shgrp, geom, ob); + DRW_shgroup_call(material->shgrp, geom, ob); } } } @@ -1077,7 +1077,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) material = get_or_create_material_data( vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0); } - DRW_shgroup_call_object(material->shgrp, geoms[i], ob); + DRW_shgroup_call(material->shgrp, geoms[i], ob); } } } @@ -1120,7 +1120,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) } DRW_shgroup_uniform_vec3(grp, "lightDirection", engine_object_data->shadow_dir, 1); DRW_shgroup_uniform_float_copy(grp, "lightDistance", 1e5f); - DRW_shgroup_call(grp, geom_shadow, ob->obmat); + DRW_shgroup_call_no_cull(grp, geom_shadow, ob); #ifdef DEBUG_SHADOW_VOLUME DRW_debug_bbox(&engine_object_data->shadow_bbox, (float[4]){1.0f, 0.0f, 0.0f, 1.0f}); #endif @@ -1142,7 +1142,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) } DRW_shgroup_uniform_vec3(grp, "lightDirection", engine_object_data->shadow_dir, 1); DRW_shgroup_uniform_float_copy(grp, "lightDistance", extrude_distance); - DRW_shgroup_call(grp, DRW_cache_object_surface_get(ob), ob->obmat); + DRW_shgroup_call_no_cull(grp, DRW_cache_object_surface_get(ob), ob); } if (is_manifold) { @@ -1154,7 +1154,7 @@ void workbench_deferred_solid_cache_populate(WORKBENCH_Data *vedata, Object *ob) } DRW_shgroup_uniform_vec3(grp, "lightDirection", engine_object_data->shadow_dir, 1); DRW_shgroup_uniform_float_copy(grp, "lightDistance", extrude_distance); - DRW_shgroup_call(grp, geom_shadow, ob->obmat); + DRW_shgroup_call_no_cull(grp, geom_shadow, ob); #ifdef DEBUG_SHADOW_VOLUME DRW_debug_bbox(&engine_object_data->shadow_bbox, (float[4]){0.0f, 1.0f, 0.0f, 1.0f}); #endif diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index 6b1982151cf..26c4b920382 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -582,8 +582,8 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) int color_type = workbench_material_determine_color_type(wpd, image, ob, is_sculpt_mode); material = workbench_forward_get_or_create_material_data( vedata, ob, mat, image, iuser, color_type, interp, is_sculpt_mode); - DRW_shgroup_call_object(material->shgrp_object_outline, geom_array[i], ob); - DRW_shgroup_call_object(material->shgrp, geom_array[i], ob); + DRW_shgroup_call(material->shgrp_object_outline, geom_array[i], ob); + DRW_shgroup_call(material->shgrp, geom_array[i], ob); } } else if (ELEM(wpd->shading.color_type, @@ -612,9 +612,9 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) material = workbench_forward_get_or_create_material_data( vedata, ob, NULL, NULL, NULL, color_type, 0, is_sculpt_mode); /* TODO(fclem) make this call optional */ - DRW_shgroup_call_object(material->shgrp_object_outline, geom, ob); + DRW_shgroup_call(material->shgrp_object_outline, geom, ob); if (!is_wire) { - DRW_shgroup_call_object(material->shgrp, geom, ob); + DRW_shgroup_call(material->shgrp, geom, ob); } } } @@ -652,9 +652,9 @@ void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob) material = workbench_forward_get_or_create_material_data( vedata, ob, mat, NULL, NULL, V3D_SHADING_MATERIAL_COLOR, 0, is_sculpt_mode); /* TODO(fclem) make this call optional */ - DRW_shgroup_call_object(material->shgrp_object_outline, mat_geom[i], ob); + DRW_shgroup_call(material->shgrp_object_outline, mat_geom[i], ob); if (!is_wire) { - DRW_shgroup_call_object(material->shgrp, mat_geom[i], ob); + DRW_shgroup_call(material->shgrp, mat_geom[i], ob); } } } diff --git a/source/blender/draw/engines/workbench/workbench_volume.c b/source/blender/draw/engines/workbench/workbench_volume.c index a2fdf35109b..575da1f9683 100644 --- a/source/blender/draw/engines/workbench/workbench_volume.c +++ b/source/blender/draw/engines/workbench/workbench_volume.c @@ -211,10 +211,10 @@ void workbench_volume_cache_populate(WORKBENCH_Data *vedata, DRW_shgroup_uniform_float_copy(grp, "densityScale", 10.0f * sds->display_thickness); if (use_slice) { - DRW_shgroup_call_object(grp, DRW_cache_quad_get(), ob); + DRW_shgroup_call(grp, DRW_cache_quad_get(), ob); } else { - DRW_shgroup_call_object(grp, DRW_cache_cube_get(), ob); + DRW_shgroup_call(grp, DRW_cache_cube_get(), ob); } BLI_addtail(&wpd->smoke_domains, BLI_genericNodeN(smd)); diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 406635297ab..4115038ee42 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -392,37 +392,51 @@ DRWShadingGroup *DRW_shgroup_transform_feedback_create(struct GPUShader *shader, /* return final visibility */ typedef bool(DRWCallVisibilityFn)(bool vis_in, void *user_data); -void DRW_shgroup_call(DRWShadingGroup *sh, struct GPUBatch *geom, float (*obmat)[4]); -void DRW_shgroup_call_range( - DRWShadingGroup *sh, struct GPUBatch *geom, float (*obmat)[4], uint v_sta, uint v_ct); +void DRW_shgroup_call_ex(DRWShadingGroup *shgroup, + Object *ob, + float (*obmat)[4], + struct GPUBatch *geom, + uint v_sta, + uint v_ct, + bool bypass_culling, + void *user_data); -void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, uint point_ct, float (*obmat)[4]); -void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, uint line_ct, float (*obmat)[4]); -void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *sh, uint tri_ct, float (*obmat)[4]); +/* If ob is NULL, unit modelmatrix is assumed and culling is bypassed. */ +#define DRW_shgroup_call(shgrp, geom, ob) \ + DRW_shgroup_call_ex(shgrp, ob, NULL, geom, 0, 0, false, NULL); -void DRW_shgroup_call_object_ex(DRWShadingGroup *shgroup, - struct GPUBatch *geom, - struct Object *ob, - bool bypass_culling); -#define DRW_shgroup_call_object(shgroup, geom, ob) \ - DRW_shgroup_call_object_ex(shgroup, geom, ob, false) -#define DRW_shgroup_call_object_no_cull(shgroup, geom, ob) \ - DRW_shgroup_call_object_ex(shgroup, geom, ob, true) +/* Same as DRW_shgroup_call but override the obmat. Not culled. */ +#define DRW_shgroup_call_obmat(shgrp, geom, obmat) \ + DRW_shgroup_call_ex(shgrp, NULL, obmat, geom, 0, 0, false, NULL); /* TODO(fclem) remove this when we have DRWView */ /* user_data is used by DRWCallVisibilityFn defined in DRWView. */ -void DRW_shgroup_call_object_with_callback(DRWShadingGroup *shgroup, - struct GPUBatch *geom, - struct Object *ob, - void *user_data); +#define DRW_shgroup_call_with_callback(shgrp, geom, ob, user_data) \ + DRW_shgroup_call_ex(shgrp, ob, NULL, geom, 0, 0, false, user_data); + +/* Same as DRW_shgroup_call but bypass culling even if ob is not NULL. */ +#define DRW_shgroup_call_no_cull(shgrp, geom, ob) \ + DRW_shgroup_call_ex(shgrp, ob, NULL, geom, 0, 0, true, NULL); + +/* Only draw a certain range of geom. */ +#define DRW_shgroup_call_range(shgrp, geom, ob, v_sta, v_ct) \ + DRW_shgroup_call_ex(shgrp, ob, NULL, geom, v_sta, v_ct, false, NULL); + +/* Same as DRW_shgroup_call_range but override the obmat. Special for gpencil. */ +#define DRW_shgroup_call_range_obmat(shgrp, geom, obmat, v_sta, v_ct) \ + DRW_shgroup_call_ex(shgrp, NULL, obmat, geom, v_sta, v_ct, false, NULL); + +void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, Object *ob, uint point_ct); +void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, Object *ob, uint line_ct); +void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *sh, Object *ob, uint tri_ct); void DRW_shgroup_call_instances(DRWShadingGroup *shgroup, + Object *ob, struct GPUBatch *geom, - float (*obmat)[4], uint count); void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup, + Object *ob, struct GPUBatch *geom, - float (*obmat)[4], struct GPUBatch *inst_attributes); void DRW_shgroup_call_sculpt(DRWShadingGroup *sh, Object *ob, bool wire, bool mask, bool vcol); diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c index 50819f6a522..20d5ae096c9 100644 --- a/source/blender/draw/intern/draw_hair.c +++ b/source/blender/draw/intern/draw_hair.c @@ -195,8 +195,8 @@ static DRWShadingGroup *drw_shgroup_create_hair_procedural_ex(Object *object, shgrp, "hairCloseTip", (part->shape_flag & PART_SHAPE_CLOSE_TIP) != 0); /* TODO(fclem): Until we have a better way to cull the hair and render with orco, bypass culling * test. */ - DRW_shgroup_call_object_no_cull( - shgrp, hair_cache->final[subdiv].proc_hairs[thickness_res - 1], object); + GPUBatch *geom = hair_cache->final[subdiv].proc_hairs[thickness_res - 1]; + DRW_shgroup_call_no_cull(shgrp, geom, object); /* Transform Feedback subdiv. */ if (need_ft_update) { @@ -224,7 +224,7 @@ static DRWShadingGroup *drw_shgroup_create_hair_procedural_ex(Object *object, DRW_shgroup_uniform_texture(tf_shgrp, "hairStrandBuffer", hair_cache->strand_tex); DRW_shgroup_uniform_texture(tf_shgrp, "hairStrandSegBuffer", hair_cache->strand_seg_tex); DRW_shgroup_uniform_int(tf_shgrp, "hairStrandsRes", &hair_cache->final[subdiv].strands_res, 1); - DRW_shgroup_call_procedural_points(tf_shgrp, final_points_len, NULL); + DRW_shgroup_call_procedural_points(tf_shgrp, NULL, final_points_len); } return shgrp; diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 24f2670dd2d..5aec14a3100 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -433,65 +433,70 @@ static DRWCallState *drw_call_state_create(DRWShadingGroup *shgroup, float (*obm static DRWCallState *drw_call_state_object(DRWShadingGroup *shgroup, float (*obmat)[4], Object *ob) { - if (DST.ob_state == NULL) { - DST.ob_state = drw_call_state_create(shgroup, obmat, ob); + if (ob == NULL) { + if (obmat == NULL) { + /* TODO return unitmat state. */ + return drw_call_state_create(shgroup, obmat, ob); + } + else { + return drw_call_state_create(shgroup, obmat, ob); + } } else { - /* If the DRWCallState is reused, add necessary matrices. */ - drw_call_state_update_matflag(DST.ob_state, shgroup, ob); - } - - return DST.ob_state; -} - -void DRW_shgroup_call(DRWShadingGroup *shgroup, GPUBatch *geom, float (*obmat)[4]) -{ - BLI_assert(geom != NULL); - - DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); - BLI_LINKS_APPEND(&shgroup->calls, call); + if (DST.ob_state == NULL) { + DST.ob_state = drw_call_state_create(shgroup, obmat, ob); + } + else { + /* If the DRWCallState is reused, add necessary matrices. */ + drw_call_state_update_matflag(DST.ob_state, shgroup, ob); + } - call->state = drw_call_state_create(shgroup, obmat, NULL); - call->batch = geom; - call->vert_first = 0; - call->vert_count = 0; /* Auto from batch. */ - call->inst_count = 0; -#ifdef USE_GPU_SELECT - call->select_id = DST.select_id; - call->inst_selectid = NULL; -#endif + return DST.ob_state; + } } -void DRW_shgroup_call_range( - DRWShadingGroup *shgroup, GPUBatch *geom, float (*obmat)[4], uint v_sta, uint v_count) +void DRW_shgroup_call_ex(DRWShadingGroup *shgroup, + Object *ob, + float (*obmat)[4], + struct GPUBatch *geom, + uint v_sta, + uint v_ct, + bool bypass_culling, + void *user_data) { BLI_assert(geom != NULL); - BLI_assert(v_count); DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_create(shgroup, obmat, NULL); + call->state = drw_call_state_object(shgroup, ob ? ob->obmat : obmat, ob); call->batch = geom; call->vert_first = v_sta; - call->vert_count = v_count; + call->vert_count = v_ct; /* 0 means auto from batch. */ call->inst_count = 0; #ifdef USE_GPU_SELECT call->select_id = DST.select_id; call->inst_selectid = NULL; #endif + if (call->state->culling) { + call->state->culling->user_data = user_data; + if (bypass_culling) { + /* NOTE this will disable culling for the whole object. */ + call->state->culling->bsphere.radius = -1.0f; + } + } } static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup, GPUBatch *geom, - uint vert_count, - float (*obmat)[4]) + Object *ob, + uint vert_count) { DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_object(shgroup, obmat, NULL); + call->state = drw_call_state_object(shgroup, ob ? ob->obmat : NULL, ob); call->batch = geom; call->vert_first = 0; call->vert_count = vert_count; @@ -502,81 +507,27 @@ static void drw_shgroup_call_procedural_add_ex(DRWShadingGroup *shgroup, #endif } -void DRW_shgroup_call_procedural_points(DRWShadingGroup *shgroup, - uint point_len, - float (*obmat)[4]) +void DRW_shgroup_call_procedural_points(DRWShadingGroup *shgroup, Object *ob, uint point_len) { struct GPUBatch *geom = drw_cache_procedural_points_get(); - drw_shgroup_call_procedural_add_ex(shgroup, geom, point_len, obmat); + drw_shgroup_call_procedural_add_ex(shgroup, geom, ob, point_len); } -void DRW_shgroup_call_procedural_lines(DRWShadingGroup *shgroup, - uint line_count, - float (*obmat)[4]) +void DRW_shgroup_call_procedural_lines(DRWShadingGroup *shgroup, Object *ob, uint line_count) { struct GPUBatch *geom = drw_cache_procedural_lines_get(); - drw_shgroup_call_procedural_add_ex(shgroup, geom, line_count * 2, obmat); + drw_shgroup_call_procedural_add_ex(shgroup, geom, ob, line_count * 2); } -void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *shgroup, - uint tria_count, - float (*obmat)[4]) +void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *shgroup, Object *ob, uint tria_count) { struct GPUBatch *geom = drw_cache_procedural_triangles_get(); - drw_shgroup_call_procedural_add_ex(shgroup, geom, tria_count * 3, obmat); -} - -/* These calls can be culled and are optimized for redraw */ -void DRW_shgroup_call_object_ex(DRWShadingGroup *shgroup, - GPUBatch *geom, - Object *ob, - bool bypass_culling) -{ - BLI_assert(geom != NULL); - - DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); - BLI_LINKS_APPEND(&shgroup->calls, call); - - call->state = drw_call_state_object(shgroup, ob->obmat, ob); - call->batch = geom; - call->vert_first = 0; - call->vert_count = 0; /* Auto from batch. */ - call->inst_count = 0; -#ifdef USE_GPU_SELECT - call->select_id = DST.select_id; - call->inst_selectid = NULL; -#endif - if (bypass_culling) { - /* NOTE this will disable culling for the whole object. */ - call->state->culling->bsphere.radius = -1.0f; - } -} - -void DRW_shgroup_call_object_with_callback(DRWShadingGroup *shgroup, - GPUBatch *geom, - Object *ob, - void *user_data) -{ - BLI_assert(geom != NULL); - - DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); - BLI_LINKS_APPEND(&shgroup->calls, call); - - call->state = drw_call_state_object(shgroup, ob->obmat, ob); - call->state->culling->user_data = user_data; - call->batch = geom; - call->vert_first = 0; - call->vert_count = 0; /* Auto from batch. */ - call->inst_count = 0; -#ifdef USE_GPU_SELECT - call->select_id = DST.select_id; - call->inst_selectid = NULL; -#endif + drw_shgroup_call_procedural_add_ex(shgroup, geom, ob, tria_count * 3); } void DRW_shgroup_call_instances(DRWShadingGroup *shgroup, - GPUBatch *geom, - float (*obmat)[4], + Object *ob, + struct GPUBatch *geom, uint count) { BLI_assert(geom != NULL); @@ -584,7 +535,7 @@ void DRW_shgroup_call_instances(DRWShadingGroup *shgroup, DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_create(shgroup, obmat, NULL); + call->state = drw_call_state_object(shgroup, ob ? ob->obmat : NULL, ob); call->batch = geom; call->vert_first = 0; call->vert_count = 0; /* Auto from batch. */ @@ -596,8 +547,8 @@ void DRW_shgroup_call_instances(DRWShadingGroup *shgroup, } void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup, + Object *ob, struct GPUBatch *geom, - float (*obmat)[4], struct GPUBatch *inst_attributes) { BLI_assert(geom != NULL); @@ -608,7 +559,7 @@ void DRW_shgroup_call_instances_with_attribs(DRWShadingGroup *shgroup, DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_create(shgroup, obmat, NULL); + call->state = drw_call_state_object(shgroup, ob ? ob->obmat : NULL, ob); call->batch = DRW_temp_batch_instance_request(DST.idatalist, buf_inst, geom); call->vert_first = 0; call->vert_count = 0; /* Auto from batch. */ @@ -669,9 +620,9 @@ static void sculpt_draw_cb(DRWSculptCallbackData *scd, GPU_PBVH_Buffers *buffers shgrp = DRW_shgroup_create_sub(shgrp); DRW_shgroup_uniform_vec3(shgrp, "materialDiffuseColor", SCULPT_DEBUG_COLOR(scd->node_nr++), 1); #endif - /* DRW_shgroup_call_object_ex reuses matrices calculations for all the drawcalls of this + /* DRW_shgroup_call_no_cull reuses matrices calculations for all the drawcalls of this * object. */ - DRW_shgroup_call_object_ex(shgrp, geom, scd->ob, true); + DRW_shgroup_call_no_cull(shgrp, geom, scd->ob); } } @@ -769,7 +720,7 @@ DRWCallBuffer *DRW_shgroup_call_buffer(DRWShadingGroup *shgroup, DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_create(shgroup, NULL, NULL); + call->state = drw_call_state_object(shgroup, NULL, NULL); GPUVertBuf *buf = DRW_temp_buffer_request(DST.idatalist, format, &call->vert_count); call->batch = DRW_temp_batch_request(DST.idatalist, buf, prim_type); call->vert_first = 0; @@ -799,7 +750,7 @@ DRWCallBuffer *DRW_shgroup_call_buffer_instance(DRWShadingGroup *shgroup, DRWCall *call = BLI_memblock_alloc(DST.vmempool->calls); BLI_LINKS_APPEND(&shgroup->calls, call); - call->state = drw_call_state_create(shgroup, NULL, NULL); + call->state = drw_call_state_object(shgroup, NULL, NULL); GPUVertBuf *buf = DRW_temp_buffer_request(DST.idatalist, format, &call->inst_count); call->batch = DRW_temp_batch_instance_request(DST.idatalist, buf, geom); call->vert_first = 0; diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index 212768dcdc9..068af2e2012 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -269,30 +269,30 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob) } geom = DRW_cache_curve_edge_wire_get(ob); - DRW_shgroup_call(wire_shgrp, geom, ob->obmat); + DRW_shgroup_call(wire_shgrp, geom, ob); if ((cu->flag & CU_3D) && (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_CU_NORMALS) != 0) { geom = DRW_cache_curve_edge_normal_get(ob); - DRW_shgroup_call_instances(wire_normals_shgrp, geom, ob->obmat, 2); + DRW_shgroup_call_instances(wire_normals_shgrp, ob, geom, 2); } geom = DRW_cache_curve_edge_overlay_get(ob); if (geom) { - DRW_shgroup_call(stl->g_data->overlay_edge_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->overlay_edge_shgrp, geom, ob); } geom = DRW_cache_curve_vert_overlay_get(ob, stl->g_data->show_handles); - DRW_shgroup_call(stl->g_data->overlay_vert_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->overlay_vert_shgrp, geom, ob); } } if (ob->type == OB_SURF) { if (BKE_object_is_in_editmode(ob)) { struct GPUBatch *geom = DRW_cache_curve_edge_overlay_get(ob); - DRW_shgroup_call(stl->g_data->overlay_edge_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->overlay_edge_shgrp, geom, ob); geom = DRW_cache_curve_vert_overlay_get(ob, false); - DRW_shgroup_call(stl->g_data->overlay_vert_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->overlay_vert_shgrp, geom, ob); } } } diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index 56c3d48814d..04404058813 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -211,10 +211,10 @@ static void EDIT_LATTICE_cache_populate(void *vedata, Object *ob) struct GPUBatch *geom; geom = DRW_cache_lattice_wire_get(ob, true); - DRW_shgroup_call(stl->g_data->wire_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->wire_shgrp, geom, ob); geom = DRW_cache_lattice_vert_overlay_get(ob); - DRW_shgroup_call(stl->g_data->vert_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->vert_shgrp, geom, ob); } } } diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index 7b8dc01dfbc..bb11ff384b5 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -663,17 +663,17 @@ static void edit_mesh_add_ob_to_pass(Scene *scene, geom_tris = DRW_mesh_batch_cache_get_edit_triangles(ob->data); geom_edges = DRW_mesh_batch_cache_get_edit_edges(ob->data); - DRW_shgroup_call(edge_shgrp, geom_edges, ob->obmat); - DRW_shgroup_call(face_shgrp, geom_tris, ob->obmat); + DRW_shgroup_call(edge_shgrp, geom_edges, ob); + DRW_shgroup_call(face_shgrp, geom_tris, ob); if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) { geom_verts = DRW_mesh_batch_cache_get_edit_vertices(ob->data); - DRW_shgroup_call(vert_shgrp, geom_verts, ob->obmat); + DRW_shgroup_call(vert_shgrp, geom_verts, ob); } if (facedot_shgrp && (tsettings->selectmode & SCE_SELECT_FACE) != 0) { geom_fcenter = DRW_mesh_batch_cache_get_edit_facedots(ob->data); - DRW_shgroup_call(facedot_shgrp, geom_fcenter, ob->obmat); + DRW_shgroup_call(facedot_shgrp, geom_fcenter, ob); } } @@ -698,7 +698,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) if (do_show_weight) { geom = DRW_cache_mesh_surface_weights_get(ob); - DRW_shgroup_call(g_data->fweights_shgrp, geom, ob->obmat); + DRW_shgroup_call(g_data->fweights_shgrp, geom, ob); } if (do_show_mesh_analysis && !XRAY_ACTIVE(v3d)) { @@ -709,7 +709,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) if (is_original) { geom = DRW_cache_mesh_surface_mesh_analysis_get(ob); if (geom) { - DRW_shgroup_call(g_data->mesh_analysis_shgrp, geom, ob->obmat); + DRW_shgroup_call(g_data->mesh_analysis_shgrp, geom, ob); } } } @@ -719,20 +719,20 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob) DRW_shgroup_call(do_in_front ? g_data->depth_shgrp_hidden_wire_in_front : g_data->depth_shgrp_hidden_wire, geom, - ob->obmat); + ob); } if (vnormals_do) { geom = DRW_mesh_batch_cache_get_edit_vertices(ob->data); - DRW_shgroup_call(g_data->vnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call(g_data->vnormals_shgrp, geom, ob); } if (lnormals_do) { geom = DRW_mesh_batch_cache_get_edit_lnors(ob->data); - DRW_shgroup_call(g_data->lnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call(g_data->lnormals_shgrp, geom, ob); } if (fnormals_do) { geom = DRW_mesh_batch_cache_get_edit_facedots(ob->data); - DRW_shgroup_call(g_data->fnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call(g_data->fnormals_shgrp, geom, ob); } if (g_data->do_zbufclip) { diff --git a/source/blender/draw/modes/edit_text_mode.c b/source/blender/draw/modes/edit_text_mode.c index b7215d5ef08..d1d17f2dc2d 100644 --- a/source/blender/draw/modes/edit_text_mode.c +++ b/source/blender/draw/modes/edit_text_mode.c @@ -240,7 +240,7 @@ static void edit_text_cache_populate_select(void *vedata, Object *ob) v2_quad_corners_to_mat4(box, final_mat); mul_m4_m4m4(final_mat, ob->obmat, final_mat); - DRW_shgroup_call(stl->g_data->overlay_select_shgrp, geom, final_mat); + DRW_shgroup_call_obmat(stl->g_data->overlay_select_shgrp, geom, final_mat); } } @@ -256,7 +256,7 @@ static void edit_text_cache_populate_cursor(void *vedata, Object *ob) mul_m4_m4m4(mat, ob->obmat, mat); struct GPUBatch *geom = DRW_cache_quad_get(); - DRW_shgroup_call(stl->g_data->overlay_cursor_shgrp, geom, mat); + DRW_shgroup_call_obmat(stl->g_data->overlay_cursor_shgrp, geom, mat); } static void edit_text_cache_populate_boxes(void *vedata, Object *ob) @@ -333,7 +333,7 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob) if ((cu->flag & CU_FAST) || !has_surface) { geom = DRW_cache_text_edge_wire_get(ob); if (geom) { - DRW_shgroup_call(stl->g_data->wire_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->wire_shgrp, geom, ob); } } else { diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index ed757424444..9f5268500e8 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1019,7 +1019,7 @@ static void DRW_shgroup_empty_image(OBJECT_Shaders *sh_data, if (sh_cfg == GPU_SHADER_CFG_CLIPPED) { DRW_shgroup_state_enable(grp, DRW_STATE_CLIP_PLANES); } - DRW_shgroup_call(grp, DRW_cache_image_plane_wire_get(), ob->obmat); + DRW_shgroup_call_no_cull(grp, DRW_cache_image_plane_wire_get(), ob); } if (!BKE_object_empty_image_data_is_visible_in_view3d(ob, rv3d)) { @@ -1039,7 +1039,7 @@ static void DRW_shgroup_empty_image(OBJECT_Shaders *sh_data, if (sh_cfg == GPU_SHADER_CFG_CLIPPED) { DRW_shgroup_state_enable(grp, DRW_STATE_CLIP_PLANES); } - DRW_shgroup_call(grp, DRW_cache_image_plane_get(), ob->obmat); + DRW_shgroup_call_no_cull(grp, DRW_cache_image_plane_get(), ob); } } @@ -1186,8 +1186,6 @@ static void OBJECT_cache_init(void *vedata) struct GPUBatch *geom = DRW_cache_grid_get(); float grid_line_size = max_ff(0.0f, U.pixelsize - 1.0f) * 0.5f; - static float mat[4][4]; - unit_m4(mat); /* Create 3 quads to render ordered transparency Z axis */ DRWShadingGroup *grp = DRW_shgroup_create(sh_data->grid, psl->grid); @@ -1199,21 +1197,21 @@ static void OBJECT_cache_init(void *vedata) DRW_shgroup_uniform_float(grp, "gridOneOverLogSubdiv", &e_data.grid_settings[4], 1); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_call(grp, geom, mat); + DRW_shgroup_call(grp, geom, NULL); grp = DRW_shgroup_create(sh_data->grid, psl->grid); DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.grid_flag, 1); DRW_shgroup_uniform_vec3(grp, "planeAxes", e_data.grid_axes, 1); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_call(grp, geom, mat); + DRW_shgroup_call(grp, geom, NULL); grp = DRW_shgroup_create(sh_data->grid, psl->grid); DRW_shgroup_uniform_int(grp, "gridFlag", &e_data.zpos_flag, 1); DRW_shgroup_uniform_vec3(grp, "planeAxes", e_data.zplane_axes, 1); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); - DRW_shgroup_call(grp, geom, mat); + DRW_shgroup_call(grp, geom, NULL); } for (int i = 0; i < 2; ++i) { @@ -2071,7 +2069,7 @@ static void camera_view3d_reconstruction(OBJECT_ShadingGroupList *sgl, GPUShader *shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); DRWShadingGroup *shading_group = DRW_shgroup_create(shader, sgl->non_meshes); DRW_shgroup_uniform_vec4(shading_group, "color", camera_path_color, 1); - DRW_shgroup_call(shading_group, geom, camera_mat); + DRW_shgroup_call_obmat(shading_group, geom, camera_mat); } } } @@ -2459,7 +2457,7 @@ static void DRW_shgroup_volume_extra(OBJECT_ShadingGroupList *sgl, DRW_shgroup_uniform_float_copy(grp, "displaySize", sds->vector_scale); DRW_shgroup_uniform_float_copy(grp, "slicePosition", sds->slice_depth); DRW_shgroup_uniform_int_copy(grp, "sliceAxis", slice_axis); - DRW_shgroup_call_procedural_lines(grp, line_count, ob->obmat); + DRW_shgroup_call_procedural_lines(grp, ob, line_count); BLI_addtail(&e_data.smoke_domains, BLI_genericNodeN(smd)); } @@ -2561,7 +2559,7 @@ static void DRW_shgroup_lightprobe(OBJECT_Shaders *sh_data, DRW_shgroup_uniform_vec3(grp, "increment_y", prb_data->increment_y, 1); DRW_shgroup_uniform_vec3(grp, "increment_z", prb_data->increment_z, 1); DRW_shgroup_uniform_ivec3(grp, "grid_resolution", &prb->grid_resolution_x, 1); - DRW_shgroup_call_procedural_points(grp, cell_count, NULL); + DRW_shgroup_call_procedural_points(grp, NULL, cell_count); if (sh_cfg == GPU_SHADER_CFG_CLIPPED) { DRW_shgroup_state_enable(grp, DRW_STATE_CLIP_PLANES); } @@ -2990,9 +2988,6 @@ static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, ParticleSettings *part = psys->part; int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as; - static float mat[4][4]; - unit_m4(mat); - if (draw_as != PART_DRAW_PATH) { struct GPUBatch *geom = DRW_cache_particles_get_dots(ob, psys); DRWShadingGroup *shgrp = NULL; @@ -3010,7 +3005,7 @@ static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, DRW_shgroup_uniform_float(shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1); DRW_shgroup_uniform_float(shgrp, "size", &part->draw_size, 1); DRW_shgroup_uniform_texture(shgrp, "ramp", G_draw.ramp); - DRW_shgroup_call(shgrp, geom, mat); + DRW_shgroup_call(shgrp, geom, NULL); break; case PART_DRAW_CROSS: shgrp = DRW_shgroup_create(sh_data->part_prim, psl->particle); @@ -3019,7 +3014,7 @@ static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, DRW_shgroup_uniform_float(shgrp, "draw_size", &part->draw_size, 1); DRW_shgroup_uniform_bool_copy(shgrp, "screen_space", false); shape = DRW_cache_particles_get_prim(PART_DRAW_CROSS); - DRW_shgroup_call_instances_with_attribs(shgrp, shape, NULL, geom); + DRW_shgroup_call_instances_with_attribs(shgrp, NULL, shape, geom); break; case PART_DRAW_CIRC: shape = DRW_cache_particles_get_prim(PART_DRAW_CIRC); @@ -3028,14 +3023,14 @@ static void OBJECT_cache_populate_particles(OBJECT_Shaders *sh_data, DRW_shgroup_uniform_vec3(shgrp, "color", ma ? &ma->r : def_prim_col, 1); DRW_shgroup_uniform_float(shgrp, "draw_size", &part->draw_size, 1); DRW_shgroup_uniform_bool_copy(shgrp, "screen_space", true); - DRW_shgroup_call_instances_with_attribs(shgrp, shape, NULL, geom); + DRW_shgroup_call_instances_with_attribs(shgrp, NULL, shape, geom); break; case PART_DRAW_AXIS: shape = DRW_cache_particles_get_prim(PART_DRAW_AXIS); shgrp = DRW_shgroup_create(sh_data->part_axis, psl->particle); DRW_shgroup_uniform_float(shgrp, "draw_size", &part->draw_size, 1); DRW_shgroup_uniform_bool_copy(shgrp, "screen_space", false); - DRW_shgroup_call_instances_with_attribs(shgrp, shape, NULL, geom); + DRW_shgroup_call_instances_with_attribs(shgrp, NULL, shape, geom); break; default: break; @@ -3191,7 +3186,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) } if (shgroup && geom) { - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } if (init_duplidata) { @@ -3203,7 +3198,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) if (dupli_data && !init_duplidata) { if (dupli_data->extra_shgrp && dupli_data->extra_geom) { - DRW_shgroup_call_object(dupli_data->extra_shgrp, dupli_data->extra_geom, ob); + DRW_shgroup_call(dupli_data->extra_shgrp, dupli_data->extra_geom, ob); } } else { @@ -3222,7 +3217,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); } shgroup = shgroup_theme_id_to_point(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } } else { @@ -3240,7 +3235,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); } shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } } } @@ -3258,7 +3253,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); } shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); break; } case OB_LATTICE: { @@ -3272,7 +3267,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) } shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } break; } @@ -3286,7 +3281,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); } shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } break; } @@ -3364,7 +3359,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) theme_id = DRW_object_wire_theme_get(ob, view_layer, NULL); } shgroup = shgroup_theme_id_to_wire(sgl, theme_id, ob->base_flag); - DRW_shgroup_call_object(shgroup, geom, ob); + DRW_shgroup_call(shgroup, geom, ob); } } break; diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c index c74129d1e6d..667f2c9e70a 100644 --- a/source/blender/draw/modes/overlay_mode.c +++ b/source/blender/draw/modes/overlay_mode.c @@ -354,7 +354,7 @@ static void overlay_cache_populate(void *vedata, Object *ob) if (DRW_object_is_renderable(ob) && pd->overlay.flag & V3D_OVERLAY_FACE_ORIENTATION) { struct GPUBatch *geom = DRW_cache_object_surface_get(ob); if (geom) { - DRW_shgroup_call_object(pd->face_orientation_shgrp, geom, ob); + DRW_shgroup_call(pd->face_orientation_shgrp, geom, ob); } } @@ -369,7 +369,7 @@ static void overlay_cache_populate(void *vedata, Object *ob) } else { if ((*dupli_data)->shgrp && (*dupli_data)->geom) { - DRW_shgroup_call_object((*dupli_data)->shgrp, (*dupli_data)->geom, ob); + DRW_shgroup_call((*dupli_data)->shgrp, (*dupli_data)->geom, ob); } return; } @@ -424,7 +424,7 @@ static void overlay_cache_populate(void *vedata, Object *ob) DRW_shgroup_call_sculpt(shgrp, ob, true, false, false); } else { - DRW_shgroup_call_object(shgrp, geom, ob); + DRW_shgroup_call(shgrp, geom, ob); } } diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c index 1c60a628f4a..90e4a2ead22 100644 --- a/source/blender/draw/modes/paint_texture_mode.c +++ b/source/blender/draw/modes/paint_texture_mode.c @@ -359,23 +359,23 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob) for (int i = 0; i < mat_nr; i++) { const int index = use_material_slots ? i : 0; if ((i < me->totcol) && stl->g_data->shgroup_image_array[index]) { - DRW_shgroup_call(stl->g_data->shgroup_image_array[index], geom_array[i], ob->obmat); + DRW_shgroup_call(stl->g_data->shgroup_image_array[index], geom_array[i], ob); } else { - DRW_shgroup_call(stl->g_data->shgroup_fallback, geom_array[i], ob->obmat); + DRW_shgroup_call(stl->g_data->shgroup_fallback, geom_array[i], ob); } } } else { if (stl->g_data->shgroup_image_array[0]) { struct GPUBatch *geom = DRW_cache_mesh_surface_texpaint_single_get(ob); - DRW_shgroup_call(stl->g_data->shgroup_image_array[0], geom, ob->obmat); + DRW_shgroup_call(stl->g_data->shgroup_image_array[0], geom, ob); } } } else { struct GPUBatch *geom = DRW_cache_mesh_surface_get(ob); - DRW_shgroup_call(stl->g_data->shgroup_fallback, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->shgroup_fallback, geom, ob); } } @@ -383,10 +383,10 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob) if (use_face_sel) { struct GPUBatch *geom; geom = DRW_cache_mesh_surface_edges_get(ob); - DRW_shgroup_call(stl->g_data->lwire_select_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->lwire_select_shgrp, geom, ob); geom = DRW_cache_mesh_surface_get(ob); - DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob); } } } diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index fe7f367c712..374cb10031e 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -312,24 +312,24 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) } } if (geom != NULL) { - DRW_shgroup_call(stl->g_data->by_mode[draw_mode].color_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->by_mode[draw_mode].color_shgrp, geom, ob); } if (use_face_sel || use_wire) { DRWShadingGroup *shgrp = use_face_sel ? stl->g_data->by_mode[draw_mode].lwire_select_shgrp : stl->g_data->by_mode[draw_mode].lwire_shgrp; geom = DRW_cache_mesh_surface_edges_get(ob); - DRW_shgroup_call(shgrp, geom, ob->obmat); + DRW_shgroup_call(shgrp, geom, ob); } if (use_face_sel) { geom = DRW_cache_mesh_surface_get(ob); - DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->face_select_shgrp, geom, ob); } if (use_vert_sel) { geom = DRW_cache_mesh_all_verts_get(ob); - DRW_shgroup_call(stl->g_data->vert_select_shgrp, geom, ob->obmat); + DRW_shgroup_call(stl->g_data->vert_select_shgrp, geom, ob); } } } diff --git a/source/blender/draw/modes/pose_mode.c b/source/blender/draw/modes/pose_mode.c index 2723f2d4c33..8cdf28f177a 100644 --- a/source/blender/draw/modes/pose_mode.c +++ b/source/blender/draw/modes/pose_mode.c @@ -226,10 +226,10 @@ static void POSE_cache_populate(void *vedata, Object *ob) struct GPUBatch *geom = DRW_cache_object_surface_get(ob); if (geom) { if (POSE_is_driven_by_active_armature(ob)) { - DRW_shgroup_call_object(ppd->bone_selection_shgrp, geom, ob); + DRW_shgroup_call(ppd->bone_selection_shgrp, geom, ob); } else { - DRW_shgroup_call_object(ppd->bone_selection_invert_shgrp, geom, ob); + DRW_shgroup_call(ppd->bone_selection_invert_shgrp, geom, ob); } } } |