@@ -972,26 +972,26 @@ SkyRD::~SkyRD() {
972972 }
973973}
974974
975- void SkyRD::setup_sky (RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const PagedArray<RID> &p_lights, RID p_camera_attributes, uint32_t p_view_count, const Projection *p_view_projections , const Vector3 *p_view_eye_offsets, const Transform3D &p_cam_transform, const Projection &p_cam_projection, const Size2i p_screen_size, Vector2 p_jitter, RendererSceneRenderRD *p_scene_render ) {
975+ void SkyRD::setup_sky (const RenderDataRD *p_render_data , const Size2i p_screen_size) {
976976 RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton ();
977977 RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton ();
978- ERR_FAIL_COND (p_env .is_null ());
978+ ERR_FAIL_COND (p_render_data-> environment .is_null ());
979979
980- ERR_FAIL_COND (p_render_buffers .is_null ());
980+ ERR_FAIL_COND (p_render_data-> render_buffers .is_null ());
981981
982982 // make sure we support our view count
983- ERR_FAIL_COND (p_view_count == 0 );
984- ERR_FAIL_COND (p_view_count > RendererSceneRender::MAX_RENDER_VIEWS);
983+ ERR_FAIL_COND (p_render_data-> scene_data -> view_count == 0 );
984+ ERR_FAIL_COND (p_render_data-> scene_data -> view_count > RendererSceneRender::MAX_RENDER_VIEWS);
985985
986986 SkyMaterialData *material = nullptr ;
987- Sky *sky = get_sky (RendererSceneRenderRD::get_singleton ()->environment_get_sky (p_env ));
987+ Sky *sky = get_sky (RendererSceneRenderRD::get_singleton ()->environment_get_sky (p_render_data-> environment ));
988988
989989 RID sky_material;
990990
991991 SkyShaderData *shader_data = nullptr ;
992992
993993 if (sky) {
994- sky_material = sky_get_material (RendererSceneRenderRD::get_singleton ()->environment_get_sky (p_env ));
994+ sky_material = sky_get_material (RendererSceneRenderRD::get_singleton ()->environment_get_sky (p_render_data-> environment ));
995995
996996 if (sky_material.is_valid ()) {
997997 material = static_cast <SkyMaterialData *>(material_storage->material_get_data (sky_material, RendererRD::MaterialStorage::SHADER_TYPE_SKY));
@@ -1025,8 +1025,8 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10251025 update_dirty_skys ();
10261026 }
10271027
1028- if (shader_data->uses_time && p_scene_render ->time - sky->prev_time > 0.00001 ) {
1029- sky->prev_time = p_scene_render ->time ;
1028+ if (shader_data->uses_time && p_render_data-> scene_data ->time - sky->prev_time > 0.00001 ) {
1029+ sky->prev_time = p_render_data-> scene_data ->time ;
10301030 sky->reflection .dirty = true ;
10311031 RenderingServerDefault::redraw_request ();
10321032 }
@@ -1041,29 +1041,30 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10411041 sky->reflection .dirty = true ;
10421042 }
10431043
1044- if (!p_cam_transform .origin .is_equal_approx (sky->prev_position ) && shader_data->uses_position ) {
1045- sky->prev_position = p_cam_transform .origin ;
1044+ if (!p_render_data-> scene_data -> cam_transform .origin .is_equal_approx (sky->prev_position ) && shader_data->uses_position ) {
1045+ sky->prev_position = p_render_data-> scene_data -> cam_transform .origin ;
10461046 sky->reflection .dirty = true ;
10471047 }
10481048 }
10491049
10501050 sky_scene_state.ubo .directional_light_count = 0 ;
10511051 if (shader_data->uses_light ) {
1052+ const PagedArray<RID> &lights = *p_render_data->lights ;
10521053 // Run through the list of lights in the scene and pick out the Directional Lights.
10531054 // This can't be done in RenderSceneRenderRD::_setup lights because that needs to be called
10541055 // after the depth prepass, but this runs before the depth prepass.
1055- for (int i = 0 ; i < (int )p_lights .size (); i++) {
1056- if (!light_storage->owns_light_instance (p_lights [i])) {
1056+ for (int i = 0 ; i < (int )lights .size (); i++) {
1057+ if (!light_storage->owns_light_instance (lights [i])) {
10571058 continue ;
10581059 }
1059- RID base = light_storage->light_instance_get_base_light (p_lights [i]);
1060+ RID base = light_storage->light_instance_get_base_light (lights [i]);
10601061
10611062 ERR_CONTINUE (base.is_null ());
10621063
10631064 RS::LightType type = light_storage->light_get_type (base);
10641065 if (type == RS::LIGHT_DIRECTIONAL && light_storage->light_directional_get_sky_mode (base) != RS::LIGHT_DIRECTIONAL_SKY_MODE_LIGHT_ONLY) {
10651066 SkyDirectionalLightData &sky_light_data = sky_scene_state.directional_lights [sky_scene_state.ubo .directional_light_count ];
1066- Transform3D light_transform = light_storage->light_instance_get_base_transform (p_lights [i]);
1067+ Transform3D light_transform = light_storage->light_instance_get_base_transform (lights [i]);
10671068 Vector3 world_direction = light_transform.basis .xform (Vector3 (0 , 0 , 1 )).normalized ();
10681069
10691070 sky_light_data.direction [0 ] = world_direction.x ;
@@ -1073,12 +1074,12 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
10731074 float sign = light_storage->light_is_negative (base) ? -1 : 1 ;
10741075 sky_light_data.energy = sign * light_storage->light_get_param (base, RS::LIGHT_PARAM_ENERGY);
10751076
1076- if (p_scene_render ->is_using_physical_light_units ()) {
1077+ if (RendererSceneRenderRD::get_singleton () ->is_using_physical_light_units ()) {
10771078 sky_light_data.energy *= light_storage->light_get_param (base, RS::LIGHT_PARAM_INTENSITY);
10781079 }
10791080
1080- if (p_camera_attributes .is_valid ()) {
1081- sky_light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor (p_camera_attributes );
1081+ if (p_render_data-> camera_attributes .is_valid ()) {
1082+ sky_light_data.energy *= RSG::camera_attributes->camera_attributes_get_exposure_normalization_factor (p_render_data-> camera_attributes );
10821083 }
10831084
10841085 Color linear_col = light_storage->light_get_color (base).srgb_to_linear ();
@@ -1149,69 +1150,74 @@ void SkyRD::setup_sky(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, con
11491150
11501151 // Setup fog variables.
11511152 sky_scene_state.ubo .volumetric_fog_enabled = false ;
1152- if (p_render_buffers.is_valid ()) {
1153- if (p_render_buffers->has_custom_data (RB_SCOPE_FOG)) {
1154- Ref<RendererRD::Fog::VolumetricFog> fog = p_render_buffers->get_custom_data (RB_SCOPE_FOG);
1155- sky_scene_state.ubo .volumetric_fog_enabled = true ;
1156-
1157- float fog_end = fog->length ;
1158- if (fog_end > 0.0 ) {
1159- sky_scene_state.ubo .volumetric_fog_inv_length = 1.0 / fog_end;
1160- } else {
1161- sky_scene_state.ubo .volumetric_fog_inv_length = 1.0 ;
1162- }
1153+ if (p_render_data->render_buffers ->has_custom_data (RB_SCOPE_FOG)) {
1154+ Ref<RendererRD::Fog::VolumetricFog> fog = p_render_data->render_buffers ->get_custom_data (RB_SCOPE_FOG);
1155+ sky_scene_state.ubo .volumetric_fog_enabled = true ;
11631156
1164- float fog_detail_spread = fog->spread ; // Reverse lookup.
1165- if (fog_detail_spread > 0.0 ) {
1166- sky_scene_state.ubo .volumetric_fog_detail_spread = 1.0 / fog_detail_spread ;
1167- } else {
1168- sky_scene_state.ubo .volumetric_fog_detail_spread = 1.0 ;
1169- }
1157+ float fog_end = fog->length ;
1158+ if (fog_end > 0.0 ) {
1159+ sky_scene_state.ubo .volumetric_fog_inv_length = 1.0 / fog_end ;
1160+ } else {
1161+ sky_scene_state.ubo .volumetric_fog_inv_length = 1.0 ;
1162+ }
11701163
1171- sky_scene_state.fog_uniform_set = fog->sky_uniform_set ;
1164+ float fog_detail_spread = fog->spread ; // Reverse lookup.
1165+ if (fog_detail_spread > 0.0 ) {
1166+ sky_scene_state.ubo .volumetric_fog_detail_spread = 1.0 / fog_detail_spread;
1167+ } else {
1168+ sky_scene_state.ubo .volumetric_fog_detail_spread = 1.0 ;
11721169 }
1170+
1171+ sky_scene_state.fog_uniform_set = fog->sky_uniform_set ;
11731172 }
11741173
1174+ sky_scene_state.view_count = p_render_data->scene_data ->view_count ;
1175+ sky_scene_state.cam_transform = p_render_data->scene_data ->cam_transform ;
1176+
11751177 Projection correction;
1176- correction.set_depth_correction (false , true );
1177- correction.add_jitter_offset (p_jitter);
1178+ correction.set_depth_correction (p_render_data->scene_data ->flip_y , true );
1179+ correction.add_jitter_offset (p_render_data->scene_data ->taa_jitter );
1180+
1181+ Projection projection = p_render_data->scene_data ->cam_projection ;
1182+ if (p_render_data->scene_data ->cam_frustum ) {
1183+ // We don't use a full projection matrix for the sky, this is enough to make up for it.
1184+ projection[2 ].y = -projection[2 ].y ;
1185+ }
11781186
1179- sky_scene_state.view_count = p_view_count;
1180- sky_scene_state.cam_transform = p_cam_transform;
1181- sky_scene_state.cam_projection = correction * p_cam_projection; // We only use this when rendering a single view.
1187+ sky_scene_state.cam_projection = correction * projection;
11821188
11831189 // Our info in our UBO is only used if we're rendering stereo.
1184- for (uint32_t i = 0 ; i < p_view_count ; i++) {
1185- Projection view_inv_projection = (correction * p_view_projections [i]).inverse ();
1186- if (p_view_count > 1 ) {
1190+ for (uint32_t i = 0 ; i < p_render_data-> scene_data -> view_count ; i++) {
1191+ Projection view_inv_projection = (correction * p_render_data-> scene_data -> view_projection [i]).inverse ();
1192+ if (p_render_data-> scene_data -> view_count > 1 ) {
11871193 // Reprojection is used when we need to have things in combined space.
1188- RendererRD::MaterialStorage::store_camera (p_cam_projection * view_inv_projection, sky_scene_state.ubo .combined_reprojection [i]);
1194+ RendererRD::MaterialStorage::store_camera (p_render_data-> scene_data -> cam_projection * view_inv_projection, sky_scene_state.ubo .combined_reprojection [i]);
11891195 } else {
11901196 // This is unused so just reset to identity.
11911197 Projection ident;
11921198 RendererRD::MaterialStorage::store_camera (ident, sky_scene_state.ubo .combined_reprojection [i]);
11931199 }
11941200
11951201 RendererRD::MaterialStorage::store_camera (view_inv_projection, sky_scene_state.ubo .view_inv_projections [i]);
1196- sky_scene_state.ubo .view_eye_offsets [i][0 ] = p_view_eye_offsets [i].x ;
1197- sky_scene_state.ubo .view_eye_offsets [i][1 ] = p_view_eye_offsets [i].y ;
1198- sky_scene_state.ubo .view_eye_offsets [i][2 ] = p_view_eye_offsets [i].z ;
1202+ sky_scene_state.ubo .view_eye_offsets [i][0 ] = p_render_data-> scene_data -> view_eye_offset [i].x ;
1203+ sky_scene_state.ubo .view_eye_offsets [i][1 ] = p_render_data-> scene_data -> view_eye_offset [i].y ;
1204+ sky_scene_state.ubo .view_eye_offsets [i][2 ] = p_render_data-> scene_data -> view_eye_offset [i].z ;
11991205 sky_scene_state.ubo .view_eye_offsets [i][3 ] = 0.0 ;
12001206 }
12011207
1202- sky_scene_state.ubo .z_far = p_view_projections [0 ].get_z_far (); // Should be the same for all projection.
1203- sky_scene_state.ubo .fog_enabled = RendererSceneRenderRD::get_singleton ()->environment_get_fog_enabled (p_env );
1204- sky_scene_state.ubo .fog_density = RendererSceneRenderRD::get_singleton ()->environment_get_fog_density (p_env );
1205- sky_scene_state.ubo .fog_aerial_perspective = RendererSceneRenderRD::get_singleton ()->environment_get_fog_aerial_perspective (p_env );
1206- Color fog_color = RendererSceneRenderRD::get_singleton ()->environment_get_fog_light_color (p_env ).srgb_to_linear ();
1207- float fog_energy = RendererSceneRenderRD::get_singleton ()->environment_get_fog_light_energy (p_env );
1208+ sky_scene_state.ubo .z_far = p_render_data-> scene_data -> view_projection [0 ].get_z_far (); // Should be the same for all projection.
1209+ sky_scene_state.ubo .fog_enabled = RendererSceneRenderRD::get_singleton ()->environment_get_fog_enabled (p_render_data-> environment );
1210+ sky_scene_state.ubo .fog_density = RendererSceneRenderRD::get_singleton ()->environment_get_fog_density (p_render_data-> environment );
1211+ sky_scene_state.ubo .fog_aerial_perspective = RendererSceneRenderRD::get_singleton ()->environment_get_fog_aerial_perspective (p_render_data-> environment );
1212+ Color fog_color = RendererSceneRenderRD::get_singleton ()->environment_get_fog_light_color (p_render_data-> environment ).srgb_to_linear ();
1213+ float fog_energy = RendererSceneRenderRD::get_singleton ()->environment_get_fog_light_energy (p_render_data-> environment );
12081214 sky_scene_state.ubo .fog_light_color [0 ] = fog_color.r * fog_energy;
12091215 sky_scene_state.ubo .fog_light_color [1 ] = fog_color.g * fog_energy;
12101216 sky_scene_state.ubo .fog_light_color [2 ] = fog_color.b * fog_energy;
1211- sky_scene_state.ubo .fog_sun_scatter = RendererSceneRenderRD::get_singleton ()->environment_get_fog_sun_scatter (p_env );
1217+ sky_scene_state.ubo .fog_sun_scatter = RendererSceneRenderRD::get_singleton ()->environment_get_fog_sun_scatter (p_render_data-> environment );
12121218
1213- sky_scene_state.ubo .fog_sky_affect = RendererSceneRenderRD::get_singleton ()->environment_get_fog_sky_affect (p_env );
1214- sky_scene_state.ubo .volumetric_fog_sky_affect = RendererSceneRenderRD::get_singleton ()->environment_get_volumetric_fog_sky_affect (p_env );
1219+ sky_scene_state.ubo .fog_sky_affect = RendererSceneRenderRD::get_singleton ()->environment_get_fog_sky_affect (p_render_data-> environment );
1220+ sky_scene_state.ubo .volumetric_fog_sky_affect = RendererSceneRenderRD::get_singleton ()->environment_get_volumetric_fog_sky_affect (p_render_data-> environment );
12151221
12161222 RD::get_singleton ()->buffer_update (sky_scene_state.uniform_buffer , 0 , sizeof (SkySceneState::UBO), &sky_scene_state.ubo );
12171223}
@@ -1292,7 +1298,7 @@ void SkyRD::update_radiance_buffers(Ref<RenderSceneBuffersRD> p_render_buffers,
12921298 Projection cm;
12931299 cm.set_perspective (90 , 1 , 0.01 , 10.0 );
12941300 Projection correction;
1295- correction.set_depth_correction (true );
1301+ correction.set_depth_correction (false );
12961302 cm = correction * cm;
12971303
12981304 // Note, we ignore environment_get_sky_orientation here as this is applied when we do our lookup in our scene shader.
0 commit comments