You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-19 14:31:59 +00:00
Implement hooks into renderer
This commit is contained in:
@@ -249,6 +249,73 @@ Ref<RenderSceneBuffers> 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<RID> 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<RID> 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<RID> 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<RenderSceneBuffersRD> 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<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &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<RenderSceneBuffers> &p_render_buffers, const CameraData *p_camera_data, const CameraData *p_prev_camera_data, const PagedArray<RenderGeometryInstance *> &p_instances, const PagedArray<RID> &p_lights, const PagedArray<RID> &p_reflection_probes, const PagedArray<RID> &p_voxel_gi_instances, const PagedArray<RID> &p_decals, const PagedArray<RID> &p_lightmaps, const PagedArray<RID> &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<RenderSceneBuffers> &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)) {
|
||||
|
||||
Reference in New Issue
Block a user