@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,184 @@
1
+ //! Texture registry: paths from TS side → stable handles that the Swift
2
+ //! Canvas resolves to CGImages on first use and caches thereafter.
3
+ //!
4
+ //! Widths + heights are parsed out of the PNG IHDR here so `loadTexture`'s
5
+ //! synchronous `{ id, width, height }` contract works without round-tripping
6
+ //! to Swift. Only PNG is supported for this first cut — adequate for Jump
7
+ //! (all its sprites are PNG).
8
+
9
+ use std::ffi::CString;
10
+ use std::os::raw::c_char;
11
+ use std::sync::Mutex;
12
+
13
+ struct TexEntry {
14
+ /// Null-terminated path, kept alive for the program's lifetime — Swift
15
+ /// holds the pointer across frames.
16
+ path: CString,
17
+ width: u32,
18
+ height: u32,
19
+ }
20
+
21
+ struct Registry {
22
+ entries: Vec<TexEntry>,
23
+ }
24
+
25
+ static REG: Mutex<Registry> = Mutex::new(Registry { entries: Vec::new() });
26
+
27
+ /// Load a texture — stores the path + parses PNG header for dimensions,
28
+ /// returns a 1-based handle. Returns 0 on failure.
29
+ pub fn load(path: &str) -> u32 {
30
+ if path.is_empty() {
31
+ return 0;
32
+ }
33
+
34
+ // Resolve bundle-relative paths against the main bundle's resource path.
35
+ let full = resolve_bundle_path(path);
36
+
37
+ let (w, h) = match parse_png_size(&full) {
38
+ Some(v) => v,
39
+ None => (0, 0), // unknown — Swift will skip/draw placeholder
40
+ };
41
+
42
+ let cpath = match CString::new(full) {
43
+ Ok(c) => c,
44
+ Err(_) => return 0,
45
+ };
46
+
47
+ let mut reg = REG.lock().unwrap();
48
+ reg.entries.push(TexEntry { path: cpath, width: w, height: h });
49
+ reg.entries.len() as u32
50
+ }
51
+
52
+ /// Register in-memory image bytes (PNG or JPEG) by writing them to a temp
53
+ /// file inside the app's sandbox and returning a handle. Used by the glTF
54
+ /// loader for embedded textures. Returns 0 on failure.
55
+ pub fn register_bytes(bytes: &[u8]) -> u32 {
56
+ if bytes.len() < 8 { return 0; }
57
+ let (ext, (w, h)) = detect_image(bytes);
58
+ if ext.is_empty() { return 0; }
59
+
60
+ // Write to a stable path inside the temp dir. We include a counter so
61
+ // distinct blobs don't collide.
62
+ let mut reg = REG.lock().unwrap();
63
+ let idx = reg.entries.len();
64
+ let dir = std::env::temp_dir().join("bloom_watchos_tex");
65
+ let _ = std::fs::create_dir_all(&dir);
66
+ let file = dir.join(format!("tex_{}.{}", idx, ext));
67
+ if std::fs::write(&file, bytes).is_err() { return 0; }
68
+
69
+ let path_str = file.to_string_lossy().to_string();
70
+ let Ok(cpath) = CString::new(path_str) else { return 0; };
71
+ reg.entries.push(TexEntry { path: cpath, width: w, height: h });
72
+ reg.entries.len() as u32
73
+ }
74
+
75
+ /// Detect PNG or JPEG by magic bytes, returning extension + (width, height).
76
+ /// Both formats are common in glTF .glb embeds.
77
+ fn detect_image(b: &[u8]) -> (&'static str, (u32, u32)) {
78
+ // PNG signature: 89 50 4E 47 0D 0A 1A 0A
79
+ if b.len() >= 24 && b[0] == 0x89 && &b[1..4] == b"PNG" && &b[12..16] == b"IHDR" {
80
+ let w = u32::from_be_bytes([b[16], b[17], b[18], b[19]]);
81
+ let h = u32::from_be_bytes([b[20], b[21], b[22], b[23]]);
82
+ return ("png", (w, h));
83
+ }
84
+ // JPEG signature: FF D8 ... look for SOF0 / SOF2 marker for dimensions.
85
+ if b.len() >= 4 && b[0] == 0xFF && b[1] == 0xD8 {
86
+ if let Some(dims) = parse_jpeg_size(b) {
87
+ return ("jpg", dims);
88
+ }
89
+ return ("jpg", (0, 0));
90
+ }
91
+ ("", (0, 0))
92
+ }
93
+
94
+ /// Walk JPEG segments until a Start-Of-Frame marker, read (h, w).
95
+ fn parse_jpeg_size(b: &[u8]) -> Option<(u32, u32)> {
96
+ let mut i = 2;
97
+ while i + 9 < b.len() {
98
+ if b[i] != 0xFF { return None; }
99
+ let marker = b[i + 1];
100
+ i += 2;
101
+ // Standalone markers (no length field)
102
+ if marker == 0xD8 || marker == 0xD9 { continue; }
103
+ if i + 2 > b.len() { return None; }
104
+ let seg_len = u16::from_be_bytes([b[i], b[i+1]]) as usize;
105
+ // SOF0 (0xC0), SOF1 (0xC1), SOF2 (0xC2) — baseline + progressive.
106
+ if marker == 0xC0 || marker == 0xC1 || marker == 0xC2 {
107
+ if i + 7 > b.len() { return None; }
108
+ let h = u16::from_be_bytes([b[i+3], b[i+4]]) as u32;
109
+ let w = u16::from_be_bytes([b[i+5], b[i+6]]) as u32;
110
+ return Some((w, h));
111
+ }
112
+ i += seg_len;
113
+ }
114
+ None
115
+ }
116
+
117
+ pub fn width(handle: u32) -> u32 {
118
+ let reg = REG.lock().unwrap();
119
+ if handle == 0 || handle as usize > reg.entries.len() {
120
+ return 0;
121
+ }
122
+ reg.entries[handle as usize - 1].width
123
+ }
124
+
125
+ pub fn height(handle: u32) -> u32 {
126
+ let reg = REG.lock().unwrap();
127
+ if handle == 0 || handle as usize > reg.entries.len() {
128
+ return 0;
129
+ }
130
+ reg.entries[handle as usize - 1].height
131
+ }
132
+
133
+ /// Get the null-terminated resolved path for a handle. Returns null for 0.
134
+ /// Pointer is stable for the program's lifetime.
135
+ pub fn path_ptr(handle: u32) -> *const c_char {
136
+ let reg = REG.lock().unwrap();
137
+ if handle == 0 || handle as usize > reg.entries.len() {
138
+ return std::ptr::null();
139
+ }
140
+ reg.entries[handle as usize - 1].path.as_ptr()
141
+ }
142
+
143
+ /// Resolve a possibly-bundle-relative path to an absolute filesystem path.
144
+ /// On watchOS the Swift shell populates `BUNDLE_RESOURCE_PATH` on startup
145
+ /// via `bloom_watchos_set_bundle_path`; if it hasn't, paths are returned
146
+ /// unchanged.
147
+ pub fn resolve_bundle_path(p: &str) -> String {
148
+ if p.starts_with('/') {
149
+ return p.to_string();
150
+ }
151
+ let bundle = BUNDLE_PATH.lock().unwrap();
152
+ if bundle.is_empty() {
153
+ return p.to_string();
154
+ }
155
+ format!("{}/{}", bundle, p)
156
+ }
157
+
158
+ static BUNDLE_PATH: Mutex<String> = Mutex::new(String::new());
159
+
160
+ pub fn set_bundle_path(p: &str) {
161
+ let mut b = BUNDLE_PATH.lock().unwrap();
162
+ b.clear();
163
+ b.push_str(p);
164
+ }
165
+
166
+ /// Read a PNG file's IHDR chunk and return (width, height). Returns None for
167
+ /// any parse failure (wrong magic, truncated, etc.).
168
+ fn parse_png_size(path: &str) -> Option<(u32, u32)> {
169
+ let bytes = std::fs::read(path).ok()?;
170
+ // PNG signature (8 bytes) + IHDR length (4) + "IHDR" (4) + width (4) + height (4) = 24 bytes min
171
+ if bytes.len() < 24 {
172
+ return None;
173
+ }
174
+ const PNG_SIG: [u8; 8] = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A];
175
+ if bytes[..8] != PNG_SIG {
176
+ return None;
177
+ }
178
+ if &bytes[12..16] != b"IHDR" {
179
+ return None;
180
+ }
181
+ let w = u32::from_be_bytes([bytes[16], bytes[17], bytes[18], bytes[19]]);
182
+ let h = u32::from_be_bytes([bytes[20], bytes[21], bytes[22], bytes[23]]);
183
+ Some((w, h))
184
+ }