@bornengine/engine 0.4.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +231 -0
  3. package/native/android/Cargo.lock +1848 -0
  4. package/native/android/Cargo.toml +24 -0
  5. package/native/android/src/lib.rs +702 -0
  6. package/native/ios/Cargo.lock +1690 -0
  7. package/native/ios/Cargo.toml +32 -0
  8. package/native/ios/src/lib.rs +1267 -0
  9. package/native/linux/Cargo.lock +3279 -0
  10. package/native/linux/Cargo.toml +29 -0
  11. package/native/linux/src/lib.rs +1331 -0
  12. package/native/macos/Cargo.lock +3310 -0
  13. package/native/macos/Cargo.toml +46 -0
  14. package/native/macos/src/lib.rs +1302 -0
  15. package/native/shared/Cargo.lock +1899 -0
  16. package/native/shared/Cargo.toml +62 -0
  17. package/native/shared/assets/default_font.ttf +0 -0
  18. package/native/shared/build.rs +270 -0
  19. package/native/shared/shaders/common/clouds.wgsl +122 -0
  20. package/native/shared/shaders/common/fog.wgsl +16 -0
  21. package/native/shared/shaders/common/foliage_wind.wgsl +98 -0
  22. package/native/shared/shaders/common/imposter.wgsl +112 -0
  23. package/native/shared/shaders/common/pbr.wgsl +186 -0
  24. package/native/shared/shaders/common/shadows.wgsl +186 -0
  25. package/native/shared/shaders/common/sky.wgsl +8 -0
  26. package/native/shared/shaders/common/tonemap.wgsl +25 -0
  27. package/native/shared/shaders/impulse_field.wgsl +57 -0
  28. package/native/shared/shaders/material_abi.wgsl +383 -0
  29. package/native/shared/shaders/materials/test_minimal.wgsl +42 -0
  30. package/native/shared/src/anim_mixer.rs +61 -0
  31. package/native/shared/src/attach.rs +263 -0
  32. package/native/shared/src/audio/decode.rs +123 -0
  33. package/native/shared/src/audio/mod.rs +863 -0
  34. package/native/shared/src/audio/render.rs +892 -0
  35. package/native/shared/src/audio/spsc.rs +156 -0
  36. package/native/shared/src/audio/stream.rs +226 -0
  37. package/native/shared/src/custom_shaders.rs +104 -0
  38. package/native/shared/src/decals.rs +245 -0
  39. package/native/shared/src/drs.rs +211 -0
  40. package/native/shared/src/engine.rs +261 -0
  41. package/native/shared/src/ffi.rs +116 -0
  42. package/native/shared/src/ffi_core/assets.rs +388 -0
  43. package/native/shared/src/ffi_core/audio_ffi.rs +184 -0
  44. package/native/shared/src/ffi_core/draw.rs +334 -0
  45. package/native/shared/src/ffi_core/game_loop.rs +577 -0
  46. package/native/shared/src/ffi_core/input.rs +234 -0
  47. package/native/shared/src/ffi_core/mod.rs +127 -0
  48. package/native/shared/src/ffi_core/models.rs +1154 -0
  49. package/native/shared/src/ffi_core/ragdoll_ffi.rs +261 -0
  50. package/native/shared/src/ffi_core/scene.rs +626 -0
  51. package/native/shared/src/ffi_core/vfx.rs +212 -0
  52. package/native/shared/src/ffi_core/visual.rs +691 -0
  53. package/native/shared/src/frame_callbacks.rs +122 -0
  54. package/native/shared/src/geometry.rs +236 -0
  55. package/native/shared/src/handles.rs +182 -0
  56. package/native/shared/src/input.rs +448 -0
  57. package/native/shared/src/jolt_sys.rs +822 -0
  58. package/native/shared/src/lib.rs +55 -0
  59. package/native/shared/src/models.rs +1093 -0
  60. package/native/shared/src/models_gltf.rs +1280 -0
  61. package/native/shared/src/particles.rs +391 -0
  62. package/native/shared/src/physics_jolt.rs +1908 -0
  63. package/native/shared/src/picking.rs +298 -0
  64. package/native/shared/src/postfx.rs +345 -0
  65. package/native/shared/src/profiler.rs +492 -0
  66. package/native/shared/src/ragdoll.rs +474 -0
  67. package/native/shared/src/renderer/atmosphere_lut.rs +573 -0
  68. package/native/shared/src/renderer/brdf_lut.rs +154 -0
  69. package/native/shared/src/renderer/draw2d.rs +143 -0
  70. package/native/shared/src/renderer/formats.rs +822 -0
  71. package/native/shared/src/renderer/froxel.rs +421 -0
  72. package/native/shared/src/renderer/gi_bake.rs +653 -0
  73. package/native/shared/src/renderer/graph.rs +462 -0
  74. package/native/shared/src/renderer/hiz.rs +269 -0
  75. package/native/shared/src/renderer/hot_reload.rs +390 -0
  76. package/native/shared/src/renderer/impulse_field.rs +456 -0
  77. package/native/shared/src/renderer/lighting.rs +154 -0
  78. package/native/shared/src/renderer/material_instancing.rs +171 -0
  79. package/native/shared/src/renderer/material_pipeline.rs +700 -0
  80. package/native/shared/src/renderer/material_system.rs +1996 -0
  81. package/native/shared/src/renderer/material_system_tests.rs +601 -0
  82. package/native/shared/src/renderer/material_system_wasm.rs +41 -0
  83. package/native/shared/src/renderer/mod.rs +12556 -0
  84. package/native/shared/src/renderer/model_draw.rs +641 -0
  85. package/native/shared/src/renderer/occlusion.rs +429 -0
  86. package/native/shared/src/renderer/planar_pass.rs +593 -0
  87. package/native/shared/src/renderer/planar_reflection.rs +499 -0
  88. package/native/shared/src/renderer/post_pass.rs +249 -0
  89. package/native/shared/src/renderer/postfx_chain.rs +728 -0
  90. package/native/shared/src/renderer/pt_pass.rs +577 -0
  91. package/native/shared/src/renderer/scene_pass.rs +607 -0
  92. package/native/shared/src/renderer/shader_include.rs +205 -0
  93. package/native/shared/src/renderer/shader_library.rs +135 -0
  94. package/native/shared/src/renderer/shaders/ao.rs +570 -0
  95. package/native/shared/src/renderer/shaders/core.rs +1243 -0
  96. package/native/shared/src/renderer/shaders/env.rs +907 -0
  97. package/native/shared/src/renderer/shaders/gi.rs +810 -0
  98. package/native/shared/src/renderer/shaders/mod.rs +19 -0
  99. package/native/shared/src/renderer/shaders/post.rs +1558 -0
  100. package/native/shared/src/renderer/shaders/pt.rs +1859 -0
  101. package/native/shared/src/renderer/shaders/ssgi.rs +1586 -0
  102. package/native/shared/src/renderer/shadow_pass.rs +731 -0
  103. package/native/shared/src/renderer/ssgi_pass.rs +392 -0
  104. package/native/shared/src/renderer/ssr_pass.rs +188 -0
  105. package/native/shared/src/renderer/texture_store.rs +473 -0
  106. package/native/shared/src/renderer/transient.rs +591 -0
  107. package/native/shared/src/renderer/types.rs +941 -0
  108. package/native/shared/src/renderer/util.rs +152 -0
  109. package/native/shared/src/scene.rs +1362 -0
  110. package/native/shared/src/sdf_cache.rs +274 -0
  111. package/native/shared/src/shadows.rs +1036 -0
  112. package/native/shared/src/staging.rs +102 -0
  113. package/native/shared/src/string_header.rs +266 -0
  114. package/native/shared/src/text_renderer.rs +502 -0
  115. package/native/shared/src/textures.rs +197 -0
  116. package/native/tvos/Cargo.lock +1693 -0
  117. package/native/tvos/Cargo.toml +36 -0
  118. package/native/tvos/metal-patched/Cargo.toml +178 -0
  119. package/native/tvos/metal-patched/LICENSE-APACHE +201 -0
  120. package/native/tvos/metal-patched/LICENSE-MIT +25 -0
  121. package/native/tvos/metal-patched/src/acceleration_structure.rs +667 -0
  122. package/native/tvos/metal-patched/src/acceleration_structure_pass.rs +108 -0
  123. package/native/tvos/metal-patched/src/argument.rs +366 -0
  124. package/native/tvos/metal-patched/src/blitpass.rs +102 -0
  125. package/native/tvos/metal-patched/src/buffer.rs +71 -0
  126. package/native/tvos/metal-patched/src/capturedescriptor.rs +76 -0
  127. package/native/tvos/metal-patched/src/capturemanager.rs +113 -0
  128. package/native/tvos/metal-patched/src/commandbuffer.rs +192 -0
  129. package/native/tvos/metal-patched/src/commandqueue.rs +44 -0
  130. package/native/tvos/metal-patched/src/computepass.rs +107 -0
  131. package/native/tvos/metal-patched/src/constants.rs +152 -0
  132. package/native/tvos/metal-patched/src/counters.rs +119 -0
  133. package/native/tvos/metal-patched/src/depthstencil.rs +190 -0
  134. package/native/tvos/metal-patched/src/device.rs +2134 -0
  135. package/native/tvos/metal-patched/src/drawable.rs +39 -0
  136. package/native/tvos/metal-patched/src/encoder.rs +2041 -0
  137. package/native/tvos/metal-patched/src/heap.rs +281 -0
  138. package/native/tvos/metal-patched/src/indirect_encoder.rs +344 -0
  139. package/native/tvos/metal-patched/src/lib.rs +657 -0
  140. package/native/tvos/metal-patched/src/library.rs +902 -0
  141. package/native/tvos/metal-patched/src/mps.rs +575 -0
  142. package/native/tvos/metal-patched/src/pipeline/compute.rs +475 -0
  143. package/native/tvos/metal-patched/src/pipeline/mod.rs +71 -0
  144. package/native/tvos/metal-patched/src/pipeline/render.rs +762 -0
  145. package/native/tvos/metal-patched/src/renderpass.rs +443 -0
  146. package/native/tvos/metal-patched/src/resource.rs +182 -0
  147. package/native/tvos/metal-patched/src/sampler.rs +165 -0
  148. package/native/tvos/metal-patched/src/sync.rs +178 -0
  149. package/native/tvos/metal-patched/src/texture.rs +352 -0
  150. package/native/tvos/metal-patched/src/types.rs +90 -0
  151. package/native/tvos/metal-patched/src/vertexdescriptor.rs +250 -0
  152. package/native/tvos/src/audio_backend.rs +197 -0
  153. package/native/tvos/src/lib.rs +1891 -0
  154. package/native/visionos/Cargo.lock +1693 -0
  155. package/native/visionos/Cargo.toml +40 -0
  156. package/native/visionos/src/audio_backend.rs +197 -0
  157. package/native/visionos/src/lib.rs +1887 -0
  158. package/native/watchos/Cargo.lock +16 -0
  159. package/native/watchos/Cargo.toml +19 -0
  160. package/native/watchos/shaders/bloom_postfx.metal +99 -0
  161. package/native/watchos/src/BloomWatchApp.swift +1267 -0
  162. package/native/watchos/src/BloomWatchAudio.swift +179 -0
  163. package/native/watchos/src/audio.rs +55 -0
  164. package/native/watchos/src/draw_list.rs +229 -0
  165. package/native/watchos/src/ffi_stubs.rs +915 -0
  166. package/native/watchos/src/ffi_stubs_manual.rs +35 -0
  167. package/native/watchos/src/lib.rs +1124 -0
  168. package/native/watchos/src/models.rs +746 -0
  169. package/native/watchos/src/postfx.rs +95 -0
  170. package/native/watchos/src/scene.rs +534 -0
  171. package/native/watchos/src/textures.rs +184 -0
  172. package/native/web/Cargo.lock +1657 -0
  173. package/native/web/Cargo.toml +43 -0
  174. package/native/web/bloom_glue.js +695 -0
  175. package/native/web/build.sh +131 -0
  176. package/native/web/index.html +35 -0
  177. package/native/web/jolt_bridge.js +1519 -0
  178. package/native/web/src/input_ffi.rs +286 -0
  179. package/native/web/src/lib.rs +1796 -0
  180. package/native/web/src/material_ffi.rs +710 -0
  181. package/native/web/src/parity_ffi.rs +343 -0
  182. package/native/web/src/physics_ffi.rs +643 -0
  183. package/native/web/src/ragdoll_ffi.rs +250 -0
  184. package/native/web/src/render_settings.rs +98 -0
  185. package/native/windows/Cargo.lock +1815 -0
  186. package/native/windows/Cargo.toml +68 -0
  187. package/native/windows/src/lib.rs +1486 -0
  188. package/package.json +4279 -0
  189. package/src/audio/index.ts +315 -0
  190. package/src/core/colors.ts +63 -0
  191. package/src/core/index.ts +1206 -0
  192. package/src/core/keys.ts +63 -0
  193. package/src/core/types.ts +104 -0
  194. package/src/index.ts +171 -0
  195. package/src/math/index.ts +516 -0
  196. package/src/mobile/index.ts +294 -0
  197. package/src/models/index.ts +1258 -0
  198. package/src/physics/index.ts +1134 -0
  199. package/src/scene/index.ts +698 -0
  200. package/src/shapes/index.ts +120 -0
  201. package/src/text/index.ts +48 -0
  202. package/src/textures/index.ts +187 -0
  203. package/src/vfx/index.ts +191 -0
  204. package/src/world/index.ts +24 -0
  205. package/src/world/loader.ts +423 -0
  206. package/src/world/prefab.ts +217 -0
  207. package/src/world/render.ts +172 -0
  208. package/src/world/saver.ts +108 -0
  209. package/src/world/serialize.ts +301 -0
  210. package/src/world/terrain.ts +355 -0
  211. package/src/world/types.ts +160 -0
  212. package/src/world/validate.ts +319 -0
  213. package/src/world/version.ts +114 -0
@@ -0,0 +1,691 @@
1
+ //! Lighting, shadows, post-FX, environment, and render-quality settings.
2
+ //!
3
+ //! Section of [`define_core_ffi!`](crate::define_core_ffi) — see
4
+ //! `ffi_core/mod.rs` for the architecture and the invoking-crate contract.
5
+ //! Internal: platform crates must invoke `define_core_ffi!()`, never the
6
+ //! section macros directly.
7
+
8
+ #[doc(hidden)]
9
+ #[macro_export]
10
+ macro_rules! __bloom_ffi_visual {
11
+ () => {
12
+
13
+ // bloom_set_env_clear_from_hdr [source: curated; gated: image-extras]
14
+ #[cfg(feature = "image-extras")]
15
+ #[no_mangle]
16
+ pub extern "C" fn bloom_set_env_clear_from_hdr(path_ptr: *const u8) {
17
+ $crate::ffi::guard("bloom_set_env_clear_from_hdr", move || {
18
+ let path = $crate::string_header::str_from_header(path_ptr);
19
+ let path: &str = &bloom_resolve_asset_path(path);
20
+ engine().renderer.set_env_clear_from_hdr_file(path);
21
+ })
22
+ }
23
+ #[cfg(not(feature = "image-extras"))]
24
+ #[no_mangle]
25
+ pub extern "C" fn bloom_set_env_clear_from_hdr(_path_ptr: *const u8) {
26
+ $crate::ffi::feature_off_warn_once("bloom_set_env_clear_from_hdr", "image-extras");
27
+ }
28
+
29
+ // bloom_set_target_fps [source: macos]
30
+ #[no_mangle]
31
+ pub extern "C" fn bloom_set_target_fps(fps: f64) {
32
+ $crate::ffi::guard("bloom_set_target_fps", move || {
33
+ engine().target_fps = fps;
34
+ })
35
+ }
36
+
37
+ // bloom_set_direct_2d_mode [source: macos]
38
+ #[no_mangle]
39
+ pub extern "C" fn bloom_set_direct_2d_mode(on: f64) {
40
+ $crate::ffi::guard("bloom_set_direct_2d_mode", move || {
41
+ engine().direct_2d_mode = on > 0.5;
42
+ })
43
+ }
44
+
45
+ // bloom_set_sound_volume [source: macos]
46
+ #[no_mangle]
47
+ pub extern "C" fn bloom_set_sound_volume(handle: f64, volume: f64) {
48
+ $crate::ffi::guard("bloom_set_sound_volume", move || {
49
+ engine().audio.set_sound_volume(handle, volume as f32);
50
+ })
51
+ }
52
+
53
+ // bloom_set_master_volume [source: macos]
54
+ #[no_mangle]
55
+ pub extern "C" fn bloom_set_master_volume(volume: f64) {
56
+ $crate::ffi::guard("bloom_set_master_volume", move || {
57
+ engine().audio.set_master_volume(volume as f32);
58
+ })
59
+ }
60
+
61
+ // bloom_set_listener_position [source: macos]
62
+ #[no_mangle]
63
+ pub extern "C" fn bloom_set_listener_position(x: f64, y: f64, z: f64, fx: f64, fy: f64, fz: f64) {
64
+ $crate::ffi::guard("bloom_set_listener_position", move || {
65
+ engine().audio.set_listener_position(x as f32, y as f32, z as f32, fx as f32, fy as f32, fz as f32);
66
+ })
67
+ }
68
+
69
+ // bloom_set_texture_filter [source: macos]
70
+ #[no_mangle]
71
+ pub extern "C" fn bloom_set_texture_filter(handle: f64, mode: f64) {
72
+ $crate::ffi::guard("bloom_set_texture_filter", move || {
73
+ let mut eng = engine();
74
+ if let Some(tex) = eng.textures.get(handle) {
75
+ let bind_group_idx = tex.bind_group_idx;
76
+ eng.renderer.set_texture_filter(bind_group_idx, mode > 0.5);
77
+ }
78
+ })
79
+ }
80
+
81
+ // bloom_set_material_reflection_probe [source: macos]
82
+ #[no_mangle]
83
+ pub extern "C" fn bloom_set_material_reflection_probe(
84
+ material: f64, probe: f64,
85
+ ) {
86
+ $crate::ffi::guard("bloom_set_material_reflection_probe", move || {
87
+ engine().renderer.set_material_reflection_probe(material as u32, probe as u32);
88
+ })
89
+ }
90
+
91
+ // bloom_set_material_texture_array [source: macos]
92
+ #[no_mangle]
93
+ pub extern "C" fn bloom_set_material_texture_array(
94
+ material: f64, slot: f64, array: f64,
95
+ ) {
96
+ $crate::ffi::guard("bloom_set_material_texture_array", move || {
97
+ engine().renderer.set_material_texture_array(
98
+ material as u32, slot as u32, array as u32,
99
+ );
100
+ })
101
+ }
102
+
103
+ // bloom_set_material_shading_model [source: macos]
104
+ #[no_mangle]
105
+ pub extern "C" fn bloom_set_material_shading_model(
106
+ material: f64, model: f64,
107
+ ) {
108
+ $crate::ffi::guard("bloom_set_material_shading_model", move || {
109
+ engine().renderer.set_material_shading_model(material as u32, model as u32);
110
+ })
111
+ }
112
+
113
+ // bloom_set_material_probe_visible [source: shared]
114
+ #[no_mangle]
115
+ pub extern "C" fn bloom_set_material_probe_visible(
116
+ material: f64, visible: f64,
117
+ ) {
118
+ $crate::ffi::guard("bloom_set_material_probe_visible", move || {
119
+ engine().renderer.set_material_probe_visible(material as u32, visible != 0.0);
120
+ })
121
+ }
122
+
123
+ // bloom_set_material_foliage [source: macos]
124
+ #[no_mangle]
125
+ pub extern "C" fn bloom_set_material_foliage(
126
+ material: f64,
127
+ trans_r: f64, trans_g: f64, trans_b: f64,
128
+ trans_amount: f64, wrap_factor: f64,
129
+ ) {
130
+ $crate::ffi::guard("bloom_set_material_foliage", move || {
131
+ engine().renderer.set_material_foliage(
132
+ material as u32,
133
+ [trans_r as f32, trans_g as f32, trans_b as f32],
134
+ trans_amount as f32, wrap_factor as f32,
135
+ );
136
+ })
137
+ }
138
+
139
+ // bloom_set_post_pass [source: macos]
140
+ #[no_mangle]
141
+ pub extern "C" fn bloom_set_post_pass(source_ptr: *const u8) -> f64 {
142
+ $crate::ffi::guard("bloom_set_post_pass", move || {
143
+ let source = $crate::string_header::str_from_header(source_ptr);
144
+ match engine().renderer.set_post_pass(source) {
145
+ Ok(()) => 1.0,
146
+ Err(e) => { eprintln!("[post_pass] compile failed: {:?}", e); 0.0 }
147
+ }
148
+ })
149
+ }
150
+
151
+ // bloom_set_joint_test [source: macos]
152
+ #[no_mangle]
153
+ pub extern "C" fn bloom_set_joint_test(joint_index: f64, angle: f64) {
154
+ $crate::ffi::guard("bloom_set_joint_test", move || {
155
+ engine().renderer.set_joint_test(joint_index as usize, angle as f32);
156
+ })
157
+ }
158
+
159
+ // bloom_set_ambient_light [source: macos]
160
+ #[no_mangle]
161
+ pub extern "C" fn bloom_set_ambient_light(r: f64, g: f64, b: f64, intensity: f64) {
162
+ $crate::ffi::guard("bloom_set_ambient_light", move || {
163
+ engine().renderer.set_ambient_light(r, g, b, intensity);
164
+ })
165
+ }
166
+
167
+ // bloom_set_directional_light [source: macos]
168
+ #[no_mangle]
169
+ pub extern "C" fn bloom_set_directional_light(dx: f64, dy: f64, dz: f64, r: f64, g: f64, b: f64, intensity: f64) {
170
+ $crate::ffi::guard("bloom_set_directional_light", move || {
171
+ engine().renderer.set_directional_light(dx, dy, dz, r, g, b, intensity);
172
+ })
173
+ }
174
+
175
+ // bloom_set_procedural_sky [source: macos]
176
+ #[no_mangle]
177
+ pub extern "C" fn bloom_set_procedural_sky(enabled: f64, rayleigh_density: f64, mie_density: f64, ground_albedo: f64) {
178
+ $crate::ffi::guard("bloom_set_procedural_sky", move || {
179
+ engine().renderer.set_procedural_sky(
180
+ enabled != 0.0,
181
+ rayleigh_density as f32,
182
+ mie_density as f32,
183
+ ground_albedo as f32,
184
+ );
185
+ })
186
+ }
187
+
188
+ // bloom_set_sun_direction [source: macos]
189
+ #[no_mangle]
190
+ pub extern "C" fn bloom_set_sun_direction(dx: f64, dy: f64, dz: f64, intensity: f64) {
191
+ $crate::ffi::guard("bloom_set_sun_direction", move || {
192
+ engine().renderer.set_sun_direction(dx as f32, dy as f32, dz as f32, intensity as f32);
193
+ })
194
+ }
195
+
196
+ // bloom_set_fog [source: macos]
197
+ #[no_mangle]
198
+ pub extern "C" fn bloom_set_fog(r: f64, g: f64, b: f64, density: f64, height_ref: f64, height_falloff: f64) {
199
+ $crate::ffi::guard("bloom_set_fog", move || {
200
+ let mut r_ = engine();
201
+ r_.renderer.set_fog_color(r as f32, g as f32, b as f32);
202
+ r_.renderer.set_fog_density(density as f32);
203
+ r_.renderer.set_fog_height_falloff(height_ref as f32, height_falloff as f32);
204
+ })
205
+ }
206
+
207
+ // bloom_set_chromatic_aberration [source: macos]
208
+ #[no_mangle]
209
+ pub extern "C" fn bloom_set_chromatic_aberration(strength: f64) {
210
+ $crate::ffi::guard("bloom_set_chromatic_aberration", move || {
211
+ engine().renderer.set_chromatic_aberration(strength as f32);
212
+ })
213
+ }
214
+
215
+ // bloom_set_vignette [source: macos]
216
+ #[no_mangle]
217
+ pub extern "C" fn bloom_set_vignette(strength: f64, softness: f64) {
218
+ $crate::ffi::guard("bloom_set_vignette", move || {
219
+ engine().renderer.set_vignette(strength as f32, softness as f32);
220
+ })
221
+ }
222
+
223
+ // bloom_set_film_grain [source: macos]
224
+ #[no_mangle]
225
+ pub extern "C" fn bloom_set_film_grain(strength: f64) {
226
+ $crate::ffi::guard("bloom_set_film_grain", move || {
227
+ engine().renderer.set_film_grain(strength as f32);
228
+ })
229
+ }
230
+
231
+ // bloom_set_sharpen_strength [round-2 audit F8]
232
+ #[no_mangle]
233
+ pub extern "C" fn bloom_set_sharpen_strength(strength: f64) {
234
+ $crate::ffi::guard("bloom_set_sharpen_strength", move || {
235
+ engine().renderer.set_sharpen_strength(strength as f32);
236
+ })
237
+ }
238
+
239
+ // bloom_set_present_mode [round-2 audit F6]
240
+ #[no_mangle]
241
+ pub extern "C" fn bloom_set_present_mode(mode: f64) {
242
+ $crate::ffi::guard("bloom_set_present_mode", move || {
243
+ engine().renderer.set_present_mode(mode as u32);
244
+ })
245
+ }
246
+
247
+ // bloom_set_sun_shafts [source: macos]
248
+ #[no_mangle]
249
+ pub extern "C" fn bloom_set_sun_shafts(strength: f64, decay: f64, r: f64, g: f64, b: f64) {
250
+ $crate::ffi::guard("bloom_set_sun_shafts", move || {
251
+ let mut eng = engine();
252
+ eng.renderer.set_sun_shaft_strength(strength as f32);
253
+ eng.renderer.set_sun_shaft_decay(decay as f32);
254
+ eng.renderer.set_sun_shaft_color(r as f32, g as f32, b as f32);
255
+ })
256
+ }
257
+
258
+ // bloom_set_auto_exposure [source: macos]
259
+ #[no_mangle]
260
+ pub extern "C" fn bloom_set_auto_exposure(on: f64) {
261
+ $crate::ffi::guard("bloom_set_auto_exposure", move || {
262
+ engine().renderer.set_auto_exposure(on != 0.0);
263
+ })
264
+ }
265
+
266
+ #[no_mangle]
267
+ pub extern "C" fn bloom_set_occlusion_culling(on: f64) {
268
+ $crate::ffi::guard("bloom_set_occlusion_culling", move || {
269
+ engine().renderer.occlusion.enabled = on != 0.0;
270
+ })
271
+ }
272
+
273
+ // bloom_set_taa_enabled [source: macos]
274
+ #[no_mangle]
275
+ pub extern "C" fn bloom_set_taa_enabled(on: f64) {
276
+ $crate::ffi::guard("bloom_set_taa_enabled", move || {
277
+ engine().renderer.set_taa_enabled(on != 0.0);
278
+ })
279
+ }
280
+
281
+ // bloom_set_render_scale [source: macos]
282
+ #[no_mangle]
283
+ pub extern "C" fn bloom_set_render_scale(scale: f64) {
284
+ $crate::ffi::guard("bloom_set_render_scale", move || {
285
+ engine().renderer.set_render_scale(scale as f32);
286
+ })
287
+ }
288
+
289
+ // bloom_set_upscale_mode [source: macos]
290
+ #[no_mangle]
291
+ pub extern "C" fn bloom_set_upscale_mode(mode: f64) {
292
+ $crate::ffi::guard("bloom_set_upscale_mode", move || {
293
+ engine().renderer.set_upscale_mode(mode as u32);
294
+ })
295
+ }
296
+
297
+ // bloom_set_cas_strength [source: macos]
298
+ #[no_mangle]
299
+ pub extern "C" fn bloom_set_cas_strength(strength: f64) {
300
+ $crate::ffi::guard("bloom_set_cas_strength", move || {
301
+ engine().renderer.set_cas_strength(strength as f32);
302
+ })
303
+ }
304
+
305
+ // bloom_set_auto_resolution [source: macos]
306
+ #[no_mangle]
307
+ pub extern "C" fn bloom_set_auto_resolution(target_hz: f64, enabled: f64) {
308
+ $crate::ffi::guard("bloom_set_auto_resolution", move || {
309
+ let mut eng = engine();
310
+ if enabled != 0.0 {
311
+ let current = eng.renderer.render_scale();
312
+ eng.drs.enable(target_hz as f32, current);
313
+ } else {
314
+ eng.drs.disable();
315
+ }
316
+ })
317
+ }
318
+
319
+ // bloom_set_manual_exposure [source: macos]
320
+ #[no_mangle]
321
+ pub extern "C" fn bloom_set_manual_exposure(value: f64) {
322
+ $crate::ffi::guard("bloom_set_manual_exposure", move || {
323
+ engine().renderer.set_manual_exposure(value as f32);
324
+ })
325
+ }
326
+
327
+ // bloom_set_env_intensity [source: macos]
328
+ #[no_mangle]
329
+ pub extern "C" fn bloom_set_env_intensity(intensity: f64) {
330
+ $crate::ffi::guard("bloom_set_env_intensity", move || {
331
+ engine().renderer.set_env_intensity(intensity as f32);
332
+ })
333
+ }
334
+
335
+ // bloom_set_ssgi_enabled [source: macos]
336
+ #[no_mangle]
337
+ pub extern "C" fn bloom_set_ssgi_enabled(enabled: f64) {
338
+ $crate::ffi::guard("bloom_set_ssgi_enabled", move || {
339
+ engine().renderer.set_ssgi_enabled(enabled != 0.0);
340
+ })
341
+ }
342
+
343
+ // bloom_set_path_tracing — 0 off / 1 progressive / 2 realtime
344
+ // (docs/pt/pt-roadmap.md). Needs hardware ray query; without it
345
+ // the request is stored but nothing engages — check
346
+ // bloom_path_tracing_supported to know which world you are in.
347
+ #[no_mangle]
348
+ pub extern "C" fn bloom_set_path_tracing(mode: f64) {
349
+ $crate::ffi::guard("bloom_set_path_tracing", move || {
350
+ engine().renderer.set_path_tracing(mode as u32);
351
+ })
352
+ }
353
+
354
+ // bloom_path_tracing_supported — 1.0 when the device can trace
355
+ // (same ray-query requirement as Lumen's HW backend), else 0.0.
356
+ #[no_mangle]
357
+ pub extern "C" fn bloom_path_tracing_supported() -> f64 {
358
+ $crate::ffi::guard("bloom_path_tracing_supported", move || {
359
+ if engine().renderer.pt_supported() { 1.0 } else { 0.0 }
360
+ })
361
+ }
362
+
363
+ // bloom_set_ssgi_intensity [source: macos]
364
+ #[no_mangle]
365
+ pub extern "C" fn bloom_set_ssgi_intensity(intensity: f64) {
366
+ $crate::ffi::guard("bloom_set_ssgi_intensity", move || {
367
+ engine().renderer.set_ssgi_intensity(intensity as f32);
368
+ })
369
+ }
370
+
371
+ // bloom_set_ssgi_radius [source: macos]
372
+ #[no_mangle]
373
+ pub extern "C" fn bloom_set_ssgi_radius(radius: f64) {
374
+ $crate::ffi::guard("bloom_set_ssgi_radius", move || {
375
+ engine().renderer.set_ssgi_radius(radius as f32);
376
+ })
377
+ }
378
+
379
+ // bloom_set_dof [source: macos]
380
+ #[no_mangle]
381
+ pub extern "C" fn bloom_set_dof(enabled: f64, focus_distance: f64, aperture: f64) {
382
+ $crate::ffi::guard("bloom_set_dof", move || {
383
+ let r = &mut engine().renderer;
384
+ r.set_dof_enabled(enabled != 0.0);
385
+ r.set_dof_focus_distance(focus_distance as f32);
386
+ r.set_dof_aperture(aperture as f32);
387
+ })
388
+ }
389
+
390
+ // bloom_set_quality_preset [source: macos]
391
+ #[no_mangle]
392
+ pub extern "C" fn bloom_set_quality_preset(preset: f64) {
393
+ $crate::ffi::guard("bloom_set_quality_preset", move || {
394
+ engine().renderer.apply_quality_preset(preset as u32);
395
+ })
396
+ }
397
+
398
+ // bloom_set_shadows_enabled [source: macos]
399
+ #[no_mangle]
400
+ pub extern "C" fn bloom_set_shadows_enabled(on: f64) {
401
+ $crate::ffi::guard("bloom_set_shadows_enabled", move || {
402
+ engine().renderer.set_shadows_enabled(on != 0.0);
403
+ })
404
+ }
405
+
406
+ // bloom_set_shadows_always_fresh [source: macos]
407
+ #[no_mangle]
408
+ pub extern "C" fn bloom_set_shadows_always_fresh(on: f64) {
409
+ $crate::ffi::guard("bloom_set_shadows_always_fresh", move || {
410
+ engine().renderer.set_shadows_always_fresh(on != 0.0);
411
+ })
412
+ }
413
+
414
+ // bloom_set_bloom_enabled [source: macos]
415
+ #[no_mangle]
416
+ pub extern "C" fn bloom_set_bloom_enabled(on: f64) {
417
+ $crate::ffi::guard("bloom_set_bloom_enabled", move || {
418
+ engine().renderer.set_bloom_enabled(on != 0.0);
419
+ })
420
+ }
421
+
422
+ // bloom_set_bloom_intensity [source: art-direction]
423
+ // Scales the bloom contribution added to the HDR scene before tonemap
424
+ // (0 = none, ~0.04 subtle default, higher = stronger glow).
425
+ #[no_mangle]
426
+ pub extern "C" fn bloom_set_bloom_intensity(value: f64) {
427
+ $crate::ffi::guard("bloom_set_bloom_intensity", move || {
428
+ engine().renderer.set_bloom_intensity(value as f32);
429
+ })
430
+ }
431
+
432
+ // bloom_set_tonemap [source: art-direction]
433
+ // Selects the tonemap operator: 0 = ACES (default), 1 = AgX (more
434
+ // filmic, better highlight desaturation + a punchier look).
435
+ #[no_mangle]
436
+ pub extern "C" fn bloom_set_tonemap(kind: f64) {
437
+ $crate::ffi::guard("bloom_set_tonemap", move || {
438
+ engine().renderer.set_tonemap_kind(kind as u32);
439
+ })
440
+ }
441
+
442
+ // bloom_set_auto_exposure_key [source: art-direction]
443
+ // Target scene-average luma for auto-exposure. Lower = the auto-
444
+ // exposure aims for a darker, more saturated midpoint (less wash-out);
445
+ // higher = brighter.
446
+ #[no_mangle]
447
+ pub extern "C" fn bloom_set_auto_exposure_key(key: f64) {
448
+ $crate::ffi::guard("bloom_set_auto_exposure_key", move || {
449
+ engine().renderer.set_auto_exposure_key(key as f32);
450
+ })
451
+ }
452
+
453
+ // bloom_set_auto_exposure_rate [source: art-direction]
454
+ // Per-frame adaptation rate for auto-exposure (0 = frozen, ~0.05 = a
455
+ // smooth eye-adaptation feel, 1 = instant).
456
+ #[no_mangle]
457
+ pub extern "C" fn bloom_set_auto_exposure_rate(rate: f64) {
458
+ $crate::ffi::guard("bloom_set_auto_exposure_rate", move || {
459
+ engine().renderer.set_auto_exposure_rate(rate as f32);
460
+ })
461
+ }
462
+
463
+ // bloom_set_ssao_enabled [source: macos]
464
+ #[no_mangle]
465
+ pub extern "C" fn bloom_set_ssao_enabled(on: f64) {
466
+ $crate::ffi::guard("bloom_set_ssao_enabled", move || {
467
+ engine().renderer.set_ssao_enabled(on != 0.0);
468
+ })
469
+ }
470
+
471
+ // bloom_set_ssao_intensity [source: macos]
472
+ #[no_mangle]
473
+ pub extern "C" fn bloom_set_ssao_intensity(value: f64) {
474
+ $crate::ffi::guard("bloom_set_ssao_intensity", move || {
475
+ engine().renderer.set_ssao_strength(value as f32);
476
+ })
477
+ }
478
+
479
+ // bloom_set_ssao_radius [source: macos]
480
+ #[no_mangle]
481
+ pub extern "C" fn bloom_set_ssao_radius(world_radius: f64) {
482
+ $crate::ffi::guard("bloom_set_ssao_radius", move || {
483
+ engine().renderer.set_ssao_radius(world_radius as f32);
484
+ })
485
+ }
486
+
487
+ // bloom_set_wind [source: macos]
488
+ #[no_mangle]
489
+ pub extern "C" fn bloom_set_wind(dir_x: f64, dir_z: f64, amplitude: f64, frequency: f64) {
490
+ $crate::ffi::guard("bloom_set_wind", move || {
491
+ engine().renderer.set_wind(dir_x as f32, dir_z as f32, amplitude as f32, frequency as f32);
492
+ })
493
+ }
494
+
495
+ // bloom_set_model_foliage_wind [EN-041]
496
+ //
497
+ // Mark a cached model as a plant so the wind bends it. amount ~1.0 for a
498
+ // tree. The engine used to sway alpha-cut materials only, so leaf cards
499
+ // fluttered and every trunk stood rigid.
500
+ #[no_mangle]
501
+ pub extern "C" fn bloom_set_model_foliage_wind(model: f64, amount: f64) {
502
+ $crate::ffi::guard("bloom_set_model_foliage_wind", move || {
503
+ engine().renderer.set_model_foliage_wind(model.to_bits(), amount as f32);
504
+ })
505
+ }
506
+
507
+ // bloom_set_foliage_shadow_motion [EN-041]
508
+ //
509
+ // Let foliage sway in the shadow pass too, so the canopy dapple moves.
510
+ // NOT free: a moving caster cannot reuse the cached static shadow depth.
511
+ #[no_mangle]
512
+ pub extern "C" fn bloom_set_foliage_shadow_motion(on: f64) {
513
+ $crate::ffi::guard("bloom_set_foliage_shadow_motion", move || {
514
+ engine().renderer.set_foliage_shadow_motion(on > 0.5);
515
+ })
516
+ }
517
+
518
+ // bloom_set_output_scale [EN-046]
519
+ //
520
+ // Shrink the SWAPCHAIN, not the G-buffer. This is the only knob that touches
521
+ // the fixed cost of the TSR upscale + final composite, which is what actually
522
+ // dominates a 4K frame — render_scale does not.
523
+ #[no_mangle]
524
+ pub extern "C" fn bloom_set_output_scale(scale: f64) {
525
+ $crate::ffi::guard("bloom_set_output_scale", move || {
526
+ engine().renderer.set_output_scale(scale as f32);
527
+ })
528
+ }
529
+
530
+ #[no_mangle]
531
+ pub extern "C" fn bloom_get_output_scale() -> f64 {
532
+ $crate::ffi::guard("bloom_get_output_scale", move || {
533
+ engine().renderer.output_scale() as f64
534
+ })
535
+ }
536
+
537
+ // bloom_set_cloud_shadows [EN-040]
538
+ //
539
+ // Opt the world into the deck the sky is already drawing. strength 0
540
+ // (the default) = sky-only clouds, which is what every game that never
541
+ // calls this keeps.
542
+ #[no_mangle]
543
+ pub extern "C" fn bloom_set_cloud_shadows(
544
+ strength: f64, deck_height: f64, feature_scale: f64, drift_speed: f64,
545
+ ) {
546
+ $crate::ffi::guard("bloom_set_cloud_shadows", move || {
547
+ engine().renderer.set_cloud_shadows(
548
+ strength as f32, deck_height as f32,
549
+ feature_scale as f32, drift_speed as f32);
550
+ })
551
+ }
552
+
553
+ // bloom_set_ssr_enabled [source: macos]
554
+ #[no_mangle]
555
+ pub extern "C" fn bloom_set_ssr_enabled(on: f64) {
556
+ $crate::ffi::guard("bloom_set_ssr_enabled", move || {
557
+ engine().renderer.set_ssr_enabled(on != 0.0);
558
+ })
559
+ }
560
+
561
+ // bloom_set_motion_blur_enabled [source: macos]
562
+ #[no_mangle]
563
+ pub extern "C" fn bloom_set_motion_blur_enabled(on: f64) {
564
+ $crate::ffi::guard("bloom_set_motion_blur_enabled", move || {
565
+ engine().renderer.set_motion_blur_enabled(on != 0.0);
566
+ })
567
+ }
568
+
569
+ // bloom_set_sss_enabled [source: macos]
570
+ #[no_mangle]
571
+ pub extern "C" fn bloom_set_sss_enabled(on: f64) {
572
+ $crate::ffi::guard("bloom_set_sss_enabled", move || {
573
+ engine().renderer.set_sss_enabled(on != 0.0);
574
+ })
575
+ }
576
+
577
+ // bloom_set_profiler_enabled [source: macos]
578
+ #[no_mangle]
579
+ pub extern "C" fn bloom_set_profiler_enabled(on: f64) {
580
+ $crate::ffi::guard("bloom_set_profiler_enabled", move || {
581
+ engine().profiler.set_enabled(on != 0.0);
582
+ })
583
+ }
584
+
585
+ // bloom_set_music_volume [source: macos]
586
+ #[no_mangle]
587
+ pub extern "C" fn bloom_set_music_volume(handle: f64, volume: f64) {
588
+ $crate::ffi::guard("bloom_set_music_volume", move || {
589
+ engine().audio.set_music_volume(handle, volume as f32);
590
+ })
591
+ }
592
+
593
+ // bloom_add_directional_light [source: macos]
594
+ #[no_mangle]
595
+ pub extern "C" fn bloom_add_directional_light(
596
+ dx: f64, dy: f64, dz: f64,
597
+ r: f64, g: f64, b: f64,
598
+ intensity: f64,
599
+ ) {
600
+ $crate::ffi::guard("bloom_add_directional_light", move || {
601
+ engine().renderer.add_directional_light(
602
+ dx as f32, dy as f32, dz as f32,
603
+ r as f32, g as f32, b as f32,
604
+ intensity as f32,
605
+ );
606
+ })
607
+ }
608
+
609
+ // bloom_add_point_light [source: macos]
610
+ #[no_mangle]
611
+ pub extern "C" fn bloom_add_point_light(
612
+ x: f64, y: f64, z: f64, range: f64,
613
+ r: f64, g: f64, b: f64,
614
+ intensity: f64,
615
+ ) {
616
+ $crate::ffi::guard("bloom_add_point_light", move || {
617
+ engine().renderer.add_point_light(
618
+ x as f32, y as f32, z as f32, range as f32,
619
+ r as f32, g as f32, b as f32,
620
+ intensity as f32,
621
+ );
622
+ })
623
+ }
624
+
625
+ // bloom_set_cursor_shape [source: macos]
626
+ #[no_mangle]
627
+ pub extern "C" fn bloom_set_cursor_shape(shape: f64) {
628
+ $crate::ffi::guard("bloom_set_cursor_shape", move || {
629
+ engine().input.cursor_shape = shape as u32;
630
+ })
631
+ }
632
+
633
+ // bloom_enable_shadows [source: macos]
634
+ #[no_mangle]
635
+ pub extern "C" fn bloom_enable_shadows() {
636
+ $crate::ffi::guard("bloom_enable_shadows", move || {
637
+ engine().renderer.shadow_map.enable();
638
+ })
639
+ }
640
+
641
+ // bloom_disable_shadows [source: macos]
642
+ #[no_mangle]
643
+ pub extern "C" fn bloom_disable_shadows() {
644
+ $crate::ffi::guard("bloom_disable_shadows", move || {
645
+ engine().renderer.shadow_map.disable();
646
+ })
647
+ }
648
+
649
+ // bloom_dump_shadow_map [source: macos]
650
+ #[no_mangle]
651
+ pub extern "C" fn bloom_dump_shadow_map(path_ptr: *const u8) {
652
+ $crate::ffi::guard("bloom_dump_shadow_map", move || {
653
+ let path = $crate::string_header::str_from_header(path_ptr).to_string();
654
+ engine().renderer.dump_shadow_map(&path);
655
+ })
656
+ }
657
+
658
+ // bloom_enable_postfx [source: macos]
659
+ #[no_mangle]
660
+ pub extern "C" fn bloom_enable_postfx() {
661
+ $crate::ffi::guard("bloom_enable_postfx", move || {
662
+ let mut eng = engine();
663
+ let w = eng.renderer.width();
664
+ let h = eng.renderer.height();
665
+ let fmt = eng.renderer.surface_format();
666
+ eng.postfx = Some($crate::postfx::PostFxPipeline::new(
667
+ &eng.renderer.device, w, h, fmt,
668
+ ));
669
+ })
670
+ }
671
+
672
+ // bloom_disable_postfx [source: macos]
673
+ #[no_mangle]
674
+ pub extern "C" fn bloom_disable_postfx() {
675
+ $crate::ffi::guard("bloom_disable_postfx", move || {
676
+ engine().postfx = None;
677
+ })
678
+ }
679
+
680
+ // bloom_splat_impulse [source: macos]
681
+ #[no_mangle]
682
+ pub extern "C" fn bloom_splat_impulse(x: f64, z: f64, radius: f64, strength: f64) {
683
+ $crate::ffi::guard("bloom_splat_impulse", move || {
684
+ engine().renderer.impulse_field.submit_splat(
685
+ x as f32, z as f32, radius as f32, strength as f32,
686
+ );
687
+ })
688
+ }
689
+
690
+ };
691
+ }