From 5a98845655900a7884bf5a73c5406318f1106d77 Mon Sep 17 00:00:00 2001 From: Bastiaan Olij Date: Thu, 3 Aug 2023 22:10:03 +1000 Subject: Implement hooks into renderer --- .../renderer_rd/renderer_scene_render_rd.cpp | 74 +++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'servers/rendering/renderer_rd/renderer_scene_render_rd.cpp') diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 35c0bdd595..62ecec3991 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -249,6 +249,73 @@ Ref RendererSceneRenderRD::render_buffers_create() { return rb; } +bool RendererSceneRenderRD::_compositor_effects_has_flag(const RenderDataRD *p_render_data, RS::CompositorEffectFlags p_flag, RS::CompositorEffectCallbackType p_callback_type) { + RendererCompositorStorage *comp_storage = RendererCompositorStorage::get_singleton(); + + if (p_render_data->compositor.is_null()) { + return false; + } + + if (p_render_data->reflection_probe.is_valid()) { + return false; + } + + ERR_FAIL_COND_V(!comp_storage->is_compositor(p_render_data->compositor), false); + Vector re_rids = comp_storage->compositor_get_compositor_effects(p_render_data->compositor, p_callback_type, true); + + for (RID rid : re_rids) { + if (comp_storage->compositor_effect_get_flag(rid, p_flag)) { + return true; + } + } + + return false; +} + +bool RendererSceneRenderRD::_has_compositor_effect(RS::CompositorEffectCallbackType p_callback_type, const RenderDataRD *p_render_data) { + RendererCompositorStorage *comp_storage = RendererCompositorStorage::get_singleton(); + + if (p_render_data->compositor.is_null()) { + return false; + } + + if (p_render_data->reflection_probe.is_valid()) { + return false; + } + + ERR_FAIL_COND_V(!comp_storage->is_compositor(p_render_data->compositor), false); + + Vector effects = comp_storage->compositor_get_compositor_effects(p_render_data->compositor, p_callback_type, true); + + return effects.size() > 0; +} + +void RendererSceneRenderRD::_process_compositor_effects(RS::CompositorEffectCallbackType p_callback_type, const RenderDataRD *p_render_data) { + RendererCompositorStorage *comp_storage = RendererCompositorStorage::get_singleton(); + + if (p_render_data->compositor.is_null()) { + return; + } + + if (p_render_data->reflection_probe.is_valid()) { + return; + } + + ERR_FAIL_COND(!comp_storage->is_compositor(p_render_data->compositor)); + + Vector re_rids = comp_storage->compositor_get_compositor_effects(p_render_data->compositor, p_callback_type, true); + + for (RID rid : re_rids) { + Array arr; + Callable callback = comp_storage->compositor_effect_get_callback(rid); + + arr.push_back(p_callback_type); + arr.push_back(p_render_data); + + callback.callv(arr); + } +} + void RendererSceneRenderRD::_render_buffers_copy_screen_texture(const RenderDataRD *p_render_data) { Ref rb = p_render_data->render_buffers; ERR_FAIL_COND(rb.is_null()); @@ -987,7 +1054,7 @@ void RendererSceneRenderRD::_post_prepass_render(RenderDataRD *p_render_data, bo } } -void RendererSceneRenderRD::render_scene(const Ref &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray &p_instances, const PagedArray &p_lights, const PagedArray &p_reflection_probes, const PagedArray &p_voxel_gi_instances, const PagedArray &p_decals, const PagedArray &p_lightmaps, const PagedArray &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { +void RendererSceneRenderRD::render_scene(const Ref &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray &p_instances, const PagedArray &p_lights, const PagedArray &p_reflection_probes, const PagedArray &p_voxel_gi_instances, const PagedArray &p_decals, const PagedArray &p_lightmaps, const PagedArray &p_fog_volumes, RID p_environment, RID p_camera_attributes, RID p_compositor, RID p_shadow_atlas, RID p_occluder_debug_tex, RID p_reflection_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, const RenderShadowData *p_render_shadows, int p_render_shadow_count, const RenderSDFGIData *p_render_sdfgi_regions, int p_render_sdfgi_region_count, const RenderSDFGIUpdateData *p_sdfgi_update_data, RenderingMethod::RenderInfo *r_render_info) { RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton(); RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); @@ -1067,6 +1134,7 @@ void RendererSceneRenderRD::render_scene(const Ref &p_render render_data.lightmaps = &p_lightmaps; render_data.fog_volumes = &p_fog_volumes; render_data.environment = p_environment; + render_data.compositor = p_compositor; render_data.camera_attributes = p_camera_attributes; render_data.shadow_atlas = p_shadow_atlas; render_data.occluder_debug_tex = p_occluder_debug_tex; @@ -1128,6 +1196,10 @@ void RendererSceneRenderRD::render_particle_collider_heightfield(RID p_collider, bool RendererSceneRenderRD::free(RID p_rid) { if (is_environment(p_rid)) { environment_free(p_rid); + } else if (is_compositor(p_rid)) { + compositor_free(p_rid); + } else if (is_compositor_effect(p_rid)) { + compositor_effect_free(p_rid); } else if (RSG::camera_attributes->owns_camera_attributes(p_rid)) { RSG::camera_attributes->camera_attributes_free(p_rid); } else if (gi.voxel_gi_instance_owns(p_rid)) { -- cgit v1.2.3