| 1 | /**************************************************************************/ |
| 2 | /* render_scene_data_rd.h */ |
| 3 | /**************************************************************************/ |
| 4 | /* This file is part of: */ |
| 5 | /* GODOT ENGINE */ |
| 6 | /* https://godotengine.org */ |
| 7 | /**************************************************************************/ |
| 8 | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ |
| 9 | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ |
| 10 | /* */ |
| 11 | /* Permission is hereby granted, free of charge, to any person obtaining */ |
| 12 | /* a copy of this software and associated documentation files (the */ |
| 13 | /* "Software"), to deal in the Software without restriction, including */ |
| 14 | /* without limitation the rights to use, copy, modify, merge, publish, */ |
| 15 | /* distribute, sublicense, and/or sell copies of the Software, and to */ |
| 16 | /* permit persons to whom the Software is furnished to do so, subject to */ |
| 17 | /* the following conditions: */ |
| 18 | /* */ |
| 19 | /* The above copyright notice and this permission notice shall be */ |
| 20 | /* included in all copies or substantial portions of the Software. */ |
| 21 | /* */ |
| 22 | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ |
| 23 | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ |
| 24 | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ |
| 25 | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ |
| 26 | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ |
| 27 | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ |
| 28 | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| 29 | /**************************************************************************/ |
| 30 | |
| 31 | #ifndef RENDER_SCENE_DATA_RD_H |
| 32 | #define RENDER_SCENE_DATA_RD_H |
| 33 | |
| 34 | #include "render_scene_buffers_rd.h" |
| 35 | #include "servers/rendering/renderer_scene_render.h" |
| 36 | #include "servers/rendering/rendering_device.h" |
| 37 | |
| 38 | // This is a container for data related to rendering a single frame of a viewport where we load this data into a UBO |
| 39 | // that can be used by the main scene shader but also by various effects. |
| 40 | |
| 41 | class RenderSceneDataRD { |
| 42 | public: |
| 43 | bool calculate_motion_vectors = false; |
| 44 | |
| 45 | Transform3D cam_transform; |
| 46 | Projection cam_projection; |
| 47 | Vector2 taa_jitter; |
| 48 | uint32_t camera_visible_layers; |
| 49 | bool cam_orthogonal = false; |
| 50 | |
| 51 | // For stereo rendering |
| 52 | uint32_t view_count = 1; |
| 53 | Vector3 view_eye_offset[RendererSceneRender::MAX_RENDER_VIEWS]; |
| 54 | Projection view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; |
| 55 | |
| 56 | Transform3D prev_cam_transform; |
| 57 | Projection prev_cam_projection; |
| 58 | Vector2 prev_taa_jitter; |
| 59 | Projection prev_view_projection[RendererSceneRender::MAX_RENDER_VIEWS]; |
| 60 | |
| 61 | float z_near = 0.0; |
| 62 | float z_far = 0.0; |
| 63 | |
| 64 | float lod_distance_multiplier = 0.0; |
| 65 | float screen_mesh_lod_threshold = 0.0; |
| 66 | |
| 67 | uint32_t directional_light_count = 0; |
| 68 | float dual_paraboloid_side = 0.0; |
| 69 | float opaque_prepass_threshold = 0.0; |
| 70 | bool material_uv2_mode = false; |
| 71 | float emissive_exposure_normalization = 0.0; |
| 72 | |
| 73 | Size2 shadow_atlas_pixel_size; |
| 74 | Size2 directional_shadow_pixel_size; |
| 75 | |
| 76 | float time; |
| 77 | float time_step; |
| 78 | |
| 79 | RID create_uniform_buffer(); |
| 80 | void update_ubo(RID p_uniform_buffer, RS::ViewportDebugDraw p_debug_mode, RID p_env, RID p_reflection_probe_instance, RID p_camera_attributes, bool p_flip_y, bool p_pancake_shadows, const Size2i &p_screen_size, const Color &p_default_bg_color, float p_luminance_multiplier, bool p_opaque_render_buffers); |
| 81 | RID get_uniform_buffer(); |
| 82 | |
| 83 | private: |
| 84 | RID uniform_buffer; // loaded into this uniform buffer (supplied externally) |
| 85 | |
| 86 | // This struct is loaded into Set 1 - Binding 0, populated at start of rendering a frame, must match with shader code |
| 87 | struct UBO { |
| 88 | float projection_matrix[16]; |
| 89 | float inv_projection_matrix[16]; |
| 90 | float inv_view_matrix[16]; |
| 91 | float view_matrix[16]; |
| 92 | |
| 93 | float projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; |
| 94 | float inv_projection_matrix_view[RendererSceneRender::MAX_RENDER_VIEWS][16]; |
| 95 | float eye_offset[RendererSceneRender::MAX_RENDER_VIEWS][4]; |
| 96 | |
| 97 | float viewport_size[2]; |
| 98 | float screen_pixel_size[2]; |
| 99 | |
| 100 | float directional_penumbra_shadow_kernel[128]; //32 vec4s |
| 101 | float directional_soft_shadow_kernel[128]; |
| 102 | float penumbra_shadow_kernel[128]; |
| 103 | float soft_shadow_kernel[128]; |
| 104 | |
| 105 | float radiance_inverse_xform[12]; |
| 106 | |
| 107 | float ambient_light_color_energy[4]; |
| 108 | |
| 109 | float ambient_color_sky_mix; |
| 110 | uint32_t use_ambient_light; |
| 111 | uint32_t use_ambient_cubemap; |
| 112 | uint32_t use_reflection_cubemap; |
| 113 | |
| 114 | float shadow_atlas_pixel_size[2]; |
| 115 | float directional_shadow_pixel_size[2]; |
| 116 | |
| 117 | uint32_t directional_light_count; |
| 118 | float dual_paraboloid_side; |
| 119 | float z_far; |
| 120 | float z_near; |
| 121 | |
| 122 | uint32_t roughness_limiter_enabled; |
| 123 | float roughness_limiter_amount; |
| 124 | float roughness_limiter_limit; |
| 125 | float opaque_prepass_threshold; |
| 126 | |
| 127 | // Fog |
| 128 | uint32_t fog_enabled; |
| 129 | float fog_density; |
| 130 | float fog_height; |
| 131 | float fog_height_density; |
| 132 | |
| 133 | float fog_light_color[3]; |
| 134 | float fog_sun_scatter; |
| 135 | |
| 136 | float fog_aerial_perspective; |
| 137 | float time; |
| 138 | float reflection_multiplier; |
| 139 | uint32_t material_uv2_mode; |
| 140 | |
| 141 | float taa_jitter[2]; |
| 142 | float emissive_exposure_normalization; // Needed to normalize emissive when using physical units. |
| 143 | float IBL_exposure_normalization; // Adjusts for baked exposure. |
| 144 | |
| 145 | uint32_t pancake_shadows; |
| 146 | uint32_t camera_visible_layers; |
| 147 | uint32_t pad2; |
| 148 | uint32_t pad3; |
| 149 | }; |
| 150 | |
| 151 | struct UBODATA { |
| 152 | UBO ubo; |
| 153 | UBO prev_ubo; |
| 154 | }; |
| 155 | }; |
| 156 | |
| 157 | #endif // RENDER_SCENE_DATA_RD_H |
| 158 | |