Restructure environment in render implementation
This commit is contained in:
parent
eac22e3eb4
commit
f579125eeb
21 changed files with 2211 additions and 1310 deletions
|
@ -32,6 +32,7 @@
|
|||
#include "core/config/project_settings.h"
|
||||
#include "core/templates/sort_array.h"
|
||||
#include "servers/rendering/rendering_server_default.h"
|
||||
#include "servers/rendering/rendering_server_globals.h"
|
||||
#include "storage/config.h"
|
||||
#include "storage/light_storage.h"
|
||||
#include "storage/mesh_storage.h"
|
||||
|
@ -39,8 +40,6 @@
|
|||
|
||||
#ifdef GLES3_ENABLED
|
||||
|
||||
uint64_t RasterizerSceneGLES3::auto_exposure_counter = 2;
|
||||
|
||||
RasterizerSceneGLES3 *RasterizerSceneGLES3::singleton = nullptr;
|
||||
|
||||
RenderGeometryInstance *RasterizerSceneGLES3::geometry_instance_create(RID p_base) {
|
||||
|
@ -561,13 +560,13 @@ void RasterizerSceneGLES3::_update_dirty_skys() {
|
|||
dirty_sky_list = nullptr;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::_setup_sky(Environment *p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size) {
|
||||
void RasterizerSceneGLES3::_setup_sky(RID p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size) {
|
||||
GLES3::LightStorage *light_storage = GLES3::LightStorage::get_singleton();
|
||||
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
GLES3::SkyMaterialData *material = nullptr;
|
||||
Sky *sky = sky_owner.get_or_null(p_env->sky);
|
||||
Sky *sky = sky_owner.get_or_null(environment_get_sky(p_env));
|
||||
|
||||
RID sky_material;
|
||||
|
||||
|
@ -707,17 +706,17 @@ void RasterizerSceneGLES3::_setup_sky(Environment *p_env, RID p_render_buffers,
|
|||
}
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::_draw_sky(Environment *p_env, const Projection &p_projection, const Transform3D &p_transform) {
|
||||
void RasterizerSceneGLES3::_draw_sky(RID p_env, const Projection &p_projection, const Transform3D &p_transform) {
|
||||
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
Sky *sky = sky_owner.get_or_null(p_env->sky);
|
||||
Sky *sky = sky_owner.get_or_null(environment_get_sky(p_env));
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
||||
GLES3::SkyMaterialData *material_data = nullptr;
|
||||
RID sky_material;
|
||||
|
||||
RS::EnvironmentBG background = p_env->background;
|
||||
RS::EnvironmentBG background = environment_get_background(p_env);
|
||||
|
||||
if (sky) {
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
@ -749,16 +748,16 @@ void RasterizerSceneGLES3::_draw_sky(Environment *p_env, const Projection &p_pro
|
|||
// Camera
|
||||
Projection camera;
|
||||
|
||||
if (p_env->sky_custom_fov) {
|
||||
if (environment_get_sky_custom_fov(p_env)) {
|
||||
float near_plane = p_projection.get_z_near();
|
||||
float far_plane = p_projection.get_z_far();
|
||||
float aspect = p_projection.get_aspect();
|
||||
|
||||
camera.set_perspective(p_env->sky_custom_fov, aspect, near_plane, far_plane);
|
||||
camera.set_perspective(environment_get_sky_custom_fov(p_env), aspect, near_plane, far_plane);
|
||||
} else {
|
||||
camera = p_projection;
|
||||
}
|
||||
Basis sky_transform = p_env->sky_orientation;
|
||||
Basis sky_transform = environment_get_sky_orientation(p_env);
|
||||
sky_transform.invert();
|
||||
sky_transform = p_transform.basis * sky_transform;
|
||||
|
||||
|
@ -772,17 +771,17 @@ void RasterizerSceneGLES3::_draw_sky(Environment *p_env, const Projection &p_pro
|
|||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::_update_sky_radiance(Environment *p_env, const Projection &p_projection, const Transform3D &p_transform) {
|
||||
void RasterizerSceneGLES3::_update_sky_radiance(RID p_env, const Projection &p_projection, const Transform3D &p_transform) {
|
||||
GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
Sky *sky = sky_owner.get_or_null(p_env->sky);
|
||||
Sky *sky = sky_owner.get_or_null(environment_get_sky(p_env));
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
||||
GLES3::SkyMaterialData *material_data = nullptr;
|
||||
RID sky_material;
|
||||
|
||||
RS::EnvironmentBG background = p_env->background;
|
||||
RS::EnvironmentBG background = environment_get_background(p_env);
|
||||
|
||||
if (sky) {
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
@ -1023,84 +1022,6 @@ Ref<Image> RasterizerSceneGLES3::sky_bake_panorama(RID p_sky, float p_energy, bo
|
|||
|
||||
/* ENVIRONMENT API */
|
||||
|
||||
RID RasterizerSceneGLES3::environment_allocate() {
|
||||
return environment_owner.allocate_rid();
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_initialize(RID p_rid) {
|
||||
environment_owner.initialize_rid(p_rid);
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_background(RID p_env, RS::EnvironmentBG p_bg) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->background = p_bg;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_sky(RID p_env, RID p_sky) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky = p_sky;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_sky_custom_fov(RID p_env, float p_scale) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_custom_fov = p_scale;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_orientation = p_orientation;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_bg_color(RID p_env, const Color &p_color) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_color = p_color;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_bg_energy(RID p_env, float p_energy) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_energy = p_energy;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_canvas_max_layer(RID p_env, int p_max_layer) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->canvas_max_layer = p_max_layer;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ambient_light = p_color;
|
||||
env->ambient_source = p_ambient;
|
||||
env->ambient_light_energy = p_energy;
|
||||
env->ambient_sky_contribution = p_sky_contribution;
|
||||
env->reflection_source = p_reflection_source;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");
|
||||
env->glow_enabled = p_enable;
|
||||
env->glow_levels = p_levels;
|
||||
env->glow_intensity = p_intensity;
|
||||
env->glow_strength = p_strength;
|
||||
env->glow_mix = p_mix;
|
||||
env->glow_bloom = p_bloom_threshold;
|
||||
env->glow_blend_mode = p_blend_mode;
|
||||
env->glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
|
||||
env->glow_hdr_bleed_scale = p_hdr_bleed_scale;
|
||||
env->glow_hdr_luminance_cap = p_hdr_luminance_cap;
|
||||
env->glow_map_strength = p_glow_map_strength;
|
||||
env->glow_map = p_glow_map;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_glow_set_use_bicubic_upscale(bool p_enable) {
|
||||
glow_bicubic_upscale = p_enable;
|
||||
}
|
||||
|
@ -1109,35 +1030,15 @@ void RasterizerSceneGLES3::environment_glow_set_use_high_quality(bool p_enable)
|
|||
glow_high_quality = p_enable;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ssr_enabled = p_enable;
|
||||
env->ssr_max_steps = p_max_steps;
|
||||
env->ssr_fade_in = p_fade_int;
|
||||
env->ssr_fade_out = p_fade_out;
|
||||
env->ssr_depth_tolerance = p_depth_tolerance;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) {
|
||||
}
|
||||
void RasterizerSceneGLES3::environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) {
|
||||
}
|
||||
|
||||
|
@ -1147,49 +1048,6 @@ void RasterizerSceneGLES3::environment_set_sdfgi_frames_to_converge(RS::Environm
|
|||
void RasterizerSceneGLES3::environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->exposure = p_exposure;
|
||||
env->tone_mapper = p_tone_mapper;
|
||||
if (!env->auto_exposure && p_auto_exposure) {
|
||||
env->auto_exposure_version = ++auto_exposure_counter;
|
||||
}
|
||||
env->auto_exposure = p_auto_exposure;
|
||||
env->white = p_white;
|
||||
env->min_luminance = p_min_luminance;
|
||||
env->max_luminance = p_max_luminance;
|
||||
env->auto_exp_speed = p_auto_exp_speed;
|
||||
env->auto_exp_scale = p_auto_exp_scale;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->adjustments_enabled = p_enable;
|
||||
env->adjustments_brightness = p_brightness;
|
||||
env->adjustments_contrast = p_contrast;
|
||||
env->adjustments_saturation = p_saturation;
|
||||
env->use_1d_color_correction = p_use_1d_color_correction;
|
||||
env->color_correction = p_color_correction;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->fog_enabled = p_enable;
|
||||
env->fog_light_color = p_light_color;
|
||||
env->fog_light_energy = p_light_energy;
|
||||
env->fog_sun_scatter = p_sun_scatter;
|
||||
env->fog_density = p_density;
|
||||
env->fog_height = p_height;
|
||||
env->fog_height_density = p_height_density;
|
||||
env->fog_aerial_perspective = p_aerial_perspective;
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) {
|
||||
}
|
||||
|
||||
void RasterizerSceneGLES3::environment_set_volumetric_fog_volume_size(int p_size, int p_depth) {
|
||||
}
|
||||
|
||||
|
@ -1197,27 +1055,9 @@ void RasterizerSceneGLES3::environment_set_volumetric_fog_filter_active(bool p_e
|
|||
}
|
||||
|
||||
Ref<Image> RasterizerSceneGLES3::environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Ref<Image>());
|
||||
return Ref<Image>();
|
||||
}
|
||||
|
||||
bool RasterizerSceneGLES3::is_environment(RID p_env) const {
|
||||
return environment_owner.owns(p_env);
|
||||
}
|
||||
|
||||
RS::EnvironmentBG RasterizerSceneGLES3::environment_get_background(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_BG_MAX);
|
||||
return env->background;
|
||||
}
|
||||
|
||||
int RasterizerSceneGLES3::environment_get_canvas_max_layer(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->canvas_max_layer;
|
||||
}
|
||||
|
||||
RID RasterizerSceneGLES3::camera_effects_allocate() {
|
||||
return RID();
|
||||
}
|
||||
|
@ -1557,18 +1397,17 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da
|
|||
scene_state.ubo.time = time;
|
||||
|
||||
if (is_environment(p_render_data->environment)) {
|
||||
Environment *env = environment_owner.get_or_null(p_render_data->environment);
|
||||
RS::EnvironmentBG env_bg = env->background;
|
||||
RS::EnvironmentAmbientSource ambient_src = env->ambient_source;
|
||||
RS::EnvironmentBG env_bg = environment_get_background(p_render_data->environment);
|
||||
RS::EnvironmentAmbientSource ambient_src = environment_get_ambient_source(p_render_data->environment);
|
||||
|
||||
float bg_energy = env->bg_energy;
|
||||
float bg_energy = environment_get_bg_energy(p_render_data->environment);
|
||||
scene_state.ubo.ambient_light_color_energy[3] = bg_energy;
|
||||
|
||||
scene_state.ubo.ambient_color_sky_mix = env->ambient_sky_contribution;
|
||||
scene_state.ubo.ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_render_data->environment);
|
||||
|
||||
//ambient
|
||||
if (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && (env_bg == RS::ENV_BG_CLEAR_COLOR || env_bg == RS::ENV_BG_COLOR)) {
|
||||
Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : env->bg_color;
|
||||
Color color = env_bg == RS::ENV_BG_CLEAR_COLOR ? p_default_bg_color : environment_get_bg_color(p_render_data->environment);
|
||||
color = color.srgb_to_linear();
|
||||
|
||||
scene_state.ubo.ambient_light_color_energy[0] = color.r * bg_energy;
|
||||
|
@ -1577,14 +1416,14 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da
|
|||
scene_state.ubo.use_ambient_light = true;
|
||||
scene_state.ubo.use_ambient_cubemap = false;
|
||||
} else {
|
||||
float energy = env->ambient_light_energy;
|
||||
Color color = env->ambient_light;
|
||||
float energy = environment_get_ambient_light_energy(p_render_data->environment);
|
||||
Color color = environment_get_ambient_light(p_render_data->environment);
|
||||
color = color.srgb_to_linear();
|
||||
scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;
|
||||
scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;
|
||||
scene_state.ubo.ambient_light_color_energy[2] = color.b * energy;
|
||||
|
||||
Basis sky_transform = env->sky_orientation;
|
||||
Basis sky_transform = environment_get_sky_orientation(p_render_data->environment);
|
||||
sky_transform = sky_transform.inverse() * p_render_data->cam_transform.basis;
|
||||
GLES3::MaterialStorage::store_transform_3x3(sky_transform, scene_state.ubo.radiance_inverse_xform);
|
||||
scene_state.ubo.use_ambient_cubemap = (ambient_src == RS::ENV_AMBIENT_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ambient_src == RS::ENV_AMBIENT_SOURCE_SKY;
|
||||
|
@ -1592,27 +1431,27 @@ void RasterizerSceneGLES3::_setup_environment(const RenderDataGLES3 *p_render_da
|
|||
}
|
||||
|
||||
//specular
|
||||
RS::EnvironmentReflectionSource ref_src = env->reflection_source;
|
||||
RS::EnvironmentReflectionSource ref_src = environment_get_reflection_source(p_render_data->environment);
|
||||
if ((ref_src == RS::ENV_REFLECTION_SOURCE_BG && env_bg == RS::ENV_BG_SKY) || ref_src == RS::ENV_REFLECTION_SOURCE_SKY) {
|
||||
scene_state.ubo.use_reflection_cubemap = true;
|
||||
} else {
|
||||
scene_state.ubo.use_reflection_cubemap = false;
|
||||
}
|
||||
|
||||
scene_state.ubo.fog_enabled = env->fog_enabled;
|
||||
scene_state.ubo.fog_density = env->fog_density;
|
||||
scene_state.ubo.fog_height = env->fog_height;
|
||||
scene_state.ubo.fog_height_density = env->fog_height_density;
|
||||
scene_state.ubo.fog_aerial_perspective = env->fog_aerial_perspective;
|
||||
scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment);
|
||||
scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment);
|
||||
scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment);
|
||||
scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment);
|
||||
scene_state.ubo.fog_aerial_perspective = environment_get_fog_aerial_perspective(p_render_data->environment);
|
||||
|
||||
Color fog_color = env->fog_light_color.srgb_to_linear();
|
||||
float fog_energy = env->fog_light_energy;
|
||||
Color fog_color = environment_get_fog_light_color(p_render_data->environment).srgb_to_linear();
|
||||
float fog_energy = environment_get_fog_light_energy(p_render_data->environment);
|
||||
|
||||
scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy;
|
||||
scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy;
|
||||
scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy;
|
||||
|
||||
scene_state.ubo.fog_sun_scatter = env->fog_sun_scatter;
|
||||
scene_state.ubo.fog_sun_scatter = environment_get_fog_sun_scatter(p_render_data->environment);
|
||||
|
||||
} else {
|
||||
}
|
||||
|
@ -1904,8 +1743,6 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
clear_color = texture_storage->get_default_clear_color();
|
||||
}
|
||||
|
||||
Environment *env = environment_owner.get_or_null(p_environment);
|
||||
|
||||
bool fb_cleared = false;
|
||||
|
||||
Size2i screen_size;
|
||||
|
@ -1915,10 +1752,10 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
bool use_wireframe = get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_WIREFRAME;
|
||||
|
||||
SceneState::TonemapUBO tonemap_ubo;
|
||||
if (env) {
|
||||
tonemap_ubo.exposure = env->exposure;
|
||||
tonemap_ubo.white = env->white;
|
||||
tonemap_ubo.tonemapper = int32_t(env->tone_mapper);
|
||||
if (render_data.environment.is_valid()) {
|
||||
tonemap_ubo.exposure = environment_get_exposure(render_data.environment);
|
||||
tonemap_ubo.white = environment_get_white(render_data.environment);
|
||||
tonemap_ubo.tonemapper = int32_t(environment_get_tone_mapper(render_data.environment));
|
||||
}
|
||||
|
||||
if (scene_state.tonemap_buffer == 0) {
|
||||
|
@ -1941,25 +1778,25 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
|
||||
if (get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_OVERDRAW) {
|
||||
clear_color = Color(0, 0, 0, 1); //in overdraw mode, BG should always be black
|
||||
} else if (env) {
|
||||
RS::EnvironmentBG bg_mode = env->background;
|
||||
float bg_energy = env->bg_energy;
|
||||
} else if (render_data.environment.is_valid()) {
|
||||
RS::EnvironmentBG bg_mode = environment_get_background(render_data.environment);
|
||||
float bg_energy = environment_get_bg_energy(render_data.environment);
|
||||
switch (bg_mode) {
|
||||
case RS::ENV_BG_CLEAR_COLOR: {
|
||||
clear_color.r *= bg_energy;
|
||||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
if (env->fog_enabled) {
|
||||
if (environment_get_fog_enabled(render_data.environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
GLES3::MaterialStorage::get_singleton()->material_set_param(sky_globals.fog_material, "clear_color", Variant(clear_color));
|
||||
}
|
||||
} break;
|
||||
case RS::ENV_BG_COLOR: {
|
||||
clear_color = env->bg_color;
|
||||
clear_color = environment_get_bg_color(render_data.environment);
|
||||
clear_color.r *= bg_energy;
|
||||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
if (env->fog_enabled) {
|
||||
if (environment_get_fog_enabled(render_data.environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
GLES3::MaterialStorage::get_singleton()->material_set_param(sky_globals.fog_material, "clear_color", Variant(clear_color));
|
||||
}
|
||||
|
@ -1979,7 +1816,7 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
}
|
||||
}
|
||||
// setup sky if used for ambient, reflections, or background
|
||||
if (draw_sky || draw_sky_fog_only || env->reflection_source == RS::ENV_REFLECTION_SOURCE_SKY || env->ambient_source == RS::ENV_AMBIENT_SOURCE_SKY) {
|
||||
if (draw_sky || draw_sky_fog_only || environment_get_reflection_source(render_data.environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(render_data.environment) == RS::ENV_AMBIENT_SOURCE_SKY) {
|
||||
RENDER_TIMESTAMP("Setup Sky");
|
||||
Projection projection = render_data.cam_projection;
|
||||
if (render_data.reflection_probe.is_valid()) {
|
||||
|
@ -1988,11 +1825,11 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
projection = correction * render_data.cam_projection;
|
||||
}
|
||||
|
||||
_setup_sky(env, p_render_buffers, *render_data.lights, projection, render_data.cam_transform, screen_size);
|
||||
_setup_sky(render_data.environment, p_render_buffers, *render_data.lights, projection, render_data.cam_transform, screen_size);
|
||||
|
||||
if (env->sky.is_valid()) {
|
||||
if (env->reflection_source == RS::ENV_REFLECTION_SOURCE_SKY || env->ambient_source == RS::ENV_AMBIENT_SOURCE_SKY || (env->reflection_source == RS::ENV_REFLECTION_SOURCE_BG && env->background == RS::ENV_BG_SKY)) {
|
||||
_update_sky_radiance(env, projection, render_data.cam_transform);
|
||||
if (environment_get_sky(render_data.environment).is_valid()) {
|
||||
if (environment_get_reflection_source(render_data.environment) == RS::ENV_REFLECTION_SOURCE_SKY || environment_get_ambient_source(render_data.environment) == RS::ENV_AMBIENT_SOURCE_SKY || (environment_get_reflection_source(render_data.environment) == RS::ENV_REFLECTION_SOURCE_BG && environment_get_background(render_data.environment) == RS::ENV_BG_SKY)) {
|
||||
_update_sky_radiance(render_data.environment, projection, render_data.cam_transform);
|
||||
}
|
||||
} else {
|
||||
// do not try to draw sky if invalid
|
||||
|
@ -2072,7 +1909,7 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_DIRECTIONAL_LIGHTS;
|
||||
}
|
||||
|
||||
if (!env || (env && !env->fog_enabled)) {
|
||||
if (render_data.environment.is_null() || (render_data.environment.is_valid() && !environment_get_fog_enabled(render_data.environment))) {
|
||||
spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_FOG;
|
||||
}
|
||||
}
|
||||
|
@ -2096,7 +1933,7 @@ void RasterizerSceneGLES3::render_scene(RID p_render_buffers, const CameraData *
|
|||
scene_state.current_depth_draw = GLES3::SceneShaderData::DEPTH_DRAW_DISABLED;
|
||||
scene_state.cull_mode = GLES3::SceneShaderData::CULL_BACK;
|
||||
|
||||
_draw_sky(env, render_data.cam_projection, render_data.cam_transform);
|
||||
_draw_sky(render_data.environment, render_data.cam_projection, render_data.cam_transform);
|
||||
}
|
||||
|
||||
RENDER_TIMESTAMP("Render 3D Transparent Pass");
|
||||
|
@ -2145,11 +1982,10 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params,
|
|||
}
|
||||
|
||||
if (p_pass_mode == PASS_MODE_COLOR || p_pass_mode == PASS_MODE_COLOR_TRANSPARENT) {
|
||||
Environment *env = environment_owner.get_or_null(p_render_data->environment);
|
||||
glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 2);
|
||||
GLuint texture_to_bind = texture_storage->get_texture(texture_storage->texture_gl_get_default(GLES3::DEFAULT_GL_TEXTURE_CUBEMAP_BLACK))->tex_id;
|
||||
if (env) {
|
||||
Sky *sky = sky_owner.get_or_null(env->sky);
|
||||
if (p_render_data->environment.is_valid()) {
|
||||
Sky *sky = sky_owner.get_or_null(environment_get_sky(p_render_data->environment));
|
||||
if (sky && sky->radiance != 0) {
|
||||
texture_to_bind = sky->radiance;
|
||||
// base_spec_constant |= USE_RADIANCE_MAP;
|
||||
|
@ -2548,8 +2384,8 @@ TypedArray<Image> RasterizerSceneGLES3::bake_render_uv2(RID p_base, const Vector
|
|||
}
|
||||
|
||||
bool RasterizerSceneGLES3::free(RID p_rid) {
|
||||
if (environment_owner.owns(p_rid)) {
|
||||
environment_owner.free(p_rid);
|
||||
if (is_environment(p_rid)) {
|
||||
environment_free(p_rid);
|
||||
} else if (sky_owner.owns(p_rid)) {
|
||||
Sky *sky = sky_owner.get_or_null(p_rid);
|
||||
ERR_FAIL_COND_V(!sky, false);
|
||||
|
|
|
@ -539,85 +539,6 @@ protected:
|
|||
|
||||
/* Environment */
|
||||
|
||||
struct Environment {
|
||||
// BG
|
||||
RS::EnvironmentBG background = RS::ENV_BG_CLEAR_COLOR;
|
||||
RID sky;
|
||||
float sky_custom_fov = 0.0;
|
||||
Basis sky_orientation;
|
||||
Color bg_color;
|
||||
float bg_energy = 1.0;
|
||||
int canvas_max_layer = 0;
|
||||
RS::EnvironmentAmbientSource ambient_source = RS::ENV_AMBIENT_SOURCE_BG;
|
||||
Color ambient_light;
|
||||
float ambient_light_energy = 1.0;
|
||||
float ambient_sky_contribution = 1.0;
|
||||
RS::EnvironmentReflectionSource reflection_source = RS::ENV_REFLECTION_SOURCE_BG;
|
||||
Color ao_color;
|
||||
|
||||
/// Tonemap
|
||||
|
||||
RS::EnvironmentToneMapper tone_mapper;
|
||||
float exposure = 1.0;
|
||||
float white = 1.0;
|
||||
bool auto_exposure = false;
|
||||
float min_luminance = 0.2;
|
||||
float max_luminance = 8.0;
|
||||
float auto_exp_speed = 0.2;
|
||||
float auto_exp_scale = 0.5;
|
||||
uint64_t auto_exposure_version = 0;
|
||||
|
||||
// Fog
|
||||
bool fog_enabled = false;
|
||||
Color fog_light_color = Color(0.5, 0.6, 0.7);
|
||||
float fog_light_energy = 1.0;
|
||||
float fog_sun_scatter = 0.0;
|
||||
float fog_density = 0.001;
|
||||
float fog_height = 0.0;
|
||||
float fog_height_density = 0.0; //can be negative to invert effect
|
||||
float fog_aerial_perspective = 0.0;
|
||||
|
||||
/// Glow
|
||||
bool glow_enabled = false;
|
||||
Vector<float> glow_levels;
|
||||
float glow_intensity = 0.8;
|
||||
float glow_strength = 1.0;
|
||||
float glow_bloom = 0.0;
|
||||
float glow_mix = 0.01;
|
||||
RS::EnvironmentGlowBlendMode glow_blend_mode = RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT;
|
||||
float glow_hdr_bleed_threshold = 1.0;
|
||||
float glow_hdr_luminance_cap = 12.0;
|
||||
float glow_hdr_bleed_scale = 2.0;
|
||||
float glow_map_strength = 1.0;
|
||||
RID glow_map = RID();
|
||||
|
||||
/// SSAO
|
||||
bool ssao_enabled = false;
|
||||
float ssao_radius = 1.0;
|
||||
float ssao_intensity = 2.0;
|
||||
float ssao_power = 1.5;
|
||||
float ssao_detail = 0.5;
|
||||
float ssao_horizon = 0.06;
|
||||
float ssao_sharpness = 0.98;
|
||||
float ssao_direct_light_affect = 0.0;
|
||||
float ssao_ao_channel_affect = 0.0;
|
||||
|
||||
/// SSR
|
||||
bool ssr_enabled = false;
|
||||
int ssr_max_steps = 64;
|
||||
float ssr_fade_in = 0.15;
|
||||
float ssr_fade_out = 2.0;
|
||||
float ssr_depth_tolerance = 0.2;
|
||||
|
||||
/// Adjustments
|
||||
bool adjustments_enabled = false;
|
||||
float adjustments_brightness = 1.0f;
|
||||
float adjustments_contrast = 1.0f;
|
||||
float adjustments_saturation = 1.0f;
|
||||
bool use_1d_color_correction = false;
|
||||
RID color_correction = RID();
|
||||
};
|
||||
|
||||
RS::EnvironmentSSAOQuality ssao_quality = RS::ENV_SSAO_QUALITY_MEDIUM;
|
||||
bool ssao_half_size = false;
|
||||
float ssao_adaptive_target = 0.5;
|
||||
|
@ -629,10 +550,6 @@ protected:
|
|||
bool glow_high_quality = false;
|
||||
RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::ENV_SSR_ROUGHNESS_QUALITY_LOW;
|
||||
|
||||
static uint64_t auto_exposure_counter;
|
||||
|
||||
mutable RID_Owner<Environment, true> environment_owner;
|
||||
|
||||
/* Sky */
|
||||
|
||||
struct SkyGlobals {
|
||||
|
@ -698,12 +615,12 @@ protected:
|
|||
Sky *dirty_sky_list = nullptr;
|
||||
mutable RID_Owner<Sky, true> sky_owner;
|
||||
|
||||
void _setup_sky(Environment *p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size);
|
||||
void _setup_sky(RID p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size);
|
||||
void _invalidate_sky(Sky *p_sky);
|
||||
void _update_dirty_skys();
|
||||
void _update_sky_radiance(Environment *p_env, const Projection &p_projection, const Transform3D &p_transform);
|
||||
void _update_sky_radiance(RID p_env, const Projection &p_projection, const Transform3D &p_transform);
|
||||
void _filter_sky_radiance(Sky *p_sky, int p_base_layer);
|
||||
void _draw_sky(Environment *p_env, const Projection &p_projection, const Transform3D &p_transform);
|
||||
void _draw_sky(RID p_env, const Projection &p_projection, const Transform3D &p_transform);
|
||||
void _free_sky_data(Sky *p_sky);
|
||||
|
||||
public:
|
||||
|
@ -751,49 +668,24 @@ public:
|
|||
|
||||
/* ENVIRONMENT API */
|
||||
|
||||
RID environment_allocate() override;
|
||||
void environment_initialize(RID p_rid) override;
|
||||
void environment_set_background(RID p_env, RS::EnvironmentBG p_bg) override;
|
||||
void environment_set_sky(RID p_env, RID p_sky) override;
|
||||
void environment_set_sky_custom_fov(RID p_env, float p_scale) override;
|
||||
void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) override;
|
||||
void environment_set_bg_color(RID p_env, const Color &p_color) override;
|
||||
void environment_set_bg_energy(RID p_env, float p_energy) override;
|
||||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer) override;
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) override;
|
||||
|
||||
void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) override;
|
||||
void environment_glow_set_use_bicubic_upscale(bool p_enable) override;
|
||||
void environment_glow_set_use_high_quality(bool p_enable) override;
|
||||
|
||||
void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) override;
|
||||
void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override;
|
||||
void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) override;
|
||||
void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) override;
|
||||
void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
|
||||
void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) override;
|
||||
void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
|
||||
void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
|
||||
void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override;
|
||||
void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override;
|
||||
void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override;
|
||||
|
||||
void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) override;
|
||||
|
||||
void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) override;
|
||||
|
||||
void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) override;
|
||||
void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) override;
|
||||
void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override;
|
||||
void environment_set_volumetric_fog_filter_active(bool p_enable) override;
|
||||
|
||||
Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override;
|
||||
|
||||
bool is_environment(RID p_env) const override;
|
||||
RS::EnvironmentBG environment_get_background(RID p_env) const override;
|
||||
int environment_get_canvas_max_layer(RID p_env) const override;
|
||||
|
||||
RID camera_effects_allocate() override;
|
||||
void camera_effects_initialize(RID p_rid) override;
|
||||
void camera_effects_set_dof_blur_quality(RS::DOFBlurQuality p_quality, bool p_use_jitter) override;
|
||||
|
|
|
@ -69,49 +69,24 @@ public:
|
|||
|
||||
/* ENVIRONMENT API */
|
||||
|
||||
RID environment_allocate() override { return RID(); }
|
||||
void environment_initialize(RID p_rid) override {}
|
||||
void environment_set_background(RID p_env, RS::EnvironmentBG p_bg) override {}
|
||||
void environment_set_sky(RID p_env, RID p_sky) override {}
|
||||
void environment_set_sky_custom_fov(RID p_env, float p_scale) override {}
|
||||
void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) override {}
|
||||
void environment_set_bg_color(RID p_env, const Color &p_color) override {}
|
||||
void environment_set_bg_energy(RID p_env, float p_energy) override {}
|
||||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer) override {}
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) override {}
|
||||
|
||||
void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) override {}
|
||||
void environment_glow_set_use_bicubic_upscale(bool p_enable) override {}
|
||||
void environment_glow_set_use_high_quality(bool p_enable) override {}
|
||||
|
||||
void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) override {}
|
||||
void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override {}
|
||||
void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) override {}
|
||||
void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override {}
|
||||
void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) override {}
|
||||
void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override {}
|
||||
|
||||
void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) override {}
|
||||
void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override {}
|
||||
|
||||
void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override {}
|
||||
|
||||
void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override {}
|
||||
void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override {}
|
||||
void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override {}
|
||||
|
||||
void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) override {}
|
||||
|
||||
void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) override {}
|
||||
|
||||
void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) override {}
|
||||
void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) override {}
|
||||
void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override {}
|
||||
void environment_set_volumetric_fog_filter_active(bool p_enable) override {}
|
||||
|
||||
Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override { return Ref<Image>(); }
|
||||
|
||||
bool is_environment(RID p_env) const override { return false; }
|
||||
RS::EnvironmentBG environment_get_background(RID p_env) const override { return RS::ENV_BG_KEEP; }
|
||||
int environment_get_canvas_max_layer(RID p_env) const override { return 0; }
|
||||
|
||||
RID camera_effects_allocate() override { return RID(); }
|
||||
void camera_effects_initialize(RID p_rid) override {}
|
||||
void camera_effects_set_dof_blur_quality(RS::DOFBlurQuality p_quality, bool p_use_jitter) override {}
|
||||
|
@ -180,7 +155,14 @@ public:
|
|||
|
||||
TypedArray<Image> bake_render_uv2(RID p_base, const Vector<RID> &p_material_overrides, const Size2i &p_image_size) override { return TypedArray<Image>(); }
|
||||
|
||||
bool free(RID p_rid) override { return false; }
|
||||
bool free(RID p_rid) override {
|
||||
if (is_environment(p_rid)) {
|
||||
environment_free(p_rid);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
void update() override {}
|
||||
void sdfgi_set_debug_probe_select(const Vector3 &p_position, const Vector3 &p_dir) override {}
|
||||
|
||||
|
|
|
@ -602,7 +602,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
Vector2 frustum_far_size = p_cam_projection.get_far_plane_half_extents();
|
||||
float z_near = p_cam_projection.get_z_near();
|
||||
float z_far = p_cam_projection.get_z_far();
|
||||
float fog_end = p_settings.env->volumetric_fog_length;
|
||||
float fog_end = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
|
||||
|
||||
Vector2 fog_far_size = frustum_near_size.lerp(frustum_far_size, (fog_end - z_near) / (z_far - z_near));
|
||||
Vector2 fog_near_size;
|
||||
|
@ -627,10 +627,10 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
params.fog_volume_size[1] = p_settings.vfog->height;
|
||||
params.fog_volume_size[2] = p_settings.vfog->depth;
|
||||
|
||||
params.use_temporal_reprojection = p_settings.env->volumetric_fog_temporal_reprojection;
|
||||
params.use_temporal_reprojection = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env);
|
||||
params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
|
||||
params.detail_spread = p_settings.env->volumetric_fog_detail_spread;
|
||||
params.temporal_blend = p_settings.env->volumetric_fog_temporal_reprojection_amount;
|
||||
params.detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
|
||||
params.temporal_blend = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection_amount(p_settings.env);
|
||||
|
||||
Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
|
||||
RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
|
||||
|
@ -732,14 +732,15 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
// Local fog volume.
|
||||
Vector3i points[8];
|
||||
Vector3 fog_size = Vector3(p_settings.vfog->width, p_settings.vfog->height, p_settings.vfog->depth);
|
||||
points[0] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[1] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[2] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[3] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[4] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[5] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[6] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[7] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, p_settings.env->volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
float volumetric_fog_detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
|
||||
points[0] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[1] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[2] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[3] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[4] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[5] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[6] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(extents.x, -extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
points[7] = _point_get_position_in_froxel_volume(fog_volume_instance->transform.xform(Vector3(-extents.x, -extents.y, -extents.z)), fog_end, fog_near_size, fog_far_size, volumetric_fog_detail_spread, fog_size, p_cam_transform);
|
||||
|
||||
min = Vector3i(int32_t(p_settings.vfog->width) - 1, int32_t(p_settings.vfog->height) - 1, int32_t(p_settings.vfog->depth) - 1);
|
||||
max = Vector3i(1, 1, 1);
|
||||
|
@ -785,7 +786,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
|
||||
RD::get_singleton()->compute_list_dispatch_threads(compute_list, kernel_size.x, kernel_size.y, kernel_size.z);
|
||||
}
|
||||
if (any_uses_time || p_settings.env->volumetric_fog_temporal_reprojection) {
|
||||
if (any_uses_time || RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env)) {
|
||||
RenderingServerDefault::redraw_request();
|
||||
}
|
||||
|
||||
|
@ -986,7 +987,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
u.uniform_type = RD::UNIFORM_TYPE_TEXTURE;
|
||||
u.binding = 19;
|
||||
RID radiance_texture = texture_storage->texture_rd_get_default(p_settings.is_using_radiance_cubemap_array ? RendererRD::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK : RendererRD::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
|
||||
RID sky_texture = p_settings.env->sky.is_valid() ? p_settings.sky->sky_get_radiance_texture_rd(p_settings.env->sky) : RID();
|
||||
RID sky_texture = RendererSceneRenderRD::get_singleton()->environment_get_sky(p_settings.env).is_valid() ? p_settings.sky->sky_get_radiance_texture_rd(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_settings.env)) : RID();
|
||||
u.append_id(sky_texture.is_valid() ? sky_texture : radiance_texture);
|
||||
uniforms.push_back(u);
|
||||
}
|
||||
|
@ -1008,7 +1009,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
p_settings.vfog->process_uniform_set_density = RD::get_singleton()->uniform_set_create(uniforms, volumetric_fog.process_shader.version_get_shader(volumetric_fog.process_shader_version, VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_DENSITY), 0);
|
||||
}
|
||||
|
||||
bool using_sdfgi = p_settings.env->volumetric_fog_gi_inject > 0.0001 && p_settings.env->sdfgi_enabled && (p_settings.sdfgi != nullptr);
|
||||
bool using_sdfgi = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env) > 0.0001 && RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_enabled(p_settings.env) && (p_settings.sdfgi != nullptr);
|
||||
|
||||
if (using_sdfgi) {
|
||||
if (p_settings.vfog->sdfgi_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(p_settings.vfog->sdfgi_uniform_set)) {
|
||||
|
@ -1042,8 +1043,8 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
}
|
||||
}
|
||||
|
||||
p_settings.vfog->length = p_settings.env->volumetric_fog_length;
|
||||
p_settings.vfog->spread = p_settings.env->volumetric_fog_detail_spread;
|
||||
p_settings.vfog->length = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
|
||||
p_settings.vfog->spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
|
||||
|
||||
VolumetricFogShader::ParamsUBO params;
|
||||
|
||||
|
@ -1051,7 +1052,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
Vector2 frustum_far_size = p_cam_projection.get_far_plane_half_extents();
|
||||
float z_near = p_cam_projection.get_z_near();
|
||||
float z_far = p_cam_projection.get_z_far();
|
||||
float fog_end = p_settings.env->volumetric_fog_length;
|
||||
float fog_end = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_length(p_settings.env);
|
||||
|
||||
Vector2 fog_far_size = frustum_near_size.lerp(frustum_far_size, (fog_end - z_near) / (z_far - z_near));
|
||||
Vector2 fog_near_size;
|
||||
|
@ -1067,16 +1068,16 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
params.fog_frustum_size_end[0] = fog_far_size.x;
|
||||
params.fog_frustum_size_end[1] = fog_far_size.y;
|
||||
|
||||
params.ambient_inject = p_settings.env->volumetric_fog_ambient_inject * p_settings.env->ambient_light_energy;
|
||||
params.ambient_inject = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_ambient_inject(p_settings.env) * RendererSceneRenderRD::get_singleton()->environment_get_ambient_light_energy(p_settings.env);
|
||||
params.z_far = z_far;
|
||||
|
||||
params.fog_frustum_end = fog_end;
|
||||
|
||||
Color ambient_color = p_settings.env->ambient_light.srgb_to_linear();
|
||||
Color ambient_color = RendererSceneRenderRD::get_singleton()->environment_get_ambient_light(p_settings.env).srgb_to_linear();
|
||||
params.ambient_color[0] = ambient_color.r;
|
||||
params.ambient_color[1] = ambient_color.g;
|
||||
params.ambient_color[2] = ambient_color.b;
|
||||
params.sky_contribution = p_settings.env->ambient_sky_contribution;
|
||||
params.sky_contribution = RendererSceneRenderRD::get_singleton()->environment_get_ambient_sky_contribution(p_settings.env);
|
||||
|
||||
params.fog_volume_size[0] = p_settings.vfog->width;
|
||||
params.fog_volume_size[1] = p_settings.vfog->height;
|
||||
|
@ -1084,20 +1085,20 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
|
||||
params.directional_light_count = p_directional_light_count;
|
||||
|
||||
Color emission = p_settings.env->volumetric_fog_emission.srgb_to_linear();
|
||||
params.base_emission[0] = emission.r * p_settings.env->volumetric_fog_emission_energy;
|
||||
params.base_emission[1] = emission.g * p_settings.env->volumetric_fog_emission_energy;
|
||||
params.base_emission[2] = emission.b * p_settings.env->volumetric_fog_emission_energy;
|
||||
params.base_density = p_settings.env->volumetric_fog_density;
|
||||
Color emission = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission(p_settings.env).srgb_to_linear();
|
||||
params.base_emission[0] = emission.r * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
|
||||
params.base_emission[1] = emission.g * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
|
||||
params.base_emission[2] = emission.b * RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_emission_energy(p_settings.env);
|
||||
params.base_density = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_density(p_settings.env);
|
||||
|
||||
Color base_scattering = p_settings.env->volumetric_fog_scattering.srgb_to_linear();
|
||||
Color base_scattering = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_scattering(p_settings.env).srgb_to_linear();
|
||||
params.base_scattering[0] = base_scattering.r;
|
||||
params.base_scattering[1] = base_scattering.g;
|
||||
params.base_scattering[2] = base_scattering.b;
|
||||
params.phase_g = p_settings.env->volumetric_fog_anisotropy;
|
||||
params.phase_g = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_anisotropy(p_settings.env);
|
||||
|
||||
params.detail_spread = p_settings.env->volumetric_fog_detail_spread;
|
||||
params.gi_inject = p_settings.env->volumetric_fog_gi_inject;
|
||||
params.detail_spread = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_detail_spread(p_settings.env);
|
||||
params.gi_inject = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env);
|
||||
|
||||
params.cam_rotation[0] = p_cam_transform.basis[0][0];
|
||||
params.cam_rotation[1] = p_cam_transform.basis[1][0];
|
||||
|
@ -1112,14 +1113,14 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
params.cam_rotation[10] = p_cam_transform.basis[2][2];
|
||||
params.cam_rotation[11] = 0;
|
||||
params.filter_axis = 0;
|
||||
params.max_voxel_gi_instances = p_settings.env->volumetric_fog_gi_inject > 0.001 ? p_voxel_gi_count : 0;
|
||||
params.max_voxel_gi_instances = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_gi_inject(p_settings.env) > 0.001 ? p_voxel_gi_count : 0;
|
||||
params.temporal_frame = RSG::rasterizer->get_frame_number() % VolumetricFog::MAX_TEMPORAL_FRAMES;
|
||||
|
||||
Transform3D to_prev_cam_view = p_prev_cam_inv_transform * p_cam_transform;
|
||||
RendererRD::MaterialStorage::store_transform(to_prev_cam_view, params.to_prev_view);
|
||||
|
||||
params.use_temporal_reprojection = p_settings.env->volumetric_fog_temporal_reprojection;
|
||||
params.temporal_blend = p_settings.env->volumetric_fog_temporal_reprojection_amount;
|
||||
params.use_temporal_reprojection = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env);
|
||||
params.temporal_blend = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection_amount(p_settings.env);
|
||||
|
||||
{
|
||||
uint32_t cluster_size = p_settings.cluster_builder->get_cluster_size();
|
||||
|
@ -1135,7 +1136,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
params.screen_size[1] = p_settings.rb_size.y;
|
||||
}
|
||||
|
||||
Basis sky_transform = p_settings.env->sky_orientation;
|
||||
Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_settings.env);
|
||||
sky_transform = sky_transform.inverse() * p_cam_transform.basis;
|
||||
RendererRD::MaterialStorage::store_transform_3x3(sky_transform, params.radiance_inverse_xform);
|
||||
|
||||
|
@ -1157,7 +1158,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P
|
|||
RD::get_singleton()->compute_list_add_barrier(compute_list);
|
||||
|
||||
// Copy fog to history buffer
|
||||
if (p_settings.env->volumetric_fog_temporal_reprojection) {
|
||||
if (RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_temporal_reprojection(p_settings.env)) {
|
||||
RD::get_singleton()->compute_list_bind_compute_pipeline(compute_list, volumetric_fog.process_pipelines[VolumetricFogShader::VOLUMETRIC_FOG_PROCESS_SHADER_COPY]);
|
||||
RD::get_singleton()->compute_list_bind_uniform_set(compute_list, p_settings.vfog->copy_uniform_set, 0);
|
||||
RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_settings.vfog->width, p_settings.vfog->height, p_settings.vfog->depth);
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "servers/rendering/environment/renderer_fog.h"
|
||||
#include "servers/rendering/renderer_rd/cluster_builder_rd.h"
|
||||
#include "servers/rendering/renderer_rd/environment/gi.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/volumetric_fog.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/volumetric_fog_process.glsl.gen.h"
|
||||
#include "servers/rendering/storage/utilities.h"
|
||||
|
@ -318,7 +317,7 @@ public:
|
|||
GI *gi;
|
||||
GI::SDFGI *sdfgi;
|
||||
GI::RenderBuffersGI *rbgi;
|
||||
RendererSceneEnvironmentRD *env;
|
||||
RID env;
|
||||
SkyRD *sky;
|
||||
};
|
||||
void volumetric_fog_update(const VolumetricFogSettings &p_settings, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes);
|
||||
|
|
|
@ -374,15 +374,15 @@ RID GI::voxel_gi_get_sdf_texture(RID p_voxel_gi) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
// SDFGI
|
||||
|
||||
void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, GI *p_gi) {
|
||||
void GI::SDFGI::create(RID p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, GI *p_gi) {
|
||||
RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton();
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
|
||||
gi = p_gi;
|
||||
num_cascades = p_env->sdfgi_cascades;
|
||||
min_cell_size = p_env->sdfgi_min_cell_size;
|
||||
uses_occlusion = p_env->sdfgi_use_occlusion;
|
||||
y_scale_mode = p_env->sdfgi_y_scale;
|
||||
num_cascades = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_cascades(p_env);
|
||||
min_cell_size = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_min_cell_size(p_env);
|
||||
uses_occlusion = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_use_occlusion(p_env);
|
||||
y_scale_mode = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_y_scale(p_env);
|
||||
static const float y_scale[3] = { 2.0, 1.5, 1.0 };
|
||||
y_mult = y_scale[y_scale_mode];
|
||||
cascades.resize(num_cascades);
|
||||
|
@ -1101,11 +1101,11 @@ void GI::SDFGI::create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world
|
|||
cascades[i].integrate_uniform_set = RD::get_singleton()->uniform_set_create(uniforms, gi->sdfgi_shader.integrate.version_get_shader(gi->sdfgi_shader.integrate_shader, 0), 0);
|
||||
}
|
||||
|
||||
bounce_feedback = p_env->sdfgi_bounce_feedback;
|
||||
energy = p_env->sdfgi_energy;
|
||||
normal_bias = p_env->sdfgi_normal_bias;
|
||||
probe_bias = p_env->sdfgi_probe_bias;
|
||||
reads_sky = p_env->sdfgi_read_sky_light;
|
||||
bounce_feedback = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_bounce_feedback(p_env);
|
||||
energy = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_energy(p_env);
|
||||
normal_bias = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_normal_bias(p_env);
|
||||
probe_bias = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_probe_bias(p_env);
|
||||
reads_sky = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_read_sky_light(p_env);
|
||||
}
|
||||
|
||||
void GI::SDFGI::erase() {
|
||||
|
@ -1163,12 +1163,12 @@ void GI::SDFGI::erase() {
|
|||
}
|
||||
}
|
||||
|
||||
void GI::SDFGI::update(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position) {
|
||||
bounce_feedback = p_env->sdfgi_bounce_feedback;
|
||||
energy = p_env->sdfgi_energy;
|
||||
normal_bias = p_env->sdfgi_normal_bias;
|
||||
probe_bias = p_env->sdfgi_probe_bias;
|
||||
reads_sky = p_env->sdfgi_read_sky_light;
|
||||
void GI::SDFGI::update(RID p_env, const Vector3 &p_world_position) {
|
||||
bounce_feedback = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_bounce_feedback(p_env);
|
||||
energy = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_energy(p_env);
|
||||
normal_bias = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_normal_bias(p_env);
|
||||
probe_bias = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_probe_bias(p_env);
|
||||
reads_sky = RendererSceneRenderRD::get_singleton()->environment_get_sdfgi_read_sky_light(p_env);
|
||||
|
||||
int32_t drag_margin = (cascade_size / SDFGI::PROBE_DIVISOR) / 2;
|
||||
|
||||
|
@ -1268,7 +1268,7 @@ void GI::SDFGI::update_light() {
|
|||
RD::get_singleton()->draw_command_end_label();
|
||||
}
|
||||
|
||||
void GI::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, SkyRD::Sky *p_sky) {
|
||||
void GI::SDFGI::update_probes(RID p_env, SkyRD::Sky *p_sky) {
|
||||
RD::get_singleton()->draw_command_begin_label("SDFGI Update Probes");
|
||||
|
||||
SDFGIShader::IntegratePushConstant push_constant;
|
||||
|
@ -1284,29 +1284,29 @@ void GI::SDFGI::update_probes(RendererSceneEnvironmentRD *p_env, SkyRD::Sky *p_s
|
|||
push_constant.ray_bias = probe_bias;
|
||||
push_constant.image_size[0] = probe_axis_count * probe_axis_count;
|
||||
push_constant.image_size[1] = probe_axis_count;
|
||||
push_constant.store_ambient_texture = p_env->volumetric_fog_enabled;
|
||||
push_constant.store_ambient_texture = RendererSceneRenderRD::get_singleton()->environment_get_volumetric_fog_enabled(p_env);
|
||||
|
||||
RID sky_uniform_set = gi->sdfgi_shader.integrate_default_sky_uniform_set;
|
||||
push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_DISABLED;
|
||||
push_constant.y_mult = y_mult;
|
||||
|
||||
if (reads_sky && p_env) {
|
||||
push_constant.sky_energy = p_env->bg_energy;
|
||||
if (reads_sky && p_env.is_valid()) {
|
||||
push_constant.sky_energy = RendererSceneRenderRD::get_singleton()->environment_get_bg_energy(p_env);
|
||||
|
||||
if (p_env->background == RS::ENV_BG_CLEAR_COLOR) {
|
||||
if (RendererSceneRenderRD::get_singleton()->environment_get_background(p_env) == RS::ENV_BG_CLEAR_COLOR) {
|
||||
push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR;
|
||||
Color c = RSG::texture_storage->get_default_clear_color().srgb_to_linear();
|
||||
push_constant.sky_color[0] = c.r;
|
||||
push_constant.sky_color[1] = c.g;
|
||||
push_constant.sky_color[2] = c.b;
|
||||
} else if (p_env->background == RS::ENV_BG_COLOR) {
|
||||
} else if (RendererSceneRenderRD::get_singleton()->environment_get_background(p_env) == RS::ENV_BG_COLOR) {
|
||||
push_constant.sky_mode = SDFGIShader::IntegratePushConstant::SKY_MODE_COLOR;
|
||||
Color c = p_env->bg_color;
|
||||
Color c = RendererSceneRenderRD::get_singleton()->environment_get_bg_color(p_env);
|
||||
push_constant.sky_color[0] = c.r;
|
||||
push_constant.sky_color[1] = c.g;
|
||||
push_constant.sky_color[2] = c.b;
|
||||
|
||||
} else if (p_env->background == RS::ENV_BG_SKY) {
|
||||
} else if (RendererSceneRenderRD::get_singleton()->environment_get_background(p_env) == RS::ENV_BG_SKY) {
|
||||
if (p_sky && p_sky->radiance.is_valid()) {
|
||||
if (integrate_sky_uniform_set.is_null() || !RD::get_singleton()->uniform_set_is_valid(integrate_sky_uniform_set)) {
|
||||
Vector<RD::Uniform> uniforms;
|
||||
|
@ -3477,7 +3477,7 @@ void GI::free() {
|
|||
}
|
||||
}
|
||||
|
||||
GI::SDFGI *GI::create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size) {
|
||||
GI::SDFGI *GI::create_sdfgi(RID p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size) {
|
||||
SDFGI *sdfgi = memnew(SDFGI);
|
||||
|
||||
sdfgi->create(p_env, p_world_position, p_requested_history_size, this);
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include "servers/rendering/environment/renderer_gi.h"
|
||||
#include "servers/rendering/renderer_compositor.h"
|
||||
#include "servers/rendering/renderer_rd/environment/sky.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/gi.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/sdfgi_debug_probes.glsl.gen.h"
|
||||
|
@ -614,11 +613,11 @@ public:
|
|||
int32_t cascade_dynamic_light_count[SDFGI::MAX_CASCADES]; //used dynamically
|
||||
RID integrate_sky_uniform_set;
|
||||
|
||||
void create(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, GI *p_gi);
|
||||
void create(RID p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size, GI *p_gi);
|
||||
void erase();
|
||||
void update(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position);
|
||||
void update(RID p_env, const Vector3 &p_world_position);
|
||||
void update_light();
|
||||
void update_probes(RendererSceneEnvironmentRD *p_env, RendererRD::SkyRD::Sky *p_sky);
|
||||
void update_probes(RID p_env, RendererRD::SkyRD::Sky *p_sky);
|
||||
void store_probes();
|
||||
int get_pending_region_data(int p_region, Vector3i &r_local_offset, Vector3i &r_local_size, AABB &r_bounds) const;
|
||||
void update_cascades();
|
||||
|
@ -772,7 +771,7 @@ public:
|
|||
void init(RendererRD::SkyRD *p_sky);
|
||||
void free();
|
||||
|
||||
SDFGI *create_sdfgi(RendererSceneEnvironmentRD *p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size);
|
||||
SDFGI *create_sdfgi(RID p_env, const Vector3 &p_world_position, uint32_t p_requested_history_size);
|
||||
|
||||
void setup_voxel_gi_instances(RID p_render_buffers, const Transform3D &p_transform, const PagedArray<RID> &p_voxel_gi_instances, uint32_t &r_voxel_gi_instances_used, RendererSceneRenderRD *p_scene_render);
|
||||
void process_gi(RID p_render_buffers, const RID *p_normal_roughness_slices, RID p_voxel_gi_buffer, const RID *p_vrs_slices, RID p_environment, uint32_t p_view_count, const Projection *p_projections, const Vector3 *p_eye_offsets, const Transform3D &p_cam_transform, const PagedArray<RID> &p_voxel_gi_instances, RendererSceneRenderRD *p_scene_render);
|
||||
|
|
|
@ -1106,20 +1106,20 @@ SkyRD::~SkyRD() {
|
|||
RD::get_singleton()->free(index_buffer); //array gets freed as dependency
|
||||
}
|
||||
|
||||
void SkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size, RendererSceneRenderRD *p_scene_render) {
|
||||
void SkyRD::setup(RID p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size, RendererSceneRenderRD *p_scene_render) {
|
||||
RendererRD::LightStorage *light_storage = RendererRD::LightStorage::get_singleton();
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
RID sky_material;
|
||||
|
||||
SkyShaderData *shader_data = nullptr;
|
||||
|
||||
if (sky) {
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = static_cast<SkyMaterialData *>(material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY));
|
||||
|
@ -1305,27 +1305,27 @@ void SkyRD::setup(RendererSceneEnvironmentRD *p_env, RID p_render_buffers, const
|
|||
}
|
||||
|
||||
sky_scene_state.ubo.z_far = p_projection.get_z_far();
|
||||
sky_scene_state.ubo.fog_enabled = p_env->fog_enabled;
|
||||
sky_scene_state.ubo.fog_density = p_env->fog_density;
|
||||
sky_scene_state.ubo.fog_aerial_perspective = p_env->fog_aerial_perspective;
|
||||
Color fog_color = p_env->fog_light_color.srgb_to_linear();
|
||||
float fog_energy = p_env->fog_light_energy;
|
||||
sky_scene_state.ubo.fog_enabled = RendererSceneRenderRD::get_singleton()->environment_get_fog_enabled(p_env);
|
||||
sky_scene_state.ubo.fog_density = RendererSceneRenderRD::get_singleton()->environment_get_fog_density(p_env);
|
||||
sky_scene_state.ubo.fog_aerial_perspective = RendererSceneRenderRD::get_singleton()->environment_get_fog_aerial_perspective(p_env);
|
||||
Color fog_color = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_color(p_env).srgb_to_linear();
|
||||
float fog_energy = RendererSceneRenderRD::get_singleton()->environment_get_fog_light_energy(p_env);
|
||||
sky_scene_state.ubo.fog_light_color[0] = fog_color.r * fog_energy;
|
||||
sky_scene_state.ubo.fog_light_color[1] = fog_color.g * fog_energy;
|
||||
sky_scene_state.ubo.fog_light_color[2] = fog_color.b * fog_energy;
|
||||
sky_scene_state.ubo.fog_sun_scatter = p_env->fog_sun_scatter;
|
||||
sky_scene_state.ubo.fog_sun_scatter = RendererSceneRenderRD::get_singleton()->environment_get_fog_sun_scatter(p_env);
|
||||
|
||||
RD::get_singleton()->buffer_update(sky_scene_state.uniform_buffer, 0, sizeof(SkySceneState::UBO), &sky_scene_state.ubo);
|
||||
}
|
||||
|
||||
void SkyRD::update(RendererSceneEnvironmentRD *p_env, const Projection &p_projection, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
void SkyRD::update(RID p_env, const Projection &p_projection, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
||||
RID sky_material = sky_get_material(p_env->sky);
|
||||
RID sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
|
||||
|
@ -1347,7 +1347,7 @@ void SkyRD::update(RendererSceneEnvironmentRD *p_env, const Projection &p_projec
|
|||
|
||||
ERR_FAIL_COND(!shader_data);
|
||||
|
||||
float multiplier = p_env->bg_energy;
|
||||
float multiplier = RendererSceneRenderRD::get_singleton()->environment_get_bg_energy(p_env);
|
||||
|
||||
bool update_single_frame = sky->mode == RS::SKY_MODE_REALTIME || sky->mode == RS::SKY_MODE_QUALITY;
|
||||
RS::SkyMode sky_mode = sky->mode;
|
||||
|
@ -1487,23 +1487,23 @@ void SkyRD::update(RendererSceneEnvironmentRD *p_env, const Projection &p_projec
|
|||
}
|
||||
}
|
||||
|
||||
void SkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_continue_color, bool p_can_continue_depth, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time) {
|
||||
void SkyRD::draw(RID p_env, bool p_can_continue_color, bool p_can_continue_depth, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
ERR_FAIL_COND(p_view_count > RendererSceneRender::MAX_RENDER_VIEWS);
|
||||
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
RID sky_material;
|
||||
|
||||
RS::EnvironmentBG background = p_env->background;
|
||||
RS::EnvironmentBG background = RendererSceneRenderRD::get_singleton()->environment_get_background(p_env);
|
||||
|
||||
if (!(background == RS::ENV_BG_CLEAR_COLOR || background == RS::ENV_BG_COLOR) || sky) {
|
||||
ERR_FAIL_COND(!sky);
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = static_cast<SkyMaterialData *>(material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY));
|
||||
|
@ -1529,11 +1529,11 @@ void SkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_continue_color, b
|
|||
|
||||
ERR_FAIL_COND(!shader_data);
|
||||
|
||||
Basis sky_transform = p_env->sky_orientation;
|
||||
Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env);
|
||||
sky_transform.invert();
|
||||
|
||||
float multiplier = p_env->bg_energy;
|
||||
float custom_fov = p_env->sky_custom_fov;
|
||||
float multiplier = RendererSceneRenderRD::get_singleton()->environment_get_bg_energy(p_env);
|
||||
float custom_fov = RendererSceneRenderRD::get_singleton()->environment_get_sky_custom_fov(p_env);
|
||||
|
||||
// Camera
|
||||
Projection camera;
|
||||
|
@ -1594,20 +1594,20 @@ void SkyRD::draw(RendererSceneEnvironmentRD *p_env, bool p_can_continue_color, b
|
|||
RD::get_singleton()->draw_list_end();
|
||||
}
|
||||
|
||||
void SkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
void SkyRD::update_res_buffers(RID p_env, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
ERR_FAIL_COND(p_view_count > RendererSceneRender::MAX_RENDER_VIEWS);
|
||||
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
ERR_FAIL_COND(!sky);
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
RID sky_material;
|
||||
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = static_cast<SkyMaterialData *>(material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY));
|
||||
|
@ -1627,11 +1627,11 @@ void SkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, uint32_t p_vie
|
|||
|
||||
ERR_FAIL_COND(!shader_data);
|
||||
|
||||
Basis sky_transform = p_env->sky_orientation;
|
||||
Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env);
|
||||
sky_transform.invert();
|
||||
|
||||
float multiplier = p_env->bg_energy;
|
||||
float custom_fov = p_env->sky_custom_fov;
|
||||
float multiplier = RendererSceneRenderRD::get_singleton()->environment_get_bg_energy(p_env);
|
||||
float custom_fov = RendererSceneRenderRD::get_singleton()->environment_get_sky_custom_fov(p_env);
|
||||
|
||||
// Camera
|
||||
Projection camera;
|
||||
|
@ -1679,23 +1679,23 @@ void SkyRD::update_res_buffers(RendererSceneEnvironmentRD *p_env, uint32_t p_vie
|
|||
}
|
||||
}
|
||||
|
||||
void SkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironmentRD *p_env, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
void SkyRD::draw(RD::DrawListID p_draw_list, RID p_env, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier) {
|
||||
RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton();
|
||||
ERR_FAIL_COND(!p_env);
|
||||
ERR_FAIL_COND(p_env.is_null());
|
||||
|
||||
ERR_FAIL_COND(p_view_count == 0);
|
||||
ERR_FAIL_COND(p_view_count > RendererSceneRender::MAX_RENDER_VIEWS);
|
||||
|
||||
Sky *sky = get_sky(p_env->sky);
|
||||
Sky *sky = get_sky(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
SkyMaterialData *material = nullptr;
|
||||
RID sky_material;
|
||||
|
||||
RS::EnvironmentBG background = p_env->background;
|
||||
RS::EnvironmentBG background = RendererSceneRenderRD::get_singleton()->environment_get_background(p_env);
|
||||
|
||||
if (!(background == RS::ENV_BG_CLEAR_COLOR || background == RS::ENV_BG_COLOR) || sky) {
|
||||
ERR_FAIL_COND(!sky);
|
||||
sky_material = sky_get_material(p_env->sky);
|
||||
sky_material = sky_get_material(RendererSceneRenderRD::get_singleton()->environment_get_sky(p_env));
|
||||
|
||||
if (sky_material.is_valid()) {
|
||||
material = static_cast<SkyMaterialData *>(material_storage->material_get_data(sky_material, RendererRD::SHADER_TYPE_SKY));
|
||||
|
@ -1721,11 +1721,11 @@ void SkyRD::draw(RD::DrawListID p_draw_list, RendererSceneEnvironmentRD *p_env,
|
|||
|
||||
ERR_FAIL_COND(!shader_data);
|
||||
|
||||
Basis sky_transform = p_env->sky_orientation;
|
||||
Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env);
|
||||
sky_transform.invert();
|
||||
|
||||
float multiplier = p_env->bg_energy;
|
||||
float custom_fov = p_env->sky_custom_fov;
|
||||
float multiplier = RendererSceneRenderRD::get_singleton()->environment_get_bg_energy(p_env);
|
||||
float custom_fov = RendererSceneRenderRD::get_singleton()->environment_get_sky_custom_fov(p_env);
|
||||
|
||||
// Camera
|
||||
Projection camera;
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include "core/templates/rid_owner.h"
|
||||
#include "servers/rendering/renderer_compositor.h"
|
||||
#include "servers/rendering/renderer_rd/pipeline_cache_rd.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
#include "servers/rendering/renderer_rd/shaders/environment/sky.glsl.gen.h"
|
||||
#include "servers/rendering/renderer_rd/storage_rd/material_storage.h"
|
||||
#include "servers/rendering/renderer_scene_render.h"
|
||||
|
@ -297,11 +296,11 @@ public:
|
|||
void set_texture_format(RD::DataFormat p_texture_format);
|
||||
~SkyRD();
|
||||
|
||||
void setup(RendererSceneEnvironmentRD *p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size, RendererSceneRenderRD *p_scene_render);
|
||||
void update(RendererSceneEnvironmentRD *p_env, const Projection &p_projection, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
void draw(RendererSceneEnvironmentRD *p_env, bool p_can_continue_color, bool p_can_continue_depth, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time); // only called by clustered renderer
|
||||
void update_res_buffers(RendererSceneEnvironmentRD *p_env, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
void draw(RD::DrawListID p_draw_list, RendererSceneEnvironmentRD *p_env, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
void setup(RID p_env, RID p_render_buffers, const PagedArray<RID> &p_lights, const Projection &p_projection, const Transform3D &p_transform, const Size2i p_screen_size, RendererSceneRenderRD *p_scene_render);
|
||||
void update(RID p_env, const Projection &p_projection, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
void draw(RID p_env, bool p_can_continue_color, bool p_can_continue_depth, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time); // only called by clustered renderer
|
||||
void update_res_buffers(RID p_env, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
void draw(RD::DrawListID p_draw_list, RID p_env, RID p_fb, uint32_t p_view_count, const Projection *p_projections, const Transform3D &p_transform, double p_time, float p_luminance_multiplier = 1.0);
|
||||
|
||||
void invalidate_sky(Sky *p_sky);
|
||||
void update_dirty_skys();
|
||||
|
|
|
@ -923,7 +923,7 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
|
|||
scene_state.ubo.use_ambient_cubemap = false;
|
||||
} else {
|
||||
float energy = environment_get_ambient_light_energy(p_render_data->environment);
|
||||
Color color = environment_get_ambient_light_color(p_render_data->environment);
|
||||
Color color = environment_get_ambient_light(p_render_data->environment);
|
||||
color = color.srgb_to_linear();
|
||||
scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;
|
||||
scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;
|
||||
|
@ -945,16 +945,16 @@ void RenderForwardClustered::_setup_environment(const RenderDataRD *p_render_dat
|
|||
scene_state.ubo.use_reflection_cubemap = false;
|
||||
}
|
||||
|
||||
scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_light_affect = environment_get_ssao_light_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment);
|
||||
uint32_t ss_flags = 0;
|
||||
if (p_opaque_render_buffers) {
|
||||
ss_flags |= environment_is_ssao_enabled(p_render_data->environment) ? 1 : 0;
|
||||
ss_flags |= environment_is_ssil_enabled(p_render_data->environment) ? 2 : 0;
|
||||
ss_flags |= environment_get_ssao_enabled(p_render_data->environment) ? 1 : 0;
|
||||
ss_flags |= environment_get_ssil_enabled(p_render_data->environment) ? 2 : 0;
|
||||
}
|
||||
scene_state.ubo.ss_effects_flags = ss_flags;
|
||||
|
||||
scene_state.ubo.fog_enabled = environment_is_fog_enabled(p_render_data->environment);
|
||||
scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment);
|
||||
scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment);
|
||||
scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment);
|
||||
scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment);
|
||||
|
@ -1410,7 +1410,6 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
if (p_render_data->render_buffers.is_valid()) {
|
||||
render_buffer = static_cast<RenderBufferDataForwardClustered *>(render_buffers_get_data(p_render_data->render_buffers));
|
||||
}
|
||||
RendererSceneEnvironmentRD *env = get_environment(p_render_data->environment);
|
||||
static const int texture_multisamples[RS::VIEWPORT_MSAA_MAX] = { 1, 2, 4, 8 };
|
||||
|
||||
//first of all, make a new render pass
|
||||
|
@ -1435,7 +1434,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
bool using_sdfgi = false;
|
||||
bool using_voxelgi = false;
|
||||
bool reverse_cull = false;
|
||||
bool using_ssil = p_render_data->environment.is_valid() && environment_is_ssil_enabled(p_render_data->environment);
|
||||
bool using_ssil = p_render_data->environment.is_valid() && environment_get_ssil_enabled(p_render_data->environment);
|
||||
|
||||
if (render_buffer) {
|
||||
screen_size.x = render_buffer->width;
|
||||
|
@ -1449,21 +1448,21 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
using_voxelgi = true;
|
||||
}
|
||||
|
||||
if (!p_render_data->environment.is_valid() && using_voxelgi) {
|
||||
if (p_render_data->environment.is_null() && using_voxelgi) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI;
|
||||
} else if (p_render_data->environment.is_valid() && (environment_is_ssr_enabled(p_render_data->environment) || environment_is_sdfgi_enabled(p_render_data->environment) || using_voxelgi)) {
|
||||
if (environment_is_sdfgi_enabled(p_render_data->environment)) {
|
||||
} else if (p_render_data->environment.is_valid() && (environment_get_ssr_enabled(p_render_data->environment) || environment_get_sdfgi_enabled(p_render_data->environment) || using_voxelgi)) {
|
||||
if (environment_get_sdfgi_enabled(p_render_data->environment)) {
|
||||
depth_pass_mode = using_voxelgi ? PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI : PASS_MODE_DEPTH_NORMAL_ROUGHNESS; // also voxelgi
|
||||
using_sdfgi = true;
|
||||
} else {
|
||||
depth_pass_mode = using_voxelgi ? PASS_MODE_DEPTH_NORMAL_ROUGHNESS_VOXEL_GI : PASS_MODE_DEPTH_NORMAL_ROUGHNESS;
|
||||
}
|
||||
if (environment_is_ssr_enabled(p_render_data->environment)) {
|
||||
if (environment_get_ssr_enabled(p_render_data->environment)) {
|
||||
using_separate_specular = true;
|
||||
using_ssr = true;
|
||||
color_pass_flags |= COLOR_PASS_FLAG_SEPARATE_SPECULAR;
|
||||
}
|
||||
} else if (p_render_data->environment.is_valid() && (environment_is_ssao_enabled(p_render_data->environment) || using_ssil || get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER)) {
|
||||
} else if (p_render_data->environment.is_valid() && (environment_get_ssao_enabled(p_render_data->environment) || using_ssil || get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_NORMAL_BUFFER)) {
|
||||
depth_pass_mode = PASS_MODE_DEPTH_NORMAL_ROUGHNESS;
|
||||
}
|
||||
|
||||
|
@ -1504,7 +1503,6 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
|
||||
if (RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) {
|
||||
p_render_data->environment = RID(); //no environment on interiors
|
||||
env = nullptr;
|
||||
}
|
||||
|
||||
reverse_cull = true; // for some reason our views are inverted
|
||||
|
@ -1556,7 +1554,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
clear_color.r *= bg_energy;
|
||||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
if ((p_render_data->render_buffers.is_valid() && render_buffers_has_volumetric_fog(p_render_data->render_buffers)) || environment_is_fog_enabled(p_render_data->environment)) {
|
||||
if ((p_render_data->render_buffers.is_valid() && render_buffers_has_volumetric_fog(p_render_data->render_buffers)) || environment_get_fog_enabled(p_render_data->environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));
|
||||
}
|
||||
|
@ -1566,7 +1564,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
clear_color.r *= bg_energy;
|
||||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
if ((p_render_data->render_buffers.is_valid() && render_buffers_has_volumetric_fog(p_render_data->render_buffers)) || environment_is_fog_enabled(p_render_data->environment)) {
|
||||
if ((p_render_data->render_buffers.is_valid() && render_buffers_has_volumetric_fog(p_render_data->render_buffers)) || environment_get_fog_enabled(p_render_data->environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));
|
||||
}
|
||||
|
@ -1596,11 +1594,11 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
projection = correction * p_render_data->cam_projection;
|
||||
}
|
||||
|
||||
sky.setup(env, p_render_data->render_buffers, *p_render_data->lights, projection, p_render_data->cam_transform, screen_size, this);
|
||||
sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, projection, p_render_data->cam_transform, screen_size, this);
|
||||
|
||||
RID sky_rid = env->sky;
|
||||
RID sky_rid = environment_get_sky(p_render_data->environment);
|
||||
if (sky_rid.is_valid()) {
|
||||
sky.update(env, projection, p_render_data->cam_transform, time);
|
||||
sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time);
|
||||
radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid);
|
||||
} else {
|
||||
// do not try to draw sky if invalid
|
||||
|
@ -1616,7 +1614,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
bool debug_sdfgi_probes = get_debug_draw_mode() == RS::VIEWPORT_DEBUG_DRAW_SDFGI_PROBES;
|
||||
bool depth_pre_pass = bool(GLOBAL_GET("rendering/driver/depth_prepass/enable")) && depth_framebuffer.is_valid();
|
||||
|
||||
bool using_ssao = depth_pre_pass && p_render_data->render_buffers.is_valid() && p_render_data->environment.is_valid() && environment_is_ssao_enabled(p_render_data->environment);
|
||||
bool using_ssao = depth_pre_pass && p_render_data->render_buffers.is_valid() && p_render_data->environment.is_valid() && environment_get_ssao_enabled(p_render_data->environment);
|
||||
bool continue_depth = false;
|
||||
if (depth_pre_pass) { //depth pre pass
|
||||
|
||||
|
@ -1755,9 +1753,9 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co
|
|||
Projection correction;
|
||||
correction.set_depth_correction(true);
|
||||
Projection projection = correction * p_render_data->cam_projection;
|
||||
sky.draw(env, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->cam_transform, time);
|
||||
sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, 1, &projection, p_render_data->cam_transform, time);
|
||||
} else {
|
||||
sky.draw(env, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time);
|
||||
sky.draw(p_render_data->environment, can_continue_color, can_continue_depth, color_only_framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time);
|
||||
}
|
||||
RD::get_singleton()->draw_command_end_label();
|
||||
}
|
||||
|
|
|
@ -497,7 +497,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
if (p_render_data->render_buffers.is_valid()) {
|
||||
render_buffer = static_cast<RenderBufferDataForwardMobile *>(render_buffers_get_data(p_render_data->render_buffers));
|
||||
}
|
||||
RendererSceneEnvironmentRD *env = get_environment(p_render_data->environment);
|
||||
|
||||
RENDER_TIMESTAMP("Setup 3D Scene");
|
||||
|
||||
|
@ -540,7 +539,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
if (render_buffer->color_fbs[FB_CONFIG_FOUR_SUBPASSES].is_null()) {
|
||||
// can't do blit subpass
|
||||
using_subpass_post_process = false;
|
||||
} else if (env && (env->glow_enabled || env->auto_exposure || camera_effects_uses_dof(p_render_data->camera_effects))) {
|
||||
} else if (p_render_data->environment.is_valid() && (environment_get_glow_enabled(p_render_data->environment) || environment_get_auto_exposure(p_render_data->environment) || camera_effects_uses_dof(p_render_data->camera_effects))) {
|
||||
// can't do blit subpass
|
||||
using_subpass_post_process = false;
|
||||
}
|
||||
|
@ -570,7 +569,6 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
|
||||
if (RendererRD::LightStorage::get_singleton()->reflection_probe_is_interior(reflection_probe_instance_get_probe(p_render_data->reflection_probe))) {
|
||||
p_render_data->environment = RID(); //no environment on interiors
|
||||
env = nullptr;
|
||||
}
|
||||
|
||||
reverse_cull = true;
|
||||
|
@ -612,7 +610,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
/*
|
||||
if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {
|
||||
if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_get_fog_enabled(p_render_data->environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));
|
||||
}
|
||||
|
@ -624,7 +622,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
clear_color.g *= bg_energy;
|
||||
clear_color.b *= bg_energy;
|
||||
/*
|
||||
if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_is_fog_enabled(p_render_data->environment)) {
|
||||
if (render_buffers_has_volumetric_fog(p_render_data->render_buffers) || environment_get_fog_enabled(p_render_data->environment)) {
|
||||
draw_sky_fog_only = true;
|
||||
RendererRD::MaterialStorage::get_singleton()->material_set_param(sky.sky_scene_state.fog_material, "clear_color", Variant(clear_color.srgb_to_linear()));
|
||||
}
|
||||
|
@ -655,11 +653,11 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
projection = correction * p_render_data->cam_projection;
|
||||
}
|
||||
|
||||
sky.setup(env, p_render_data->render_buffers, *p_render_data->lights, projection, p_render_data->cam_transform, screen_size, this);
|
||||
sky.setup(p_render_data->environment, p_render_data->render_buffers, *p_render_data->lights, projection, p_render_data->cam_transform, screen_size, this);
|
||||
|
||||
RID sky_rid = env->sky;
|
||||
RID sky_rid = environment_get_sky(p_render_data->environment);
|
||||
if (sky_rid.is_valid()) {
|
||||
sky.update(env, projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
sky.update(p_render_data->environment, projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
radiance_texture = sky.sky_get_radiance_texture_rd(sky_rid);
|
||||
} else {
|
||||
// do not try to draw sky if invalid
|
||||
|
@ -683,9 +681,9 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
Projection correction;
|
||||
correction.set_depth_correction(true);
|
||||
Projection projection = correction * p_render_data->cam_projection;
|
||||
sky.update_res_buffers(env, 1, &projection, p_render_data->cam_transform, time);
|
||||
sky.update_res_buffers(p_render_data->environment, 1, &projection, p_render_data->cam_transform, time);
|
||||
} else {
|
||||
sky.update_res_buffers(env, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time);
|
||||
sky.update_res_buffers(p_render_data->environment, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time);
|
||||
}
|
||||
|
||||
RD::get_singleton()->draw_command_end_label(); // Setup Sky resolution buffers
|
||||
|
@ -707,7 +705,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_DIRECTIONAL_LIGHTS;
|
||||
}
|
||||
|
||||
if (!is_environment(p_render_data->environment) || environment_is_fog_enabled(p_render_data->environment)) {
|
||||
if (!is_environment(p_render_data->environment) || environment_get_fog_enabled(p_render_data->environment)) {
|
||||
spec_constant_base_flags |= 1 << SPEC_CONSTANT_DISABLE_FOG;
|
||||
}
|
||||
}
|
||||
|
@ -782,9 +780,9 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color
|
|||
Projection correction;
|
||||
correction.set_depth_correction(true);
|
||||
Projection projection = correction * p_render_data->cam_projection;
|
||||
sky.draw(draw_list, env, framebuffer, 1, &projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
sky.draw(draw_list, p_render_data->environment, framebuffer, 1, &projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
} else {
|
||||
sky.draw(draw_list, env, framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
sky.draw(draw_list, p_render_data->environment, framebuffer, p_render_data->view_count, p_render_data->view_projection, p_render_data->cam_transform, time, _render_buffers_get_luminance_multiplier());
|
||||
}
|
||||
|
||||
RD::get_singleton()->draw_command_end_label(); // Draw Sky Subpass
|
||||
|
@ -1663,7 +1661,7 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
|
|||
scene_state.ubo.use_ambient_cubemap = false;
|
||||
} else {
|
||||
float energy = environment_get_ambient_light_energy(p_render_data->environment);
|
||||
Color color = environment_get_ambient_light_color(p_render_data->environment);
|
||||
Color color = environment_get_ambient_light(p_render_data->environment);
|
||||
color = color.srgb_to_linear();
|
||||
scene_state.ubo.ambient_light_color_energy[0] = color.r * energy;
|
||||
scene_state.ubo.ambient_light_color_energy[1] = color.g * energy;
|
||||
|
@ -1685,11 +1683,11 @@ void RenderForwardMobile::_setup_environment(const RenderDataRD *p_render_data,
|
|||
scene_state.ubo.use_reflection_cubemap = false;
|
||||
}
|
||||
|
||||
scene_state.ubo.ssao_enabled = p_opaque_render_buffers && environment_is_ssao_enabled(p_render_data->environment);
|
||||
scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_light_affect = environment_get_ssao_light_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_enabled = p_opaque_render_buffers && environment_get_ssao_enabled(p_render_data->environment);
|
||||
scene_state.ubo.ssao_ao_affect = environment_get_ssao_ao_channel_affect(p_render_data->environment);
|
||||
scene_state.ubo.ssao_light_affect = environment_get_ssao_direct_light_affect(p_render_data->environment);
|
||||
|
||||
scene_state.ubo.fog_enabled = environment_is_fog_enabled(p_render_data->environment);
|
||||
scene_state.ubo.fog_enabled = environment_get_fog_enabled(p_render_data->environment);
|
||||
scene_state.ubo.fog_density = environment_get_fog_density(p_render_data->environment);
|
||||
scene_state.ubo.fog_height = environment_get_fog_height(p_render_data->environment);
|
||||
scene_state.ubo.fog_height_density = environment_get_fog_height_density(p_render_data->environment);
|
||||
|
|
|
@ -1,130 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* renderer_scene_environment_rd.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
|
||||
uint64_t RendererSceneEnvironmentRD::auto_exposure_counter = 2;
|
||||
|
||||
void RendererSceneEnvironmentRD::set_ambient_light(const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
ambient_light = p_color;
|
||||
ambient_source = p_ambient;
|
||||
ambient_light_energy = p_energy;
|
||||
ambient_sky_contribution = p_sky_contribution;
|
||||
reflection_source = p_reflection_source;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_tonemap(RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) {
|
||||
exposure = p_exposure;
|
||||
tone_mapper = p_tone_mapper;
|
||||
if (!auto_exposure && p_auto_exposure) {
|
||||
auto_exposure_version = ++auto_exposure_counter;
|
||||
}
|
||||
auto_exposure = p_auto_exposure;
|
||||
white = p_white;
|
||||
min_luminance = p_min_luminance;
|
||||
max_luminance = p_max_luminance;
|
||||
auto_exp_speed = p_auto_exp_speed;
|
||||
auto_exp_scale = p_auto_exp_scale;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_glow(bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
|
||||
ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");
|
||||
glow_enabled = p_enable;
|
||||
glow_levels = p_levels;
|
||||
glow_intensity = p_intensity;
|
||||
glow_strength = p_strength;
|
||||
glow_mix = p_mix;
|
||||
glow_bloom = p_bloom_threshold;
|
||||
glow_blend_mode = p_blend_mode;
|
||||
glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
|
||||
glow_hdr_bleed_scale = p_hdr_bleed_scale;
|
||||
glow_hdr_luminance_cap = p_hdr_luminance_cap;
|
||||
glow_map_strength = p_glow_map_strength;
|
||||
glow_map = p_glow_map;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_sdfgi(bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
sdfgi_enabled = p_enable;
|
||||
sdfgi_cascades = p_cascades;
|
||||
sdfgi_min_cell_size = p_min_cell_size;
|
||||
sdfgi_use_occlusion = p_use_occlusion;
|
||||
sdfgi_bounce_feedback = p_bounce_feedback;
|
||||
sdfgi_read_sky_light = p_read_sky;
|
||||
sdfgi_energy = p_energy;
|
||||
sdfgi_normal_bias = p_normal_bias;
|
||||
sdfgi_probe_bias = p_probe_bias;
|
||||
sdfgi_y_scale = p_y_scale;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_fog(bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective) {
|
||||
fog_enabled = p_enable;
|
||||
fog_light_color = p_light_color;
|
||||
fog_light_energy = p_light_energy;
|
||||
fog_sun_scatter = p_sun_scatter;
|
||||
fog_density = p_density;
|
||||
fog_height = p_height;
|
||||
fog_height_density = p_height_density;
|
||||
fog_aerial_perspective = p_fog_aerial_perspective;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_volumetric_fog(bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) {
|
||||
volumetric_fog_enabled = p_enable;
|
||||
volumetric_fog_density = p_density;
|
||||
volumetric_fog_scattering = p_albedo;
|
||||
volumetric_fog_emission = p_emission;
|
||||
volumetric_fog_emission_energy = p_emission_energy;
|
||||
volumetric_fog_anisotropy = p_anisotropy,
|
||||
volumetric_fog_length = p_length;
|
||||
volumetric_fog_detail_spread = p_detail_spread;
|
||||
volumetric_fog_gi_inject = p_gi_inject;
|
||||
volumetric_fog_temporal_reprojection = p_temporal_reprojection;
|
||||
volumetric_fog_temporal_reprojection_amount = p_temporal_reprojection_amount;
|
||||
volumetric_fog_ambient_inject = p_ambient_inject;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_ssr(bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
|
||||
ssr_enabled = p_enable;
|
||||
ssr_max_steps = p_max_steps;
|
||||
ssr_fade_in = p_fade_int;
|
||||
ssr_fade_out = p_fade_out;
|
||||
ssr_depth_tolerance = p_depth_tolerance;
|
||||
}
|
||||
|
||||
void RendererSceneEnvironmentRD::set_ssao(bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
|
||||
ssao_enabled = p_enable;
|
||||
ssao_radius = p_radius;
|
||||
ssao_intensity = p_intensity;
|
||||
ssao_power = p_power;
|
||||
ssao_detail = p_detail;
|
||||
ssao_horizon = p_horizon;
|
||||
ssao_sharpness = p_sharpness;
|
||||
ssao_direct_light_affect = p_light_affect;
|
||||
ssao_ao_channel_affect = p_ao_channel_affect;
|
||||
}
|
|
@ -1,167 +0,0 @@
|
|||
/*************************************************************************/
|
||||
/* renderer_scene_environment_rd.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef RENDERER_SCENE_ENVIRONMENT_RD_H
|
||||
#define RENDERER_SCENE_ENVIRONMENT_RD_H
|
||||
|
||||
#include "servers/rendering/renderer_scene_render.h"
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
|
||||
class RendererSceneEnvironmentRD {
|
||||
private:
|
||||
static uint64_t auto_exposure_counter;
|
||||
|
||||
public:
|
||||
// BG
|
||||
RS::EnvironmentBG background = RS::ENV_BG_CLEAR_COLOR;
|
||||
RID sky;
|
||||
float sky_custom_fov = 0.0;
|
||||
Basis sky_orientation;
|
||||
Color bg_color;
|
||||
float bg_energy = 1.0;
|
||||
int canvas_max_layer = 0;
|
||||
RS::EnvironmentAmbientSource ambient_source = RS::ENV_AMBIENT_SOURCE_BG;
|
||||
Color ambient_light;
|
||||
float ambient_light_energy = 1.0;
|
||||
float ambient_sky_contribution = 1.0;
|
||||
RS::EnvironmentReflectionSource reflection_source = RS::ENV_REFLECTION_SOURCE_BG;
|
||||
|
||||
/// Tonemap
|
||||
|
||||
RS::EnvironmentToneMapper tone_mapper;
|
||||
float exposure = 1.0;
|
||||
float white = 1.0;
|
||||
bool auto_exposure = false;
|
||||
float min_luminance = 0.2;
|
||||
float max_luminance = 8.0;
|
||||
float auto_exp_speed = 0.2;
|
||||
float auto_exp_scale = 0.5;
|
||||
uint64_t auto_exposure_version = 0;
|
||||
|
||||
// Fog
|
||||
bool fog_enabled = false;
|
||||
Color fog_light_color = Color(0.5, 0.6, 0.7);
|
||||
float fog_light_energy = 1.0;
|
||||
float fog_sun_scatter = 0.0;
|
||||
float fog_density = 0.001;
|
||||
float fog_height = 0.0;
|
||||
float fog_height_density = 0.0; //can be negative to invert effect
|
||||
float fog_aerial_perspective = 0.0;
|
||||
|
||||
/// Volumetric Fog
|
||||
///
|
||||
bool volumetric_fog_enabled = false;
|
||||
float volumetric_fog_density = 0.01;
|
||||
Color volumetric_fog_scattering = Color(1, 1, 1);
|
||||
Color volumetric_fog_emission = Color(0, 0, 0);
|
||||
float volumetric_fog_emission_energy = 0.0;
|
||||
float volumetric_fog_anisotropy = 0.2;
|
||||
float volumetric_fog_length = 64.0;
|
||||
float volumetric_fog_detail_spread = 2.0;
|
||||
float volumetric_fog_gi_inject = 0.0;
|
||||
bool volumetric_fog_temporal_reprojection = true;
|
||||
float volumetric_fog_temporal_reprojection_amount = 0.9;
|
||||
float volumetric_fog_ambient_inject = 0.0;
|
||||
|
||||
/// Glow
|
||||
|
||||
bool glow_enabled = false;
|
||||
Vector<float> glow_levels;
|
||||
float glow_intensity = 0.8;
|
||||
float glow_strength = 1.0;
|
||||
float glow_bloom = 0.0;
|
||||
float glow_mix = 0.01;
|
||||
RS::EnvironmentGlowBlendMode glow_blend_mode = RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT;
|
||||
float glow_hdr_bleed_threshold = 1.0;
|
||||
float glow_hdr_luminance_cap = 12.0;
|
||||
float glow_hdr_bleed_scale = 2.0;
|
||||
float glow_map_strength = 0.0f;
|
||||
RID glow_map = RID();
|
||||
|
||||
/// SSAO
|
||||
|
||||
bool ssao_enabled = false;
|
||||
float ssao_radius = 1.0;
|
||||
float ssao_intensity = 2.0;
|
||||
float ssao_power = 1.5;
|
||||
float ssao_detail = 0.5;
|
||||
float ssao_horizon = 0.06;
|
||||
float ssao_sharpness = 0.98;
|
||||
float ssao_direct_light_affect = 0.0;
|
||||
float ssao_ao_channel_affect = 0.0;
|
||||
|
||||
/// SSR
|
||||
///
|
||||
bool ssr_enabled = false;
|
||||
int ssr_max_steps = 64;
|
||||
float ssr_fade_in = 0.15;
|
||||
float ssr_fade_out = 2.0;
|
||||
float ssr_depth_tolerance = 0.2;
|
||||
|
||||
/// SSIL
|
||||
///
|
||||
bool ssil_enabled = false;
|
||||
float ssil_radius = 5.0;
|
||||
float ssil_intensity = 1.0;
|
||||
float ssil_sharpness = 0.98;
|
||||
float ssil_normal_rejection = 1.0;
|
||||
|
||||
/// SDFGI
|
||||
bool sdfgi_enabled = false;
|
||||
int sdfgi_cascades = 4;
|
||||
float sdfgi_min_cell_size = 0.2;
|
||||
bool sdfgi_use_occlusion = false;
|
||||
float sdfgi_bounce_feedback = 0.5;
|
||||
bool sdfgi_read_sky_light = true;
|
||||
float sdfgi_energy = 1.0;
|
||||
float sdfgi_normal_bias = 1.1;
|
||||
float sdfgi_probe_bias = 1.1;
|
||||
RS::EnvironmentSDFGIYScale sdfgi_y_scale = RS::ENV_SDFGI_Y_SCALE_75_PERCENT;
|
||||
|
||||
/// Adjustments
|
||||
|
||||
bool adjustments_enabled = false;
|
||||
float adjustments_brightness = 1.0f;
|
||||
float adjustments_contrast = 1.0f;
|
||||
float adjustments_saturation = 1.0f;
|
||||
bool use_1d_color_correction = false;
|
||||
RID color_correction = RID();
|
||||
|
||||
void set_ambient_light(const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source);
|
||||
void set_tonemap(RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale);
|
||||
void set_glow(bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map);
|
||||
void set_sdfgi(bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias);
|
||||
void set_fog(bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective);
|
||||
void set_volumetric_fog(bool p_enable, float p_density, const Color &p_scatterin, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject);
|
||||
void set_ssr(bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance);
|
||||
void set_ssao(bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect);
|
||||
};
|
||||
|
||||
#endif // RENDERER_SCENE_ENVIRONMENT_RD_H
|
|
@ -51,9 +51,8 @@ void get_vogel_disk(float *r_kernel, int p_sample_count) {
|
|||
}
|
||||
|
||||
void RendererSceneRenderRD::sdfgi_update(RID p_render_buffers, RID p_environment, const Vector3 &p_world_position) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_environment);
|
||||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_buffers);
|
||||
bool needs_sdfgi = env && env->sdfgi_enabled;
|
||||
bool needs_sdfgi = p_environment.is_valid() && environment_get_sdfgi_enabled(p_environment);
|
||||
|
||||
if (!needs_sdfgi) {
|
||||
if (rb->sdfgi != nullptr) {
|
||||
|
@ -68,7 +67,7 @@ void RendererSceneRenderRD::sdfgi_update(RID p_render_buffers, RID p_environment
|
|||
static const uint32_t history_frames_to_converge[RS::ENV_SDFGI_CONVERGE_MAX] = { 5, 10, 15, 20, 25, 30 };
|
||||
uint32_t requested_history_size = history_frames_to_converge[gi.sdfgi_frames_to_converge];
|
||||
|
||||
if (rb->sdfgi && (rb->sdfgi->num_cascades != env->sdfgi_cascades || rb->sdfgi->min_cell_size != env->sdfgi_min_cell_size || requested_history_size != rb->sdfgi->history_size || rb->sdfgi->uses_occlusion != env->sdfgi_use_occlusion || rb->sdfgi->y_scale_mode != env->sdfgi_y_scale)) {
|
||||
if (rb->sdfgi && (rb->sdfgi->num_cascades != environment_get_sdfgi_cascades(p_environment) || rb->sdfgi->min_cell_size != environment_get_sdfgi_min_cell_size(p_environment) || requested_history_size != rb->sdfgi->history_size || rb->sdfgi->uses_occlusion != environment_get_sdfgi_use_occlusion(p_environment) || rb->sdfgi->y_scale_mode != environment_get_sdfgi_y_scale(p_environment))) {
|
||||
//configuration changed, erase
|
||||
rb->sdfgi->erase();
|
||||
memdelete(rb->sdfgi);
|
||||
|
@ -78,10 +77,10 @@ void RendererSceneRenderRD::sdfgi_update(RID p_render_buffers, RID p_environment
|
|||
RendererRD::GI::SDFGI *sdfgi = rb->sdfgi;
|
||||
if (sdfgi == nullptr) {
|
||||
// re-create
|
||||
rb->sdfgi = gi.create_sdfgi(env, p_world_position, requested_history_size);
|
||||
rb->sdfgi = gi.create_sdfgi(p_environment, p_world_position, requested_history_size);
|
||||
} else {
|
||||
//check for updates
|
||||
rb->sdfgi->update(env, p_world_position);
|
||||
rb->sdfgi->update(p_environment, p_world_position);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -159,145 +158,6 @@ Ref<Image> RendererSceneRenderRD::sky_bake_panorama(RID p_sky, float p_energy, b
|
|||
return sky.sky_bake_panorama(p_sky, p_energy, p_bake_irradiance, p_size);
|
||||
}
|
||||
|
||||
RID RendererSceneRenderRD::environment_allocate() {
|
||||
return environment_owner.allocate_rid();
|
||||
}
|
||||
void RendererSceneRenderRD::environment_initialize(RID p_rid) {
|
||||
environment_owner.initialize_rid(p_rid, RendererSceneEnvironmentRD());
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_background(RID p_env, RS::EnvironmentBG p_bg) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->background = p_bg;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_sky(RID p_env, RID p_sky) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky = p_sky;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_sky_custom_fov(RID p_env, float p_scale) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_custom_fov = p_scale;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_orientation = p_orientation;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_bg_color(RID p_env, const Color &p_color) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_color = p_color;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_bg_energy(RID p_env, float p_energy) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_energy = p_energy;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_canvas_max_layer(RID p_env, int p_max_layer) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->canvas_max_layer = p_max_layer;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->set_ambient_light(p_color, p_ambient, p_energy, p_sky_contribution, p_reflection_source);
|
||||
}
|
||||
|
||||
RS::EnvironmentBG RendererSceneRenderRD::environment_get_background(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_BG_MAX);
|
||||
return env->background;
|
||||
}
|
||||
|
||||
RID RendererSceneRenderRD::environment_get_sky(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RID());
|
||||
return env->sky;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_sky_custom_fov(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->sky_custom_fov;
|
||||
}
|
||||
|
||||
Basis RendererSceneRenderRD::environment_get_sky_orientation(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Basis());
|
||||
return env->sky_orientation;
|
||||
}
|
||||
|
||||
Color RendererSceneRenderRD::environment_get_bg_color(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color());
|
||||
return env->bg_color;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_bg_energy(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->bg_energy;
|
||||
}
|
||||
|
||||
int RendererSceneRenderRD::environment_get_canvas_max_layer(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->canvas_max_layer;
|
||||
}
|
||||
|
||||
Color RendererSceneRenderRD::environment_get_ambient_light_color(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color());
|
||||
return env->ambient_light;
|
||||
}
|
||||
|
||||
RS::EnvironmentAmbientSource RendererSceneRenderRD::environment_get_ambient_source(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_AMBIENT_SOURCE_BG);
|
||||
return env->ambient_source;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_ambient_light_energy(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->ambient_light_energy;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_ambient_sky_contribution(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->ambient_sky_contribution;
|
||||
}
|
||||
|
||||
RS::EnvironmentReflectionSource RendererSceneRenderRD::environment_get_reflection_source(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_REFLECTION_SOURCE_DISABLED);
|
||||
return env->reflection_source;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->set_tonemap(p_tone_mapper, p_exposure, p_white, p_auto_exposure, p_min_luminance, p_max_luminance, p_auto_exp_speed, p_auto_exp_scale);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->set_glow(p_enable, p_levels, p_intensity, p_strength, p_mix, p_bloom_threshold, p_blend_mode, p_hdr_bleed_threshold, p_hdr_bleed_scale, p_hdr_luminance_cap, p_glow_map_strength, p_glow_map);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_glow_set_use_bicubic_upscale(bool p_enable) {
|
||||
glow_bicubic_upscale = p_enable;
|
||||
}
|
||||
|
@ -306,79 +166,6 @@ void RendererSceneRenderRD::environment_glow_set_use_high_quality(bool p_enable)
|
|||
glow_high_quality = p_enable;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
if (!is_dynamic_gi_supported()) {
|
||||
return;
|
||||
}
|
||||
|
||||
env->set_sdfgi(p_enable, p_cascades, p_min_cell_size, p_y_scale, p_use_occlusion, p_bounce_feedback, p_read_sky, p_energy, p_normal_bias, p_probe_bias);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
env->set_fog(p_enable, p_light_color, p_light_energy, p_sun_scatter, p_density, p_height, p_height_density, p_fog_aerial_perspective);
|
||||
}
|
||||
|
||||
bool RendererSceneRenderRD::environment_is_fog_enabled(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
|
||||
return env->fog_enabled;
|
||||
}
|
||||
Color RendererSceneRenderRD::environment_get_fog_light_color(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color());
|
||||
return env->fog_light_color;
|
||||
}
|
||||
float RendererSceneRenderRD::environment_get_fog_light_energy(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->fog_light_energy;
|
||||
}
|
||||
float RendererSceneRenderRD::environment_get_fog_sun_scatter(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->fog_sun_scatter;
|
||||
}
|
||||
float RendererSceneRenderRD::environment_get_fog_density(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->fog_density;
|
||||
}
|
||||
float RendererSceneRenderRD::environment_get_fog_height(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
|
||||
return env->fog_height;
|
||||
}
|
||||
float RendererSceneRenderRD::environment_get_fog_height_density(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->fog_height_density;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_fog_aerial_perspective(RID p_env) const {
|
||||
const RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->fog_aerial_perspective;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
if (!is_volumetric_supported()) {
|
||||
return;
|
||||
}
|
||||
|
||||
env->set_volumetric_fog(p_enable, p_density, p_albedo, p_emission, p_emission_energy, p_anisotropy, p_length, p_detail_spread, p_gi_inject, p_temporal_reprojection, p_temporal_reprojection_amount, p_ambient_inject);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_volumetric_fog_volume_size(int p_size, int p_depth) {
|
||||
volumetric_fog_size = p_size;
|
||||
volumetric_fog_depth = p_depth;
|
||||
|
@ -399,13 +186,6 @@ void RendererSceneRenderRD::environment_set_sdfgi_frames_to_update_light(RS::Env
|
|||
gi.sdfgi_frames_to_update_light = p_update;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
env->set_ssr(p_enable, p_max_steps, p_fade_int, p_fade_out, p_depth_tolerance);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) {
|
||||
ssr_roughness_quality = p_quality;
|
||||
}
|
||||
|
@ -414,13 +194,6 @@ RS::EnvironmentSSRRoughnessQuality RendererSceneRenderRD::environment_get_ssr_ro
|
|||
return ssr_roughness_quality;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
env->set_ssao(p_enable, p_radius, p_intensity, p_power, p_detail, p_horizon, p_sharpness, p_light_affect, p_ao_channel_affect);
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
|
||||
ssao_quality = p_quality;
|
||||
ssao_half_size = p_half_size;
|
||||
|
@ -430,17 +203,6 @@ void RendererSceneRenderRD::environment_set_ssao_quality(RS::EnvironmentSSAOQual
|
|||
ssao_fadeout_to = p_fadeout_to;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
env->ssil_enabled = p_enable;
|
||||
env->ssil_radius = p_radius;
|
||||
env->ssil_intensity = p_intensity;
|
||||
env->ssil_sharpness = p_sharpness;
|
||||
env->ssil_normal_rejection = p_normal_rejection;
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) {
|
||||
ssil_quality = p_quality;
|
||||
ssil_half_size = p_half_size;
|
||||
|
@ -450,56 +212,16 @@ void RendererSceneRenderRD::environment_set_ssil_quality(RS::EnvironmentSSILQual
|
|||
ssil_fadeout_to = p_fadeout_to;
|
||||
}
|
||||
|
||||
bool RendererSceneRenderRD::environment_is_ssao_enabled(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssao_enabled;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_ssao_ao_affect(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->ssao_ao_channel_affect;
|
||||
}
|
||||
|
||||
float RendererSceneRenderRD::environment_get_ssao_light_affect(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->ssao_direct_light_affect;
|
||||
}
|
||||
|
||||
bool RendererSceneRenderRD::environment_is_ssil_enabled(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssil_enabled;
|
||||
}
|
||||
|
||||
bool RendererSceneRenderRD::environment_is_ssr_enabled(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssr_enabled;
|
||||
}
|
||||
bool RendererSceneRenderRD::environment_is_sdfgi_enabled(RID p_env) const {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->sdfgi_enabled;
|
||||
}
|
||||
|
||||
bool RendererSceneRenderRD::is_environment(RID p_env) const {
|
||||
return environment_owner.owns(p_env);
|
||||
}
|
||||
|
||||
Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Ref<Image>());
|
||||
ERR_FAIL_COND_V(p_env.is_null(), Ref<Image>());
|
||||
|
||||
RS::EnvironmentBG environment_background = env->background;
|
||||
RS::EnvironmentBG environment_background = environment_get_background(p_env);
|
||||
|
||||
if (environment_background == RS::ENV_BG_CAMERA_FEED || environment_background == RS::ENV_BG_CANVAS || environment_background == RS::ENV_BG_KEEP) {
|
||||
return Ref<Image>(); //nothing to bake
|
||||
}
|
||||
|
||||
RS::EnvironmentAmbientSource ambient_source = env->ambient_source;
|
||||
RS::EnvironmentAmbientSource ambient_source = environment_get_ambient_source(p_env);
|
||||
|
||||
bool use_ambient_light = false;
|
||||
bool use_cube_map = false;
|
||||
|
@ -509,14 +231,14 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba
|
|||
use_cube_map = (ambient_source == RS::ENV_AMBIENT_SOURCE_BG && environment_background == RS::ENV_BG_SKY) || ambient_source == RS::ENV_AMBIENT_SOURCE_SKY;
|
||||
use_ambient_light = use_cube_map || ambient_source == RS::ENV_AMBIENT_SOURCE_COLOR;
|
||||
}
|
||||
use_cube_map = use_cube_map || (environment_background == RS::ENV_BG_SKY && env->sky.is_valid());
|
||||
use_cube_map = use_cube_map || (environment_background == RS::ENV_BG_SKY && environment_get_sky(p_env).is_valid());
|
||||
|
||||
Color ambient_color;
|
||||
float ambient_color_sky_mix;
|
||||
float ambient_color_sky_mix = 0.0;
|
||||
if (use_ambient_light) {
|
||||
ambient_color_sky_mix = env->ambient_sky_contribution;
|
||||
const float ambient_energy = env->ambient_light_energy;
|
||||
ambient_color = env->ambient_light;
|
||||
ambient_color_sky_mix = environment_get_ambient_sky_contribution(p_env);
|
||||
const float ambient_energy = environment_get_ambient_light_energy(p_env);
|
||||
ambient_color = environment_get_ambient_light(p_env);
|
||||
ambient_color = ambient_color.srgb_to_linear();
|
||||
ambient_color.r *= ambient_energy;
|
||||
ambient_color.g *= ambient_energy;
|
||||
|
@ -524,7 +246,7 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba
|
|||
}
|
||||
|
||||
if (use_cube_map) {
|
||||
Ref<Image> panorama = sky_bake_panorama(env->sky, env->bg_energy, p_bake_irradiance, p_size);
|
||||
Ref<Image> panorama = sky_bake_panorama(environment_get_sky(p_env), environment_get_bg_energy(p_env), p_bake_irradiance, p_size);
|
||||
if (use_ambient_light) {
|
||||
for (int x = 0; x < p_size.width; x++) {
|
||||
for (int y = 0; y < p_size.height; y++) {
|
||||
|
@ -534,8 +256,8 @@ Ref<Image> RendererSceneRenderRD::environment_bake_panorama(RID p_env, bool p_ba
|
|||
}
|
||||
return panorama;
|
||||
} else {
|
||||
const float bg_energy = env->bg_energy;
|
||||
Color panorama_color = ((environment_background == RS::ENV_BG_CLEAR_COLOR) ? RSG::texture_storage->get_default_clear_color() : env->bg_color);
|
||||
const float bg_energy = environment_get_bg_energy(p_env);
|
||||
Color panorama_color = ((environment_background == RS::ENV_BG_CLEAR_COLOR) ? RSG::texture_storage->get_default_clear_color() : environment_get_bg_color(p_env));
|
||||
panorama_color = panorama_color.srgb_to_linear();
|
||||
panorama_color.r *= bg_energy;
|
||||
panorama_color.g *= bg_energy;
|
||||
|
@ -1944,10 +1666,9 @@ void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_frameb
|
|||
return;
|
||||
}
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_environment);
|
||||
ERR_FAIL_COND(!env);
|
||||
ERR_FAIL_COND(p_environment.is_null());
|
||||
|
||||
ERR_FAIL_COND(!env->ssr_enabled);
|
||||
ERR_FAIL_COND(!environment_get_ssr_enabled(p_environment));
|
||||
|
||||
Size2i half_size = Size2i(rb->internal_width / 2, rb->internal_height / 2);
|
||||
if (rb->ssr.output.is_null()) {
|
||||
|
@ -1959,7 +1680,7 @@ void RendererSceneRenderRD::_process_ssr(RID p_render_buffers, RID p_dest_frameb
|
|||
texture_slices[v] = rb->views[v].view_texture;
|
||||
depth_slices[v] = rb->views[v].view_depth;
|
||||
}
|
||||
ss_effects->screen_space_reflection(rb->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, p_metallic_mask, depth_slices, half_size, env->ssr_max_steps, env->ssr_fade_in, env->ssr_fade_out, env->ssr_depth_tolerance, rb->view_count, p_projections, p_eye_offsets);
|
||||
ss_effects->screen_space_reflection(rb->ssr, texture_slices, p_normal_slices, ssr_roughness_quality, p_metallic_slices, p_metallic_mask, depth_slices, half_size, environment_get_ssr_max_steps(p_environment), environment_get_ssr_fade_in(p_environment), environment_get_ssr_fade_out(p_environment), environment_get_ssr_depth_tolerance(p_environment), rb->view_count, p_projections, p_eye_offsets);
|
||||
copy_effects->merge_specular(p_dest_framebuffer, p_specular_buffer, p_use_additive ? RID() : rb->internal_texture, rb->ssr.output, rb->view_count);
|
||||
}
|
||||
|
||||
|
@ -1969,18 +1690,17 @@ void RendererSceneRenderRD::_process_ssao(RID p_render_buffers, RID p_environmen
|
|||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_buffers);
|
||||
ERR_FAIL_COND(!rb);
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_environment);
|
||||
ERR_FAIL_COND(!env);
|
||||
ERR_FAIL_COND(p_environment.is_null());
|
||||
|
||||
RENDER_TIMESTAMP("Process SSAO");
|
||||
|
||||
RendererRD::SSEffects::SSAOSettings settings;
|
||||
settings.radius = env->ssao_radius;
|
||||
settings.intensity = env->ssao_intensity;
|
||||
settings.power = env->ssao_power;
|
||||
settings.detail = env->ssao_detail;
|
||||
settings.horizon = env->ssao_horizon;
|
||||
settings.sharpness = env->ssao_sharpness;
|
||||
settings.radius = environment_get_ssao_radius(p_environment);
|
||||
settings.intensity = environment_get_ssao_intensity(p_environment);
|
||||
settings.power = environment_get_ssao_power(p_environment);
|
||||
settings.detail = environment_get_ssao_detail(p_environment);
|
||||
settings.horizon = environment_get_ssao_horizon(p_environment);
|
||||
settings.sharpness = environment_get_ssao_sharpness(p_environment);
|
||||
|
||||
settings.quality = ssao_quality;
|
||||
settings.half_size = ssao_half_size;
|
||||
|
@ -2000,16 +1720,15 @@ void RendererSceneRenderRD::_process_ssil(RID p_render_buffers, RID p_environmen
|
|||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_buffers);
|
||||
ERR_FAIL_COND(!rb);
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_environment);
|
||||
ERR_FAIL_COND(!env);
|
||||
ERR_FAIL_COND(p_environment.is_null());
|
||||
|
||||
RENDER_TIMESTAMP("Process SSIL");
|
||||
|
||||
RendererRD::SSEffects::SSILSettings settings;
|
||||
settings.radius = env->ssil_radius;
|
||||
settings.intensity = env->ssil_intensity;
|
||||
settings.sharpness = env->ssil_sharpness;
|
||||
settings.normal_rejection = env->ssil_normal_rejection;
|
||||
settings.radius = environment_get_ssil_radius(p_environment);
|
||||
settings.intensity = environment_get_ssil_intensity(p_environment);
|
||||
settings.sharpness = environment_get_ssil_sharpness(p_environment);
|
||||
settings.normal_rejection = environment_get_ssil_normal_rejection(p_environment);
|
||||
|
||||
settings.quality = ssil_quality;
|
||||
settings.half_size = ssil_half_size;
|
||||
|
@ -2141,7 +1860,6 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_data->render_buffers);
|
||||
ERR_FAIL_COND(!rb);
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
|
||||
// Glow and override exposure (if enabled).
|
||||
CameraEffects *camfx = camera_effects_owner.get_or_null(p_render_data->camera_effects);
|
||||
|
||||
|
@ -2201,21 +1919,21 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
RD::get_singleton()->draw_command_end_label();
|
||||
}
|
||||
|
||||
if (can_use_effects && env && env->auto_exposure) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_auto_exposure(p_render_data->environment)) {
|
||||
RENDER_TIMESTAMP("Auto exposure");
|
||||
RD::get_singleton()->draw_command_begin_label("Auto exposure");
|
||||
if (rb->luminance.current.is_null()) {
|
||||
_allocate_luminance_textures(rb);
|
||||
}
|
||||
|
||||
bool set_immediate = env->auto_exposure_version != rb->auto_exposure_version;
|
||||
rb->auto_exposure_version = env->auto_exposure_version;
|
||||
bool set_immediate = environment_get_auto_exposure_version(p_render_data->environment) != rb->auto_exposure_version;
|
||||
rb->auto_exposure_version = environment_get_auto_exposure_version(p_render_data->environment);
|
||||
|
||||
double step = env->auto_exp_speed * time_step;
|
||||
double step = environment_get_auto_exp_speed(p_render_data->environment) * time_step;
|
||||
if (can_use_storage) {
|
||||
RendererCompositorRD::singleton->get_effects()->luminance_reduction(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
|
||||
RendererCompositorRD::singleton->get_effects()->luminance_reduction(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.current, environment_get_min_luminance(p_render_data->environment), environment_get_max_luminance(p_render_data->environment), step, set_immediate);
|
||||
} else {
|
||||
RendererCompositorRD::singleton->get_effects()->luminance_reduction_raster(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, env->min_luminance, env->max_luminance, step, set_immediate);
|
||||
RendererCompositorRD::singleton->get_effects()->luminance_reduction_raster(rb->internal_texture, Size2i(rb->internal_width, rb->internal_height), rb->luminance.reduce, rb->luminance.fb, rb->luminance.current, environment_get_min_luminance(p_render_data->environment), environment_get_max_luminance(p_render_data->environment), step, set_immediate);
|
||||
}
|
||||
// Swap final reduce with prev luminance.
|
||||
SWAP(rb->luminance.current, rb->luminance.reduce.write[rb->luminance.reduce.size() - 1]);
|
||||
|
@ -2229,7 +1947,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
|
||||
int max_glow_level = -1;
|
||||
|
||||
if (can_use_effects && env && env->glow_enabled) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_glow_enabled(p_render_data->environment)) {
|
||||
RENDER_TIMESTAMP("Glow");
|
||||
RD::get_singleton()->draw_command_begin_label("Gaussian Glow");
|
||||
|
||||
|
@ -2240,7 +1958,7 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
}
|
||||
|
||||
for (int i = 0; i < RS::MAX_GLOW_LEVELS; i++) {
|
||||
if (env->glow_levels[i] > 0.0) {
|
||||
if (environment_get_glow_levels(p_render_data->environment)[i] > 0.0) {
|
||||
if (i >= rb->blur[1].layers[0].mipmaps.size()) {
|
||||
max_glow_level = rb->blur[1].layers[0].mipmaps.size() - 1;
|
||||
} else {
|
||||
|
@ -2257,19 +1975,19 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
|
||||
if (i == 0) {
|
||||
RID luminance_texture;
|
||||
if (env->auto_exposure && rb->luminance.current.is_valid()) {
|
||||
if (environment_get_auto_exposure(p_render_data->environment) && rb->luminance.current.is_valid()) {
|
||||
luminance_texture = rb->luminance.current;
|
||||
}
|
||||
if (can_use_storage) {
|
||||
copy_effects->gaussian_glow(rb->views[l].view_texture, rb->blur[1].layers[l].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale);
|
||||
copy_effects->gaussian_glow(rb->views[l].view_texture, rb->blur[1].layers[l].mipmaps[i].texture, Size2i(vp_w, vp_h), environment_get_glow_strength(p_render_data->environment), glow_high_quality, true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, environment_get_auto_exp_scale(p_render_data->environment));
|
||||
} else {
|
||||
copy_effects->gaussian_glow_raster(rb->views[l].view_texture, luminance_multiplier, rb->blur[1].layers[l].mipmaps[i].half_fb, rb->blur[1].layers[l].mipmaps[i].half_texture, rb->blur[1].layers[l].mipmaps[i].fb, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality, true, env->glow_hdr_luminance_cap, env->exposure, env->glow_bloom, env->glow_hdr_bleed_threshold, env->glow_hdr_bleed_scale, luminance_texture, env->auto_exp_scale);
|
||||
copy_effects->gaussian_glow_raster(rb->views[l].view_texture, luminance_multiplier, rb->blur[1].layers[l].mipmaps[i].half_fb, rb->blur[1].layers[l].mipmaps[i].half_texture, rb->blur[1].layers[l].mipmaps[i].fb, Size2i(vp_w, vp_h), environment_get_glow_strength(p_render_data->environment), glow_high_quality, true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, environment_get_auto_exp_scale(p_render_data->environment));
|
||||
}
|
||||
} else {
|
||||
if (can_use_storage) {
|
||||
copy_effects->gaussian_glow(rb->blur[1].layers[l].mipmaps[i - 1].texture, rb->blur[1].layers[l].mipmaps[i].texture, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality);
|
||||
copy_effects->gaussian_glow(rb->blur[1].layers[l].mipmaps[i - 1].texture, rb->blur[1].layers[l].mipmaps[i].texture, Size2i(vp_w, vp_h), environment_get_glow_strength(p_render_data->environment), glow_high_quality);
|
||||
} else {
|
||||
copy_effects->gaussian_glow_raster(rb->blur[1].layers[l].mipmaps[i - 1].texture, luminance_multiplier, rb->blur[1].layers[l].mipmaps[i].half_fb, rb->blur[1].layers[l].mipmaps[i].half_texture, rb->blur[1].layers[l].mipmaps[i].fb, Size2i(vp_w, vp_h), env->glow_strength, glow_high_quality);
|
||||
copy_effects->gaussian_glow_raster(rb->blur[1].layers[l].mipmaps[i - 1].texture, luminance_multiplier, rb->blur[1].layers[l].mipmaps[i].half_fb, rb->blur[1].layers[l].mipmaps[i].half_texture, rb->blur[1].layers[l].mipmaps[i].fb, Size2i(vp_w, vp_h), environment_get_glow_strength(p_render_data->environment), glow_high_quality);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2284,28 +2002,28 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
|
||||
RendererRD::ToneMapper::TonemapSettings tonemap;
|
||||
|
||||
if (can_use_effects && env && env->auto_exposure && rb->luminance.current.is_valid()) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_auto_exposure(p_render_data->environment) && rb->luminance.current.is_valid()) {
|
||||
tonemap.use_auto_exposure = true;
|
||||
tonemap.exposure_texture = rb->luminance.current;
|
||||
tonemap.auto_exposure_grey = env->auto_exp_scale;
|
||||
tonemap.auto_exposure_grey = environment_get_auto_exp_scale(p_render_data->environment);
|
||||
} else {
|
||||
tonemap.exposure_texture = texture_storage->texture_rd_get_default(RendererRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
}
|
||||
|
||||
if (can_use_effects && env && env->glow_enabled) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_glow_enabled(p_render_data->environment)) {
|
||||
tonemap.use_glow = true;
|
||||
tonemap.glow_mode = RendererRD::ToneMapper::TonemapSettings::GlowMode(env->glow_blend_mode);
|
||||
tonemap.glow_intensity = env->glow_blend_mode == RS::ENV_GLOW_BLEND_MODE_MIX ? env->glow_mix : env->glow_intensity;
|
||||
tonemap.glow_mode = RendererRD::ToneMapper::TonemapSettings::GlowMode(environment_get_glow_blend_mode(p_render_data->environment));
|
||||
tonemap.glow_intensity = environment_get_glow_blend_mode(p_render_data->environment) == RS::ENV_GLOW_BLEND_MODE_MIX ? environment_get_glow_mix(p_render_data->environment) : environment_get_glow_intensity(p_render_data->environment);
|
||||
for (int i = 0; i < RS::MAX_GLOW_LEVELS; i++) {
|
||||
tonemap.glow_levels[i] = env->glow_levels[i];
|
||||
tonemap.glow_levels[i] = environment_get_glow_levels(p_render_data->environment)[i];
|
||||
}
|
||||
tonemap.glow_texture_size.x = rb->blur[1].layers[0].mipmaps[0].width;
|
||||
tonemap.glow_texture_size.y = rb->blur[1].layers[0].mipmaps[0].height;
|
||||
tonemap.glow_use_bicubic_upscale = glow_bicubic_upscale;
|
||||
tonemap.glow_texture = rb->blur[1].texture;
|
||||
if (env->glow_map.is_valid()) {
|
||||
tonemap.glow_map_strength = env->glow_map_strength;
|
||||
tonemap.glow_map = texture_storage->texture_get_rd_texture(env->glow_map);
|
||||
if (environment_get_glow_map(p_render_data->environment).is_valid()) {
|
||||
tonemap.glow_map_strength = environment_get_glow_map_strength(p_render_data->environment);
|
||||
tonemap.glow_map = texture_storage->texture_get_rd_texture(environment_get_glow_map(p_render_data->environment));
|
||||
} else {
|
||||
tonemap.glow_map_strength = 0.0f;
|
||||
tonemap.glow_map = texture_storage->texture_rd_get_default(RendererRD::DEFAULT_RD_TEXTURE_WHITE);
|
||||
|
@ -2323,10 +2041,10 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
tonemap.use_debanding = rb->use_debanding;
|
||||
tonemap.texture_size = Vector2i(rb->internal_width, rb->internal_height);
|
||||
|
||||
if (env) {
|
||||
tonemap.tonemap_mode = env->tone_mapper;
|
||||
tonemap.white = env->white;
|
||||
tonemap.exposure = env->exposure;
|
||||
if (p_render_data->environment.is_valid()) {
|
||||
tonemap.tonemap_mode = environment_get_tone_mapper(p_render_data->environment);
|
||||
tonemap.white = environment_get_white(p_render_data->environment);
|
||||
tonemap.exposure = environment_get_exposure(p_render_data->environment);
|
||||
}
|
||||
|
||||
if (camfx && camfx->override_exposure_enabled) {
|
||||
|
@ -2337,15 +2055,15 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende
|
|||
tonemap.use_1d_color_correction = false;
|
||||
tonemap.color_correction_texture = texture_storage->texture_rd_get_default(RendererRD::DEFAULT_RD_TEXTURE_3D_WHITE);
|
||||
|
||||
if (can_use_effects && env) {
|
||||
tonemap.use_bcs = env->adjustments_enabled;
|
||||
tonemap.brightness = env->adjustments_brightness;
|
||||
tonemap.contrast = env->adjustments_contrast;
|
||||
tonemap.saturation = env->adjustments_saturation;
|
||||
if (env->adjustments_enabled && env->color_correction.is_valid()) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid()) {
|
||||
tonemap.use_bcs = environment_get_adjustments_enabled(p_render_data->environment);
|
||||
tonemap.brightness = environment_get_adjustments_brightness(p_render_data->environment);
|
||||
tonemap.contrast = environment_get_adjustments_contrast(p_render_data->environment);
|
||||
tonemap.saturation = environment_get_adjustments_saturation(p_render_data->environment);
|
||||
if (environment_get_adjustments_enabled(p_render_data->environment) && environment_get_color_correction(p_render_data->environment).is_valid()) {
|
||||
tonemap.use_color_correction = true;
|
||||
tonemap.use_1d_color_correction = env->use_1d_color_correction;
|
||||
tonemap.color_correction_texture = texture_storage->texture_get_rd_texture(env->color_correction);
|
||||
tonemap.use_1d_color_correction = environment_get_use_1d_color_correction(p_render_data->environment);
|
||||
tonemap.color_correction_texture = texture_storage->texture_get_rd_texture(environment_get_color_correction(p_render_data->environment));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2375,7 +2093,6 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
|
|||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_data->render_buffers);
|
||||
ERR_FAIL_COND(!rb);
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
|
||||
// Override exposure (if enabled).
|
||||
CameraEffects *camfx = camera_effects_owner.get_or_null(p_render_data->camera_effects);
|
||||
|
||||
|
@ -2385,10 +2102,10 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
|
|||
|
||||
RendererRD::ToneMapper::TonemapSettings tonemap;
|
||||
|
||||
if (env) {
|
||||
tonemap.tonemap_mode = env->tone_mapper;
|
||||
tonemap.exposure = env->exposure;
|
||||
tonemap.white = env->white;
|
||||
if (p_render_data->environment.is_valid()) {
|
||||
tonemap.tonemap_mode = environment_get_tone_mapper(p_render_data->environment);
|
||||
tonemap.exposure = environment_get_exposure(p_render_data->environment);
|
||||
tonemap.white = environment_get_white(p_render_data->environment);
|
||||
}
|
||||
|
||||
if (camfx && camfx->override_exposure_enabled) {
|
||||
|
@ -2398,10 +2115,10 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
|
|||
// We don't support glow or auto exposure here, if they are needed, don't use subpasses!
|
||||
// The problem is that we need to use the result so far and process them before we can
|
||||
// apply this to our results.
|
||||
if (can_use_effects && env && env->glow_enabled) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_glow_enabled(p_render_data->environment)) {
|
||||
ERR_FAIL_MSG("Glow is not supported when using subpasses.");
|
||||
}
|
||||
if (can_use_effects && env && env->auto_exposure) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid() && environment_get_auto_exposure(p_render_data->environment)) {
|
||||
ERR_FAIL_MSG("Glow is not supported when using subpasses.");
|
||||
}
|
||||
|
||||
|
@ -2415,15 +2132,15 @@ void RendererSceneRenderRD::_post_process_subpass(RID p_source_texture, RID p_fr
|
|||
tonemap.use_1d_color_correction = false;
|
||||
tonemap.color_correction_texture = texture_storage->texture_rd_get_default(RendererRD::DEFAULT_RD_TEXTURE_3D_WHITE);
|
||||
|
||||
if (can_use_effects && env) {
|
||||
tonemap.use_bcs = env->adjustments_enabled;
|
||||
tonemap.brightness = env->adjustments_brightness;
|
||||
tonemap.contrast = env->adjustments_contrast;
|
||||
tonemap.saturation = env->adjustments_saturation;
|
||||
if (env->adjustments_enabled && env->color_correction.is_valid()) {
|
||||
if (can_use_effects && p_render_data->environment.is_valid()) {
|
||||
tonemap.use_bcs = environment_get_adjustments_enabled(p_render_data->environment);
|
||||
tonemap.brightness = environment_get_adjustments_brightness(p_render_data->environment);
|
||||
tonemap.contrast = environment_get_adjustments_contrast(p_render_data->environment);
|
||||
tonemap.saturation = environment_get_adjustments_saturation(p_render_data->environment);
|
||||
if (environment_get_adjustments_enabled(p_render_data->environment) && environment_get_color_correction(p_render_data->environment).is_valid()) {
|
||||
tonemap.use_color_correction = true;
|
||||
tonemap.use_1d_color_correction = env->use_1d_color_correction;
|
||||
tonemap.color_correction_texture = texture_storage->texture_get_rd_texture(env->color_correction);
|
||||
tonemap.use_1d_color_correction = environment_get_use_1d_color_correction(p_render_data->environment);
|
||||
tonemap.color_correction_texture = texture_storage->texture_get_rd_texture(environment_get_color_correction(p_render_data->environment));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2527,18 +2244,6 @@ void RendererSceneRenderRD::_render_buffers_debug_draw(RID p_render_buffers, RID
|
|||
}
|
||||
}
|
||||
|
||||
void RendererSceneRenderRD::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) {
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
|
||||
env->adjustments_enabled = p_enable;
|
||||
env->adjustments_brightness = p_brightness;
|
||||
env->adjustments_contrast = p_contrast;
|
||||
env->adjustments_saturation = p_saturation;
|
||||
env->use_1d_color_correction = p_use_1d_color_correction;
|
||||
env->color_correction = p_color_correction;
|
||||
}
|
||||
|
||||
RID RendererSceneRenderRD::render_buffers_get_back_buffer_texture(RID p_render_buffers) {
|
||||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_buffers);
|
||||
ERR_FAIL_COND_V(!rb, RID());
|
||||
|
@ -3692,7 +3397,6 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
|
|||
ERR_FAIL_COND(!is_clustered_enabled()); // can't use volumetric fog without clustered
|
||||
RenderBuffers *rb = render_buffers_owner.get_or_null(p_render_buffers);
|
||||
ERR_FAIL_COND(!rb);
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_environment);
|
||||
|
||||
float ratio = float(rb->width) / float((rb->width + rb->height) / 2);
|
||||
uint32_t target_width = uint32_t(float(volumetric_fog_size) * ratio);
|
||||
|
@ -3700,18 +3404,18 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
|
|||
|
||||
if (rb->volumetric_fog) {
|
||||
//validate
|
||||
if (!env || !env->volumetric_fog_enabled || rb->volumetric_fog->width != target_width || rb->volumetric_fog->height != target_height || rb->volumetric_fog->depth != volumetric_fog_depth) {
|
||||
if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment) || rb->volumetric_fog->width != target_width || rb->volumetric_fog->height != target_height || rb->volumetric_fog->depth != volumetric_fog_depth) {
|
||||
memdelete(rb->volumetric_fog);
|
||||
rb->volumetric_fog = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
if (!env || !env->volumetric_fog_enabled) {
|
||||
if (p_environment.is_null() || !environment_get_volumetric_fog_enabled(p_environment)) {
|
||||
//no reason to enable or update, bye
|
||||
return;
|
||||
}
|
||||
|
||||
if (env && env->volumetric_fog_enabled && !rb->volumetric_fog) {
|
||||
if (p_environment.is_valid() && environment_get_volumetric_fog_enabled(p_environment) && !rb->volumetric_fog) {
|
||||
//required volumetric fog but not existing, create
|
||||
rb->volumetric_fog = memnew(RendererRD::Fog::VolumetricFog(Vector3i(target_width, target_height, volumetric_fog_depth), sky.sky_shader.default_shader_rd));
|
||||
}
|
||||
|
@ -3737,7 +3441,7 @@ void RendererSceneRenderRD::_update_volumetric_fog(RID p_render_buffers, RID p_e
|
|||
settings.cluster_builder = rb->cluster_builder;
|
||||
settings.rbgi = &rb->rbgi;
|
||||
settings.sdfgi = rb->sdfgi;
|
||||
settings.env = env;
|
||||
settings.env = p_environment;
|
||||
settings.sky = &sky;
|
||||
settings.gi = &gi;
|
||||
|
||||
|
@ -3764,8 +3468,7 @@ void RendererSceneRenderRD::_post_prepass_render(RenderDataRD *p_render_data, bo
|
|||
return;
|
||||
}
|
||||
|
||||
RendererSceneEnvironmentRD *env = environment_owner.get_or_null(p_render_data->environment);
|
||||
rb->sdfgi->update_probes(env, sky.sky_owner.get_or_null(env->sky));
|
||||
rb->sdfgi->update_probes(p_render_data->environment, sky.sky_owner.get_or_null(environment_get_sky(p_render_data->environment)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -4355,9 +4058,8 @@ bool RendererSceneRenderRD::free(RID p_rid) {
|
|||
memdelete(rb->cluster_builder);
|
||||
}
|
||||
render_buffers_owner.free(p_rid);
|
||||
} else if (environment_owner.owns(p_rid)) {
|
||||
//not much to delete, just free it
|
||||
environment_owner.free(p_rid);
|
||||
} else if (is_environment(p_rid)) {
|
||||
environment_free(p_rid);
|
||||
} else if (camera_effects_owner.owns(p_rid)) {
|
||||
//not much to delete, just free it
|
||||
camera_effects_owner.free(p_rid);
|
||||
|
|
|
@ -43,7 +43,6 @@
|
|||
#include "servers/rendering/renderer_rd/environment/fog.h"
|
||||
#include "servers/rendering/renderer_rd/environment/gi.h"
|
||||
#include "servers/rendering/renderer_rd/environment/sky.h"
|
||||
#include "servers/rendering/renderer_rd/renderer_scene_environment_rd.h"
|
||||
#include "servers/rendering/renderer_scene.h"
|
||||
#include "servers/rendering/renderer_scene_render.h"
|
||||
#include "servers/rendering/rendering_device.h"
|
||||
|
@ -168,14 +167,6 @@ protected:
|
|||
RendererRD::GI gi;
|
||||
RendererRD::SkyRD sky;
|
||||
|
||||
RendererSceneEnvironmentRD *get_environment(RID p_environment) {
|
||||
if (p_environment.is_valid()) {
|
||||
return environment_owner.get_or_null(p_environment);
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
//used for mobile renderer mostly
|
||||
|
||||
typedef int32_t ForwardID;
|
||||
|
@ -427,8 +418,6 @@ private:
|
|||
bool glow_high_quality = false;
|
||||
RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::ENV_SSR_ROUGHNESS_QUALITY_LOW;
|
||||
|
||||
mutable RID_Owner<RendererSceneEnvironmentRD, true> environment_owner;
|
||||
|
||||
/* CAMERA EFFECTS */
|
||||
|
||||
struct CameraEffects {
|
||||
|
@ -761,6 +750,8 @@ private:
|
|||
void _update_volumetric_fog(RID p_render_buffers, RID p_environment, const Projection &p_cam_projection, const Transform3D &p_cam_transform, const Transform3D &p_prev_cam_inv_transform, RID p_shadow_atlas, int p_directional_light_count, bool p_use_directional_shadows, int p_positional_light_count, int p_voxel_gi_count, const PagedArray<RID> &p_fog_volumes);
|
||||
|
||||
public:
|
||||
static RendererSceneRenderRD *get_singleton() { return singleton; }
|
||||
|
||||
/* GI */
|
||||
|
||||
RendererRD::GI *get_gi() { return &gi; }
|
||||
|
@ -821,65 +812,16 @@ public:
|
|||
|
||||
/* ENVIRONMENT API */
|
||||
|
||||
virtual RID environment_allocate() override;
|
||||
virtual void environment_initialize(RID p_rid) override;
|
||||
|
||||
virtual void environment_set_background(RID p_env, RS::EnvironmentBG p_bg) override;
|
||||
virtual void environment_set_sky(RID p_env, RID p_sky) override;
|
||||
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale) override;
|
||||
virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) override;
|
||||
virtual void environment_set_bg_color(RID p_env, const Color &p_color) override;
|
||||
virtual void environment_set_bg_energy(RID p_env, float p_energy) override;
|
||||
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) override;
|
||||
virtual void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) override;
|
||||
|
||||
virtual RS::EnvironmentBG environment_get_background(RID p_env) const override;
|
||||
RID environment_get_sky(RID p_env) const;
|
||||
float environment_get_sky_custom_fov(RID p_env) const;
|
||||
Basis environment_get_sky_orientation(RID p_env) const;
|
||||
Color environment_get_bg_color(RID p_env) const;
|
||||
float environment_get_bg_energy(RID p_env) const;
|
||||
virtual int environment_get_canvas_max_layer(RID p_env) const override;
|
||||
Color environment_get_ambient_light_color(RID p_env) const;
|
||||
RS::EnvironmentAmbientSource environment_get_ambient_source(RID p_env) const;
|
||||
float environment_get_ambient_light_energy(RID p_env) const;
|
||||
float environment_get_ambient_sky_contribution(RID p_env) const;
|
||||
RS::EnvironmentReflectionSource environment_get_reflection_source(RID p_env) const;
|
||||
|
||||
virtual bool is_environment(RID p_env) const override;
|
||||
|
||||
virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) override;
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) override;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) override;
|
||||
|
||||
virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) override;
|
||||
bool environment_is_fog_enabled(RID p_env) const;
|
||||
Color environment_get_fog_light_color(RID p_env) const;
|
||||
float environment_get_fog_light_energy(RID p_env) const;
|
||||
float environment_get_fog_sun_scatter(RID p_env) const;
|
||||
float environment_get_fog_density(RID p_env) const;
|
||||
float environment_get_fog_height(RID p_env) const;
|
||||
float environment_get_fog_height_density(RID p_env) const;
|
||||
float environment_get_fog_aerial_perspective(RID p_env) const;
|
||||
|
||||
virtual void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) override;
|
||||
|
||||
virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override;
|
||||
virtual void environment_set_volumetric_fog_filter_active(bool p_enable) override;
|
||||
|
||||
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) override;
|
||||
virtual void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) override;
|
||||
virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
virtual void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) override;
|
||||
virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
bool environment_is_ssao_enabled(RID p_env) const;
|
||||
float environment_get_ssao_ao_affect(RID p_env) const;
|
||||
float environment_get_ssao_light_affect(RID p_env) const;
|
||||
bool environment_is_ssil_enabled(RID p_env) const;
|
||||
bool environment_is_ssr_enabled(RID p_env) const;
|
||||
bool environment_is_sdfgi_enabled(RID p_env) const;
|
||||
|
||||
virtual void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) override;
|
||||
virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) override;
|
||||
|
||||
virtual void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) override;
|
||||
virtual void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) override;
|
||||
virtual void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) override;
|
||||
|
@ -887,9 +829,6 @@ public:
|
|||
virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override;
|
||||
RS::EnvironmentSSRRoughnessQuality environment_get_ssr_roughness_quality() const;
|
||||
|
||||
virtual void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) override;
|
||||
virtual void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) override;
|
||||
|
||||
virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) override;
|
||||
|
||||
/* CAMERA EFFECTS */
|
||||
|
|
|
@ -122,6 +122,7 @@ public:
|
|||
virtual RID environment_allocate() = 0;
|
||||
virtual void environment_initialize(RID p_rid) = 0;
|
||||
|
||||
// Background
|
||||
virtual void environment_set_background(RID p_env, RS::EnvironmentBG p_bg) = 0;
|
||||
virtual void environment_set_sky(RID p_env, RID p_sky) = 0;
|
||||
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale) = 0;
|
||||
|
@ -131,41 +132,152 @@ public:
|
|||
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) = 0;
|
||||
virtual void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) = 0;
|
||||
|
||||
virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) = 0;
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) = 0;
|
||||
virtual RS::EnvironmentBG environment_get_background(RID p_Env) const = 0;
|
||||
virtual RID environment_get_sky(RID p_env) const = 0;
|
||||
virtual float environment_get_sky_custom_fov(RID p_env) const = 0;
|
||||
virtual Basis environment_get_sky_orientation(RID p_env) const = 0;
|
||||
virtual Color environment_get_bg_color(RID p_env) const = 0;
|
||||
virtual float environment_get_bg_energy(RID p_env) const = 0;
|
||||
virtual int environment_get_canvas_max_layer(RID p_env) const = 0;
|
||||
virtual RS::EnvironmentAmbientSource environment_get_ambient_source(RID p_env) const = 0;
|
||||
virtual Color environment_get_ambient_light(RID p_env) const = 0;
|
||||
virtual float environment_get_ambient_light_energy(RID p_env) const = 0;
|
||||
virtual float environment_get_ambient_sky_contribution(RID p_env) const = 0;
|
||||
virtual RS::EnvironmentReflectionSource environment_get_reflection_source(RID p_env) const = 0;
|
||||
|
||||
// Tonemap
|
||||
virtual void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) = 0;
|
||||
|
||||
virtual RS::EnvironmentToneMapper environment_get_tone_mapper(RID p_env) const = 0;
|
||||
virtual float environment_get_exposure(RID p_env) const = 0;
|
||||
virtual float environment_get_white(RID p_env) const = 0;
|
||||
virtual bool environment_get_auto_exposure(RID p_env) const = 0;
|
||||
virtual float environment_get_min_luminance(RID p_env) const = 0;
|
||||
virtual float environment_get_max_luminance(RID p_env) const = 0;
|
||||
virtual float environment_get_auto_exp_speed(RID p_env) const = 0;
|
||||
virtual float environment_get_auto_exp_scale(RID p_env) const = 0;
|
||||
virtual uint64_t environment_get_auto_exposure_version(RID p_env) const = 0;
|
||||
|
||||
// Fog
|
||||
virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) = 0;
|
||||
|
||||
virtual bool environment_get_fog_enabled(RID p_env) const = 0;
|
||||
virtual Color environment_get_fog_light_color(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_light_energy(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_sun_scatter(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_density(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_height(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_height_density(RID p_env) const = 0;
|
||||
virtual float environment_get_fog_aerial_perspective(RID p_env) const = 0;
|
||||
|
||||
// Volumetric Fog
|
||||
virtual void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) = 0;
|
||||
|
||||
virtual bool environment_get_volumetric_fog_enabled(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_density(RID p_env) const = 0;
|
||||
virtual Color environment_get_volumetric_fog_scattering(RID p_env) const = 0;
|
||||
virtual Color environment_get_volumetric_fog_emission(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_emission_energy(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_anisotropy(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_length(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_detail_spread(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_gi_inject(RID p_env) const = 0;
|
||||
virtual bool environment_get_volumetric_fog_temporal_reprojection(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const = 0;
|
||||
virtual float environment_get_volumetric_fog_ambient_inject(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) = 0;
|
||||
virtual void environment_set_volumetric_fog_filter_active(bool p_enable) = 0;
|
||||
|
||||
// Glow
|
||||
|
||||
virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) = 0;
|
||||
|
||||
virtual bool environment_get_glow_enabled(RID p_env) const = 0;
|
||||
virtual Vector<float> environment_get_glow_levels(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_intensity(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_strength(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_bloom(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_mix(RID p_env) const = 0;
|
||||
virtual RS::EnvironmentGlowBlendMode environment_get_glow_blend_mode(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_hdr_bleed_threshold(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_hdr_luminance_cap(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_hdr_bleed_scale(RID p_env) const = 0;
|
||||
virtual float environment_get_glow_map_strength(RID p_env) const = 0;
|
||||
virtual RID environment_get_glow_map(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) = 0;
|
||||
|
||||
// SSR
|
||||
|
||||
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) = 0;
|
||||
|
||||
virtual bool environment_get_ssr_enabled(RID p_env) const = 0;
|
||||
virtual int environment_get_ssr_max_steps(RID p_env) const = 0;
|
||||
virtual float environment_get_ssr_fade_in(RID p_env) const = 0;
|
||||
virtual float environment_get_ssr_fade_out(RID p_env) const = 0;
|
||||
virtual float environment_get_ssr_depth_tolerance(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) = 0;
|
||||
|
||||
// SSAO
|
||||
virtual void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) = 0;
|
||||
|
||||
virtual bool environment_get_ssao_enabled(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_radius(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_intensity(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_power(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_detail(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_horizon(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_sharpness(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_direct_light_affect(RID p_env) const = 0;
|
||||
virtual float environment_get_ssao_ao_channel_affect(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) = 0;
|
||||
|
||||
// SSIL
|
||||
|
||||
virtual void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) = 0;
|
||||
|
||||
virtual bool environment_get_ssil_enabled(RID p_env) const = 0;
|
||||
virtual float environment_get_ssil_radius(RID p_env) const = 0;
|
||||
virtual float environment_get_ssil_intensity(RID p_env) const = 0;
|
||||
virtual float environment_get_ssil_sharpness(RID p_env) const = 0;
|
||||
virtual float environment_get_ssil_normal_rejection(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) = 0;
|
||||
|
||||
// SDFGI
|
||||
virtual void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) = 0;
|
||||
|
||||
virtual bool environment_get_sdfgi_enabled(RID p_env) const = 0;
|
||||
virtual int environment_get_sdfgi_cascades(RID p_env) const = 0;
|
||||
virtual float environment_get_sdfgi_min_cell_size(RID p_env) const = 0;
|
||||
virtual bool environment_get_sdfgi_use_occlusion(RID p_env) const = 0;
|
||||
virtual float environment_get_sdfgi_bounce_feedback(RID p_env) const = 0;
|
||||
virtual bool environment_get_sdfgi_read_sky_light(RID p_env) const = 0;
|
||||
virtual float environment_get_sdfgi_energy(RID p_env) const = 0;
|
||||
virtual float environment_get_sdfgi_normal_bias(RID p_env) const = 0;
|
||||
virtual float environment_get_sdfgi_probe_bias(RID p_env) const = 0;
|
||||
virtual RS::EnvironmentSDFGIYScale environment_get_sdfgi_y_scale(RID p_env) const = 0;
|
||||
|
||||
virtual void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) = 0;
|
||||
virtual void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) = 0;
|
||||
virtual void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) = 0;
|
||||
|
||||
virtual void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) = 0;
|
||||
|
||||
// Adjustment
|
||||
virtual void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) = 0;
|
||||
|
||||
virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) = 0;
|
||||
virtual bool environment_get_adjustments_enabled(RID p_env) const = 0;
|
||||
virtual float environment_get_adjustments_brightness(RID p_env) const = 0;
|
||||
virtual float environment_get_adjustments_contrast(RID p_env) const = 0;
|
||||
virtual float environment_get_adjustments_saturation(RID p_env) const = 0;
|
||||
virtual bool environment_get_use_1d_color_correction(RID p_env) const = 0;
|
||||
virtual RID environment_get_color_correction(RID p_env) const = 0;
|
||||
|
||||
virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) = 0;
|
||||
|
||||
virtual RS::EnvironmentBG environment_get_background(RID p_Env) const = 0;
|
||||
virtual int environment_get_canvas_max_layer(RID p_env) const = 0;
|
||||
|
||||
virtual bool is_environment(RID p_environment) const = 0;
|
||||
|
||||
virtual void screen_space_roughness_limiter_set_active(bool p_enable, float p_amount, float p_limit) = 0;
|
||||
|
|
|
@ -1093,6 +1093,7 @@ public:
|
|||
|
||||
PASS1RC(bool, is_environment, RID)
|
||||
|
||||
// Background
|
||||
PASS2(environment_set_background, RID, RS::EnvironmentBG)
|
||||
PASS2(environment_set_sky, RID, RID)
|
||||
PASS2(environment_set_sky_custom_fov, RID, float)
|
||||
|
@ -1102,36 +1103,146 @@ public:
|
|||
PASS2(environment_set_canvas_max_layer, RID, int)
|
||||
PASS6(environment_set_ambient_light, RID, const Color &, RS::EnvironmentAmbientSource, float, float, RS::EnvironmentReflectionSource)
|
||||
|
||||
PASS6(environment_set_ssr, RID, bool, int, float, float, float)
|
||||
PASS1(environment_set_ssr_roughness_quality, RS::EnvironmentSSRRoughnessQuality)
|
||||
|
||||
PASS10(environment_set_ssao, RID, bool, float, float, float, float, float, float, float, float)
|
||||
PASS6(environment_set_ssao_quality, RS::EnvironmentSSAOQuality, bool, float, int, float, float)
|
||||
|
||||
PASS6(environment_set_ssil, RID, bool, float, float, float, float)
|
||||
PASS6(environment_set_ssil_quality, RS::EnvironmentSSILQuality, bool, float, int, float, float)
|
||||
|
||||
PASS13(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, RS::EnvironmentGlowBlendMode, float, float, float, float, RID)
|
||||
PASS1(environment_glow_set_use_bicubic_upscale, bool)
|
||||
PASS1(environment_glow_set_use_high_quality, bool)
|
||||
PASS1RC(RS::EnvironmentBG, environment_get_background, RID)
|
||||
PASS1RC(RID, environment_get_sky, RID)
|
||||
PASS1RC(float, environment_get_sky_custom_fov, RID)
|
||||
PASS1RC(Basis, environment_get_sky_orientation, RID)
|
||||
PASS1RC(Color, environment_get_bg_color, RID)
|
||||
PASS1RC(float, environment_get_bg_energy, RID)
|
||||
PASS1RC(int, environment_get_canvas_max_layer, RID)
|
||||
PASS1RC(RS::EnvironmentAmbientSource, environment_get_ambient_source, RID)
|
||||
PASS1RC(Color, environment_get_ambient_light, RID)
|
||||
PASS1RC(float, environment_get_ambient_light_energy, RID)
|
||||
PASS1RC(float, environment_get_ambient_sky_contribution, RID)
|
||||
PASS1RC(RS::EnvironmentReflectionSource, environment_get_reflection_source, RID)
|
||||
|
||||
// Tonemap
|
||||
PASS9(environment_set_tonemap, RID, RS::EnvironmentToneMapper, float, float, bool, float, float, float, float)
|
||||
PASS1RC(RS::EnvironmentToneMapper, environment_get_tone_mapper, RID)
|
||||
PASS1RC(float, environment_get_exposure, RID)
|
||||
PASS1RC(float, environment_get_white, RID)
|
||||
PASS1RC(bool, environment_get_auto_exposure, RID)
|
||||
PASS1RC(float, environment_get_min_luminance, RID)
|
||||
PASS1RC(float, environment_get_max_luminance, RID)
|
||||
PASS1RC(float, environment_get_auto_exp_speed, RID)
|
||||
PASS1RC(float, environment_get_auto_exp_scale, RID)
|
||||
PASS1RC(uint64_t, environment_get_auto_exposure_version, RID)
|
||||
|
||||
PASS7(environment_set_adjustment, RID, bool, float, float, float, bool, RID)
|
||||
|
||||
// Fog
|
||||
PASS9(environment_set_fog, RID, bool, const Color &, float, float, float, float, float, float)
|
||||
PASS13(environment_set_volumetric_fog, RID, bool, float, const Color &, const Color &, float, float, float, float, float, bool, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_fog_enabled, RID)
|
||||
PASS1RC(Color, environment_get_fog_light_color, RID)
|
||||
PASS1RC(float, environment_get_fog_light_energy, RID)
|
||||
PASS1RC(float, environment_get_fog_sun_scatter, RID)
|
||||
PASS1RC(float, environment_get_fog_density, RID)
|
||||
PASS1RC(float, environment_get_fog_height, RID)
|
||||
PASS1RC(float, environment_get_fog_height_density, RID)
|
||||
PASS1RC(float, environment_get_fog_aerial_perspective, RID)
|
||||
|
||||
PASS2(environment_set_volumetric_fog_volume_size, int, int)
|
||||
PASS1(environment_set_volumetric_fog_filter_active, bool)
|
||||
|
||||
// Volumentric Fog
|
||||
PASS13(environment_set_volumetric_fog, RID, bool, float, const Color &, const Color &, float, float, float, float, float, bool, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_volumetric_fog_enabled, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_density, RID)
|
||||
PASS1RC(Color, environment_get_volumetric_fog_scattering, RID)
|
||||
PASS1RC(Color, environment_get_volumetric_fog_emission, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_emission_energy, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_anisotropy, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_length, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_detail_spread, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_gi_inject, RID)
|
||||
PASS1RC(bool, environment_get_volumetric_fog_temporal_reprojection, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_temporal_reprojection_amount, RID)
|
||||
PASS1RC(float, environment_get_volumetric_fog_ambient_inject, RID)
|
||||
|
||||
// Glow
|
||||
PASS13(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, RS::EnvironmentGlowBlendMode, float, float, float, float, RID)
|
||||
|
||||
PASS1RC(bool, environment_get_glow_enabled, RID)
|
||||
PASS1RC(Vector<float>, environment_get_glow_levels, RID)
|
||||
PASS1RC(float, environment_get_glow_intensity, RID)
|
||||
PASS1RC(float, environment_get_glow_strength, RID)
|
||||
PASS1RC(float, environment_get_glow_bloom, RID)
|
||||
PASS1RC(float, environment_get_glow_mix, RID)
|
||||
PASS1RC(RS::EnvironmentGlowBlendMode, environment_get_glow_blend_mode, RID)
|
||||
PASS1RC(float, environment_get_glow_hdr_bleed_threshold, RID)
|
||||
PASS1RC(float, environment_get_glow_hdr_luminance_cap, RID)
|
||||
PASS1RC(float, environment_get_glow_hdr_bleed_scale, RID)
|
||||
PASS1RC(float, environment_get_glow_map_strength, RID)
|
||||
PASS1RC(RID, environment_get_glow_map, RID)
|
||||
|
||||
PASS1(environment_glow_set_use_bicubic_upscale, bool)
|
||||
PASS1(environment_glow_set_use_high_quality, bool)
|
||||
|
||||
// SSR
|
||||
PASS6(environment_set_ssr, RID, bool, int, float, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_ssr_enabled, RID)
|
||||
PASS1RC(int, environment_get_ssr_max_steps, RID)
|
||||
PASS1RC(float, environment_get_ssr_fade_in, RID)
|
||||
PASS1RC(float, environment_get_ssr_fade_out, RID)
|
||||
PASS1RC(float, environment_get_ssr_depth_tolerance, RID)
|
||||
|
||||
PASS1(environment_set_ssr_roughness_quality, RS::EnvironmentSSRRoughnessQuality)
|
||||
|
||||
// SSAO
|
||||
PASS10(environment_set_ssao, RID, bool, float, float, float, float, float, float, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_ssao_enabled, RID)
|
||||
PASS1RC(float, environment_get_ssao_radius, RID)
|
||||
PASS1RC(float, environment_get_ssao_intensity, RID)
|
||||
PASS1RC(float, environment_get_ssao_power, RID)
|
||||
PASS1RC(float, environment_get_ssao_detail, RID)
|
||||
PASS1RC(float, environment_get_ssao_horizon, RID)
|
||||
PASS1RC(float, environment_get_ssao_sharpness, RID)
|
||||
PASS1RC(float, environment_get_ssao_direct_light_affect, RID)
|
||||
PASS1RC(float, environment_get_ssao_ao_channel_affect, RID)
|
||||
|
||||
PASS6(environment_set_ssao_quality, RS::EnvironmentSSAOQuality, bool, float, int, float, float)
|
||||
|
||||
// SSIL
|
||||
PASS6(environment_set_ssil, RID, bool, float, float, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_ssil_enabled, RID)
|
||||
PASS1RC(float, environment_get_ssil_radius, RID)
|
||||
PASS1RC(float, environment_get_ssil_intensity, RID)
|
||||
PASS1RC(float, environment_get_ssil_sharpness, RID)
|
||||
PASS1RC(float, environment_get_ssil_normal_rejection, RID)
|
||||
|
||||
PASS6(environment_set_ssil_quality, RS::EnvironmentSSILQuality, bool, float, int, float, float)
|
||||
|
||||
// SDFGI
|
||||
|
||||
PASS11(environment_set_sdfgi, RID, bool, int, float, RS::EnvironmentSDFGIYScale, bool, float, bool, float, float, float)
|
||||
|
||||
PASS1RC(bool, environment_get_sdfgi_enabled, RID)
|
||||
PASS1RC(int, environment_get_sdfgi_cascades, RID)
|
||||
PASS1RC(float, environment_get_sdfgi_min_cell_size, RID)
|
||||
PASS1RC(bool, environment_get_sdfgi_use_occlusion, RID)
|
||||
PASS1RC(float, environment_get_sdfgi_bounce_feedback, RID)
|
||||
PASS1RC(bool, environment_get_sdfgi_read_sky_light, RID)
|
||||
PASS1RC(float, environment_get_sdfgi_energy, RID)
|
||||
PASS1RC(float, environment_get_sdfgi_normal_bias, RID)
|
||||
PASS1RC(float, environment_get_sdfgi_probe_bias, RID)
|
||||
PASS1RC(RS::EnvironmentSDFGIYScale, environment_get_sdfgi_y_scale, RID)
|
||||
|
||||
PASS1(environment_set_sdfgi_ray_count, RS::EnvironmentSDFGIRayCount)
|
||||
PASS1(environment_set_sdfgi_frames_to_converge, RS::EnvironmentSDFGIFramesToConverge)
|
||||
PASS1(environment_set_sdfgi_frames_to_update_light, RS::EnvironmentSDFGIFramesToUpdateLight)
|
||||
|
||||
PASS1RC(RS::EnvironmentBG, environment_get_background, RID)
|
||||
PASS1RC(int, environment_get_canvas_max_layer, RID)
|
||||
// Adjustment
|
||||
PASS7(environment_set_adjustment, RID, bool, float, float, float, bool, RID)
|
||||
|
||||
PASS1RC(bool, environment_get_adjustments_enabled, RID)
|
||||
PASS1RC(float, environment_get_adjustments_brightness, RID)
|
||||
PASS1RC(float, environment_get_adjustments_contrast, RID)
|
||||
PASS1RC(float, environment_get_adjustments_saturation, RID)
|
||||
PASS1RC(bool, environment_get_use_1d_color_correction, RID)
|
||||
PASS1RC(RID, environment_get_color_correction, RID)
|
||||
|
||||
PASS3R(Ref<Image>, environment_bake_panorama, RID, bool, const Size2i &)
|
||||
|
||||
|
|
|
@ -183,3 +183,461 @@ void RendererSceneRender::CameraData::set_multiview_camera(uint32_t p_view_count
|
|||
view_projection[v] = p_projections[v] * Projection(view_offset[v].inverse());
|
||||
}
|
||||
}
|
||||
|
||||
/* Environment API */
|
||||
|
||||
RID RendererSceneRender::environment_allocate() {
|
||||
return environment_storage.environment_allocate();
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_initialize(RID p_rid) {
|
||||
environment_storage.environment_initialize(p_rid);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_free(RID p_rid) {
|
||||
environment_storage.environment_free(p_rid);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::is_environment(RID p_rid) const {
|
||||
return environment_storage.is_environment(p_rid);
|
||||
}
|
||||
|
||||
// background
|
||||
|
||||
void RendererSceneRender::environment_set_background(RID p_env, RS::EnvironmentBG p_bg) {
|
||||
environment_storage.environment_set_background(p_env, p_bg);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_sky(RID p_env, RID p_sky) {
|
||||
environment_storage.environment_set_sky(p_env, p_sky);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_sky_custom_fov(RID p_env, float p_scale) {
|
||||
environment_storage.environment_set_sky_custom_fov(p_env, p_scale);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
|
||||
environment_storage.environment_set_sky_orientation(p_env, p_orientation);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_bg_color(RID p_env, const Color &p_color) {
|
||||
environment_storage.environment_set_bg_color(p_env, p_color);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_bg_energy(RID p_env, float p_energy) {
|
||||
environment_storage.environment_set_bg_energy(p_env, p_energy);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_canvas_max_layer(RID p_env, int p_max_layer) {
|
||||
environment_storage.environment_set_canvas_max_layer(p_env, p_max_layer);
|
||||
}
|
||||
|
||||
void RendererSceneRender::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
environment_storage.environment_set_ambient_light(p_env, p_color, p_ambient, p_energy, p_sky_contribution, p_reflection_source);
|
||||
}
|
||||
|
||||
RS::EnvironmentBG RendererSceneRender::environment_get_background(RID p_env) const {
|
||||
return environment_storage.environment_get_background(p_env);
|
||||
}
|
||||
|
||||
RID RendererSceneRender::environment_get_sky(RID p_env) const {
|
||||
return environment_storage.environment_get_sky(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sky_custom_fov(RID p_env) const {
|
||||
return environment_storage.environment_get_sky_custom_fov(p_env);
|
||||
}
|
||||
|
||||
Basis RendererSceneRender::environment_get_sky_orientation(RID p_env) const {
|
||||
return environment_storage.environment_get_sky_orientation(p_env);
|
||||
}
|
||||
|
||||
Color RendererSceneRender::environment_get_bg_color(RID p_env) const {
|
||||
return environment_storage.environment_get_bg_color(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_bg_energy(RID p_env) const {
|
||||
return environment_storage.environment_get_bg_energy(p_env);
|
||||
}
|
||||
|
||||
int RendererSceneRender::environment_get_canvas_max_layer(RID p_env) const {
|
||||
return environment_storage.environment_get_canvas_max_layer(p_env);
|
||||
}
|
||||
|
||||
RS::EnvironmentAmbientSource RendererSceneRender::environment_get_ambient_source(RID p_env) const {
|
||||
return environment_storage.environment_get_ambient_source(p_env);
|
||||
}
|
||||
|
||||
Color RendererSceneRender::environment_get_ambient_light(RID p_env) const {
|
||||
return environment_storage.environment_get_ambient_light(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ambient_light_energy(RID p_env) const {
|
||||
return environment_storage.environment_get_ambient_light_energy(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ambient_sky_contribution(RID p_env) const {
|
||||
return environment_storage.environment_get_ambient_sky_contribution(p_env);
|
||||
}
|
||||
|
||||
RS::EnvironmentReflectionSource RendererSceneRender::environment_get_reflection_source(RID p_env) const {
|
||||
return environment_storage.environment_get_reflection_source(p_env);
|
||||
}
|
||||
|
||||
// Tonemap
|
||||
|
||||
void RendererSceneRender::environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) {
|
||||
environment_storage.environment_set_tonemap(p_env, p_tone_mapper, p_exposure, p_white, p_auto_exposure, p_min_luminance, p_max_luminance, p_auto_exp_speed, p_auto_exp_scale);
|
||||
}
|
||||
|
||||
RS::EnvironmentToneMapper RendererSceneRender::environment_get_tone_mapper(RID p_env) const {
|
||||
return environment_storage.environment_get_tone_mapper(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_exposure(RID p_env) const {
|
||||
return environment_storage.environment_get_exposure(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_white(RID p_env) const {
|
||||
return environment_storage.environment_get_white(p_env);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_auto_exposure(RID p_env) const {
|
||||
return environment_storage.environment_get_auto_exposure(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_min_luminance(RID p_env) const {
|
||||
return environment_storage.environment_get_min_luminance(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_max_luminance(RID p_env) const {
|
||||
return environment_storage.environment_get_max_luminance(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_auto_exp_speed(RID p_env) const {
|
||||
return environment_storage.environment_get_auto_exp_speed(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_auto_exp_scale(RID p_env) const {
|
||||
return environment_storage.environment_get_auto_exp_scale(p_env);
|
||||
}
|
||||
|
||||
uint64_t RendererSceneRender::environment_get_auto_exposure_version(RID p_env) const {
|
||||
return environment_storage.environment_get_auto_exposure_version(p_env);
|
||||
}
|
||||
|
||||
// Fog
|
||||
|
||||
void RendererSceneRender::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) {
|
||||
environment_storage.environment_set_fog(p_env, p_enable, p_light_color, p_light_energy, p_sun_scatter, p_density, p_height, p_height_density, p_aerial_perspective);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_fog_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_enabled(p_env);
|
||||
}
|
||||
|
||||
Color RendererSceneRender::environment_get_fog_light_color(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_light_color(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_light_energy(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_light_energy(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_sun_scatter(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_sun_scatter(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_density(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_density(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_height(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_height(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_height_density(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_height_density(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_fog_aerial_perspective(RID p_env) const {
|
||||
return environment_storage.environment_get_fog_aerial_perspective(p_env);
|
||||
}
|
||||
|
||||
// Volumetric Fog
|
||||
|
||||
void RendererSceneRender::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) {
|
||||
environment_storage.environment_set_volumetric_fog(p_env, p_enable, p_density, p_albedo, p_emission, p_emission_energy, p_anisotropy, p_length, p_detail_spread, p_gi_inject, p_temporal_reprojection, p_temporal_reprojection_amount, p_ambient_inject);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_volumetric_fog_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_enabled(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_density(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_density(p_env);
|
||||
}
|
||||
|
||||
Color RendererSceneRender::environment_get_volumetric_fog_scattering(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_scattering(p_env);
|
||||
}
|
||||
|
||||
Color RendererSceneRender::environment_get_volumetric_fog_emission(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_emission(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_emission_energy(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_emission_energy(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_anisotropy(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_anisotropy(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_length(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_length(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_detail_spread(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_detail_spread(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_gi_inject(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_gi_inject(p_env);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_volumetric_fog_temporal_reprojection(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_temporal_reprojection(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_temporal_reprojection_amount(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_volumetric_fog_ambient_inject(RID p_env) const {
|
||||
return environment_storage.environment_get_volumetric_fog_ambient_inject(p_env);
|
||||
}
|
||||
|
||||
// GLOW
|
||||
|
||||
void RendererSceneRender::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
|
||||
environment_storage.environment_set_glow(p_env, p_enable, p_levels, p_intensity, p_strength, p_mix, p_bloom_threshold, p_blend_mode, p_hdr_bleed_threshold, p_hdr_bleed_scale, p_hdr_luminance_cap, p_glow_map_strength, p_glow_map);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_glow_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_enabled(p_env);
|
||||
}
|
||||
|
||||
Vector<float> RendererSceneRender::environment_get_glow_levels(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_levels(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_intensity(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_intensity(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_strength(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_strength(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_bloom(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_bloom(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_mix(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_mix(p_env);
|
||||
}
|
||||
|
||||
RS::EnvironmentGlowBlendMode RendererSceneRender::environment_get_glow_blend_mode(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_blend_mode(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_hdr_bleed_threshold(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_hdr_bleed_threshold(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_hdr_luminance_cap(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_hdr_luminance_cap(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_hdr_bleed_scale(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_hdr_bleed_scale(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_glow_map_strength(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_map_strength(p_env);
|
||||
}
|
||||
|
||||
RID RendererSceneRender::environment_get_glow_map(RID p_env) const {
|
||||
return environment_storage.environment_get_glow_map(p_env);
|
||||
}
|
||||
|
||||
// SSR
|
||||
|
||||
void RendererSceneRender::environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
|
||||
environment_storage.environment_set_ssr(p_env, p_enable, p_max_steps, p_fade_int, p_fade_out, p_depth_tolerance);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_ssr_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_ssr_enabled(p_env);
|
||||
}
|
||||
|
||||
int RendererSceneRender::environment_get_ssr_max_steps(RID p_env) const {
|
||||
return environment_storage.environment_get_ssr_max_steps(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssr_fade_in(RID p_env) const {
|
||||
return environment_storage.environment_get_ssr_fade_in(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssr_fade_out(RID p_env) const {
|
||||
return environment_storage.environment_get_ssr_fade_out(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssr_depth_tolerance(RID p_env) const {
|
||||
return environment_storage.environment_get_ssr_depth_tolerance(p_env);
|
||||
}
|
||||
|
||||
// SSAO
|
||||
|
||||
void RendererSceneRender::environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
|
||||
environment_storage.environment_set_ssao(p_env, p_enable, p_radius, p_intensity, p_power, p_detail, p_horizon, p_sharpness, p_light_affect, p_ao_channel_affect);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_ssao_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_enabled(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_radius(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_radius(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_intensity(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_intensity(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_power(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_power(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_detail(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_detail(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_horizon(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_horizon(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_sharpness(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_sharpness(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_direct_light_affect(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_direct_light_affect(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssao_ao_channel_affect(RID p_env) const {
|
||||
return environment_storage.environment_get_ssao_ao_channel_affect(p_env);
|
||||
}
|
||||
|
||||
// SSIL
|
||||
|
||||
void RendererSceneRender::environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) {
|
||||
environment_storage.environment_set_ssil(p_env, p_enable, p_radius, p_intensity, p_sharpness, p_normal_rejection);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_ssil_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_ssil_enabled(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssil_radius(RID p_env) const {
|
||||
return environment_storage.environment_get_ssil_radius(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssil_intensity(RID p_env) const {
|
||||
return environment_storage.environment_get_ssil_intensity(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssil_sharpness(RID p_env) const {
|
||||
return environment_storage.environment_get_ssil_sharpness(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_ssil_normal_rejection(RID p_env) const {
|
||||
return environment_storage.environment_get_ssil_normal_rejection(p_env);
|
||||
}
|
||||
|
||||
// SDFGI
|
||||
|
||||
void RendererSceneRender::environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
environment_storage.environment_set_sdfgi(p_env, p_enable, p_cascades, p_min_cell_size, p_y_scale, p_use_occlusion, p_bounce_feedback, p_read_sky, p_energy, p_normal_bias, p_probe_bias);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_sdfgi_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_enabled(p_env);
|
||||
}
|
||||
|
||||
int RendererSceneRender::environment_get_sdfgi_cascades(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_cascades(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sdfgi_min_cell_size(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_min_cell_size(p_env);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_sdfgi_use_occlusion(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_use_occlusion(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sdfgi_bounce_feedback(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_bounce_feedback(p_env);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_sdfgi_read_sky_light(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_read_sky_light(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sdfgi_energy(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_energy(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sdfgi_normal_bias(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_normal_bias(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_sdfgi_probe_bias(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_probe_bias(p_env);
|
||||
}
|
||||
|
||||
RS::EnvironmentSDFGIYScale RendererSceneRender::environment_get_sdfgi_y_scale(RID p_env) const {
|
||||
return environment_storage.environment_get_sdfgi_y_scale(p_env);
|
||||
}
|
||||
|
||||
// Adjustments
|
||||
|
||||
void RendererSceneRender::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) {
|
||||
environment_storage.environment_set_adjustment(p_env, p_enable, p_brightness, p_contrast, p_saturation, p_use_1d_color_correction, p_color_correction);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_adjustments_enabled(RID p_env) const {
|
||||
return environment_storage.environment_get_adjustments_enabled(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_adjustments_brightness(RID p_env) const {
|
||||
return environment_storage.environment_get_adjustments_brightness(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_adjustments_contrast(RID p_env) const {
|
||||
return environment_storage.environment_get_adjustments_contrast(p_env);
|
||||
}
|
||||
|
||||
float RendererSceneRender::environment_get_adjustments_saturation(RID p_env) const {
|
||||
return environment_storage.environment_get_adjustments_saturation(p_env);
|
||||
}
|
||||
|
||||
bool RendererSceneRender::environment_get_use_1d_color_correction(RID p_env) const {
|
||||
return environment_storage.environment_get_use_1d_color_correction(p_env);
|
||||
}
|
||||
|
||||
RID RendererSceneRender::environment_get_color_correction(RID p_env) const {
|
||||
return environment_storage.environment_get_color_correction(p_env);
|
||||
}
|
||||
|
|
|
@ -35,9 +35,13 @@
|
|||
#include "core/templates/paged_array.h"
|
||||
#include "servers/rendering/renderer_geometry_instance.h"
|
||||
#include "servers/rendering/renderer_scene.h"
|
||||
#include "servers/rendering/storage/environment_storage.h"
|
||||
#include "storage/utilities.h"
|
||||
|
||||
class RendererSceneRender {
|
||||
private:
|
||||
RendererEnvironmentStorage environment_storage;
|
||||
|
||||
public:
|
||||
enum {
|
||||
MAX_DIRECTIONAL_LIGHTS = 8,
|
||||
|
@ -81,57 +85,160 @@ public:
|
|||
|
||||
/* ENVIRONMENT API */
|
||||
|
||||
virtual RID environment_allocate() = 0;
|
||||
virtual void environment_initialize(RID p_rid) = 0;
|
||||
RID environment_allocate();
|
||||
void environment_initialize(RID p_rid);
|
||||
void environment_free(RID p_rid);
|
||||
|
||||
virtual void environment_set_background(RID p_env, RS::EnvironmentBG p_bg) = 0;
|
||||
virtual void environment_set_sky(RID p_env, RID p_sky) = 0;
|
||||
virtual void environment_set_sky_custom_fov(RID p_env, float p_scale) = 0;
|
||||
virtual void environment_set_sky_orientation(RID p_env, const Basis &p_orientation) = 0;
|
||||
virtual void environment_set_bg_color(RID p_env, const Color &p_color) = 0;
|
||||
virtual void environment_set_bg_energy(RID p_env, float p_energy) = 0;
|
||||
virtual void environment_set_canvas_max_layer(RID p_env, int p_max_layer) = 0;
|
||||
virtual void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG) = 0;
|
||||
bool is_environment(RID p_env) const;
|
||||
|
||||
// Background
|
||||
void environment_set_background(RID p_env, RS::EnvironmentBG p_bg);
|
||||
void environment_set_sky(RID p_env, RID p_sky);
|
||||
void environment_set_sky_custom_fov(RID p_env, float p_scale);
|
||||
void environment_set_sky_orientation(RID p_env, const Basis &p_orientation);
|
||||
void environment_set_bg_color(RID p_env, const Color &p_color);
|
||||
void environment_set_bg_energy(RID p_env, float p_energy);
|
||||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer);
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG);
|
||||
// FIXME: Disabled during Vulkan refactoring, should be ported.
|
||||
#if 0
|
||||
virtual void environment_set_camera_feed_id(RID p_env, int p_camera_feed_id) = 0;
|
||||
void environment_set_camera_feed_id(RID p_env, int p_camera_feed_id);
|
||||
#endif
|
||||
|
||||
virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) = 0;
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) = 0;
|
||||
RS::EnvironmentBG environment_get_background(RID p_env) const;
|
||||
RID environment_get_sky(RID p_env) const;
|
||||
float environment_get_sky_custom_fov(RID p_env) const;
|
||||
Basis environment_get_sky_orientation(RID p_env) const;
|
||||
Color environment_get_bg_color(RID p_env) const;
|
||||
float environment_get_bg_energy(RID p_env) const;
|
||||
int environment_get_canvas_max_layer(RID p_env) const;
|
||||
RS::EnvironmentAmbientSource environment_get_ambient_source(RID p_env) const;
|
||||
Color environment_get_ambient_light(RID p_env) const;
|
||||
float environment_get_ambient_light_energy(RID p_env) const;
|
||||
float environment_get_ambient_sky_contribution(RID p_env) const;
|
||||
RS::EnvironmentReflectionSource environment_get_reflection_source(RID p_env) const;
|
||||
|
||||
// Tonemap
|
||||
void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale);
|
||||
RS::EnvironmentToneMapper environment_get_tone_mapper(RID p_env) const;
|
||||
float environment_get_exposure(RID p_env) const;
|
||||
float environment_get_white(RID p_env) const;
|
||||
bool environment_get_auto_exposure(RID p_env) const;
|
||||
float environment_get_min_luminance(RID p_env) const;
|
||||
float environment_get_max_luminance(RID p_env) const;
|
||||
float environment_get_auto_exp_speed(RID p_env) const;
|
||||
float environment_get_auto_exp_scale(RID p_env) const;
|
||||
uint64_t environment_get_auto_exposure_version(RID p_env) const;
|
||||
|
||||
// Fog
|
||||
void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective);
|
||||
bool environment_get_fog_enabled(RID p_env) const;
|
||||
Color environment_get_fog_light_color(RID p_env) const;
|
||||
float environment_get_fog_light_energy(RID p_env) const;
|
||||
float environment_get_fog_sun_scatter(RID p_env) const;
|
||||
float environment_get_fog_density(RID p_env) const;
|
||||
float environment_get_fog_height(RID p_env) const;
|
||||
float environment_get_fog_height_density(RID p_env) const;
|
||||
float environment_get_fog_aerial_perspective(RID p_env) const;
|
||||
|
||||
// Volumetric Fog
|
||||
void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject);
|
||||
bool environment_get_volumetric_fog_enabled(RID p_env) const;
|
||||
float environment_get_volumetric_fog_density(RID p_env) const;
|
||||
Color environment_get_volumetric_fog_scattering(RID p_env) const;
|
||||
Color environment_get_volumetric_fog_emission(RID p_env) const;
|
||||
float environment_get_volumetric_fog_emission_energy(RID p_env) const;
|
||||
float environment_get_volumetric_fog_anisotropy(RID p_env) const;
|
||||
float environment_get_volumetric_fog_length(RID p_env) const;
|
||||
float environment_get_volumetric_fog_detail_spread(RID p_env) const;
|
||||
float environment_get_volumetric_fog_gi_inject(RID p_env) const;
|
||||
bool environment_get_volumetric_fog_temporal_reprojection(RID p_env) const;
|
||||
float environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const;
|
||||
float environment_get_volumetric_fog_ambient_inject(RID p_env) const;
|
||||
|
||||
virtual void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) = 0;
|
||||
virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) = 0;
|
||||
virtual void environment_set_volumetric_fog_filter_active(bool p_enable) = 0;
|
||||
|
||||
virtual void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) = 0;
|
||||
// GLOW
|
||||
void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map);
|
||||
bool environment_get_glow_enabled(RID p_env) const;
|
||||
Vector<float> environment_get_glow_levels(RID p_env) const;
|
||||
float environment_get_glow_intensity(RID p_env) const;
|
||||
float environment_get_glow_strength(RID p_env) const;
|
||||
float environment_get_glow_bloom(RID p_env) const;
|
||||
float environment_get_glow_mix(RID p_env) const;
|
||||
RS::EnvironmentGlowBlendMode environment_get_glow_blend_mode(RID p_env) const;
|
||||
float environment_get_glow_hdr_bleed_threshold(RID p_env) const;
|
||||
float environment_get_glow_hdr_luminance_cap(RID p_env) const;
|
||||
float environment_get_glow_hdr_bleed_scale(RID p_env) const;
|
||||
float environment_get_glow_map_strength(RID p_env) const;
|
||||
RID environment_get_glow_map(RID p_env) const;
|
||||
|
||||
virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0;
|
||||
virtual void environment_glow_set_use_high_quality(bool p_enable) = 0;
|
||||
|
||||
// SSR
|
||||
void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance);
|
||||
bool environment_get_ssr_enabled(RID p_env) const;
|
||||
int environment_get_ssr_max_steps(RID p_env) const;
|
||||
float environment_get_ssr_fade_in(RID p_env) const;
|
||||
float environment_get_ssr_fade_out(RID p_env) const;
|
||||
float environment_get_ssr_depth_tolerance(RID p_env) const;
|
||||
|
||||
virtual void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) = 0;
|
||||
|
||||
virtual void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) = 0;
|
||||
// SSAO
|
||||
void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect);
|
||||
bool environment_get_ssao_enabled(RID p_env) const;
|
||||
float environment_get_ssao_radius(RID p_env) const;
|
||||
float environment_get_ssao_intensity(RID p_env) const;
|
||||
float environment_get_ssao_power(RID p_env) const;
|
||||
float environment_get_ssao_detail(RID p_env) const;
|
||||
float environment_get_ssao_horizon(RID p_env) const;
|
||||
float environment_get_ssao_sharpness(RID p_env) const;
|
||||
float environment_get_ssao_direct_light_affect(RID p_env) const;
|
||||
float environment_get_ssao_ao_channel_affect(RID p_env) const;
|
||||
|
||||
virtual void environment_set_ssao_quality(RS::EnvironmentSSAOQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) = 0;
|
||||
|
||||
virtual void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) = 0;
|
||||
// SSIL
|
||||
void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection);
|
||||
bool environment_get_ssil_enabled(RID p_env) const;
|
||||
float environment_get_ssil_radius(RID p_env) const;
|
||||
float environment_get_ssil_intensity(RID p_env) const;
|
||||
float environment_get_ssil_sharpness(RID p_env) const;
|
||||
float environment_get_ssil_normal_rejection(RID p_env) const;
|
||||
|
||||
virtual void environment_set_ssil_quality(RS::EnvironmentSSILQuality p_quality, bool p_half_size, float p_adaptive_target, int p_blur_passes, float p_fadeout_from, float p_fadeout_to) = 0;
|
||||
|
||||
virtual void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) = 0;
|
||||
// SDFGI
|
||||
void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias);
|
||||
bool environment_get_sdfgi_enabled(RID p_env) const;
|
||||
int environment_get_sdfgi_cascades(RID p_env) const;
|
||||
float environment_get_sdfgi_min_cell_size(RID p_env) const;
|
||||
bool environment_get_sdfgi_use_occlusion(RID p_env) const;
|
||||
float environment_get_sdfgi_bounce_feedback(RID p_env) const;
|
||||
bool environment_get_sdfgi_read_sky_light(RID p_env) const;
|
||||
float environment_get_sdfgi_energy(RID p_env) const;
|
||||
float environment_get_sdfgi_normal_bias(RID p_env) const;
|
||||
float environment_get_sdfgi_probe_bias(RID p_env) const;
|
||||
RS::EnvironmentSDFGIYScale environment_get_sdfgi_y_scale(RID p_env) const;
|
||||
|
||||
virtual void environment_set_sdfgi_ray_count(RS::EnvironmentSDFGIRayCount p_ray_count) = 0;
|
||||
virtual void environment_set_sdfgi_frames_to_converge(RS::EnvironmentSDFGIFramesToConverge p_frames) = 0;
|
||||
virtual void environment_set_sdfgi_frames_to_update_light(RS::EnvironmentSDFGIFramesToUpdateLight p_update) = 0;
|
||||
|
||||
virtual void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) = 0;
|
||||
|
||||
virtual void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) = 0;
|
||||
|
||||
virtual void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective) = 0;
|
||||
// Adjustment
|
||||
void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction);
|
||||
bool environment_get_adjustments_enabled(RID p_env) const;
|
||||
float environment_get_adjustments_brightness(RID p_env) const;
|
||||
float environment_get_adjustments_contrast(RID p_env) const;
|
||||
float environment_get_adjustments_saturation(RID p_env) const;
|
||||
bool environment_get_use_1d_color_correction(RID p_env) const;
|
||||
RID environment_get_color_correction(RID p_env) const;
|
||||
|
||||
virtual Ref<Image> environment_bake_panorama(RID p_env, bool p_bake_irradiance, const Size2i &p_size) = 0;
|
||||
|
||||
virtual bool is_environment(RID p_env) const = 0;
|
||||
virtual RS::EnvironmentBG environment_get_background(RID p_env) const = 0;
|
||||
virtual int environment_get_canvas_max_layer(RID p_env) const = 0;
|
||||
|
||||
virtual RID camera_effects_allocate() = 0;
|
||||
virtual void camera_effects_initialize(RID p_rid) = 0;
|
||||
|
||||
|
|
769
servers/rendering/storage/environment_storage.cpp
Normal file
769
servers/rendering/storage/environment_storage.cpp
Normal file
|
@ -0,0 +1,769 @@
|
|||
/*************************************************************************/
|
||||
/* environment_storage.cpp */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#include "environment_storage.h"
|
||||
|
||||
uint64_t RendererEnvironmentStorage::auto_exposure_counter = 2;
|
||||
|
||||
RID RendererEnvironmentStorage::environment_allocate() {
|
||||
return environment_owner.allocate_rid();
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_initialize(RID p_rid) {
|
||||
environment_owner.initialize_rid(p_rid, Environment());
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_free(RID p_rid) {
|
||||
environment_owner.free(p_rid);
|
||||
}
|
||||
|
||||
// Background
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_background(RID p_env, RS::EnvironmentBG p_bg) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->background = p_bg;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_sky(RID p_env, RID p_sky) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky = p_sky;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_sky_custom_fov(RID p_env, float p_scale) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_custom_fov = p_scale;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sky_orientation = p_orientation;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_bg_color(RID p_env, const Color &p_color) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_color = p_color;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_bg_energy(RID p_env, float p_energy) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->bg_energy = p_energy;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_canvas_max_layer(RID p_env, int p_max_layer) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->canvas_max_layer = p_max_layer;
|
||||
}
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ambient_light = p_color;
|
||||
env->ambient_source = p_ambient;
|
||||
env->ambient_light_energy = p_energy;
|
||||
env->ambient_sky_contribution = p_sky_contribution;
|
||||
env->reflection_source = p_reflection_source;
|
||||
}
|
||||
|
||||
RS::EnvironmentBG RendererEnvironmentStorage::environment_get_background(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_BG_CLEAR_COLOR);
|
||||
return env->background;
|
||||
}
|
||||
|
||||
RID RendererEnvironmentStorage::environment_get_sky(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RID());
|
||||
return env->sky;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sky_custom_fov(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->sky_custom_fov;
|
||||
}
|
||||
|
||||
Basis RendererEnvironmentStorage::environment_get_sky_orientation(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Basis());
|
||||
return env->sky_orientation;
|
||||
}
|
||||
|
||||
Color RendererEnvironmentStorage::environment_get_bg_color(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color());
|
||||
return env->bg_color;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_bg_energy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->bg_energy;
|
||||
}
|
||||
|
||||
int RendererEnvironmentStorage::environment_get_canvas_max_layer(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->canvas_max_layer;
|
||||
}
|
||||
|
||||
RS::EnvironmentAmbientSource RendererEnvironmentStorage::environment_get_ambient_source(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_AMBIENT_SOURCE_BG);
|
||||
return env->ambient_source;
|
||||
}
|
||||
|
||||
Color RendererEnvironmentStorage::environment_get_ambient_light(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color());
|
||||
return env->ambient_light;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ambient_light_energy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->ambient_light_energy;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ambient_sky_contribution(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->ambient_sky_contribution;
|
||||
}
|
||||
|
||||
RS::EnvironmentReflectionSource RendererEnvironmentStorage::environment_get_reflection_source(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_REFLECTION_SOURCE_BG);
|
||||
return env->reflection_source;
|
||||
}
|
||||
|
||||
// Tonemap
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->exposure = p_exposure;
|
||||
env->tone_mapper = p_tone_mapper;
|
||||
if (!env->auto_exposure && p_auto_exposure) {
|
||||
env->auto_exposure_version = ++auto_exposure_counter;
|
||||
}
|
||||
env->auto_exposure = p_auto_exposure;
|
||||
env->white = p_white;
|
||||
env->min_luminance = p_min_luminance;
|
||||
env->max_luminance = p_max_luminance;
|
||||
env->auto_exp_speed = p_auto_exp_speed;
|
||||
env->auto_exp_scale = p_auto_exp_scale;
|
||||
}
|
||||
|
||||
RS::EnvironmentToneMapper RendererEnvironmentStorage::environment_get_tone_mapper(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_TONE_MAPPER_LINEAR);
|
||||
return env->tone_mapper;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_exposure(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->exposure;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_white(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->white;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_auto_exposure(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->auto_exposure;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_min_luminance(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.2);
|
||||
return env->min_luminance;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_max_luminance(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 8.0);
|
||||
return env->max_luminance;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_auto_exp_speed(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.2);
|
||||
return env->auto_exp_speed;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_auto_exp_scale(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.5);
|
||||
return env->auto_exp_scale;
|
||||
}
|
||||
|
||||
uint64_t RendererEnvironmentStorage::environment_get_auto_exposure_version(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0);
|
||||
return env->auto_exposure_version;
|
||||
}
|
||||
|
||||
// Fog
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->fog_enabled = p_enable;
|
||||
env->fog_light_color = p_light_color;
|
||||
env->fog_light_energy = p_light_energy;
|
||||
env->fog_sun_scatter = p_sun_scatter;
|
||||
env->fog_density = p_density;
|
||||
env->fog_height = p_height;
|
||||
env->fog_height_density = p_height_density;
|
||||
env->fog_aerial_perspective = p_fog_aerial_perspective;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_fog_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->fog_enabled;
|
||||
}
|
||||
|
||||
Color RendererEnvironmentStorage::environment_get_fog_light_color(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color(0.5, 0.6, 0.7));
|
||||
return env->fog_light_color;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_light_energy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->fog_light_energy;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_sun_scatter(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->fog_sun_scatter;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_density(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.001);
|
||||
return env->fog_density;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_height(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->fog_height;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_height_density(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->fog_height_density;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_fog_aerial_perspective(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->fog_aerial_perspective;
|
||||
}
|
||||
|
||||
// Volumetric Fog
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->volumetric_fog_enabled = p_enable;
|
||||
env->volumetric_fog_density = p_density;
|
||||
env->volumetric_fog_scattering = p_albedo;
|
||||
env->volumetric_fog_emission = p_emission;
|
||||
env->volumetric_fog_emission_energy = p_emission_energy;
|
||||
env->volumetric_fog_anisotropy = p_anisotropy,
|
||||
env->volumetric_fog_length = p_length;
|
||||
env->volumetric_fog_detail_spread = p_detail_spread;
|
||||
env->volumetric_fog_gi_inject = p_gi_inject;
|
||||
env->volumetric_fog_temporal_reprojection = p_temporal_reprojection;
|
||||
env->volumetric_fog_temporal_reprojection_amount = p_temporal_reprojection_amount;
|
||||
env->volumetric_fog_ambient_inject = p_ambient_inject;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_volumetric_fog_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->volumetric_fog_enabled;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_density(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.01);
|
||||
return env->volumetric_fog_density;
|
||||
}
|
||||
|
||||
Color RendererEnvironmentStorage::environment_get_volumetric_fog_scattering(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color(1, 1, 1));
|
||||
return env->volumetric_fog_scattering;
|
||||
}
|
||||
|
||||
Color RendererEnvironmentStorage::environment_get_volumetric_fog_emission(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Color(0, 0, 0));
|
||||
return env->volumetric_fog_emission;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_emission_energy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->volumetric_fog_emission_energy;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_anisotropy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.2);
|
||||
return env->volumetric_fog_anisotropy;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_length(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 64.0);
|
||||
return env->volumetric_fog_length;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_detail_spread(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 2.0);
|
||||
return env->volumetric_fog_detail_spread;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_gi_inject(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->volumetric_fog_gi_inject;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_volumetric_fog_temporal_reprojection(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, true);
|
||||
return env->volumetric_fog_temporal_reprojection;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.9);
|
||||
return env->volumetric_fog_temporal_reprojection_amount;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_volumetric_fog_ambient_inject(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->volumetric_fog_ambient_inject;
|
||||
}
|
||||
|
||||
// GLOW
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");
|
||||
env->glow_enabled = p_enable;
|
||||
env->glow_levels = p_levels;
|
||||
env->glow_intensity = p_intensity;
|
||||
env->glow_strength = p_strength;
|
||||
env->glow_mix = p_mix;
|
||||
env->glow_bloom = p_bloom_threshold;
|
||||
env->glow_blend_mode = p_blend_mode;
|
||||
env->glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
|
||||
env->glow_hdr_bleed_scale = p_hdr_bleed_scale;
|
||||
env->glow_hdr_luminance_cap = p_hdr_luminance_cap;
|
||||
env->glow_map_strength = p_glow_map_strength;
|
||||
env->glow_map = p_glow_map;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_glow_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->glow_enabled;
|
||||
}
|
||||
|
||||
Vector<float> RendererEnvironmentStorage::environment_get_glow_levels(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, Vector<float>());
|
||||
return env->glow_levels;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_intensity(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.8);
|
||||
return env->glow_intensity;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_strength(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->glow_strength;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_bloom(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->glow_bloom;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_mix(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.01);
|
||||
return env->glow_mix;
|
||||
}
|
||||
|
||||
RS::EnvironmentGlowBlendMode RendererEnvironmentStorage::environment_get_glow_blend_mode(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT);
|
||||
return env->glow_blend_mode;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_hdr_bleed_threshold(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->glow_hdr_bleed_threshold;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_hdr_luminance_cap(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 12.0);
|
||||
return env->glow_hdr_luminance_cap;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_hdr_bleed_scale(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 2.0);
|
||||
return env->glow_hdr_bleed_scale;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_glow_map_strength(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->glow_map_strength;
|
||||
}
|
||||
|
||||
RID RendererEnvironmentStorage::environment_get_glow_map(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RID());
|
||||
return env->glow_map;
|
||||
}
|
||||
|
||||
// SSR
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ssr_enabled = p_enable;
|
||||
env->ssr_max_steps = p_max_steps;
|
||||
env->ssr_fade_in = p_fade_int;
|
||||
env->ssr_fade_out = p_fade_out;
|
||||
env->ssr_depth_tolerance = p_depth_tolerance;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_ssr_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssr_enabled;
|
||||
}
|
||||
|
||||
int RendererEnvironmentStorage::environment_get_ssr_max_steps(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 64);
|
||||
return env->ssr_max_steps;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssr_fade_in(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.15);
|
||||
return env->ssr_fade_in;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssr_fade_out(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 2.0);
|
||||
return env->ssr_fade_out;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssr_depth_tolerance(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.2);
|
||||
return env->ssr_depth_tolerance;
|
||||
}
|
||||
|
||||
// SSAO
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ssao_enabled = p_enable;
|
||||
env->ssao_radius = p_radius;
|
||||
env->ssao_intensity = p_intensity;
|
||||
env->ssao_power = p_power;
|
||||
env->ssao_detail = p_detail;
|
||||
env->ssao_horizon = p_horizon;
|
||||
env->ssao_sharpness = p_sharpness;
|
||||
env->ssao_direct_light_affect = p_light_affect;
|
||||
env->ssao_ao_channel_affect = p_ao_channel_affect;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_ssao_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssao_enabled;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_radius(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->ssao_radius;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_intensity(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 2.0);
|
||||
return env->ssao_intensity;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_power(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.5);
|
||||
return env->ssao_power;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_detail(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.5);
|
||||
return env->ssao_detail;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_horizon(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.06);
|
||||
return env->ssao_horizon;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_sharpness(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.98);
|
||||
return env->ssao_sharpness;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_direct_light_affect(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->ssao_direct_light_affect;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssao_ao_channel_affect(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.0);
|
||||
return env->ssao_ao_channel_affect;
|
||||
}
|
||||
|
||||
// SSIL
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->ssil_enabled = p_enable;
|
||||
env->ssil_radius = p_radius;
|
||||
env->ssil_intensity = p_intensity;
|
||||
env->ssil_sharpness = p_sharpness;
|
||||
env->ssil_normal_rejection = p_normal_rejection;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_ssil_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->ssil_enabled;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssil_radius(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 5.0);
|
||||
return env->ssil_radius;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssil_intensity(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->ssil_intensity;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssil_sharpness(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.98);
|
||||
return env->ssil_sharpness;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_ssil_normal_rejection(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->ssil_normal_rejection;
|
||||
}
|
||||
|
||||
// SDFGI
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->sdfgi_enabled = p_enable;
|
||||
env->sdfgi_cascades = p_cascades;
|
||||
env->sdfgi_min_cell_size = p_min_cell_size;
|
||||
env->sdfgi_use_occlusion = p_use_occlusion;
|
||||
env->sdfgi_bounce_feedback = p_bounce_feedback;
|
||||
env->sdfgi_read_sky_light = p_read_sky;
|
||||
env->sdfgi_energy = p_energy;
|
||||
env->sdfgi_normal_bias = p_normal_bias;
|
||||
env->sdfgi_probe_bias = p_probe_bias;
|
||||
env->sdfgi_y_scale = p_y_scale;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_sdfgi_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->sdfgi_enabled;
|
||||
}
|
||||
|
||||
int RendererEnvironmentStorage::environment_get_sdfgi_cascades(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 4);
|
||||
return env->sdfgi_cascades;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sdfgi_min_cell_size(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.2);
|
||||
return env->sdfgi_min_cell_size;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_sdfgi_use_occlusion(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->sdfgi_use_occlusion;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sdfgi_bounce_feedback(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 0.5);
|
||||
return env->sdfgi_bounce_feedback;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_sdfgi_read_sky_light(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, true);
|
||||
return env->sdfgi_read_sky_light;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sdfgi_energy(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->sdfgi_energy;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sdfgi_normal_bias(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.1);
|
||||
return env->sdfgi_normal_bias;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_sdfgi_probe_bias(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.1);
|
||||
return env->sdfgi_probe_bias;
|
||||
}
|
||||
|
||||
RS::EnvironmentSDFGIYScale RendererEnvironmentStorage::environment_get_sdfgi_y_scale(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RS::ENV_SDFGI_Y_SCALE_75_PERCENT);
|
||||
return env->sdfgi_y_scale;
|
||||
}
|
||||
|
||||
// Adjustments
|
||||
|
||||
void RendererEnvironmentStorage::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND(!env);
|
||||
env->adjustments_enabled = p_enable;
|
||||
env->adjustments_brightness = p_brightness;
|
||||
env->adjustments_contrast = p_contrast;
|
||||
env->adjustments_saturation = p_saturation;
|
||||
env->use_1d_color_correction = p_use_1d_color_correction;
|
||||
env->color_correction = p_color_correction;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_adjustments_enabled(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->adjustments_enabled;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_adjustments_brightness(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->adjustments_brightness;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_adjustments_contrast(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->adjustments_contrast;
|
||||
}
|
||||
|
||||
float RendererEnvironmentStorage::environment_get_adjustments_saturation(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, 1.0);
|
||||
return env->adjustments_saturation;
|
||||
}
|
||||
|
||||
bool RendererEnvironmentStorage::environment_get_use_1d_color_correction(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, false);
|
||||
return env->use_1d_color_correction;
|
||||
}
|
||||
|
||||
RID RendererEnvironmentStorage::environment_get_color_correction(RID p_env) const {
|
||||
Environment *env = environment_owner.get_or_null(p_env);
|
||||
ERR_FAIL_COND_V(!env, RID());
|
||||
return env->color_correction;
|
||||
}
|
296
servers/rendering/storage/environment_storage.h
Normal file
296
servers/rendering/storage/environment_storage.h
Normal file
|
@ -0,0 +1,296 @@
|
|||
/*************************************************************************/
|
||||
/* environment_storage.h */
|
||||
/*************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/*************************************************************************/
|
||||
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
|
||||
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/*************************************************************************/
|
||||
|
||||
#ifndef ENVIRONMENT_STORAGE_H
|
||||
#define ENVIRONMENT_STORAGE_H
|
||||
|
||||
#include "core/templates/rid_owner.h"
|
||||
#include "servers/rendering_server.h"
|
||||
|
||||
class RendererEnvironmentStorage {
|
||||
private:
|
||||
struct Environment {
|
||||
// Note, we capture and store all environment parameters received from Godot here.
|
||||
// Not all renderers support all effects and should just ignore the bits they don't support.
|
||||
|
||||
// Background
|
||||
RS::EnvironmentBG background = RS::ENV_BG_CLEAR_COLOR;
|
||||
RID sky;
|
||||
float sky_custom_fov = 0.0;
|
||||
Basis sky_orientation;
|
||||
Color bg_color;
|
||||
float bg_energy = 1.0;
|
||||
int canvas_max_layer = 0;
|
||||
RS::EnvironmentAmbientSource ambient_source = RS::ENV_AMBIENT_SOURCE_BG;
|
||||
Color ambient_light;
|
||||
float ambient_light_energy = 1.0;
|
||||
float ambient_sky_contribution = 1.0;
|
||||
RS::EnvironmentReflectionSource reflection_source = RS::ENV_REFLECTION_SOURCE_BG;
|
||||
|
||||
// Tonemap
|
||||
RS::EnvironmentToneMapper tone_mapper;
|
||||
float exposure = 1.0;
|
||||
float white = 1.0;
|
||||
bool auto_exposure = false;
|
||||
float min_luminance = 0.2;
|
||||
float max_luminance = 8.0;
|
||||
float auto_exp_speed = 0.2;
|
||||
float auto_exp_scale = 0.5;
|
||||
uint64_t auto_exposure_version = 0;
|
||||
|
||||
// Fog
|
||||
bool fog_enabled = false;
|
||||
Color fog_light_color = Color(0.5, 0.6, 0.7);
|
||||
float fog_light_energy = 1.0;
|
||||
float fog_sun_scatter = 0.0;
|
||||
float fog_density = 0.001;
|
||||
float fog_height = 0.0;
|
||||
float fog_height_density = 0.0; //can be negative to invert effect
|
||||
float fog_aerial_perspective = 0.0;
|
||||
|
||||
// Volumetric Fog
|
||||
bool volumetric_fog_enabled = false;
|
||||
float volumetric_fog_density = 0.01;
|
||||
Color volumetric_fog_scattering = Color(1, 1, 1);
|
||||
Color volumetric_fog_emission = Color(0, 0, 0);
|
||||
float volumetric_fog_emission_energy = 0.0;
|
||||
float volumetric_fog_anisotropy = 0.2;
|
||||
float volumetric_fog_length = 64.0;
|
||||
float volumetric_fog_detail_spread = 2.0;
|
||||
float volumetric_fog_gi_inject = 0.0;
|
||||
bool volumetric_fog_temporal_reprojection = true;
|
||||
float volumetric_fog_temporal_reprojection_amount = 0.9;
|
||||
float volumetric_fog_ambient_inject = 0.0;
|
||||
|
||||
// Glow
|
||||
bool glow_enabled = false;
|
||||
Vector<float> glow_levels;
|
||||
float glow_intensity = 0.8;
|
||||
float glow_strength = 1.0;
|
||||
float glow_bloom = 0.0;
|
||||
float glow_mix = 0.01;
|
||||
RS::EnvironmentGlowBlendMode glow_blend_mode = RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT;
|
||||
float glow_hdr_bleed_threshold = 1.0;
|
||||
float glow_hdr_luminance_cap = 12.0;
|
||||
float glow_hdr_bleed_scale = 2.0;
|
||||
float glow_map_strength = 0.0f; // 1.0f in GLES3 ??
|
||||
RID glow_map = RID();
|
||||
|
||||
// SSR
|
||||
bool ssr_enabled = false;
|
||||
int ssr_max_steps = 64;
|
||||
float ssr_fade_in = 0.15;
|
||||
float ssr_fade_out = 2.0;
|
||||
float ssr_depth_tolerance = 0.2;
|
||||
|
||||
// SSAO
|
||||
bool ssao_enabled = false;
|
||||
float ssao_radius = 1.0;
|
||||
float ssao_intensity = 2.0;
|
||||
float ssao_power = 1.5;
|
||||
float ssao_detail = 0.5;
|
||||
float ssao_horizon = 0.06;
|
||||
float ssao_sharpness = 0.98;
|
||||
float ssao_direct_light_affect = 0.0;
|
||||
float ssao_ao_channel_affect = 0.0;
|
||||
|
||||
// SSIL
|
||||
bool ssil_enabled = false;
|
||||
float ssil_radius = 5.0;
|
||||
float ssil_intensity = 1.0;
|
||||
float ssil_sharpness = 0.98;
|
||||
float ssil_normal_rejection = 1.0;
|
||||
|
||||
// SDFGI
|
||||
bool sdfgi_enabled = false;
|
||||
int sdfgi_cascades = 4;
|
||||
float sdfgi_min_cell_size = 0.2;
|
||||
bool sdfgi_use_occlusion = false;
|
||||
float sdfgi_bounce_feedback = 0.5;
|
||||
bool sdfgi_read_sky_light = true;
|
||||
float sdfgi_energy = 1.0;
|
||||
float sdfgi_normal_bias = 1.1;
|
||||
float sdfgi_probe_bias = 1.1;
|
||||
RS::EnvironmentSDFGIYScale sdfgi_y_scale = RS::ENV_SDFGI_Y_SCALE_75_PERCENT;
|
||||
|
||||
// Adjustments
|
||||
bool adjustments_enabled = false;
|
||||
float adjustments_brightness = 1.0f;
|
||||
float adjustments_contrast = 1.0f;
|
||||
float adjustments_saturation = 1.0f;
|
||||
bool use_1d_color_correction = false;
|
||||
RID color_correction = RID();
|
||||
};
|
||||
|
||||
static uint64_t auto_exposure_counter;
|
||||
|
||||
mutable RID_Owner<Environment, true> environment_owner;
|
||||
|
||||
public:
|
||||
RID environment_allocate();
|
||||
void environment_initialize(RID p_rid);
|
||||
void environment_free(RID p_rid);
|
||||
|
||||
bool is_environment(RID p_environment) const {
|
||||
return environment_owner.owns(p_environment);
|
||||
}
|
||||
|
||||
// Background
|
||||
void environment_set_background(RID p_env, RS::EnvironmentBG p_bg);
|
||||
void environment_set_sky(RID p_env, RID p_sky);
|
||||
void environment_set_sky_custom_fov(RID p_env, float p_scale);
|
||||
void environment_set_sky_orientation(RID p_env, const Basis &p_orientation);
|
||||
void environment_set_bg_color(RID p_env, const Color &p_color);
|
||||
void environment_set_bg_energy(RID p_env, float p_energy);
|
||||
void environment_set_canvas_max_layer(RID p_env, int p_max_layer);
|
||||
void environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient = RS::ENV_AMBIENT_SOURCE_BG, float p_energy = 1.0, float p_sky_contribution = 0.0, RS::EnvironmentReflectionSource p_reflection_source = RS::ENV_REFLECTION_SOURCE_BG);
|
||||
// FIXME: Disabled during Vulkan refactoring, should be ported.
|
||||
#if 0
|
||||
void environment_set_camera_feed_id(RID p_env, int p_camera_feed_id);
|
||||
#endif
|
||||
|
||||
RS::EnvironmentBG environment_get_background(RID p_env) const;
|
||||
RID environment_get_sky(RID p_env) const;
|
||||
float environment_get_sky_custom_fov(RID p_env) const;
|
||||
Basis environment_get_sky_orientation(RID p_env) const;
|
||||
Color environment_get_bg_color(RID p_env) const;
|
||||
float environment_get_bg_energy(RID p_env) const;
|
||||
int environment_get_canvas_max_layer(RID p_env) const;
|
||||
RS::EnvironmentAmbientSource environment_get_ambient_source(RID p_env) const;
|
||||
Color environment_get_ambient_light(RID p_env) const;
|
||||
float environment_get_ambient_light_energy(RID p_env) const;
|
||||
float environment_get_ambient_sky_contribution(RID p_env) const;
|
||||
RS::EnvironmentReflectionSource environment_get_reflection_source(RID p_env) const;
|
||||
|
||||
// Tonemap
|
||||
void environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white, bool p_auto_exposure, float p_min_luminance, float p_max_luminance, float p_auto_exp_speed, float p_auto_exp_scale);
|
||||
RS::EnvironmentToneMapper environment_get_tone_mapper(RID p_env) const;
|
||||
float environment_get_exposure(RID p_env) const;
|
||||
float environment_get_white(RID p_env) const;
|
||||
bool environment_get_auto_exposure(RID p_env) const;
|
||||
float environment_get_min_luminance(RID p_env) const;
|
||||
float environment_get_max_luminance(RID p_env) const;
|
||||
float environment_get_auto_exp_speed(RID p_env) const;
|
||||
float environment_get_auto_exp_scale(RID p_env) const;
|
||||
uint64_t environment_get_auto_exposure_version(RID p_env) const;
|
||||
|
||||
// Fog
|
||||
void environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_aerial_perspective);
|
||||
bool environment_get_fog_enabled(RID p_env) const;
|
||||
Color environment_get_fog_light_color(RID p_env) const;
|
||||
float environment_get_fog_light_energy(RID p_env) const;
|
||||
float environment_get_fog_sun_scatter(RID p_env) const;
|
||||
float environment_get_fog_density(RID p_env) const;
|
||||
float environment_get_fog_height(RID p_env) const;
|
||||
float environment_get_fog_height_density(RID p_env) const;
|
||||
float environment_get_fog_aerial_perspective(RID p_env) const;
|
||||
|
||||
// Volumetric Fog
|
||||
void environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject);
|
||||
bool environment_get_volumetric_fog_enabled(RID p_env) const;
|
||||
float environment_get_volumetric_fog_density(RID p_env) const;
|
||||
Color environment_get_volumetric_fog_scattering(RID p_env) const;
|
||||
Color environment_get_volumetric_fog_emission(RID p_env) const;
|
||||
float environment_get_volumetric_fog_emission_energy(RID p_env) const;
|
||||
float environment_get_volumetric_fog_anisotropy(RID p_env) const;
|
||||
float environment_get_volumetric_fog_length(RID p_env) const;
|
||||
float environment_get_volumetric_fog_detail_spread(RID p_env) const;
|
||||
float environment_get_volumetric_fog_gi_inject(RID p_env) const;
|
||||
bool environment_get_volumetric_fog_temporal_reprojection(RID p_env) const;
|
||||
float environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const;
|
||||
float environment_get_volumetric_fog_ambient_inject(RID p_env) const;
|
||||
|
||||
// GLOW
|
||||
void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map);
|
||||
bool environment_get_glow_enabled(RID p_env) const;
|
||||
Vector<float> environment_get_glow_levels(RID p_env) const;
|
||||
float environment_get_glow_intensity(RID p_env) const;
|
||||
float environment_get_glow_strength(RID p_env) const;
|
||||
float environment_get_glow_bloom(RID p_env) const;
|
||||
float environment_get_glow_mix(RID p_env) const;
|
||||
RS::EnvironmentGlowBlendMode environment_get_glow_blend_mode(RID p_env) const;
|
||||
float environment_get_glow_hdr_bleed_threshold(RID p_env) const;
|
||||
float environment_get_glow_hdr_luminance_cap(RID p_env) const;
|
||||
float environment_get_glow_hdr_bleed_scale(RID p_env) const;
|
||||
float environment_get_glow_map_strength(RID p_env) const;
|
||||
RID environment_get_glow_map(RID p_env) const;
|
||||
|
||||
// SSR
|
||||
void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance);
|
||||
bool environment_get_ssr_enabled(RID p_env) const;
|
||||
int environment_get_ssr_max_steps(RID p_env) const;
|
||||
float environment_get_ssr_fade_in(RID p_env) const;
|
||||
float environment_get_ssr_fade_out(RID p_env) const;
|
||||
float environment_get_ssr_depth_tolerance(RID p_env) const;
|
||||
|
||||
// SSAO
|
||||
void environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect);
|
||||
bool environment_get_ssao_enabled(RID p_env) const;
|
||||
float environment_get_ssao_radius(RID p_env) const;
|
||||
float environment_get_ssao_intensity(RID p_env) const;
|
||||
float environment_get_ssao_power(RID p_env) const;
|
||||
float environment_get_ssao_detail(RID p_env) const;
|
||||
float environment_get_ssao_horizon(RID p_env) const;
|
||||
float environment_get_ssao_sharpness(RID p_env) const;
|
||||
float environment_get_ssao_direct_light_affect(RID p_env) const;
|
||||
float environment_get_ssao_ao_channel_affect(RID p_env) const;
|
||||
|
||||
// SSIL
|
||||
void environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection);
|
||||
bool environment_get_ssil_enabled(RID p_env) const;
|
||||
float environment_get_ssil_radius(RID p_env) const;
|
||||
float environment_get_ssil_intensity(RID p_env) const;
|
||||
float environment_get_ssil_sharpness(RID p_env) const;
|
||||
float environment_get_ssil_normal_rejection(RID p_env) const;
|
||||
|
||||
// SDFGI
|
||||
void environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias);
|
||||
bool environment_get_sdfgi_enabled(RID p_env) const;
|
||||
int environment_get_sdfgi_cascades(RID p_env) const;
|
||||
float environment_get_sdfgi_min_cell_size(RID p_env) const;
|
||||
bool environment_get_sdfgi_use_occlusion(RID p_env) const;
|
||||
float environment_get_sdfgi_bounce_feedback(RID p_env) const;
|
||||
bool environment_get_sdfgi_read_sky_light(RID p_env) const;
|
||||
float environment_get_sdfgi_energy(RID p_env) const;
|
||||
float environment_get_sdfgi_normal_bias(RID p_env) const;
|
||||
float environment_get_sdfgi_probe_bias(RID p_env) const;
|
||||
RS::EnvironmentSDFGIYScale environment_get_sdfgi_y_scale(RID p_env) const;
|
||||
|
||||
// Adjustment
|
||||
void environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction);
|
||||
bool environment_get_adjustments_enabled(RID p_env) const;
|
||||
float environment_get_adjustments_brightness(RID p_env) const;
|
||||
float environment_get_adjustments_contrast(RID p_env) const;
|
||||
float environment_get_adjustments_saturation(RID p_env) const;
|
||||
bool environment_get_use_1d_color_correction(RID p_env) const;
|
||||
RID environment_get_color_correction(RID p_env) const;
|
||||
};
|
||||
|
||||
#endif // ENVIRONMENT_STORAGE_H
|
Loading…
Reference in a new issue