environment_storage.cpp 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. /**************************************************************************/
  2. /* environment_storage.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. #include "environment_storage.h"
  31. // Storage
  32. RendererEnvironmentStorage *RendererEnvironmentStorage::singleton = nullptr;
  33. RendererEnvironmentStorage::RendererEnvironmentStorage() {
  34. singleton = this;
  35. }
  36. RendererEnvironmentStorage::~RendererEnvironmentStorage() {
  37. singleton = nullptr;
  38. }
  39. // Environment
  40. RID RendererEnvironmentStorage::environment_allocate() {
  41. return environment_owner.allocate_rid();
  42. }
  43. void RendererEnvironmentStorage::environment_initialize(RID p_rid) {
  44. environment_owner.initialize_rid(p_rid, Environment());
  45. }
  46. void RendererEnvironmentStorage::environment_free(RID p_rid) {
  47. environment_owner.free(p_rid);
  48. }
  49. // Background
  50. void RendererEnvironmentStorage::environment_set_background(RID p_env, RS::EnvironmentBG p_bg) {
  51. Environment *env = environment_owner.get_or_null(p_env);
  52. ERR_FAIL_NULL(env);
  53. env->background = p_bg;
  54. }
  55. void RendererEnvironmentStorage::environment_set_sky(RID p_env, RID p_sky) {
  56. Environment *env = environment_owner.get_or_null(p_env);
  57. ERR_FAIL_NULL(env);
  58. env->sky = p_sky;
  59. }
  60. void RendererEnvironmentStorage::environment_set_sky_custom_fov(RID p_env, float p_scale) {
  61. Environment *env = environment_owner.get_or_null(p_env);
  62. ERR_FAIL_NULL(env);
  63. env->sky_custom_fov = p_scale;
  64. }
  65. void RendererEnvironmentStorage::environment_set_sky_orientation(RID p_env, const Basis &p_orientation) {
  66. Environment *env = environment_owner.get_or_null(p_env);
  67. ERR_FAIL_NULL(env);
  68. env->sky_orientation = p_orientation;
  69. }
  70. void RendererEnvironmentStorage::environment_set_bg_color(RID p_env, const Color &p_color) {
  71. Environment *env = environment_owner.get_or_null(p_env);
  72. ERR_FAIL_NULL(env);
  73. env->bg_color = p_color;
  74. }
  75. void RendererEnvironmentStorage::environment_set_bg_energy(RID p_env, float p_multiplier, float p_intensity) {
  76. Environment *env = environment_owner.get_or_null(p_env);
  77. ERR_FAIL_NULL(env);
  78. env->bg_energy_multiplier = p_multiplier;
  79. env->bg_intensity = p_intensity;
  80. }
  81. void RendererEnvironmentStorage::environment_set_canvas_max_layer(RID p_env, int p_max_layer) {
  82. Environment *env = environment_owner.get_or_null(p_env);
  83. ERR_FAIL_NULL(env);
  84. env->canvas_max_layer = p_max_layer;
  85. }
  86. void RendererEnvironmentStorage::environment_set_ambient_light(RID p_env, const Color &p_color, RS::EnvironmentAmbientSource p_ambient, float p_energy, float p_sky_contribution, RS::EnvironmentReflectionSource p_reflection_source) {
  87. Environment *env = environment_owner.get_or_null(p_env);
  88. ERR_FAIL_NULL(env);
  89. env->ambient_light = p_color;
  90. env->ambient_source = p_ambient;
  91. env->ambient_light_energy = p_energy;
  92. env->ambient_sky_contribution = p_sky_contribution;
  93. env->reflection_source = p_reflection_source;
  94. }
  95. RS::EnvironmentBG RendererEnvironmentStorage::environment_get_background(RID p_env) const {
  96. Environment *env = environment_owner.get_or_null(p_env);
  97. ERR_FAIL_NULL_V(env, RS::ENV_BG_CLEAR_COLOR);
  98. return env->background;
  99. }
  100. RID RendererEnvironmentStorage::environment_get_sky(RID p_env) const {
  101. Environment *env = environment_owner.get_or_null(p_env);
  102. ERR_FAIL_NULL_V(env, RID());
  103. return env->sky;
  104. }
  105. float RendererEnvironmentStorage::environment_get_sky_custom_fov(RID p_env) const {
  106. Environment *env = environment_owner.get_or_null(p_env);
  107. ERR_FAIL_NULL_V(env, 0.0);
  108. return env->sky_custom_fov;
  109. }
  110. Basis RendererEnvironmentStorage::environment_get_sky_orientation(RID p_env) const {
  111. Environment *env = environment_owner.get_or_null(p_env);
  112. ERR_FAIL_NULL_V(env, Basis());
  113. return env->sky_orientation;
  114. }
  115. Color RendererEnvironmentStorage::environment_get_bg_color(RID p_env) const {
  116. Environment *env = environment_owner.get_or_null(p_env);
  117. ERR_FAIL_NULL_V(env, Color());
  118. return env->bg_color;
  119. }
  120. float RendererEnvironmentStorage::environment_get_bg_energy_multiplier(RID p_env) const {
  121. Environment *env = environment_owner.get_or_null(p_env);
  122. ERR_FAIL_NULL_V(env, 1.0);
  123. return env->bg_energy_multiplier;
  124. }
  125. float RendererEnvironmentStorage::environment_get_bg_intensity(RID p_env) const {
  126. Environment *env = environment_owner.get_or_null(p_env);
  127. ERR_FAIL_NULL_V(env, 1.0);
  128. return env->bg_intensity;
  129. }
  130. int RendererEnvironmentStorage::environment_get_canvas_max_layer(RID p_env) const {
  131. Environment *env = environment_owner.get_or_null(p_env);
  132. ERR_FAIL_NULL_V(env, 0);
  133. return env->canvas_max_layer;
  134. }
  135. RS::EnvironmentAmbientSource RendererEnvironmentStorage::environment_get_ambient_source(RID p_env) const {
  136. Environment *env = environment_owner.get_or_null(p_env);
  137. ERR_FAIL_NULL_V(env, RS::ENV_AMBIENT_SOURCE_BG);
  138. return env->ambient_source;
  139. }
  140. Color RendererEnvironmentStorage::environment_get_ambient_light(RID p_env) const {
  141. Environment *env = environment_owner.get_or_null(p_env);
  142. ERR_FAIL_NULL_V(env, Color());
  143. return env->ambient_light;
  144. }
  145. float RendererEnvironmentStorage::environment_get_ambient_light_energy(RID p_env) const {
  146. Environment *env = environment_owner.get_or_null(p_env);
  147. ERR_FAIL_NULL_V(env, 1.0);
  148. return env->ambient_light_energy;
  149. }
  150. float RendererEnvironmentStorage::environment_get_ambient_sky_contribution(RID p_env) const {
  151. Environment *env = environment_owner.get_or_null(p_env);
  152. ERR_FAIL_NULL_V(env, 1.0);
  153. return env->ambient_sky_contribution;
  154. }
  155. RS::EnvironmentReflectionSource RendererEnvironmentStorage::environment_get_reflection_source(RID p_env) const {
  156. Environment *env = environment_owner.get_or_null(p_env);
  157. ERR_FAIL_NULL_V(env, RS::ENV_REFLECTION_SOURCE_BG);
  158. return env->reflection_source;
  159. }
  160. void RendererEnvironmentStorage::environment_set_camera_feed_id(RID p_env, int p_camera_feed_id) {
  161. Environment *env = environment_owner.get_or_null(p_env);
  162. ERR_FAIL_NULL(env);
  163. env->camera_feed_id = p_camera_feed_id;
  164. }
  165. int RendererEnvironmentStorage::environment_get_camera_feed_id(RID p_env) const {
  166. Environment *env = environment_owner.get_or_null(p_env);
  167. ERR_FAIL_NULL_V(env, -1);
  168. return env->camera_feed_id;
  169. }
  170. // Tonemap
  171. void RendererEnvironmentStorage::environment_set_tonemap(RID p_env, RS::EnvironmentToneMapper p_tone_mapper, float p_exposure, float p_white) {
  172. Environment *env = environment_owner.get_or_null(p_env);
  173. ERR_FAIL_NULL(env);
  174. env->exposure = p_exposure;
  175. env->tone_mapper = p_tone_mapper;
  176. env->white = p_white;
  177. }
  178. RS::EnvironmentToneMapper RendererEnvironmentStorage::environment_get_tone_mapper(RID p_env) const {
  179. Environment *env = environment_owner.get_or_null(p_env);
  180. ERR_FAIL_NULL_V(env, RS::ENV_TONE_MAPPER_LINEAR);
  181. return env->tone_mapper;
  182. }
  183. float RendererEnvironmentStorage::environment_get_exposure(RID p_env) const {
  184. Environment *env = environment_owner.get_or_null(p_env);
  185. ERR_FAIL_NULL_V(env, 1.0);
  186. return env->exposure;
  187. }
  188. float RendererEnvironmentStorage::environment_get_white(RID p_env) const {
  189. Environment *env = environment_owner.get_or_null(p_env);
  190. ERR_FAIL_NULL_V(env, 1.0);
  191. return env->white;
  192. }
  193. // Fog
  194. void RendererEnvironmentStorage::environment_set_fog(RID p_env, bool p_enable, const Color &p_light_color, float p_light_energy, float p_sun_scatter, float p_density, float p_height, float p_height_density, float p_fog_aerial_perspective, float p_sky_affect, RS::EnvironmentFogMode p_mode) {
  195. Environment *env = environment_owner.get_or_null(p_env);
  196. ERR_FAIL_NULL(env);
  197. env->fog_enabled = p_enable;
  198. env->fog_mode = p_mode;
  199. env->fog_light_color = p_light_color;
  200. env->fog_light_energy = p_light_energy;
  201. env->fog_sun_scatter = p_sun_scatter;
  202. env->fog_density = p_density;
  203. env->fog_height = p_height;
  204. env->fog_height_density = p_height_density;
  205. env->fog_aerial_perspective = p_fog_aerial_perspective;
  206. env->fog_sky_affect = p_sky_affect;
  207. }
  208. bool RendererEnvironmentStorage::environment_get_fog_enabled(RID p_env) const {
  209. Environment *env = environment_owner.get_or_null(p_env);
  210. ERR_FAIL_NULL_V(env, false);
  211. return env->fog_enabled;
  212. }
  213. RS::EnvironmentFogMode RendererEnvironmentStorage::environment_get_fog_mode(RID p_env) const {
  214. Environment *env = environment_owner.get_or_null(p_env);
  215. ERR_FAIL_NULL_V(env, RS::ENV_FOG_MODE_EXPONENTIAL);
  216. return env->fog_mode;
  217. }
  218. Color RendererEnvironmentStorage::environment_get_fog_light_color(RID p_env) const {
  219. Environment *env = environment_owner.get_or_null(p_env);
  220. ERR_FAIL_NULL_V(env, Color(0.5, 0.6, 0.7));
  221. return env->fog_light_color;
  222. }
  223. float RendererEnvironmentStorage::environment_get_fog_light_energy(RID p_env) const {
  224. Environment *env = environment_owner.get_or_null(p_env);
  225. ERR_FAIL_NULL_V(env, 1.0);
  226. return env->fog_light_energy;
  227. }
  228. float RendererEnvironmentStorage::environment_get_fog_sun_scatter(RID p_env) const {
  229. Environment *env = environment_owner.get_or_null(p_env);
  230. ERR_FAIL_NULL_V(env, 0.0);
  231. return env->fog_sun_scatter;
  232. }
  233. float RendererEnvironmentStorage::environment_get_fog_density(RID p_env) const {
  234. Environment *env = environment_owner.get_or_null(p_env);
  235. ERR_FAIL_NULL_V(env, 0.001);
  236. return env->fog_density;
  237. }
  238. float RendererEnvironmentStorage::environment_get_fog_height(RID p_env) const {
  239. Environment *env = environment_owner.get_or_null(p_env);
  240. ERR_FAIL_NULL_V(env, 0.0);
  241. return env->fog_height;
  242. }
  243. float RendererEnvironmentStorage::environment_get_fog_height_density(RID p_env) const {
  244. Environment *env = environment_owner.get_or_null(p_env);
  245. ERR_FAIL_NULL_V(env, 0.0);
  246. return env->fog_height_density;
  247. }
  248. float RendererEnvironmentStorage::environment_get_fog_aerial_perspective(RID p_env) const {
  249. Environment *env = environment_owner.get_or_null(p_env);
  250. ERR_FAIL_NULL_V(env, 0.0);
  251. return env->fog_aerial_perspective;
  252. }
  253. float RendererEnvironmentStorage::environment_get_fog_sky_affect(RID p_env) const {
  254. Environment *env = environment_owner.get_or_null(p_env);
  255. ERR_FAIL_NULL_V(env, 0.0);
  256. return env->fog_sky_affect;
  257. }
  258. // Depth Fog
  259. void RendererEnvironmentStorage::environment_set_fog_depth(RID p_env, float p_curve, float p_begin, float p_end) {
  260. Environment *env = environment_owner.get_or_null(p_env);
  261. ERR_FAIL_NULL(env);
  262. env->fog_depth_curve = p_curve;
  263. env->fog_depth_begin = p_begin;
  264. env->fog_depth_end = p_end;
  265. }
  266. float RendererEnvironmentStorage::environment_get_fog_depth_curve(RID p_env) const {
  267. Environment *env = environment_owner.get_or_null(p_env);
  268. ERR_FAIL_NULL_V(env, 0.0);
  269. return env->fog_depth_curve;
  270. }
  271. float RendererEnvironmentStorage::environment_get_fog_depth_begin(RID p_env) const {
  272. Environment *env = environment_owner.get_or_null(p_env);
  273. ERR_FAIL_NULL_V(env, 0.0);
  274. return env->fog_depth_begin;
  275. }
  276. float RendererEnvironmentStorage::environment_get_fog_depth_end(RID p_env) const {
  277. Environment *env = environment_owner.get_or_null(p_env);
  278. ERR_FAIL_NULL_V(env, 0.0);
  279. return env->fog_depth_end;
  280. }
  281. // Volumetric Fog
  282. void RendererEnvironmentStorage::environment_set_volumetric_fog(RID p_env, bool p_enable, float p_density, const Color &p_albedo, const Color &p_emission, float p_emission_energy, float p_anisotropy, float p_length, float p_detail_spread, float p_gi_inject, bool p_temporal_reprojection, float p_temporal_reprojection_amount, float p_ambient_inject, float p_sky_affect) {
  283. Environment *env = environment_owner.get_or_null(p_env);
  284. ERR_FAIL_NULL(env);
  285. #ifdef DEBUG_ENABLED
  286. if (OS::get_singleton()->get_current_rendering_method() != "forward_plus" && p_enable) {
  287. WARN_PRINT_ONCE_ED("Volumetric fog can only be enabled when using the Forward+ rendering backend.");
  288. }
  289. #endif
  290. env->volumetric_fog_enabled = p_enable;
  291. env->volumetric_fog_density = p_density;
  292. env->volumetric_fog_scattering = p_albedo;
  293. env->volumetric_fog_emission = p_emission;
  294. env->volumetric_fog_emission_energy = p_emission_energy;
  295. env->volumetric_fog_anisotropy = p_anisotropy;
  296. env->volumetric_fog_length = p_length;
  297. env->volumetric_fog_detail_spread = p_detail_spread;
  298. env->volumetric_fog_gi_inject = p_gi_inject;
  299. env->volumetric_fog_temporal_reprojection = p_temporal_reprojection;
  300. env->volumetric_fog_temporal_reprojection_amount = p_temporal_reprojection_amount;
  301. env->volumetric_fog_ambient_inject = p_ambient_inject;
  302. env->volumetric_fog_sky_affect = p_sky_affect;
  303. }
  304. bool RendererEnvironmentStorage::environment_get_volumetric_fog_enabled(RID p_env) const {
  305. Environment *env = environment_owner.get_or_null(p_env);
  306. ERR_FAIL_NULL_V(env, false);
  307. return env->volumetric_fog_enabled;
  308. }
  309. float RendererEnvironmentStorage::environment_get_volumetric_fog_density(RID p_env) const {
  310. Environment *env = environment_owner.get_or_null(p_env);
  311. ERR_FAIL_NULL_V(env, 0.01);
  312. return env->volumetric_fog_density;
  313. }
  314. Color RendererEnvironmentStorage::environment_get_volumetric_fog_scattering(RID p_env) const {
  315. Environment *env = environment_owner.get_or_null(p_env);
  316. ERR_FAIL_NULL_V(env, Color(1, 1, 1));
  317. return env->volumetric_fog_scattering;
  318. }
  319. Color RendererEnvironmentStorage::environment_get_volumetric_fog_emission(RID p_env) const {
  320. Environment *env = environment_owner.get_or_null(p_env);
  321. ERR_FAIL_NULL_V(env, Color(0, 0, 0));
  322. return env->volumetric_fog_emission;
  323. }
  324. float RendererEnvironmentStorage::environment_get_volumetric_fog_emission_energy(RID p_env) const {
  325. Environment *env = environment_owner.get_or_null(p_env);
  326. ERR_FAIL_NULL_V(env, 0.0);
  327. return env->volumetric_fog_emission_energy;
  328. }
  329. float RendererEnvironmentStorage::environment_get_volumetric_fog_anisotropy(RID p_env) const {
  330. Environment *env = environment_owner.get_or_null(p_env);
  331. ERR_FAIL_NULL_V(env, 0.2);
  332. return env->volumetric_fog_anisotropy;
  333. }
  334. float RendererEnvironmentStorage::environment_get_volumetric_fog_length(RID p_env) const {
  335. Environment *env = environment_owner.get_or_null(p_env);
  336. ERR_FAIL_NULL_V(env, 64.0);
  337. return env->volumetric_fog_length;
  338. }
  339. float RendererEnvironmentStorage::environment_get_volumetric_fog_detail_spread(RID p_env) const {
  340. Environment *env = environment_owner.get_or_null(p_env);
  341. ERR_FAIL_NULL_V(env, 2.0);
  342. return env->volumetric_fog_detail_spread;
  343. }
  344. float RendererEnvironmentStorage::environment_get_volumetric_fog_gi_inject(RID p_env) const {
  345. Environment *env = environment_owner.get_or_null(p_env);
  346. ERR_FAIL_NULL_V(env, 0.0);
  347. return env->volumetric_fog_gi_inject;
  348. }
  349. float RendererEnvironmentStorage::environment_get_volumetric_fog_sky_affect(RID p_env) const {
  350. Environment *env = environment_owner.get_or_null(p_env);
  351. ERR_FAIL_NULL_V(env, 0.0);
  352. return env->volumetric_fog_sky_affect;
  353. }
  354. bool RendererEnvironmentStorage::environment_get_volumetric_fog_temporal_reprojection(RID p_env) const {
  355. Environment *env = environment_owner.get_or_null(p_env);
  356. ERR_FAIL_NULL_V(env, true);
  357. return env->volumetric_fog_temporal_reprojection;
  358. }
  359. float RendererEnvironmentStorage::environment_get_volumetric_fog_temporal_reprojection_amount(RID p_env) const {
  360. Environment *env = environment_owner.get_or_null(p_env);
  361. ERR_FAIL_NULL_V(env, 0.9);
  362. return env->volumetric_fog_temporal_reprojection_amount;
  363. }
  364. float RendererEnvironmentStorage::environment_get_volumetric_fog_ambient_inject(RID p_env) const {
  365. Environment *env = environment_owner.get_or_null(p_env);
  366. ERR_FAIL_NULL_V(env, 0.0);
  367. return env->volumetric_fog_ambient_inject;
  368. }
  369. // GLOW
  370. void RendererEnvironmentStorage::environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, RS::EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) {
  371. Environment *env = environment_owner.get_or_null(p_env);
  372. ERR_FAIL_NULL(env);
  373. ERR_FAIL_COND_MSG(p_levels.size() != 7, "Size of array of glow levels must be 7");
  374. env->glow_enabled = p_enable;
  375. env->glow_levels = p_levels;
  376. env->glow_intensity = p_intensity;
  377. env->glow_strength = p_strength;
  378. env->glow_mix = p_mix;
  379. env->glow_bloom = p_bloom_threshold;
  380. env->glow_blend_mode = p_blend_mode;
  381. env->glow_hdr_bleed_threshold = p_hdr_bleed_threshold;
  382. env->glow_hdr_bleed_scale = p_hdr_bleed_scale;
  383. env->glow_hdr_luminance_cap = p_hdr_luminance_cap;
  384. env->glow_map_strength = p_glow_map_strength;
  385. env->glow_map = p_glow_map;
  386. }
  387. bool RendererEnvironmentStorage::environment_get_glow_enabled(RID p_env) const {
  388. Environment *env = environment_owner.get_or_null(p_env);
  389. ERR_FAIL_NULL_V(env, false);
  390. return env->glow_enabled;
  391. }
  392. Vector<float> RendererEnvironmentStorage::environment_get_glow_levels(RID p_env) const {
  393. Environment *env = environment_owner.get_or_null(p_env);
  394. ERR_FAIL_NULL_V(env, Vector<float>());
  395. return env->glow_levels;
  396. }
  397. float RendererEnvironmentStorage::environment_get_glow_intensity(RID p_env) const {
  398. Environment *env = environment_owner.get_or_null(p_env);
  399. ERR_FAIL_NULL_V(env, 0.8);
  400. return env->glow_intensity;
  401. }
  402. float RendererEnvironmentStorage::environment_get_glow_strength(RID p_env) const {
  403. Environment *env = environment_owner.get_or_null(p_env);
  404. ERR_FAIL_NULL_V(env, 1.0);
  405. return env->glow_strength;
  406. }
  407. float RendererEnvironmentStorage::environment_get_glow_bloom(RID p_env) const {
  408. Environment *env = environment_owner.get_or_null(p_env);
  409. ERR_FAIL_NULL_V(env, 0.0);
  410. return env->glow_bloom;
  411. }
  412. float RendererEnvironmentStorage::environment_get_glow_mix(RID p_env) const {
  413. Environment *env = environment_owner.get_or_null(p_env);
  414. ERR_FAIL_NULL_V(env, 0.01);
  415. return env->glow_mix;
  416. }
  417. RS::EnvironmentGlowBlendMode RendererEnvironmentStorage::environment_get_glow_blend_mode(RID p_env) const {
  418. Environment *env = environment_owner.get_or_null(p_env);
  419. ERR_FAIL_NULL_V(env, RS::ENV_GLOW_BLEND_MODE_SOFTLIGHT);
  420. return env->glow_blend_mode;
  421. }
  422. float RendererEnvironmentStorage::environment_get_glow_hdr_bleed_threshold(RID p_env) const {
  423. Environment *env = environment_owner.get_or_null(p_env);
  424. ERR_FAIL_NULL_V(env, 1.0);
  425. return env->glow_hdr_bleed_threshold;
  426. }
  427. float RendererEnvironmentStorage::environment_get_glow_hdr_luminance_cap(RID p_env) const {
  428. Environment *env = environment_owner.get_or_null(p_env);
  429. ERR_FAIL_NULL_V(env, 12.0);
  430. return env->glow_hdr_luminance_cap;
  431. }
  432. float RendererEnvironmentStorage::environment_get_glow_hdr_bleed_scale(RID p_env) const {
  433. Environment *env = environment_owner.get_or_null(p_env);
  434. ERR_FAIL_NULL_V(env, 2.0);
  435. return env->glow_hdr_bleed_scale;
  436. }
  437. float RendererEnvironmentStorage::environment_get_glow_map_strength(RID p_env) const {
  438. Environment *env = environment_owner.get_or_null(p_env);
  439. ERR_FAIL_NULL_V(env, 0.0);
  440. return env->glow_map_strength;
  441. }
  442. RID RendererEnvironmentStorage::environment_get_glow_map(RID p_env) const {
  443. Environment *env = environment_owner.get_or_null(p_env);
  444. ERR_FAIL_NULL_V(env, RID());
  445. return env->glow_map;
  446. }
  447. // SSR
  448. void RendererEnvironmentStorage::environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance) {
  449. Environment *env = environment_owner.get_or_null(p_env);
  450. ERR_FAIL_NULL(env);
  451. #ifdef DEBUG_ENABLED
  452. if (OS::get_singleton()->get_current_rendering_method() != "forward_plus" && p_enable) {
  453. WARN_PRINT_ONCE_ED("Screen-space reflections (SSR) can only be enabled when using the Forward+ rendering backend.");
  454. }
  455. #endif
  456. env->ssr_enabled = p_enable;
  457. env->ssr_max_steps = p_max_steps;
  458. env->ssr_fade_in = p_fade_int;
  459. env->ssr_fade_out = p_fade_out;
  460. env->ssr_depth_tolerance = p_depth_tolerance;
  461. }
  462. bool RendererEnvironmentStorage::environment_get_ssr_enabled(RID p_env) const {
  463. Environment *env = environment_owner.get_or_null(p_env);
  464. ERR_FAIL_NULL_V(env, false);
  465. return env->ssr_enabled;
  466. }
  467. int RendererEnvironmentStorage::environment_get_ssr_max_steps(RID p_env) const {
  468. Environment *env = environment_owner.get_or_null(p_env);
  469. ERR_FAIL_NULL_V(env, 64);
  470. return env->ssr_max_steps;
  471. }
  472. float RendererEnvironmentStorage::environment_get_ssr_fade_in(RID p_env) const {
  473. Environment *env = environment_owner.get_or_null(p_env);
  474. ERR_FAIL_NULL_V(env, 0.15);
  475. return env->ssr_fade_in;
  476. }
  477. float RendererEnvironmentStorage::environment_get_ssr_fade_out(RID p_env) const {
  478. Environment *env = environment_owner.get_or_null(p_env);
  479. ERR_FAIL_NULL_V(env, 2.0);
  480. return env->ssr_fade_out;
  481. }
  482. float RendererEnvironmentStorage::environment_get_ssr_depth_tolerance(RID p_env) const {
  483. Environment *env = environment_owner.get_or_null(p_env);
  484. ERR_FAIL_NULL_V(env, 0.2);
  485. return env->ssr_depth_tolerance;
  486. }
  487. // SSAO
  488. void RendererEnvironmentStorage::environment_set_ssao(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_power, float p_detail, float p_horizon, float p_sharpness, float p_light_affect, float p_ao_channel_affect) {
  489. Environment *env = environment_owner.get_or_null(p_env);
  490. ERR_FAIL_NULL(env);
  491. #ifdef DEBUG_ENABLED
  492. if (OS::get_singleton()->get_current_rendering_method() != "forward_plus" && p_enable) {
  493. WARN_PRINT_ONCE_ED("Screen-space ambient occlusion (SSAO) can only be enabled when using the Forward+ rendering backend.");
  494. }
  495. #endif
  496. env->ssao_enabled = p_enable;
  497. env->ssao_radius = p_radius;
  498. env->ssao_intensity = p_intensity;
  499. env->ssao_power = p_power;
  500. env->ssao_detail = p_detail;
  501. env->ssao_horizon = p_horizon;
  502. env->ssao_sharpness = p_sharpness;
  503. env->ssao_direct_light_affect = p_light_affect;
  504. env->ssao_ao_channel_affect = p_ao_channel_affect;
  505. }
  506. bool RendererEnvironmentStorage::environment_get_ssao_enabled(RID p_env) const {
  507. Environment *env = environment_owner.get_or_null(p_env);
  508. ERR_FAIL_NULL_V(env, false);
  509. return env->ssao_enabled;
  510. }
  511. float RendererEnvironmentStorage::environment_get_ssao_radius(RID p_env) const {
  512. Environment *env = environment_owner.get_or_null(p_env);
  513. ERR_FAIL_NULL_V(env, 1.0);
  514. return env->ssao_radius;
  515. }
  516. float RendererEnvironmentStorage::environment_get_ssao_intensity(RID p_env) const {
  517. Environment *env = environment_owner.get_or_null(p_env);
  518. ERR_FAIL_NULL_V(env, 2.0);
  519. return env->ssao_intensity;
  520. }
  521. float RendererEnvironmentStorage::environment_get_ssao_power(RID p_env) const {
  522. Environment *env = environment_owner.get_or_null(p_env);
  523. ERR_FAIL_NULL_V(env, 1.5);
  524. return env->ssao_power;
  525. }
  526. float RendererEnvironmentStorage::environment_get_ssao_detail(RID p_env) const {
  527. Environment *env = environment_owner.get_or_null(p_env);
  528. ERR_FAIL_NULL_V(env, 0.5);
  529. return env->ssao_detail;
  530. }
  531. float RendererEnvironmentStorage::environment_get_ssao_horizon(RID p_env) const {
  532. Environment *env = environment_owner.get_or_null(p_env);
  533. ERR_FAIL_NULL_V(env, 0.06);
  534. return env->ssao_horizon;
  535. }
  536. float RendererEnvironmentStorage::environment_get_ssao_sharpness(RID p_env) const {
  537. Environment *env = environment_owner.get_or_null(p_env);
  538. ERR_FAIL_NULL_V(env, 0.98);
  539. return env->ssao_sharpness;
  540. }
  541. float RendererEnvironmentStorage::environment_get_ssao_direct_light_affect(RID p_env) const {
  542. Environment *env = environment_owner.get_or_null(p_env);
  543. ERR_FAIL_NULL_V(env, 0.0);
  544. return env->ssao_direct_light_affect;
  545. }
  546. float RendererEnvironmentStorage::environment_get_ssao_ao_channel_affect(RID p_env) const {
  547. Environment *env = environment_owner.get_or_null(p_env);
  548. ERR_FAIL_NULL_V(env, 0.0);
  549. return env->ssao_ao_channel_affect;
  550. }
  551. // SSIL
  552. void RendererEnvironmentStorage::environment_set_ssil(RID p_env, bool p_enable, float p_radius, float p_intensity, float p_sharpness, float p_normal_rejection) {
  553. Environment *env = environment_owner.get_or_null(p_env);
  554. ERR_FAIL_NULL(env);
  555. #ifdef DEBUG_ENABLED
  556. if (OS::get_singleton()->get_current_rendering_method() != "forward_plus" && p_enable) {
  557. WARN_PRINT_ONCE_ED("Screen-space indirect lighting (SSIL) can only be enabled when using the Forward+ rendering backend.");
  558. }
  559. #endif
  560. env->ssil_enabled = p_enable;
  561. env->ssil_radius = p_radius;
  562. env->ssil_intensity = p_intensity;
  563. env->ssil_sharpness = p_sharpness;
  564. env->ssil_normal_rejection = p_normal_rejection;
  565. }
  566. bool RendererEnvironmentStorage::environment_get_ssil_enabled(RID p_env) const {
  567. Environment *env = environment_owner.get_or_null(p_env);
  568. ERR_FAIL_NULL_V(env, false);
  569. return env->ssil_enabled;
  570. }
  571. float RendererEnvironmentStorage::environment_get_ssil_radius(RID p_env) const {
  572. Environment *env = environment_owner.get_or_null(p_env);
  573. ERR_FAIL_NULL_V(env, 5.0);
  574. return env->ssil_radius;
  575. }
  576. float RendererEnvironmentStorage::environment_get_ssil_intensity(RID p_env) const {
  577. Environment *env = environment_owner.get_or_null(p_env);
  578. ERR_FAIL_NULL_V(env, 1.0);
  579. return env->ssil_intensity;
  580. }
  581. float RendererEnvironmentStorage::environment_get_ssil_sharpness(RID p_env) const {
  582. Environment *env = environment_owner.get_or_null(p_env);
  583. ERR_FAIL_NULL_V(env, 0.98);
  584. return env->ssil_sharpness;
  585. }
  586. float RendererEnvironmentStorage::environment_get_ssil_normal_rejection(RID p_env) const {
  587. Environment *env = environment_owner.get_or_null(p_env);
  588. ERR_FAIL_NULL_V(env, 1.0);
  589. return env->ssil_normal_rejection;
  590. }
  591. // SDFGI
  592. void RendererEnvironmentStorage::environment_set_sdfgi(RID p_env, bool p_enable, int p_cascades, float p_min_cell_size, RS::EnvironmentSDFGIYScale p_y_scale, bool p_use_occlusion, float p_bounce_feedback, bool p_read_sky, float p_energy, float p_normal_bias, float p_probe_bias) {
  593. Environment *env = environment_owner.get_or_null(p_env);
  594. ERR_FAIL_NULL(env);
  595. #ifdef DEBUG_ENABLED
  596. if (OS::get_singleton()->get_current_rendering_method() != "forward_plus" && p_enable) {
  597. WARN_PRINT_ONCE_ED("SDFGI can only be enabled when using the Forward+ rendering backend.");
  598. }
  599. #endif
  600. env->sdfgi_enabled = p_enable;
  601. env->sdfgi_cascades = p_cascades;
  602. env->sdfgi_min_cell_size = p_min_cell_size;
  603. env->sdfgi_use_occlusion = p_use_occlusion;
  604. env->sdfgi_bounce_feedback = p_bounce_feedback;
  605. env->sdfgi_read_sky_light = p_read_sky;
  606. env->sdfgi_energy = p_energy;
  607. env->sdfgi_normal_bias = p_normal_bias;
  608. env->sdfgi_probe_bias = p_probe_bias;
  609. env->sdfgi_y_scale = p_y_scale;
  610. }
  611. bool RendererEnvironmentStorage::environment_get_sdfgi_enabled(RID p_env) const {
  612. Environment *env = environment_owner.get_or_null(p_env);
  613. ERR_FAIL_NULL_V(env, false);
  614. return env->sdfgi_enabled;
  615. }
  616. int RendererEnvironmentStorage::environment_get_sdfgi_cascades(RID p_env) const {
  617. Environment *env = environment_owner.get_or_null(p_env);
  618. ERR_FAIL_NULL_V(env, 4);
  619. return env->sdfgi_cascades;
  620. }
  621. float RendererEnvironmentStorage::environment_get_sdfgi_min_cell_size(RID p_env) const {
  622. Environment *env = environment_owner.get_or_null(p_env);
  623. ERR_FAIL_NULL_V(env, 0.2);
  624. return env->sdfgi_min_cell_size;
  625. }
  626. bool RendererEnvironmentStorage::environment_get_sdfgi_use_occlusion(RID p_env) const {
  627. Environment *env = environment_owner.get_or_null(p_env);
  628. ERR_FAIL_NULL_V(env, false);
  629. return env->sdfgi_use_occlusion;
  630. }
  631. float RendererEnvironmentStorage::environment_get_sdfgi_bounce_feedback(RID p_env) const {
  632. Environment *env = environment_owner.get_or_null(p_env);
  633. ERR_FAIL_NULL_V(env, 0.5);
  634. return env->sdfgi_bounce_feedback;
  635. }
  636. bool RendererEnvironmentStorage::environment_get_sdfgi_read_sky_light(RID p_env) const {
  637. Environment *env = environment_owner.get_or_null(p_env);
  638. ERR_FAIL_NULL_V(env, true);
  639. return env->sdfgi_read_sky_light;
  640. }
  641. float RendererEnvironmentStorage::environment_get_sdfgi_energy(RID p_env) const {
  642. Environment *env = environment_owner.get_or_null(p_env);
  643. ERR_FAIL_NULL_V(env, 1.0);
  644. return env->sdfgi_energy;
  645. }
  646. float RendererEnvironmentStorage::environment_get_sdfgi_normal_bias(RID p_env) const {
  647. Environment *env = environment_owner.get_or_null(p_env);
  648. ERR_FAIL_NULL_V(env, 1.1);
  649. return env->sdfgi_normal_bias;
  650. }
  651. float RendererEnvironmentStorage::environment_get_sdfgi_probe_bias(RID p_env) const {
  652. Environment *env = environment_owner.get_or_null(p_env);
  653. ERR_FAIL_NULL_V(env, 1.1);
  654. return env->sdfgi_probe_bias;
  655. }
  656. RS::EnvironmentSDFGIYScale RendererEnvironmentStorage::environment_get_sdfgi_y_scale(RID p_env) const {
  657. Environment *env = environment_owner.get_or_null(p_env);
  658. ERR_FAIL_NULL_V(env, RS::ENV_SDFGI_Y_SCALE_75_PERCENT);
  659. return env->sdfgi_y_scale;
  660. }
  661. // Adjustments
  662. void RendererEnvironmentStorage::environment_set_adjustment(RID p_env, bool p_enable, float p_brightness, float p_contrast, float p_saturation, bool p_use_1d_color_correction, RID p_color_correction) {
  663. Environment *env = environment_owner.get_or_null(p_env);
  664. ERR_FAIL_NULL(env);
  665. env->adjustments_enabled = p_enable;
  666. env->adjustments_brightness = p_brightness;
  667. env->adjustments_contrast = p_contrast;
  668. env->adjustments_saturation = p_saturation;
  669. env->use_1d_color_correction = p_use_1d_color_correction;
  670. env->color_correction = p_color_correction;
  671. }
  672. bool RendererEnvironmentStorage::environment_get_adjustments_enabled(RID p_env) const {
  673. Environment *env = environment_owner.get_or_null(p_env);
  674. ERR_FAIL_NULL_V(env, false);
  675. return env->adjustments_enabled;
  676. }
  677. float RendererEnvironmentStorage::environment_get_adjustments_brightness(RID p_env) const {
  678. Environment *env = environment_owner.get_or_null(p_env);
  679. ERR_FAIL_NULL_V(env, 1.0);
  680. return env->adjustments_brightness;
  681. }
  682. float RendererEnvironmentStorage::environment_get_adjustments_contrast(RID p_env) const {
  683. Environment *env = environment_owner.get_or_null(p_env);
  684. ERR_FAIL_NULL_V(env, 1.0);
  685. return env->adjustments_contrast;
  686. }
  687. float RendererEnvironmentStorage::environment_get_adjustments_saturation(RID p_env) const {
  688. Environment *env = environment_owner.get_or_null(p_env);
  689. ERR_FAIL_NULL_V(env, 1.0);
  690. return env->adjustments_saturation;
  691. }
  692. bool RendererEnvironmentStorage::environment_get_use_1d_color_correction(RID p_env) const {
  693. Environment *env = environment_owner.get_or_null(p_env);
  694. ERR_FAIL_NULL_V(env, false);
  695. return env->use_1d_color_correction;
  696. }
  697. RID RendererEnvironmentStorage::environment_get_color_correction(RID p_env) const {
  698. Environment *env = environment_owner.get_or_null(p_env);
  699. ERR_FAIL_NULL_V(env, RID());
  700. return env->color_correction;
  701. }