Implement hooks into renderer
This commit is contained in:
@ -115,6 +115,12 @@ void RendererSceneCull::camera_set_camera_attributes(RID p_camera, RID p_attribu
|
||||
camera->attributes = p_attributes;
|
||||
}
|
||||
|
||||
void RendererSceneCull::camera_set_compositor(RID p_camera, RID p_compositor) {
|
||||
Camera *camera = camera_owner.get_or_null(p_camera);
|
||||
ERR_FAIL_NULL(camera);
|
||||
camera->compositor = p_compositor;
|
||||
}
|
||||
|
||||
void RendererSceneCull::camera_set_use_vertical_aspect(RID p_camera, bool p_enable) {
|
||||
Camera *camera = camera_owner.get_or_null(p_camera);
|
||||
ERR_FAIL_NULL(camera);
|
||||
@ -401,6 +407,12 @@ void RendererSceneCull::scenario_set_camera_attributes(RID p_scenario, RID p_cam
|
||||
scenario->camera_attributes = p_camera_attributes;
|
||||
}
|
||||
|
||||
void RendererSceneCull::scenario_set_compositor(RID p_scenario, RID p_compositor) {
|
||||
Scenario *scenario = scenario_owner.get_or_null(p_scenario);
|
||||
ERR_FAIL_NULL(scenario);
|
||||
scenario->compositor = p_compositor;
|
||||
}
|
||||
|
||||
void RendererSceneCull::scenario_set_fallback_environment(RID p_scenario, RID p_environment) {
|
||||
Scenario *scenario = scenario_owner.get_or_null(p_scenario);
|
||||
ERR_FAIL_NULL(scenario);
|
||||
@ -2623,12 +2635,13 @@ void RendererSceneCull::render_camera(const Ref<RenderSceneBuffers> &p_render_bu
|
||||
}
|
||||
|
||||
RID environment = _render_get_environment(p_camera, p_scenario);
|
||||
RID compositor = _render_get_compositor(p_camera, p_scenario);
|
||||
|
||||
RENDER_TIMESTAMP("Update Occlusion Buffer")
|
||||
// For now just cull on the first camera
|
||||
RendererSceneOcclusionCull::get_singleton()->buffer_update(p_viewport, camera_data.main_transform, camera_data.main_projection, camera_data.is_orthogonal);
|
||||
|
||||
_render_scene(&camera_data, p_render_buffers, environment, camera->attributes, camera->visible_layers, p_scenario, p_viewport, p_shadow_atlas, RID(), -1, p_screen_mesh_lod_threshold, true, r_render_info);
|
||||
_render_scene(&camera_data, p_render_buffers, environment, camera->attributes, compositor, camera->visible_layers, p_scenario, p_viewport, p_shadow_atlas, RID(), -1, p_screen_mesh_lod_threshold, true, r_render_info);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -3008,7 +3021,7 @@ void RendererSceneCull::_scene_cull(CullData &cull_data, InstanceCullResult &cul
|
||||
}
|
||||
}
|
||||
|
||||
void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RenderingMethod::RenderInfo *r_render_info) {
|
||||
void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_camera_data, const Ref<RenderSceneBuffers> &p_render_buffers, RID p_environment, RID p_force_camera_attributes, RID p_compositor, uint32_t p_visible_layers, RID p_scenario, RID p_viewport, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass, float p_screen_mesh_lod_threshold, bool p_using_shadows, RenderingMethod::RenderInfo *r_render_info) {
|
||||
Instance *render_reflection_probe = instance_owner.get_or_null(p_reflection_probe); //if null, not rendering to it
|
||||
|
||||
// Prepare the light - camera volume culling system.
|
||||
@ -3378,6 +3391,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
|
||||
} else {
|
||||
camera_attributes = scenario->camera_attributes;
|
||||
}
|
||||
|
||||
/* PROCESS GEOMETRY AND DRAW SCENE */
|
||||
|
||||
RID occluders_tex;
|
||||
@ -3388,7 +3402,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
|
||||
}
|
||||
|
||||
RENDER_TIMESTAMP("Render 3D Scene");
|
||||
scene_render->render_scene(p_render_buffers, p_camera_data, prev_camera_data, scene_cull_result.geometry_instances, scene_cull_result.light_instances, scene_cull_result.reflections, scene_cull_result.voxel_gi_instances, scene_cull_result.decals, scene_cull_result.lightmaps, scene_cull_result.fog_volumes, p_environment, camera_attributes, p_shadow_atlas, occluders_tex, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass, p_screen_mesh_lod_threshold, render_shadow_data, max_shadows_used, render_sdfgi_data, cull.sdfgi.region_count, &sdfgi_update_data, r_render_info);
|
||||
scene_render->render_scene(p_render_buffers, p_camera_data, prev_camera_data, scene_cull_result.geometry_instances, scene_cull_result.light_instances, scene_cull_result.reflections, scene_cull_result.voxel_gi_instances, scene_cull_result.decals, scene_cull_result.lightmaps, scene_cull_result.fog_volumes, p_environment, camera_attributes, p_compositor, p_shadow_atlas, occluders_tex, p_reflection_probe.is_valid() ? RID() : scenario->reflection_atlas, p_reflection_probe, p_reflection_probe_pass, p_screen_mesh_lod_threshold, render_shadow_data, max_shadows_used, render_sdfgi_data, cull.sdfgi.region_count, &sdfgi_update_data, r_render_info);
|
||||
|
||||
if (p_viewport.is_valid()) {
|
||||
RSG::viewport->viewport_set_prev_camera_data(p_viewport, p_camera_data);
|
||||
@ -3425,6 +3439,20 @@ RID RendererSceneCull::_render_get_environment(RID p_camera, RID p_scenario) {
|
||||
return RID();
|
||||
}
|
||||
|
||||
RID RendererSceneCull::_render_get_compositor(RID p_camera, RID p_scenario) {
|
||||
Camera *camera = camera_owner.get_or_null(p_camera);
|
||||
if (camera && scene_render->is_compositor(camera->compositor)) {
|
||||
return camera->compositor;
|
||||
}
|
||||
|
||||
Scenario *scenario = scenario_owner.get_or_null(p_scenario);
|
||||
if (scenario && scene_render->is_compositor(scenario->compositor)) {
|
||||
return scenario->compositor;
|
||||
}
|
||||
|
||||
return RID();
|
||||
}
|
||||
|
||||
void RendererSceneCull::render_empty_scene(const Ref<RenderSceneBuffers> &p_render_buffers, RID p_scenario, RID p_shadow_atlas) {
|
||||
#ifndef _3D_DISABLED
|
||||
Scenario *scenario = scenario_owner.get_or_null(p_scenario);
|
||||
@ -3435,12 +3463,13 @@ void RendererSceneCull::render_empty_scene(const Ref<RenderSceneBuffers> &p_rend
|
||||
} else {
|
||||
environment = scenario->fallback_environment;
|
||||
}
|
||||
RID compositor = scenario->compositor;
|
||||
RENDER_TIMESTAMP("Render Empty 3D Scene");
|
||||
|
||||
RendererSceneRender::CameraData camera_data;
|
||||
camera_data.set_camera(Transform3D(), Projection(), true, false);
|
||||
|
||||
scene_render->render_scene(p_render_buffers, &camera_data, &camera_data, PagedArray<RenderGeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), environment, RID(), p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr);
|
||||
scene_render->render_scene(p_render_buffers, &camera_data, &camera_data, PagedArray<RenderGeometryInstance *>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), PagedArray<RID>(), environment, RID(), compositor, p_shadow_atlas, RID(), scenario->reflection_atlas, RID(), 0, 0, nullptr, 0, nullptr, 0, nullptr);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -3514,7 +3543,7 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int
|
||||
camera_data.set_camera(xform, cm, false, false);
|
||||
|
||||
Ref<RenderSceneBuffers> render_buffers = RSG::light_storage->reflection_probe_atlas_get_render_buffers(scenario->reflection_atlas);
|
||||
_render_scene(&camera_data, render_buffers, environment, RID(), RSG::light_storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, RID(), shadow_atlas, reflection_probe->instance, p_step, mesh_lod_threshold, use_shadows);
|
||||
_render_scene(&camera_data, render_buffers, environment, RID(), RID(), RSG::light_storage->reflection_probe_get_cull_mask(p_instance->base), p_instance->scenario->self, RID(), shadow_atlas, reflection_probe->instance, p_step, mesh_lod_threshold, use_shadows);
|
||||
|
||||
} else {
|
||||
//do roughness postprocess step until it believes it's done
|
||||
|
||||
Reference in New Issue
Block a user