Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/scene/resources/environment.cpp
9903 views
1
/**************************************************************************/
2
/* environment.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "environment.h"
32
33
#include "core/config/project_settings.h"
34
#include "scene/resources/gradient_texture.h"
35
#include "servers/rendering_server.h"
36
37
RID Environment::get_rid() const {
38
return environment;
39
}
40
41
// Background
42
43
void Environment::set_background(BGMode p_bg) {
44
bg_mode = p_bg;
45
RS::get_singleton()->environment_set_background(environment, RS::EnvironmentBG(p_bg));
46
notify_property_list_changed();
47
if (bg_mode != BG_SKY) {
48
set_fog_aerial_perspective(0.0);
49
}
50
}
51
52
Environment::BGMode Environment::get_background() const {
53
return bg_mode;
54
}
55
56
void Environment::set_sky(const Ref<Sky> &p_sky) {
57
bg_sky = p_sky;
58
RID sb_rid;
59
if (bg_sky.is_valid()) {
60
sb_rid = bg_sky->get_rid();
61
}
62
RS::get_singleton()->environment_set_sky(environment, sb_rid);
63
}
64
65
Ref<Sky> Environment::get_sky() const {
66
return bg_sky;
67
}
68
69
void Environment::set_sky_custom_fov(float p_scale) {
70
bg_sky_custom_fov = p_scale;
71
RS::get_singleton()->environment_set_sky_custom_fov(environment, p_scale);
72
}
73
74
float Environment::get_sky_custom_fov() const {
75
return bg_sky_custom_fov;
76
}
77
78
void Environment::set_sky_rotation(const Vector3 &p_rotation) {
79
bg_sky_rotation = p_rotation;
80
RS::get_singleton()->environment_set_sky_orientation(environment, Basis::from_euler(p_rotation));
81
}
82
83
Vector3 Environment::get_sky_rotation() const {
84
return bg_sky_rotation;
85
}
86
87
void Environment::set_bg_color(const Color &p_color) {
88
bg_color = p_color;
89
RS::get_singleton()->environment_set_bg_color(environment, p_color);
90
}
91
92
Color Environment::get_bg_color() const {
93
return bg_color;
94
}
95
96
void Environment::set_bg_energy_multiplier(float p_multiplier) {
97
bg_energy_multiplier = p_multiplier;
98
_update_bg_energy();
99
}
100
101
float Environment::get_bg_energy_multiplier() const {
102
return bg_energy_multiplier;
103
}
104
105
void Environment::set_bg_intensity(float p_exposure_value) {
106
bg_intensity = p_exposure_value;
107
_update_bg_energy();
108
}
109
110
float Environment::get_bg_intensity() const {
111
return bg_intensity;
112
}
113
114
void Environment::_update_bg_energy() {
115
if (GLOBAL_GET_CACHED(bool, "rendering/lights_and_shadows/use_physical_light_units")) {
116
RS::get_singleton()->environment_set_bg_energy(environment, bg_energy_multiplier, bg_intensity);
117
} else {
118
RS::get_singleton()->environment_set_bg_energy(environment, bg_energy_multiplier, 1.0);
119
}
120
}
121
122
void Environment::set_canvas_max_layer(int p_max_layer) {
123
bg_canvas_max_layer = p_max_layer;
124
RS::get_singleton()->environment_set_canvas_max_layer(environment, p_max_layer);
125
}
126
127
int Environment::get_canvas_max_layer() const {
128
return bg_canvas_max_layer;
129
}
130
131
void Environment::set_camera_feed_id(int p_id) {
132
bg_camera_feed_id = p_id;
133
RS::get_singleton()->environment_set_camera_feed_id(environment, bg_camera_feed_id);
134
}
135
136
int Environment::get_camera_feed_id() const {
137
return bg_camera_feed_id;
138
}
139
140
// Ambient light
141
142
void Environment::set_ambient_light_color(const Color &p_color) {
143
ambient_color = p_color;
144
_update_ambient_light();
145
}
146
147
Color Environment::get_ambient_light_color() const {
148
return ambient_color;
149
}
150
151
void Environment::set_ambient_source(AmbientSource p_source) {
152
ambient_source = p_source;
153
_update_ambient_light();
154
notify_property_list_changed();
155
}
156
157
Environment::AmbientSource Environment::get_ambient_source() const {
158
return ambient_source;
159
}
160
161
void Environment::set_ambient_light_energy(float p_energy) {
162
ambient_energy = p_energy;
163
_update_ambient_light();
164
}
165
166
float Environment::get_ambient_light_energy() const {
167
return ambient_energy;
168
}
169
170
void Environment::set_ambient_light_sky_contribution(float p_ratio) {
171
// Sky contribution values outside the [0.0; 1.0] range don't make sense and
172
// can result in negative colors.
173
ambient_sky_contribution = CLAMP(p_ratio, 0.0, 1.0);
174
_update_ambient_light();
175
}
176
177
float Environment::get_ambient_light_sky_contribution() const {
178
return ambient_sky_contribution;
179
}
180
181
void Environment::set_reflection_source(ReflectionSource p_source) {
182
reflection_source = p_source;
183
_update_ambient_light();
184
notify_property_list_changed();
185
}
186
187
Environment::ReflectionSource Environment::get_reflection_source() const {
188
return reflection_source;
189
}
190
191
void Environment::_update_ambient_light() {
192
RS::get_singleton()->environment_set_ambient_light(
193
environment,
194
ambient_color,
195
RS::EnvironmentAmbientSource(ambient_source),
196
ambient_energy,
197
ambient_sky_contribution, RS::EnvironmentReflectionSource(reflection_source));
198
}
199
200
// Tonemap
201
202
void Environment::set_tonemapper(ToneMapper p_tone_mapper) {
203
tone_mapper = p_tone_mapper;
204
_update_tonemap();
205
notify_property_list_changed();
206
}
207
208
Environment::ToneMapper Environment::get_tonemapper() const {
209
return tone_mapper;
210
}
211
212
void Environment::set_tonemap_exposure(float p_exposure) {
213
tonemap_exposure = p_exposure;
214
_update_tonemap();
215
}
216
217
float Environment::get_tonemap_exposure() const {
218
return tonemap_exposure;
219
}
220
221
void Environment::set_tonemap_white(float p_white) {
222
tonemap_white = p_white;
223
_update_tonemap();
224
}
225
226
float Environment::get_tonemap_white() const {
227
return tonemap_white;
228
}
229
230
void Environment::_update_tonemap() {
231
RS::get_singleton()->environment_set_tonemap(
232
environment,
233
RS::EnvironmentToneMapper(tone_mapper),
234
tonemap_exposure,
235
tonemap_white);
236
}
237
238
// SSR
239
240
void Environment::set_ssr_enabled(bool p_enabled) {
241
ssr_enabled = p_enabled;
242
_update_ssr();
243
}
244
245
bool Environment::is_ssr_enabled() const {
246
return ssr_enabled;
247
}
248
249
void Environment::set_ssr_max_steps(int p_steps) {
250
ssr_max_steps = p_steps;
251
_update_ssr();
252
}
253
254
int Environment::get_ssr_max_steps() const {
255
return ssr_max_steps;
256
}
257
258
void Environment::set_ssr_fade_in(float p_fade_in) {
259
ssr_fade_in = MAX(p_fade_in, 0.0f);
260
_update_ssr();
261
}
262
263
float Environment::get_ssr_fade_in() const {
264
return ssr_fade_in;
265
}
266
267
void Environment::set_ssr_fade_out(float p_fade_out) {
268
ssr_fade_out = MAX(p_fade_out, 0.0f);
269
_update_ssr();
270
}
271
272
float Environment::get_ssr_fade_out() const {
273
return ssr_fade_out;
274
}
275
276
void Environment::set_ssr_depth_tolerance(float p_depth_tolerance) {
277
ssr_depth_tolerance = p_depth_tolerance;
278
_update_ssr();
279
}
280
281
float Environment::get_ssr_depth_tolerance() const {
282
return ssr_depth_tolerance;
283
}
284
285
void Environment::_update_ssr() {
286
RS::get_singleton()->environment_set_ssr(
287
environment,
288
ssr_enabled,
289
ssr_max_steps,
290
ssr_fade_in,
291
ssr_fade_out,
292
ssr_depth_tolerance);
293
}
294
295
// SSAO
296
297
void Environment::set_ssao_enabled(bool p_enabled) {
298
ssao_enabled = p_enabled;
299
_update_ssao();
300
}
301
302
bool Environment::is_ssao_enabled() const {
303
return ssao_enabled;
304
}
305
306
void Environment::set_ssao_radius(float p_radius) {
307
ssao_radius = p_radius;
308
_update_ssao();
309
}
310
311
float Environment::get_ssao_radius() const {
312
return ssao_radius;
313
}
314
315
void Environment::set_ssao_intensity(float p_intensity) {
316
ssao_intensity = p_intensity;
317
_update_ssao();
318
}
319
320
float Environment::get_ssao_intensity() const {
321
return ssao_intensity;
322
}
323
324
void Environment::set_ssao_power(float p_power) {
325
ssao_power = p_power;
326
_update_ssao();
327
}
328
329
float Environment::get_ssao_power() const {
330
return ssao_power;
331
}
332
333
void Environment::set_ssao_detail(float p_detail) {
334
ssao_detail = p_detail;
335
_update_ssao();
336
}
337
338
float Environment::get_ssao_detail() const {
339
return ssao_detail;
340
}
341
342
void Environment::set_ssao_horizon(float p_horizon) {
343
ssao_horizon = p_horizon;
344
_update_ssao();
345
}
346
347
float Environment::get_ssao_horizon() const {
348
return ssao_horizon;
349
}
350
351
void Environment::set_ssao_sharpness(float p_sharpness) {
352
ssao_sharpness = p_sharpness;
353
_update_ssao();
354
}
355
356
float Environment::get_ssao_sharpness() const {
357
return ssao_sharpness;
358
}
359
360
void Environment::set_ssao_direct_light_affect(float p_direct_light_affect) {
361
ssao_direct_light_affect = p_direct_light_affect;
362
_update_ssao();
363
}
364
365
float Environment::get_ssao_direct_light_affect() const {
366
return ssao_direct_light_affect;
367
}
368
369
void Environment::set_ssao_ao_channel_affect(float p_ao_channel_affect) {
370
ssao_ao_channel_affect = p_ao_channel_affect;
371
_update_ssao();
372
}
373
374
float Environment::get_ssao_ao_channel_affect() const {
375
return ssao_ao_channel_affect;
376
}
377
378
void Environment::_update_ssao() {
379
RS::get_singleton()->environment_set_ssao(
380
environment,
381
ssao_enabled,
382
ssao_radius,
383
ssao_intensity,
384
ssao_power,
385
ssao_detail,
386
ssao_horizon,
387
ssao_sharpness,
388
ssao_direct_light_affect,
389
ssao_ao_channel_affect);
390
}
391
392
// SSIL
393
394
void Environment::set_ssil_enabled(bool p_enabled) {
395
ssil_enabled = p_enabled;
396
_update_ssil();
397
}
398
399
bool Environment::is_ssil_enabled() const {
400
return ssil_enabled;
401
}
402
403
void Environment::set_ssil_radius(float p_radius) {
404
ssil_radius = p_radius;
405
_update_ssil();
406
}
407
408
float Environment::get_ssil_radius() const {
409
return ssil_radius;
410
}
411
412
void Environment::set_ssil_intensity(float p_intensity) {
413
ssil_intensity = p_intensity;
414
_update_ssil();
415
}
416
417
float Environment::get_ssil_intensity() const {
418
return ssil_intensity;
419
}
420
421
void Environment::set_ssil_sharpness(float p_sharpness) {
422
ssil_sharpness = p_sharpness;
423
_update_ssil();
424
}
425
426
float Environment::get_ssil_sharpness() const {
427
return ssil_sharpness;
428
}
429
430
void Environment::set_ssil_normal_rejection(float p_normal_rejection) {
431
ssil_normal_rejection = p_normal_rejection;
432
_update_ssil();
433
}
434
435
float Environment::get_ssil_normal_rejection() const {
436
return ssil_normal_rejection;
437
}
438
439
void Environment::_update_ssil() {
440
RS::get_singleton()->environment_set_ssil(
441
environment,
442
ssil_enabled,
443
ssil_radius,
444
ssil_intensity,
445
ssil_sharpness,
446
ssil_normal_rejection);
447
}
448
449
// SDFGI
450
451
void Environment::set_sdfgi_enabled(bool p_enabled) {
452
sdfgi_enabled = p_enabled;
453
_update_sdfgi();
454
}
455
456
bool Environment::is_sdfgi_enabled() const {
457
return sdfgi_enabled;
458
}
459
460
void Environment::set_sdfgi_cascades(int p_cascades) {
461
ERR_FAIL_COND_MSG(p_cascades < 1 || p_cascades > 8, "Invalid number of SDFGI cascades (must be between 1 and 8).");
462
sdfgi_cascades = p_cascades;
463
_update_sdfgi();
464
}
465
466
int Environment::get_sdfgi_cascades() const {
467
return sdfgi_cascades;
468
}
469
470
void Environment::set_sdfgi_min_cell_size(float p_size) {
471
sdfgi_min_cell_size = p_size;
472
_update_sdfgi();
473
}
474
475
float Environment::get_sdfgi_min_cell_size() const {
476
return sdfgi_min_cell_size;
477
}
478
479
void Environment::set_sdfgi_max_distance(float p_distance) {
480
p_distance /= 64.0;
481
for (int i = 0; i < sdfgi_cascades; i++) {
482
p_distance *= 0.5; //halve for each cascade
483
}
484
sdfgi_min_cell_size = p_distance;
485
_update_sdfgi();
486
}
487
488
float Environment::get_sdfgi_max_distance() const {
489
float md = sdfgi_min_cell_size;
490
md *= 64.0;
491
for (int i = 0; i < sdfgi_cascades; i++) {
492
md *= 2.0;
493
}
494
return md;
495
}
496
497
void Environment::set_sdfgi_cascade0_distance(float p_distance) {
498
sdfgi_min_cell_size = p_distance / 64.0;
499
_update_sdfgi();
500
}
501
502
float Environment::get_sdfgi_cascade0_distance() const {
503
return sdfgi_min_cell_size * 64.0;
504
}
505
506
void Environment::set_sdfgi_y_scale(SDFGIYScale p_y_scale) {
507
sdfgi_y_scale = p_y_scale;
508
_update_sdfgi();
509
}
510
511
Environment::SDFGIYScale Environment::get_sdfgi_y_scale() const {
512
return sdfgi_y_scale;
513
}
514
515
void Environment::set_sdfgi_use_occlusion(bool p_enabled) {
516
sdfgi_use_occlusion = p_enabled;
517
_update_sdfgi();
518
}
519
520
bool Environment::is_sdfgi_using_occlusion() const {
521
return sdfgi_use_occlusion;
522
}
523
524
void Environment::set_sdfgi_bounce_feedback(float p_amount) {
525
sdfgi_bounce_feedback = p_amount;
526
_update_sdfgi();
527
}
528
float Environment::get_sdfgi_bounce_feedback() const {
529
return sdfgi_bounce_feedback;
530
}
531
532
void Environment::set_sdfgi_read_sky_light(bool p_enabled) {
533
sdfgi_read_sky_light = p_enabled;
534
_update_sdfgi();
535
}
536
537
bool Environment::is_sdfgi_reading_sky_light() const {
538
return sdfgi_read_sky_light;
539
}
540
541
void Environment::set_sdfgi_energy(float p_energy) {
542
sdfgi_energy = p_energy;
543
_update_sdfgi();
544
}
545
546
float Environment::get_sdfgi_energy() const {
547
return sdfgi_energy;
548
}
549
550
void Environment::set_sdfgi_normal_bias(float p_bias) {
551
sdfgi_normal_bias = p_bias;
552
_update_sdfgi();
553
}
554
555
float Environment::get_sdfgi_normal_bias() const {
556
return sdfgi_normal_bias;
557
}
558
559
void Environment::set_sdfgi_probe_bias(float p_bias) {
560
sdfgi_probe_bias = p_bias;
561
_update_sdfgi();
562
}
563
564
float Environment::get_sdfgi_probe_bias() const {
565
return sdfgi_probe_bias;
566
}
567
568
void Environment::_update_sdfgi() {
569
RS::get_singleton()->environment_set_sdfgi(
570
environment,
571
sdfgi_enabled,
572
sdfgi_cascades,
573
sdfgi_min_cell_size,
574
RS::EnvironmentSDFGIYScale(sdfgi_y_scale),
575
sdfgi_use_occlusion,
576
sdfgi_bounce_feedback,
577
sdfgi_read_sky_light,
578
sdfgi_energy,
579
sdfgi_normal_bias,
580
sdfgi_probe_bias);
581
}
582
583
// Glow
584
585
void Environment::set_glow_enabled(bool p_enabled) {
586
glow_enabled = p_enabled;
587
_update_glow();
588
}
589
590
bool Environment::is_glow_enabled() const {
591
return glow_enabled;
592
}
593
594
void Environment::set_glow_level(int p_level, float p_intensity) {
595
ERR_FAIL_INDEX(p_level, RS::MAX_GLOW_LEVELS);
596
597
glow_levels.write[p_level] = p_intensity;
598
599
_update_glow();
600
}
601
602
float Environment::get_glow_level(int p_level) const {
603
ERR_FAIL_INDEX_V(p_level, RS::MAX_GLOW_LEVELS, 0.0);
604
605
return glow_levels[p_level];
606
}
607
608
void Environment::set_glow_normalized(bool p_normalized) {
609
glow_normalize_levels = p_normalized;
610
611
_update_glow();
612
}
613
614
bool Environment::is_glow_normalized() const {
615
return glow_normalize_levels;
616
}
617
618
void Environment::set_glow_intensity(float p_intensity) {
619
glow_intensity = p_intensity;
620
_update_glow();
621
}
622
623
float Environment::get_glow_intensity() const {
624
return glow_intensity;
625
}
626
627
void Environment::set_glow_strength(float p_strength) {
628
glow_strength = p_strength;
629
_update_glow();
630
}
631
632
float Environment::get_glow_strength() const {
633
return glow_strength;
634
}
635
636
void Environment::set_glow_mix(float p_mix) {
637
glow_mix = p_mix;
638
_update_glow();
639
}
640
641
float Environment::get_glow_mix() const {
642
return glow_mix;
643
}
644
645
void Environment::set_glow_bloom(float p_threshold) {
646
glow_bloom = p_threshold;
647
_update_glow();
648
}
649
650
float Environment::get_glow_bloom() const {
651
return glow_bloom;
652
}
653
654
void Environment::set_glow_blend_mode(GlowBlendMode p_mode) {
655
glow_blend_mode = p_mode;
656
_update_glow();
657
notify_property_list_changed();
658
}
659
660
Environment::GlowBlendMode Environment::get_glow_blend_mode() const {
661
return glow_blend_mode;
662
}
663
664
void Environment::set_glow_hdr_bleed_threshold(float p_threshold) {
665
glow_hdr_bleed_threshold = p_threshold;
666
_update_glow();
667
}
668
669
float Environment::get_glow_hdr_bleed_threshold() const {
670
return glow_hdr_bleed_threshold;
671
}
672
673
void Environment::set_glow_hdr_bleed_scale(float p_scale) {
674
glow_hdr_bleed_scale = p_scale;
675
_update_glow();
676
}
677
678
float Environment::get_glow_hdr_bleed_scale() const {
679
return glow_hdr_bleed_scale;
680
}
681
682
void Environment::set_glow_hdr_luminance_cap(float p_amount) {
683
glow_hdr_luminance_cap = p_amount;
684
_update_glow();
685
}
686
687
float Environment::get_glow_hdr_luminance_cap() const {
688
return glow_hdr_luminance_cap;
689
}
690
691
void Environment::set_glow_map_strength(float p_strength) {
692
glow_map_strength = p_strength;
693
_update_glow();
694
}
695
696
float Environment::get_glow_map_strength() const {
697
return glow_map_strength;
698
}
699
700
void Environment::set_glow_map(Ref<Texture> p_glow_map) {
701
glow_map = p_glow_map;
702
_update_glow();
703
}
704
705
Ref<Texture> Environment::get_glow_map() const {
706
return glow_map;
707
}
708
709
void Environment::_update_glow() {
710
Vector<float> normalized_levels;
711
if (glow_normalize_levels) {
712
normalized_levels.resize(7);
713
float size = 0.0;
714
for (int i = 0; i < glow_levels.size(); i++) {
715
size += glow_levels[i];
716
}
717
for (int i = 0; i < glow_levels.size(); i++) {
718
normalized_levels.write[i] = glow_levels[i] / size;
719
}
720
} else {
721
normalized_levels = glow_levels;
722
}
723
724
float _glow_map_strength = 0.0f;
725
RID glow_map_rid;
726
if (glow_map.is_valid()) {
727
glow_map_rid = glow_map->get_rid();
728
_glow_map_strength = glow_map_strength;
729
} else {
730
glow_map_rid = RID();
731
}
732
733
RS::get_singleton()->environment_set_glow(
734
environment,
735
glow_enabled,
736
normalized_levels,
737
glow_intensity,
738
glow_strength,
739
glow_mix,
740
glow_bloom,
741
RS::EnvironmentGlowBlendMode(glow_blend_mode),
742
glow_hdr_bleed_threshold,
743
glow_hdr_bleed_scale,
744
glow_hdr_luminance_cap,
745
_glow_map_strength,
746
glow_map_rid);
747
}
748
749
// Fog
750
751
void Environment::set_fog_enabled(bool p_enabled) {
752
fog_enabled = p_enabled;
753
_update_fog();
754
}
755
756
bool Environment::is_fog_enabled() const {
757
return fog_enabled;
758
}
759
760
void Environment::set_fog_mode(FogMode p_mode) {
761
if (fog_mode != p_mode && p_mode == FogMode::FOG_MODE_EXPONENTIAL) {
762
set_fog_density(0.01);
763
} else {
764
set_fog_density(1.0);
765
}
766
fog_mode = p_mode;
767
_update_fog();
768
notify_property_list_changed();
769
}
770
771
Environment::FogMode Environment::get_fog_mode() const {
772
return fog_mode;
773
}
774
775
void Environment::set_fog_light_color(const Color &p_light_color) {
776
fog_light_color = p_light_color;
777
_update_fog();
778
}
779
Color Environment::get_fog_light_color() const {
780
return fog_light_color;
781
}
782
void Environment::set_fog_light_energy(float p_amount) {
783
fog_light_energy = p_amount;
784
_update_fog();
785
}
786
float Environment::get_fog_light_energy() const {
787
return fog_light_energy;
788
}
789
void Environment::set_fog_sun_scatter(float p_amount) {
790
fog_sun_scatter = p_amount;
791
_update_fog();
792
}
793
float Environment::get_fog_sun_scatter() const {
794
return fog_sun_scatter;
795
}
796
void Environment::set_fog_density(float p_amount) {
797
fog_density = p_amount;
798
_update_fog();
799
}
800
float Environment::get_fog_density() const {
801
return fog_density;
802
}
803
void Environment::set_fog_height(float p_amount) {
804
fog_height = p_amount;
805
_update_fog();
806
}
807
float Environment::get_fog_height() const {
808
return fog_height;
809
}
810
void Environment::set_fog_height_density(float p_amount) {
811
fog_height_density = p_amount;
812
_update_fog();
813
}
814
float Environment::get_fog_height_density() const {
815
return fog_height_density;
816
}
817
818
void Environment::set_fog_aerial_perspective(float p_aerial_perspective) {
819
fog_aerial_perspective = p_aerial_perspective;
820
_update_fog();
821
}
822
float Environment::get_fog_aerial_perspective() const {
823
return fog_aerial_perspective;
824
}
825
826
void Environment::set_fog_sky_affect(float p_sky_affect) {
827
fog_sky_affect = p_sky_affect;
828
_update_fog();
829
}
830
831
float Environment::get_fog_sky_affect() const {
832
return fog_sky_affect;
833
}
834
835
void Environment::_update_fog() {
836
RS::get_singleton()->environment_set_fog(
837
environment,
838
fog_enabled,
839
fog_light_color,
840
fog_light_energy,
841
fog_sun_scatter,
842
fog_density,
843
fog_height,
844
fog_height_density,
845
fog_aerial_perspective,
846
fog_sky_affect,
847
RS::EnvironmentFogMode(fog_mode));
848
}
849
850
// Depth Fog
851
852
void Environment::set_fog_depth_curve(float p_curve) {
853
fog_depth_curve = p_curve;
854
_update_fog_depth();
855
}
856
857
float Environment::get_fog_depth_curve() const {
858
return fog_depth_curve;
859
}
860
861
void Environment::set_fog_depth_begin(float p_begin) {
862
fog_depth_begin = p_begin;
863
if (fog_depth_begin > fog_depth_end) {
864
set_fog_depth_end(fog_depth_begin);
865
}
866
_update_fog_depth();
867
}
868
869
float Environment::get_fog_depth_begin() const {
870
return fog_depth_begin;
871
}
872
873
void Environment::set_fog_depth_end(float p_end) {
874
fog_depth_end = p_end;
875
if (fog_depth_end < fog_depth_begin) {
876
set_fog_depth_begin(fog_depth_end);
877
}
878
_update_fog_depth();
879
}
880
881
float Environment::get_fog_depth_end() const {
882
return fog_depth_end;
883
}
884
885
void Environment::_update_fog_depth() {
886
RS::get_singleton()->environment_set_fog_depth(
887
environment,
888
fog_depth_curve,
889
fog_depth_begin,
890
fog_depth_end);
891
}
892
893
// Volumetric Fog
894
895
void Environment::_update_volumetric_fog() {
896
RS::get_singleton()->environment_set_volumetric_fog(
897
environment,
898
volumetric_fog_enabled,
899
volumetric_fog_density,
900
volumetric_fog_albedo,
901
volumetric_fog_emission,
902
volumetric_fog_emission_energy,
903
volumetric_fog_anisotropy,
904
volumetric_fog_length,
905
volumetric_fog_detail_spread,
906
volumetric_fog_gi_inject,
907
volumetric_fog_temporal_reproject,
908
volumetric_fog_temporal_reproject_amount,
909
volumetric_fog_ambient_inject,
910
volumetric_fog_sky_affect);
911
}
912
913
void Environment::set_volumetric_fog_enabled(bool p_enable) {
914
volumetric_fog_enabled = p_enable;
915
_update_volumetric_fog();
916
}
917
918
bool Environment::is_volumetric_fog_enabled() const {
919
return volumetric_fog_enabled;
920
}
921
void Environment::set_volumetric_fog_density(float p_density) {
922
volumetric_fog_density = p_density;
923
_update_volumetric_fog();
924
}
925
float Environment::get_volumetric_fog_density() const {
926
return volumetric_fog_density;
927
}
928
void Environment::set_volumetric_fog_albedo(Color p_color) {
929
volumetric_fog_albedo = p_color;
930
_update_volumetric_fog();
931
}
932
Color Environment::get_volumetric_fog_albedo() const {
933
return volumetric_fog_albedo;
934
}
935
void Environment::set_volumetric_fog_emission(Color p_color) {
936
volumetric_fog_emission = p_color;
937
_update_volumetric_fog();
938
}
939
Color Environment::get_volumetric_fog_emission() const {
940
return volumetric_fog_emission;
941
}
942
void Environment::set_volumetric_fog_emission_energy(float p_begin) {
943
volumetric_fog_emission_energy = p_begin;
944
_update_volumetric_fog();
945
}
946
float Environment::get_volumetric_fog_emission_energy() const {
947
return volumetric_fog_emission_energy;
948
}
949
void Environment::set_volumetric_fog_anisotropy(float p_anisotropy) {
950
volumetric_fog_anisotropy = p_anisotropy;
951
_update_volumetric_fog();
952
}
953
float Environment::get_volumetric_fog_anisotropy() const {
954
return volumetric_fog_anisotropy;
955
}
956
void Environment::set_volumetric_fog_length(float p_length) {
957
volumetric_fog_length = p_length;
958
_update_volumetric_fog();
959
}
960
float Environment::get_volumetric_fog_length() const {
961
return volumetric_fog_length;
962
}
963
void Environment::set_volumetric_fog_detail_spread(float p_detail_spread) {
964
p_detail_spread = CLAMP(p_detail_spread, 0.5, 6.0);
965
volumetric_fog_detail_spread = p_detail_spread;
966
_update_volumetric_fog();
967
}
968
float Environment::get_volumetric_fog_detail_spread() const {
969
return volumetric_fog_detail_spread;
970
}
971
972
void Environment::set_volumetric_fog_gi_inject(float p_gi_inject) {
973
volumetric_fog_gi_inject = p_gi_inject;
974
_update_volumetric_fog();
975
}
976
float Environment::get_volumetric_fog_gi_inject() const {
977
return volumetric_fog_gi_inject;
978
}
979
void Environment::set_volumetric_fog_ambient_inject(float p_ambient_inject) {
980
volumetric_fog_ambient_inject = p_ambient_inject;
981
_update_volumetric_fog();
982
}
983
float Environment::get_volumetric_fog_ambient_inject() const {
984
return volumetric_fog_ambient_inject;
985
}
986
987
void Environment::set_volumetric_fog_sky_affect(float p_sky_affect) {
988
volumetric_fog_sky_affect = p_sky_affect;
989
_update_volumetric_fog();
990
}
991
992
float Environment::get_volumetric_fog_sky_affect() const {
993
return volumetric_fog_sky_affect;
994
}
995
996
void Environment::set_volumetric_fog_temporal_reprojection_enabled(bool p_enable) {
997
volumetric_fog_temporal_reproject = p_enable;
998
_update_volumetric_fog();
999
}
1000
bool Environment::is_volumetric_fog_temporal_reprojection_enabled() const {
1001
return volumetric_fog_temporal_reproject;
1002
}
1003
void Environment::set_volumetric_fog_temporal_reprojection_amount(float p_amount) {
1004
volumetric_fog_temporal_reproject_amount = p_amount;
1005
_update_volumetric_fog();
1006
}
1007
1008
float Environment::get_volumetric_fog_temporal_reprojection_amount() const {
1009
return volumetric_fog_temporal_reproject_amount;
1010
}
1011
1012
// Adjustment
1013
1014
void Environment::set_adjustment_enabled(bool p_enabled) {
1015
adjustment_enabled = p_enabled;
1016
_update_adjustment();
1017
}
1018
1019
bool Environment::is_adjustment_enabled() const {
1020
return adjustment_enabled;
1021
}
1022
1023
void Environment::set_adjustment_brightness(float p_brightness) {
1024
adjustment_brightness = p_brightness;
1025
_update_adjustment();
1026
}
1027
1028
float Environment::get_adjustment_brightness() const {
1029
return adjustment_brightness;
1030
}
1031
1032
void Environment::set_adjustment_contrast(float p_contrast) {
1033
adjustment_contrast = p_contrast;
1034
_update_adjustment();
1035
}
1036
1037
float Environment::get_adjustment_contrast() const {
1038
return adjustment_contrast;
1039
}
1040
1041
void Environment::set_adjustment_saturation(float p_saturation) {
1042
adjustment_saturation = p_saturation;
1043
_update_adjustment();
1044
}
1045
1046
float Environment::get_adjustment_saturation() const {
1047
return adjustment_saturation;
1048
}
1049
1050
void Environment::set_adjustment_color_correction(Ref<Texture> p_color_correction) {
1051
adjustment_color_correction = p_color_correction;
1052
Ref<GradientTexture1D> grad_tex = p_color_correction;
1053
if (grad_tex.is_valid()) {
1054
grad_tex->connect_changed(callable_mp(this, &Environment::_update_adjustment));
1055
}
1056
Ref<Texture2D> adjustment_texture_2d = adjustment_color_correction;
1057
if (adjustment_texture_2d.is_valid()) {
1058
use_1d_color_correction = true;
1059
} else {
1060
use_1d_color_correction = false;
1061
}
1062
_update_adjustment();
1063
}
1064
1065
Ref<Texture> Environment::get_adjustment_color_correction() const {
1066
return adjustment_color_correction;
1067
}
1068
1069
void Environment::_update_adjustment() {
1070
RID color_correction = adjustment_color_correction.is_valid() ? adjustment_color_correction->get_rid() : RID();
1071
1072
RS::get_singleton()->environment_set_adjustment(
1073
environment,
1074
adjustment_enabled,
1075
adjustment_brightness,
1076
adjustment_contrast,
1077
adjustment_saturation,
1078
use_1d_color_correction,
1079
color_correction);
1080
}
1081
1082
// Private methods, constructor and destructor
1083
1084
void Environment::_validate_property(PropertyInfo &p_property) const {
1085
if (!Engine::get_singleton()->is_editor_hint()) {
1086
return;
1087
}
1088
if (p_property.name == "sky" || p_property.name == "sky_custom_fov" || p_property.name == "sky_rotation" || p_property.name == "ambient_light_sky_contribution") {
1089
if (bg_mode != BG_SKY && ambient_source != AMBIENT_SOURCE_SKY && reflection_source != REFLECTION_SOURCE_SKY) {
1090
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1091
}
1092
}
1093
1094
if (p_property.name == "fog_depth_curve" || p_property.name == "fog_depth_begin" || p_property.name == "fog_depth_end") {
1095
if (fog_mode == FOG_MODE_EXPONENTIAL) {
1096
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1097
}
1098
}
1099
1100
if (p_property.name == "ambient_light_color" || p_property.name == "ambient_light_energy") {
1101
if (ambient_source == AMBIENT_SOURCE_DISABLED) {
1102
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1103
}
1104
}
1105
1106
if (p_property.name == "ambient_light_sky_contribution") {
1107
if (ambient_source == AMBIENT_SOURCE_DISABLED || ambient_source == AMBIENT_SOURCE_COLOR) {
1108
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1109
}
1110
}
1111
1112
if (p_property.name == "fog_aerial_perspective") {
1113
if (bg_mode != BG_SKY) {
1114
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1115
}
1116
}
1117
1118
if (p_property.name == "tonemap_white" && (tone_mapper == TONE_MAPPER_LINEAR || tone_mapper == TONE_MAPPER_AGX)) {
1119
// Whitepoint adjustment is not available with AgX or linear as it's hardcoded there.
1120
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1121
}
1122
1123
if (p_property.name == "glow_intensity" && glow_blend_mode == GLOW_BLEND_MODE_MIX) {
1124
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1125
}
1126
1127
if (OS::get_singleton()->get_current_rendering_method() == "gl_compatibility") {
1128
// Hide glow properties we do not support in GL Compatibility.
1129
if (p_property.name.begins_with("glow_levels") || p_property.name == "glow_normalized" || p_property.name == "glow_strength" || p_property.name == "glow_mix" || p_property.name == "glow_blend_mode" || p_property.name == "glow_map_strength" || p_property.name == "glow_map") {
1130
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1131
}
1132
} else {
1133
if (p_property.name == "glow_mix" && glow_blend_mode != GLOW_BLEND_MODE_MIX) {
1134
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1135
}
1136
}
1137
1138
if (p_property.name == "background_color") {
1139
if (bg_mode != BG_COLOR && ambient_source != AMBIENT_SOURCE_COLOR) {
1140
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1141
}
1142
}
1143
1144
if (p_property.name == "background_canvas_max_layer") {
1145
if (bg_mode != BG_CANVAS) {
1146
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1147
}
1148
}
1149
1150
if (p_property.name == "background_camera_feed_id") {
1151
if (bg_mode != BG_CAMERA_FEED) {
1152
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1153
}
1154
}
1155
1156
if (p_property.name == "background_intensity" && !GLOBAL_GET_CACHED(bool, "rendering/lights_and_shadows/use_physical_light_units")) {
1157
p_property.usage = PROPERTY_USAGE_NO_EDITOR;
1158
}
1159
}
1160
1161
#ifndef DISABLE_DEPRECATED
1162
// Kept for compatibility from 3.x to 4.0.
1163
bool Environment::_set(const StringName &p_name, const Variant &p_value) {
1164
if (p_name == "background_sky") {
1165
set_sky(p_value);
1166
return true;
1167
} else if (p_name == "background_sky_custom_fov") {
1168
set_sky_custom_fov(p_value);
1169
return true;
1170
} else if (p_name == "background_sky_orientation") {
1171
Vector3 euler = p_value.operator Basis().get_euler();
1172
set_sky_rotation(euler);
1173
return true;
1174
} else {
1175
return false;
1176
}
1177
}
1178
#endif
1179
1180
void Environment::_bind_methods() {
1181
// Background
1182
1183
ClassDB::bind_method(D_METHOD("set_background", "mode"), &Environment::set_background);
1184
ClassDB::bind_method(D_METHOD("get_background"), &Environment::get_background);
1185
ClassDB::bind_method(D_METHOD("set_sky", "sky"), &Environment::set_sky);
1186
ClassDB::bind_method(D_METHOD("get_sky"), &Environment::get_sky);
1187
ClassDB::bind_method(D_METHOD("set_sky_custom_fov", "scale"), &Environment::set_sky_custom_fov);
1188
ClassDB::bind_method(D_METHOD("get_sky_custom_fov"), &Environment::get_sky_custom_fov);
1189
ClassDB::bind_method(D_METHOD("set_sky_rotation", "euler_radians"), &Environment::set_sky_rotation);
1190
ClassDB::bind_method(D_METHOD("get_sky_rotation"), &Environment::get_sky_rotation);
1191
ClassDB::bind_method(D_METHOD("set_bg_color", "color"), &Environment::set_bg_color);
1192
ClassDB::bind_method(D_METHOD("get_bg_color"), &Environment::get_bg_color);
1193
ClassDB::bind_method(D_METHOD("set_bg_energy_multiplier", "energy"), &Environment::set_bg_energy_multiplier);
1194
ClassDB::bind_method(D_METHOD("get_bg_energy_multiplier"), &Environment::get_bg_energy_multiplier);
1195
ClassDB::bind_method(D_METHOD("set_bg_intensity", "energy"), &Environment::set_bg_intensity);
1196
ClassDB::bind_method(D_METHOD("get_bg_intensity"), &Environment::get_bg_intensity);
1197
ClassDB::bind_method(D_METHOD("set_canvas_max_layer", "layer"), &Environment::set_canvas_max_layer);
1198
ClassDB::bind_method(D_METHOD("get_canvas_max_layer"), &Environment::get_canvas_max_layer);
1199
ClassDB::bind_method(D_METHOD("set_camera_feed_id", "id"), &Environment::set_camera_feed_id);
1200
ClassDB::bind_method(D_METHOD("get_camera_feed_id"), &Environment::get_camera_feed_id);
1201
1202
ADD_GROUP("Background", "background_");
1203
ADD_PROPERTY(PropertyInfo(Variant::INT, "background_mode", PROPERTY_HINT_ENUM, "Clear Color,Custom Color,Sky,Canvas,Keep,Camera Feed"), "set_background", "get_background");
1204
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "background_color"), "set_bg_color", "get_bg_color");
1205
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "background_energy_multiplier", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_bg_energy_multiplier", "get_bg_energy_multiplier");
1206
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "background_intensity", PROPERTY_HINT_RANGE, "0,100000,0.01,suffix:nt"), "set_bg_intensity", "get_bg_intensity");
1207
1208
ADD_PROPERTY(PropertyInfo(Variant::INT, "background_canvas_max_layer", PROPERTY_HINT_RANGE, "-1000,1000,1"), "set_canvas_max_layer", "get_canvas_max_layer");
1209
ADD_PROPERTY(PropertyInfo(Variant::INT, "background_camera_feed_id", PROPERTY_HINT_RANGE, "1,10,1"), "set_camera_feed_id", "get_camera_feed_id");
1210
1211
ADD_GROUP("Sky", "sky_");
1212
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "sky", PROPERTY_HINT_RESOURCE_TYPE, "Sky"), "set_sky", "get_sky");
1213
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sky_custom_fov", PROPERTY_HINT_RANGE, "0,180,0.1,degrees"), "set_sky_custom_fov", "get_sky_custom_fov");
1214
ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "sky_rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_less,or_greater,radians_as_degrees"), "set_sky_rotation", "get_sky_rotation");
1215
1216
// Ambient light
1217
1218
ClassDB::bind_method(D_METHOD("set_ambient_light_color", "color"), &Environment::set_ambient_light_color);
1219
ClassDB::bind_method(D_METHOD("get_ambient_light_color"), &Environment::get_ambient_light_color);
1220
ClassDB::bind_method(D_METHOD("set_ambient_source", "source"), &Environment::set_ambient_source);
1221
ClassDB::bind_method(D_METHOD("get_ambient_source"), &Environment::get_ambient_source);
1222
ClassDB::bind_method(D_METHOD("set_ambient_light_energy", "energy"), &Environment::set_ambient_light_energy);
1223
ClassDB::bind_method(D_METHOD("get_ambient_light_energy"), &Environment::get_ambient_light_energy);
1224
ClassDB::bind_method(D_METHOD("set_ambient_light_sky_contribution", "ratio"), &Environment::set_ambient_light_sky_contribution);
1225
ClassDB::bind_method(D_METHOD("get_ambient_light_sky_contribution"), &Environment::get_ambient_light_sky_contribution);
1226
ClassDB::bind_method(D_METHOD("set_reflection_source", "source"), &Environment::set_reflection_source);
1227
ClassDB::bind_method(D_METHOD("get_reflection_source"), &Environment::get_reflection_source);
1228
1229
ADD_GROUP("Ambient Light", "ambient_light_");
1230
ADD_PROPERTY(PropertyInfo(Variant::INT, "ambient_light_source", PROPERTY_HINT_ENUM, "Background,Disabled,Color,Sky"), "set_ambient_source", "get_ambient_source");
1231
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "ambient_light_color"), "set_ambient_light_color", "get_ambient_light_color");
1232
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ambient_light_sky_contribution", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_ambient_light_sky_contribution", "get_ambient_light_sky_contribution");
1233
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ambient_light_energy", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_ambient_light_energy", "get_ambient_light_energy");
1234
1235
ADD_GROUP("Reflected Light", "reflected_light_");
1236
ADD_PROPERTY(PropertyInfo(Variant::INT, "reflected_light_source", PROPERTY_HINT_ENUM, "Background,Disabled,Sky"), "set_reflection_source", "get_reflection_source");
1237
1238
// Tonemap
1239
1240
ClassDB::bind_method(D_METHOD("set_tonemapper", "mode"), &Environment::set_tonemapper);
1241
ClassDB::bind_method(D_METHOD("get_tonemapper"), &Environment::get_tonemapper);
1242
ClassDB::bind_method(D_METHOD("set_tonemap_exposure", "exposure"), &Environment::set_tonemap_exposure);
1243
ClassDB::bind_method(D_METHOD("get_tonemap_exposure"), &Environment::get_tonemap_exposure);
1244
ClassDB::bind_method(D_METHOD("set_tonemap_white", "white"), &Environment::set_tonemap_white);
1245
ClassDB::bind_method(D_METHOD("get_tonemap_white"), &Environment::get_tonemap_white);
1246
1247
ADD_GROUP("Tonemap", "tonemap_");
1248
ADD_PROPERTY(PropertyInfo(Variant::INT, "tonemap_mode", PROPERTY_HINT_ENUM, "Linear,Reinhard,Filmic,ACES,AgX"), "set_tonemapper", "get_tonemapper");
1249
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "tonemap_exposure", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_tonemap_exposure", "get_tonemap_exposure");
1250
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "tonemap_white", PROPERTY_HINT_RANGE, "0,16,0.01"), "set_tonemap_white", "get_tonemap_white");
1251
1252
// SSR
1253
1254
ClassDB::bind_method(D_METHOD("set_ssr_enabled", "enabled"), &Environment::set_ssr_enabled);
1255
ClassDB::bind_method(D_METHOD("is_ssr_enabled"), &Environment::is_ssr_enabled);
1256
ClassDB::bind_method(D_METHOD("set_ssr_max_steps", "max_steps"), &Environment::set_ssr_max_steps);
1257
ClassDB::bind_method(D_METHOD("get_ssr_max_steps"), &Environment::get_ssr_max_steps);
1258
ClassDB::bind_method(D_METHOD("set_ssr_fade_in", "fade_in"), &Environment::set_ssr_fade_in);
1259
ClassDB::bind_method(D_METHOD("get_ssr_fade_in"), &Environment::get_ssr_fade_in);
1260
ClassDB::bind_method(D_METHOD("set_ssr_fade_out", "fade_out"), &Environment::set_ssr_fade_out);
1261
ClassDB::bind_method(D_METHOD("get_ssr_fade_out"), &Environment::get_ssr_fade_out);
1262
ClassDB::bind_method(D_METHOD("set_ssr_depth_tolerance", "depth_tolerance"), &Environment::set_ssr_depth_tolerance);
1263
ClassDB::bind_method(D_METHOD("get_ssr_depth_tolerance"), &Environment::get_ssr_depth_tolerance);
1264
1265
ADD_GROUP("SSR", "ssr_");
1266
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ssr_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_ssr_enabled", "is_ssr_enabled");
1267
ADD_PROPERTY(PropertyInfo(Variant::INT, "ssr_max_steps", PROPERTY_HINT_RANGE, "1,512,1"), "set_ssr_max_steps", "get_ssr_max_steps");
1268
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssr_fade_in", PROPERTY_HINT_EXP_EASING, "positive_only"), "set_ssr_fade_in", "get_ssr_fade_in");
1269
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssr_fade_out", PROPERTY_HINT_EXP_EASING, "positive_only"), "set_ssr_fade_out", "get_ssr_fade_out");
1270
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssr_depth_tolerance", PROPERTY_HINT_RANGE, "0.01,128,0.1"), "set_ssr_depth_tolerance", "get_ssr_depth_tolerance");
1271
1272
// SSAO
1273
ClassDB::bind_method(D_METHOD("set_ssao_enabled", "enabled"), &Environment::set_ssao_enabled);
1274
ClassDB::bind_method(D_METHOD("is_ssao_enabled"), &Environment::is_ssao_enabled);
1275
ClassDB::bind_method(D_METHOD("set_ssao_radius", "radius"), &Environment::set_ssao_radius);
1276
ClassDB::bind_method(D_METHOD("get_ssao_radius"), &Environment::get_ssao_radius);
1277
ClassDB::bind_method(D_METHOD("set_ssao_intensity", "intensity"), &Environment::set_ssao_intensity);
1278
ClassDB::bind_method(D_METHOD("get_ssao_intensity"), &Environment::get_ssao_intensity);
1279
ClassDB::bind_method(D_METHOD("set_ssao_power", "power"), &Environment::set_ssao_power);
1280
ClassDB::bind_method(D_METHOD("get_ssao_power"), &Environment::get_ssao_power);
1281
ClassDB::bind_method(D_METHOD("set_ssao_detail", "detail"), &Environment::set_ssao_detail);
1282
ClassDB::bind_method(D_METHOD("get_ssao_detail"), &Environment::get_ssao_detail);
1283
ClassDB::bind_method(D_METHOD("set_ssao_horizon", "horizon"), &Environment::set_ssao_horizon);
1284
ClassDB::bind_method(D_METHOD("get_ssao_horizon"), &Environment::get_ssao_horizon);
1285
ClassDB::bind_method(D_METHOD("set_ssao_sharpness", "sharpness"), &Environment::set_ssao_sharpness);
1286
ClassDB::bind_method(D_METHOD("get_ssao_sharpness"), &Environment::get_ssao_sharpness);
1287
ClassDB::bind_method(D_METHOD("set_ssao_direct_light_affect", "amount"), &Environment::set_ssao_direct_light_affect);
1288
ClassDB::bind_method(D_METHOD("get_ssao_direct_light_affect"), &Environment::get_ssao_direct_light_affect);
1289
ClassDB::bind_method(D_METHOD("set_ssao_ao_channel_affect", "amount"), &Environment::set_ssao_ao_channel_affect);
1290
ClassDB::bind_method(D_METHOD("get_ssao_ao_channel_affect"), &Environment::get_ssao_ao_channel_affect);
1291
1292
ADD_GROUP("SSAO", "ssao_");
1293
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ssao_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_ssao_enabled", "is_ssao_enabled");
1294
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_radius", PROPERTY_HINT_RANGE, "0.01,16,0.01,or_greater"), "set_ssao_radius", "get_ssao_radius");
1295
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_intensity", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_ssao_intensity", "get_ssao_intensity");
1296
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_power", PROPERTY_HINT_EXP_EASING, "positive_only"), "set_ssao_power", "get_ssao_power");
1297
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_detail", PROPERTY_HINT_RANGE, "0,5,0.01"), "set_ssao_detail", "get_ssao_detail");
1298
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_horizon", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_ssao_horizon", "get_ssao_horizon");
1299
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_sharpness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_ssao_sharpness", "get_ssao_sharpness");
1300
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_light_affect", PROPERTY_HINT_RANGE, "0.00,1,0.01"), "set_ssao_direct_light_affect", "get_ssao_direct_light_affect");
1301
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssao_ao_channel_affect", PROPERTY_HINT_RANGE, "0.00,1,0.01"), "set_ssao_ao_channel_affect", "get_ssao_ao_channel_affect");
1302
1303
// SSIL
1304
ClassDB::bind_method(D_METHOD("set_ssil_enabled", "enabled"), &Environment::set_ssil_enabled);
1305
ClassDB::bind_method(D_METHOD("is_ssil_enabled"), &Environment::is_ssil_enabled);
1306
ClassDB::bind_method(D_METHOD("set_ssil_radius", "radius"), &Environment::set_ssil_radius);
1307
ClassDB::bind_method(D_METHOD("get_ssil_radius"), &Environment::get_ssil_radius);
1308
ClassDB::bind_method(D_METHOD("set_ssil_intensity", "intensity"), &Environment::set_ssil_intensity);
1309
ClassDB::bind_method(D_METHOD("get_ssil_intensity"), &Environment::get_ssil_intensity);
1310
ClassDB::bind_method(D_METHOD("set_ssil_sharpness", "sharpness"), &Environment::set_ssil_sharpness);
1311
ClassDB::bind_method(D_METHOD("get_ssil_sharpness"), &Environment::get_ssil_sharpness);
1312
ClassDB::bind_method(D_METHOD("set_ssil_normal_rejection", "normal_rejection"), &Environment::set_ssil_normal_rejection);
1313
ClassDB::bind_method(D_METHOD("get_ssil_normal_rejection"), &Environment::get_ssil_normal_rejection);
1314
1315
ADD_GROUP("SSIL", "ssil_");
1316
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ssil_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_ssil_enabled", "is_ssil_enabled");
1317
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssil_radius", PROPERTY_HINT_RANGE, "0.01,16,0.01,or_greater,suffix:m"), "set_ssil_radius", "get_ssil_radius");
1318
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssil_intensity", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_ssil_intensity", "get_ssil_intensity");
1319
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssil_sharpness", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_ssil_sharpness", "get_ssil_sharpness");
1320
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "ssil_normal_rejection", PROPERTY_HINT_RANGE, "0,1,0.01"), "set_ssil_normal_rejection", "get_ssil_normal_rejection");
1321
1322
// SDFGI
1323
1324
ClassDB::bind_method(D_METHOD("set_sdfgi_enabled", "enabled"), &Environment::set_sdfgi_enabled);
1325
ClassDB::bind_method(D_METHOD("is_sdfgi_enabled"), &Environment::is_sdfgi_enabled);
1326
ClassDB::bind_method(D_METHOD("set_sdfgi_cascades", "amount"), &Environment::set_sdfgi_cascades);
1327
ClassDB::bind_method(D_METHOD("get_sdfgi_cascades"), &Environment::get_sdfgi_cascades);
1328
ClassDB::bind_method(D_METHOD("set_sdfgi_min_cell_size", "size"), &Environment::set_sdfgi_min_cell_size);
1329
ClassDB::bind_method(D_METHOD("get_sdfgi_min_cell_size"), &Environment::get_sdfgi_min_cell_size);
1330
ClassDB::bind_method(D_METHOD("set_sdfgi_max_distance", "distance"), &Environment::set_sdfgi_max_distance);
1331
ClassDB::bind_method(D_METHOD("get_sdfgi_max_distance"), &Environment::get_sdfgi_max_distance);
1332
ClassDB::bind_method(D_METHOD("set_sdfgi_cascade0_distance", "distance"), &Environment::set_sdfgi_cascade0_distance);
1333
ClassDB::bind_method(D_METHOD("get_sdfgi_cascade0_distance"), &Environment::get_sdfgi_cascade0_distance);
1334
ClassDB::bind_method(D_METHOD("set_sdfgi_y_scale", "scale"), &Environment::set_sdfgi_y_scale);
1335
ClassDB::bind_method(D_METHOD("get_sdfgi_y_scale"), &Environment::get_sdfgi_y_scale);
1336
ClassDB::bind_method(D_METHOD("set_sdfgi_use_occlusion", "enable"), &Environment::set_sdfgi_use_occlusion);
1337
ClassDB::bind_method(D_METHOD("is_sdfgi_using_occlusion"), &Environment::is_sdfgi_using_occlusion);
1338
ClassDB::bind_method(D_METHOD("set_sdfgi_bounce_feedback", "amount"), &Environment::set_sdfgi_bounce_feedback);
1339
ClassDB::bind_method(D_METHOD("get_sdfgi_bounce_feedback"), &Environment::get_sdfgi_bounce_feedback);
1340
ClassDB::bind_method(D_METHOD("set_sdfgi_read_sky_light", "enable"), &Environment::set_sdfgi_read_sky_light);
1341
ClassDB::bind_method(D_METHOD("is_sdfgi_reading_sky_light"), &Environment::is_sdfgi_reading_sky_light);
1342
ClassDB::bind_method(D_METHOD("set_sdfgi_energy", "amount"), &Environment::set_sdfgi_energy);
1343
ClassDB::bind_method(D_METHOD("get_sdfgi_energy"), &Environment::get_sdfgi_energy);
1344
ClassDB::bind_method(D_METHOD("set_sdfgi_normal_bias", "bias"), &Environment::set_sdfgi_normal_bias);
1345
ClassDB::bind_method(D_METHOD("get_sdfgi_normal_bias"), &Environment::get_sdfgi_normal_bias);
1346
ClassDB::bind_method(D_METHOD("set_sdfgi_probe_bias", "bias"), &Environment::set_sdfgi_probe_bias);
1347
ClassDB::bind_method(D_METHOD("get_sdfgi_probe_bias"), &Environment::get_sdfgi_probe_bias);
1348
1349
ADD_GROUP("SDFGI", "sdfgi_");
1350
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sdfgi_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_sdfgi_enabled", "is_sdfgi_enabled");
1351
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sdfgi_use_occlusion"), "set_sdfgi_use_occlusion", "is_sdfgi_using_occlusion");
1352
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "sdfgi_read_sky_light"), "set_sdfgi_read_sky_light", "is_sdfgi_reading_sky_light");
1353
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_bounce_feedback", PROPERTY_HINT_RANGE, "0,1.99,0.01"), "set_sdfgi_bounce_feedback", "get_sdfgi_bounce_feedback");
1354
ADD_PROPERTY(PropertyInfo(Variant::INT, "sdfgi_cascades", PROPERTY_HINT_RANGE, "1,8,1"), "set_sdfgi_cascades", "get_sdfgi_cascades");
1355
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_min_cell_size", PROPERTY_HINT_RANGE, "0.01,64,0.01"), "set_sdfgi_min_cell_size", "get_sdfgi_min_cell_size");
1356
// Don't store the values of `sdfgi_cascade0_distance` and `sdfgi_max_distance`
1357
// as they're derived from `sdfgi_min_cell_size`.
1358
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_cascade0_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater", PROPERTY_USAGE_EDITOR), "set_sdfgi_cascade0_distance", "get_sdfgi_cascade0_distance");
1359
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_max_distance", PROPERTY_HINT_RANGE, "0.1,16384,0.1,or_greater", PROPERTY_USAGE_EDITOR), "set_sdfgi_max_distance", "get_sdfgi_max_distance");
1360
ADD_PROPERTY(PropertyInfo(Variant::INT, "sdfgi_y_scale", PROPERTY_HINT_ENUM, "50% (Compact),75% (Balanced),100% (Sparse)"), "set_sdfgi_y_scale", "get_sdfgi_y_scale");
1361
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_energy"), "set_sdfgi_energy", "get_sdfgi_energy");
1362
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_normal_bias"), "set_sdfgi_normal_bias", "get_sdfgi_normal_bias");
1363
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "sdfgi_probe_bias"), "set_sdfgi_probe_bias", "get_sdfgi_probe_bias");
1364
1365
// Glow
1366
1367
ClassDB::bind_method(D_METHOD("set_glow_enabled", "enabled"), &Environment::set_glow_enabled);
1368
ClassDB::bind_method(D_METHOD("is_glow_enabled"), &Environment::is_glow_enabled);
1369
ClassDB::bind_method(D_METHOD("set_glow_level", "idx", "intensity"), &Environment::set_glow_level);
1370
ClassDB::bind_method(D_METHOD("get_glow_level", "idx"), &Environment::get_glow_level);
1371
ClassDB::bind_method(D_METHOD("set_glow_normalized", "normalize"), &Environment::set_glow_normalized);
1372
ClassDB::bind_method(D_METHOD("is_glow_normalized"), &Environment::is_glow_normalized);
1373
ClassDB::bind_method(D_METHOD("set_glow_intensity", "intensity"), &Environment::set_glow_intensity);
1374
ClassDB::bind_method(D_METHOD("get_glow_intensity"), &Environment::get_glow_intensity);
1375
ClassDB::bind_method(D_METHOD("set_glow_strength", "strength"), &Environment::set_glow_strength);
1376
ClassDB::bind_method(D_METHOD("get_glow_strength"), &Environment::get_glow_strength);
1377
ClassDB::bind_method(D_METHOD("set_glow_mix", "mix"), &Environment::set_glow_mix);
1378
ClassDB::bind_method(D_METHOD("get_glow_mix"), &Environment::get_glow_mix);
1379
ClassDB::bind_method(D_METHOD("set_glow_bloom", "amount"), &Environment::set_glow_bloom);
1380
ClassDB::bind_method(D_METHOD("get_glow_bloom"), &Environment::get_glow_bloom);
1381
ClassDB::bind_method(D_METHOD("set_glow_blend_mode", "mode"), &Environment::set_glow_blend_mode);
1382
ClassDB::bind_method(D_METHOD("get_glow_blend_mode"), &Environment::get_glow_blend_mode);
1383
ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_threshold", "threshold"), &Environment::set_glow_hdr_bleed_threshold);
1384
ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_threshold"), &Environment::get_glow_hdr_bleed_threshold);
1385
ClassDB::bind_method(D_METHOD("set_glow_hdr_bleed_scale", "scale"), &Environment::set_glow_hdr_bleed_scale);
1386
ClassDB::bind_method(D_METHOD("get_glow_hdr_bleed_scale"), &Environment::get_glow_hdr_bleed_scale);
1387
ClassDB::bind_method(D_METHOD("set_glow_hdr_luminance_cap", "amount"), &Environment::set_glow_hdr_luminance_cap);
1388
ClassDB::bind_method(D_METHOD("get_glow_hdr_luminance_cap"), &Environment::get_glow_hdr_luminance_cap);
1389
ClassDB::bind_method(D_METHOD("set_glow_map_strength", "strength"), &Environment::set_glow_map_strength);
1390
ClassDB::bind_method(D_METHOD("get_glow_map_strength"), &Environment::get_glow_map_strength);
1391
ClassDB::bind_method(D_METHOD("set_glow_map", "mode"), &Environment::set_glow_map);
1392
ClassDB::bind_method(D_METHOD("get_glow_map"), &Environment::get_glow_map);
1393
1394
ADD_GROUP("Glow", "glow_");
1395
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_glow_enabled", "is_glow_enabled");
1396
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/1", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 0);
1397
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/2", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 1);
1398
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/3", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 2);
1399
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/4", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 3);
1400
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/5", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 4);
1401
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/6", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 5);
1402
ADD_PROPERTYI(PropertyInfo(Variant::FLOAT, "glow_levels/7", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_glow_level", "get_glow_level", 6);
1403
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "glow_normalized"), "set_glow_normalized", "is_glow_normalized");
1404
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_intensity", PROPERTY_HINT_RANGE, "0.0,8.0,0.01"), "set_glow_intensity", "get_glow_intensity");
1405
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_strength", PROPERTY_HINT_RANGE, "0.0,2.0,0.01"), "set_glow_strength", "get_glow_strength");
1406
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_mix", PROPERTY_HINT_RANGE, "0.0,1.0,0.001"), "set_glow_mix", "get_glow_mix");
1407
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_bloom", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_bloom", "get_glow_bloom");
1408
ADD_PROPERTY(PropertyInfo(Variant::INT, "glow_blend_mode", PROPERTY_HINT_ENUM, "Additive,Screen,Softlight,Replace,Mix"), "set_glow_blend_mode", "get_glow_blend_mode");
1409
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_threshold", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_threshold", "get_glow_hdr_bleed_threshold");
1410
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_scale", PROPERTY_HINT_RANGE, "0.0,4.0,0.01"), "set_glow_hdr_bleed_scale", "get_glow_hdr_bleed_scale");
1411
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_hdr_luminance_cap", PROPERTY_HINT_RANGE, "0.0,256.0,0.01"), "set_glow_hdr_luminance_cap", "get_glow_hdr_luminance_cap");
1412
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "glow_map_strength", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_glow_map_strength", "get_glow_map_strength");
1413
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "glow_map", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_glow_map", "get_glow_map");
1414
1415
// Fog
1416
1417
ClassDB::bind_method(D_METHOD("set_fog_enabled", "enabled"), &Environment::set_fog_enabled);
1418
ClassDB::bind_method(D_METHOD("is_fog_enabled"), &Environment::is_fog_enabled);
1419
ClassDB::bind_method(D_METHOD("set_fog_mode", "mode"), &Environment::set_fog_mode);
1420
ClassDB::bind_method(D_METHOD("get_fog_mode"), &Environment::get_fog_mode);
1421
ClassDB::bind_method(D_METHOD("set_fog_light_color", "light_color"), &Environment::set_fog_light_color);
1422
ClassDB::bind_method(D_METHOD("get_fog_light_color"), &Environment::get_fog_light_color);
1423
ClassDB::bind_method(D_METHOD("set_fog_light_energy", "light_energy"), &Environment::set_fog_light_energy);
1424
ClassDB::bind_method(D_METHOD("get_fog_light_energy"), &Environment::get_fog_light_energy);
1425
ClassDB::bind_method(D_METHOD("set_fog_sun_scatter", "sun_scatter"), &Environment::set_fog_sun_scatter);
1426
ClassDB::bind_method(D_METHOD("get_fog_sun_scatter"), &Environment::get_fog_sun_scatter);
1427
1428
ClassDB::bind_method(D_METHOD("set_fog_density", "density"), &Environment::set_fog_density);
1429
ClassDB::bind_method(D_METHOD("get_fog_density"), &Environment::get_fog_density);
1430
1431
ClassDB::bind_method(D_METHOD("set_fog_height", "height"), &Environment::set_fog_height);
1432
ClassDB::bind_method(D_METHOD("get_fog_height"), &Environment::get_fog_height);
1433
1434
ClassDB::bind_method(D_METHOD("set_fog_height_density", "height_density"), &Environment::set_fog_height_density);
1435
ClassDB::bind_method(D_METHOD("get_fog_height_density"), &Environment::get_fog_height_density);
1436
1437
ClassDB::bind_method(D_METHOD("set_fog_aerial_perspective", "aerial_perspective"), &Environment::set_fog_aerial_perspective);
1438
ClassDB::bind_method(D_METHOD("get_fog_aerial_perspective"), &Environment::get_fog_aerial_perspective);
1439
1440
ClassDB::bind_method(D_METHOD("set_fog_sky_affect", "sky_affect"), &Environment::set_fog_sky_affect);
1441
ClassDB::bind_method(D_METHOD("get_fog_sky_affect"), &Environment::get_fog_sky_affect);
1442
1443
ClassDB::bind_method(D_METHOD("set_fog_depth_curve", "curve"), &Environment::set_fog_depth_curve);
1444
ClassDB::bind_method(D_METHOD("get_fog_depth_curve"), &Environment::get_fog_depth_curve);
1445
ClassDB::bind_method(D_METHOD("set_fog_depth_begin", "begin"), &Environment::set_fog_depth_begin);
1446
ClassDB::bind_method(D_METHOD("get_fog_depth_begin"), &Environment::get_fog_depth_begin);
1447
ClassDB::bind_method(D_METHOD("set_fog_depth_end", "end"), &Environment::set_fog_depth_end);
1448
ClassDB::bind_method(D_METHOD("get_fog_depth_end"), &Environment::get_fog_depth_end);
1449
1450
ADD_GROUP("Fog", "fog_");
1451
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "fog_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_fog_enabled", "is_fog_enabled");
1452
ADD_PROPERTY(PropertyInfo(Variant::INT, "fog_mode", PROPERTY_HINT_ENUM, "Exponential,Depth"), "set_fog_mode", "get_fog_mode");
1453
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "fog_light_color", PROPERTY_HINT_COLOR_NO_ALPHA), "set_fog_light_color", "get_fog_light_color");
1454
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_light_energy", PROPERTY_HINT_RANGE, "0,16,0.01,or_greater"), "set_fog_light_energy", "get_fog_light_energy");
1455
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_sun_scatter", PROPERTY_HINT_RANGE, "0,1,0.01,or_greater"), "set_fog_sun_scatter", "get_fog_sun_scatter");
1456
1457
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_density", PROPERTY_HINT_RANGE, "0,1,0.0001,or_greater"), "set_fog_density", "get_fog_density");
1458
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_aerial_perspective", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_fog_aerial_perspective", "get_fog_aerial_perspective");
1459
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_sky_affect", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_fog_sky_affect", "get_fog_sky_affect");
1460
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_height", PROPERTY_HINT_RANGE, "-1024,1024,0.01,or_less,or_greater,suffix:m"), "set_fog_height", "get_fog_height");
1461
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_height_density", PROPERTY_HINT_RANGE, "-16,16,0.0001,or_less,or_greater"), "set_fog_height_density", "get_fog_height_density");
1462
1463
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_depth_curve", PROPERTY_HINT_EXP_EASING), "set_fog_depth_curve", "get_fog_depth_curve");
1464
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_depth_begin", PROPERTY_HINT_RANGE, "0,4000,0.1,or_greater,or_less,suffix:m"), "set_fog_depth_begin", "get_fog_depth_begin");
1465
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "fog_depth_end", PROPERTY_HINT_RANGE, "0,4000,0.1,or_greater,or_less,suffix:m"), "set_fog_depth_end", "get_fog_depth_end");
1466
1467
ClassDB::bind_method(D_METHOD("set_volumetric_fog_enabled", "enabled"), &Environment::set_volumetric_fog_enabled);
1468
ClassDB::bind_method(D_METHOD("is_volumetric_fog_enabled"), &Environment::is_volumetric_fog_enabled);
1469
ClassDB::bind_method(D_METHOD("set_volumetric_fog_emission", "color"), &Environment::set_volumetric_fog_emission);
1470
ClassDB::bind_method(D_METHOD("get_volumetric_fog_emission"), &Environment::get_volumetric_fog_emission);
1471
ClassDB::bind_method(D_METHOD("set_volumetric_fog_albedo", "color"), &Environment::set_volumetric_fog_albedo);
1472
ClassDB::bind_method(D_METHOD("get_volumetric_fog_albedo"), &Environment::get_volumetric_fog_albedo);
1473
ClassDB::bind_method(D_METHOD("set_volumetric_fog_density", "density"), &Environment::set_volumetric_fog_density);
1474
ClassDB::bind_method(D_METHOD("get_volumetric_fog_density"), &Environment::get_volumetric_fog_density);
1475
ClassDB::bind_method(D_METHOD("set_volumetric_fog_emission_energy", "begin"), &Environment::set_volumetric_fog_emission_energy);
1476
ClassDB::bind_method(D_METHOD("get_volumetric_fog_emission_energy"), &Environment::get_volumetric_fog_emission_energy);
1477
ClassDB::bind_method(D_METHOD("set_volumetric_fog_anisotropy", "anisotropy"), &Environment::set_volumetric_fog_anisotropy);
1478
ClassDB::bind_method(D_METHOD("get_volumetric_fog_anisotropy"), &Environment::get_volumetric_fog_anisotropy);
1479
ClassDB::bind_method(D_METHOD("set_volumetric_fog_length", "length"), &Environment::set_volumetric_fog_length);
1480
ClassDB::bind_method(D_METHOD("get_volumetric_fog_length"), &Environment::get_volumetric_fog_length);
1481
ClassDB::bind_method(D_METHOD("set_volumetric_fog_detail_spread", "detail_spread"), &Environment::set_volumetric_fog_detail_spread);
1482
ClassDB::bind_method(D_METHOD("get_volumetric_fog_detail_spread"), &Environment::get_volumetric_fog_detail_spread);
1483
ClassDB::bind_method(D_METHOD("set_volumetric_fog_gi_inject", "gi_inject"), &Environment::set_volumetric_fog_gi_inject);
1484
ClassDB::bind_method(D_METHOD("get_volumetric_fog_gi_inject"), &Environment::get_volumetric_fog_gi_inject);
1485
ClassDB::bind_method(D_METHOD("set_volumetric_fog_ambient_inject", "enabled"), &Environment::set_volumetric_fog_ambient_inject);
1486
ClassDB::bind_method(D_METHOD("get_volumetric_fog_ambient_inject"), &Environment::get_volumetric_fog_ambient_inject);
1487
ClassDB::bind_method(D_METHOD("set_volumetric_fog_sky_affect", "sky_affect"), &Environment::set_volumetric_fog_sky_affect);
1488
ClassDB::bind_method(D_METHOD("get_volumetric_fog_sky_affect"), &Environment::get_volumetric_fog_sky_affect);
1489
ClassDB::bind_method(D_METHOD("set_volumetric_fog_temporal_reprojection_enabled", "enabled"), &Environment::set_volumetric_fog_temporal_reprojection_enabled);
1490
ClassDB::bind_method(D_METHOD("is_volumetric_fog_temporal_reprojection_enabled"), &Environment::is_volumetric_fog_temporal_reprojection_enabled);
1491
ClassDB::bind_method(D_METHOD("set_volumetric_fog_temporal_reprojection_amount", "temporal_reprojection_amount"), &Environment::set_volumetric_fog_temporal_reprojection_amount);
1492
ClassDB::bind_method(D_METHOD("get_volumetric_fog_temporal_reprojection_amount"), &Environment::get_volumetric_fog_temporal_reprojection_amount);
1493
1494
ADD_GROUP("Volumetric Fog", "volumetric_fog_");
1495
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "volumetric_fog_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_volumetric_fog_enabled", "is_volumetric_fog_enabled");
1496
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_density", PROPERTY_HINT_RANGE, "0,1,0.0001,or_greater"), "set_volumetric_fog_density", "get_volumetric_fog_density");
1497
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "volumetric_fog_albedo", PROPERTY_HINT_COLOR_NO_ALPHA), "set_volumetric_fog_albedo", "get_volumetric_fog_albedo");
1498
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "volumetric_fog_emission", PROPERTY_HINT_COLOR_NO_ALPHA), "set_volumetric_fog_emission", "get_volumetric_fog_emission");
1499
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_emission_energy", PROPERTY_HINT_RANGE, "0,1024,0.01,or_greater"), "set_volumetric_fog_emission_energy", "get_volumetric_fog_emission_energy");
1500
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_gi_inject", PROPERTY_HINT_RANGE, "0.0,16,0.01,exp"), "set_volumetric_fog_gi_inject", "get_volumetric_fog_gi_inject");
1501
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_anisotropy", PROPERTY_HINT_RANGE, "-0.9,0.9,0.01"), "set_volumetric_fog_anisotropy", "get_volumetric_fog_anisotropy");
1502
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_length", PROPERTY_HINT_RANGE, "0.01,1024,0.01,or_greater,suffix:m"), "set_volumetric_fog_length", "get_volumetric_fog_length");
1503
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_detail_spread", PROPERTY_HINT_EXP_EASING, "positive_only"), "set_volumetric_fog_detail_spread", "get_volumetric_fog_detail_spread");
1504
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_ambient_inject", PROPERTY_HINT_RANGE, "0.0,16,0.01,exp"), "set_volumetric_fog_ambient_inject", "get_volumetric_fog_ambient_inject");
1505
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_sky_affect", PROPERTY_HINT_RANGE, "0,1,0.001"), "set_volumetric_fog_sky_affect", "get_volumetric_fog_sky_affect");
1506
ADD_SUBGROUP("Temporal Reprojection", "volumetric_fog_temporal_reprojection_");
1507
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "volumetric_fog_temporal_reprojection_enabled"), "set_volumetric_fog_temporal_reprojection_enabled", "is_volumetric_fog_temporal_reprojection_enabled");
1508
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "volumetric_fog_temporal_reprojection_amount", PROPERTY_HINT_RANGE, "0.5,0.99,0.001"), "set_volumetric_fog_temporal_reprojection_amount", "get_volumetric_fog_temporal_reprojection_amount");
1509
1510
// Adjustment
1511
1512
ClassDB::bind_method(D_METHOD("set_adjustment_enabled", "enabled"), &Environment::set_adjustment_enabled);
1513
ClassDB::bind_method(D_METHOD("is_adjustment_enabled"), &Environment::is_adjustment_enabled);
1514
ClassDB::bind_method(D_METHOD("set_adjustment_brightness", "brightness"), &Environment::set_adjustment_brightness);
1515
ClassDB::bind_method(D_METHOD("get_adjustment_brightness"), &Environment::get_adjustment_brightness);
1516
ClassDB::bind_method(D_METHOD("set_adjustment_contrast", "contrast"), &Environment::set_adjustment_contrast);
1517
ClassDB::bind_method(D_METHOD("get_adjustment_contrast"), &Environment::get_adjustment_contrast);
1518
ClassDB::bind_method(D_METHOD("set_adjustment_saturation", "saturation"), &Environment::set_adjustment_saturation);
1519
ClassDB::bind_method(D_METHOD("get_adjustment_saturation"), &Environment::get_adjustment_saturation);
1520
ClassDB::bind_method(D_METHOD("set_adjustment_color_correction", "color_correction"), &Environment::set_adjustment_color_correction);
1521
ClassDB::bind_method(D_METHOD("get_adjustment_color_correction"), &Environment::get_adjustment_color_correction);
1522
1523
ADD_GROUP("Adjustments", "adjustment_");
1524
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "adjustment_enabled", PROPERTY_HINT_GROUP_ENABLE), "set_adjustment_enabled", "is_adjustment_enabled");
1525
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "adjustment_brightness", PROPERTY_HINT_RANGE, "0.01,8,0.01"), "set_adjustment_brightness", "get_adjustment_brightness");
1526
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "adjustment_contrast", PROPERTY_HINT_RANGE, "0.01,8,0.01"), "set_adjustment_contrast", "get_adjustment_contrast");
1527
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "adjustment_saturation", PROPERTY_HINT_RANGE, "0.01,8,0.01"), "set_adjustment_saturation", "get_adjustment_saturation");
1528
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "adjustment_color_correction", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D,Texture3D"), "set_adjustment_color_correction", "get_adjustment_color_correction");
1529
1530
// Constants
1531
1532
BIND_ENUM_CONSTANT(BG_CLEAR_COLOR);
1533
BIND_ENUM_CONSTANT(BG_COLOR);
1534
BIND_ENUM_CONSTANT(BG_SKY);
1535
BIND_ENUM_CONSTANT(BG_CANVAS);
1536
BIND_ENUM_CONSTANT(BG_KEEP);
1537
BIND_ENUM_CONSTANT(BG_CAMERA_FEED);
1538
BIND_ENUM_CONSTANT(BG_MAX);
1539
1540
BIND_ENUM_CONSTANT(AMBIENT_SOURCE_BG);
1541
BIND_ENUM_CONSTANT(AMBIENT_SOURCE_DISABLED);
1542
BIND_ENUM_CONSTANT(AMBIENT_SOURCE_COLOR);
1543
BIND_ENUM_CONSTANT(AMBIENT_SOURCE_SKY);
1544
1545
BIND_ENUM_CONSTANT(REFLECTION_SOURCE_BG);
1546
BIND_ENUM_CONSTANT(REFLECTION_SOURCE_DISABLED);
1547
BIND_ENUM_CONSTANT(REFLECTION_SOURCE_SKY);
1548
1549
BIND_ENUM_CONSTANT(TONE_MAPPER_LINEAR);
1550
BIND_ENUM_CONSTANT(TONE_MAPPER_REINHARDT);
1551
BIND_ENUM_CONSTANT(TONE_MAPPER_FILMIC);
1552
BIND_ENUM_CONSTANT(TONE_MAPPER_ACES);
1553
BIND_ENUM_CONSTANT(TONE_MAPPER_AGX);
1554
1555
BIND_ENUM_CONSTANT(GLOW_BLEND_MODE_ADDITIVE);
1556
BIND_ENUM_CONSTANT(GLOW_BLEND_MODE_SCREEN);
1557
BIND_ENUM_CONSTANT(GLOW_BLEND_MODE_SOFTLIGHT);
1558
BIND_ENUM_CONSTANT(GLOW_BLEND_MODE_REPLACE);
1559
BIND_ENUM_CONSTANT(GLOW_BLEND_MODE_MIX);
1560
1561
BIND_ENUM_CONSTANT(FOG_MODE_EXPONENTIAL);
1562
BIND_ENUM_CONSTANT(FOG_MODE_DEPTH);
1563
1564
BIND_ENUM_CONSTANT(SDFGI_Y_SCALE_50_PERCENT);
1565
BIND_ENUM_CONSTANT(SDFGI_Y_SCALE_75_PERCENT);
1566
BIND_ENUM_CONSTANT(SDFGI_Y_SCALE_100_PERCENT);
1567
}
1568
1569
Environment::Environment() {
1570
environment = RS::get_singleton()->environment_create();
1571
1572
set_camera_feed_id(bg_camera_feed_id);
1573
1574
glow_levels.resize(7);
1575
glow_levels.write[0] = 0.0;
1576
glow_levels.write[1] = 0.0;
1577
glow_levels.write[2] = 1.0;
1578
glow_levels.write[3] = 0.0;
1579
glow_levels.write[4] = 1.0;
1580
glow_levels.write[5] = 0.0;
1581
glow_levels.write[6] = 0.0;
1582
1583
_update_ambient_light();
1584
_update_tonemap();
1585
_update_ssr();
1586
_update_ssao();
1587
_update_ssil();
1588
_update_sdfgi();
1589
_update_glow();
1590
_update_fog();
1591
_update_adjustment();
1592
_update_volumetric_fog();
1593
_update_bg_energy();
1594
notify_property_list_changed();
1595
}
1596
1597
Environment::~Environment() {
1598
ERR_FAIL_NULL(RenderingServer::get_singleton());
1599
RS::get_singleton()->free(environment);
1600
}
1601
1602