environment_storage.cpp 27 KB

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