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