@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.
- package/LICENSE +21 -0
- package/README.md +231 -0
- package/native/android/Cargo.lock +1848 -0
- package/native/android/Cargo.toml +24 -0
- package/native/android/src/lib.rs +702 -0
- package/native/ios/Cargo.lock +1690 -0
- package/native/ios/Cargo.toml +32 -0
- package/native/ios/src/lib.rs +1267 -0
- package/native/linux/Cargo.lock +3279 -0
- package/native/linux/Cargo.toml +29 -0
- package/native/linux/src/lib.rs +1331 -0
- package/native/macos/Cargo.lock +3310 -0
- package/native/macos/Cargo.toml +46 -0
- package/native/macos/src/lib.rs +1302 -0
- package/native/shared/Cargo.lock +1899 -0
- package/native/shared/Cargo.toml +62 -0
- package/native/shared/assets/default_font.ttf +0 -0
- package/native/shared/build.rs +270 -0
- package/native/shared/shaders/common/clouds.wgsl +122 -0
- package/native/shared/shaders/common/fog.wgsl +16 -0
- package/native/shared/shaders/common/foliage_wind.wgsl +98 -0
- package/native/shared/shaders/common/imposter.wgsl +112 -0
- package/native/shared/shaders/common/pbr.wgsl +186 -0
- package/native/shared/shaders/common/shadows.wgsl +186 -0
- package/native/shared/shaders/common/sky.wgsl +8 -0
- package/native/shared/shaders/common/tonemap.wgsl +25 -0
- package/native/shared/shaders/impulse_field.wgsl +57 -0
- package/native/shared/shaders/material_abi.wgsl +383 -0
- package/native/shared/shaders/materials/test_minimal.wgsl +42 -0
- package/native/shared/src/anim_mixer.rs +61 -0
- package/native/shared/src/attach.rs +263 -0
- package/native/shared/src/audio/decode.rs +123 -0
- package/native/shared/src/audio/mod.rs +863 -0
- package/native/shared/src/audio/render.rs +892 -0
- package/native/shared/src/audio/spsc.rs +156 -0
- package/native/shared/src/audio/stream.rs +226 -0
- package/native/shared/src/custom_shaders.rs +104 -0
- package/native/shared/src/decals.rs +245 -0
- package/native/shared/src/drs.rs +211 -0
- package/native/shared/src/engine.rs +261 -0
- package/native/shared/src/ffi.rs +116 -0
- package/native/shared/src/ffi_core/assets.rs +388 -0
- package/native/shared/src/ffi_core/audio_ffi.rs +184 -0
- package/native/shared/src/ffi_core/draw.rs +334 -0
- package/native/shared/src/ffi_core/game_loop.rs +577 -0
- package/native/shared/src/ffi_core/input.rs +234 -0
- package/native/shared/src/ffi_core/mod.rs +127 -0
- package/native/shared/src/ffi_core/models.rs +1154 -0
- package/native/shared/src/ffi_core/ragdoll_ffi.rs +261 -0
- package/native/shared/src/ffi_core/scene.rs +626 -0
- package/native/shared/src/ffi_core/vfx.rs +212 -0
- package/native/shared/src/ffi_core/visual.rs +691 -0
- package/native/shared/src/frame_callbacks.rs +122 -0
- package/native/shared/src/geometry.rs +236 -0
- package/native/shared/src/handles.rs +182 -0
- package/native/shared/src/input.rs +448 -0
- package/native/shared/src/jolt_sys.rs +822 -0
- package/native/shared/src/lib.rs +55 -0
- package/native/shared/src/models.rs +1093 -0
- package/native/shared/src/models_gltf.rs +1280 -0
- package/native/shared/src/particles.rs +391 -0
- package/native/shared/src/physics_jolt.rs +1908 -0
- package/native/shared/src/picking.rs +298 -0
- package/native/shared/src/postfx.rs +345 -0
- package/native/shared/src/profiler.rs +492 -0
- package/native/shared/src/ragdoll.rs +474 -0
- package/native/shared/src/renderer/atmosphere_lut.rs +573 -0
- package/native/shared/src/renderer/brdf_lut.rs +154 -0
- package/native/shared/src/renderer/draw2d.rs +143 -0
- package/native/shared/src/renderer/formats.rs +822 -0
- package/native/shared/src/renderer/froxel.rs +421 -0
- package/native/shared/src/renderer/gi_bake.rs +653 -0
- package/native/shared/src/renderer/graph.rs +462 -0
- package/native/shared/src/renderer/hiz.rs +269 -0
- package/native/shared/src/renderer/hot_reload.rs +390 -0
- package/native/shared/src/renderer/impulse_field.rs +456 -0
- package/native/shared/src/renderer/lighting.rs +154 -0
- package/native/shared/src/renderer/material_instancing.rs +171 -0
- package/native/shared/src/renderer/material_pipeline.rs +700 -0
- package/native/shared/src/renderer/material_system.rs +1996 -0
- package/native/shared/src/renderer/material_system_tests.rs +601 -0
- package/native/shared/src/renderer/material_system_wasm.rs +41 -0
- package/native/shared/src/renderer/mod.rs +12556 -0
- package/native/shared/src/renderer/model_draw.rs +641 -0
- package/native/shared/src/renderer/occlusion.rs +429 -0
- package/native/shared/src/renderer/planar_pass.rs +593 -0
- package/native/shared/src/renderer/planar_reflection.rs +499 -0
- package/native/shared/src/renderer/post_pass.rs +249 -0
- package/native/shared/src/renderer/postfx_chain.rs +728 -0
- package/native/shared/src/renderer/pt_pass.rs +577 -0
- package/native/shared/src/renderer/scene_pass.rs +607 -0
- package/native/shared/src/renderer/shader_include.rs +205 -0
- package/native/shared/src/renderer/shader_library.rs +135 -0
- package/native/shared/src/renderer/shaders/ao.rs +570 -0
- package/native/shared/src/renderer/shaders/core.rs +1243 -0
- package/native/shared/src/renderer/shaders/env.rs +907 -0
- package/native/shared/src/renderer/shaders/gi.rs +810 -0
- package/native/shared/src/renderer/shaders/mod.rs +19 -0
- package/native/shared/src/renderer/shaders/post.rs +1558 -0
- package/native/shared/src/renderer/shaders/pt.rs +1859 -0
- package/native/shared/src/renderer/shaders/ssgi.rs +1586 -0
- package/native/shared/src/renderer/shadow_pass.rs +731 -0
- package/native/shared/src/renderer/ssgi_pass.rs +392 -0
- package/native/shared/src/renderer/ssr_pass.rs +188 -0
- package/native/shared/src/renderer/texture_store.rs +473 -0
- package/native/shared/src/renderer/transient.rs +591 -0
- package/native/shared/src/renderer/types.rs +941 -0
- package/native/shared/src/renderer/util.rs +152 -0
- package/native/shared/src/scene.rs +1362 -0
- package/native/shared/src/sdf_cache.rs +274 -0
- package/native/shared/src/shadows.rs +1036 -0
- package/native/shared/src/staging.rs +102 -0
- package/native/shared/src/string_header.rs +266 -0
- package/native/shared/src/text_renderer.rs +502 -0
- package/native/shared/src/textures.rs +197 -0
- package/native/tvos/Cargo.lock +1693 -0
- package/native/tvos/Cargo.toml +36 -0
- package/native/tvos/metal-patched/Cargo.toml +178 -0
- package/native/tvos/metal-patched/LICENSE-APACHE +201 -0
- package/native/tvos/metal-patched/LICENSE-MIT +25 -0
- package/native/tvos/metal-patched/src/acceleration_structure.rs +667 -0
- package/native/tvos/metal-patched/src/acceleration_structure_pass.rs +108 -0
- package/native/tvos/metal-patched/src/argument.rs +366 -0
- package/native/tvos/metal-patched/src/blitpass.rs +102 -0
- package/native/tvos/metal-patched/src/buffer.rs +71 -0
- package/native/tvos/metal-patched/src/capturedescriptor.rs +76 -0
- package/native/tvos/metal-patched/src/capturemanager.rs +113 -0
- package/native/tvos/metal-patched/src/commandbuffer.rs +192 -0
- package/native/tvos/metal-patched/src/commandqueue.rs +44 -0
- package/native/tvos/metal-patched/src/computepass.rs +107 -0
- package/native/tvos/metal-patched/src/constants.rs +152 -0
- package/native/tvos/metal-patched/src/counters.rs +119 -0
- package/native/tvos/metal-patched/src/depthstencil.rs +190 -0
- package/native/tvos/metal-patched/src/device.rs +2134 -0
- package/native/tvos/metal-patched/src/drawable.rs +39 -0
- package/native/tvos/metal-patched/src/encoder.rs +2041 -0
- package/native/tvos/metal-patched/src/heap.rs +281 -0
- package/native/tvos/metal-patched/src/indirect_encoder.rs +344 -0
- package/native/tvos/metal-patched/src/lib.rs +657 -0
- package/native/tvos/metal-patched/src/library.rs +902 -0
- package/native/tvos/metal-patched/src/mps.rs +575 -0
- package/native/tvos/metal-patched/src/pipeline/compute.rs +475 -0
- package/native/tvos/metal-patched/src/pipeline/mod.rs +71 -0
- package/native/tvos/metal-patched/src/pipeline/render.rs +762 -0
- package/native/tvos/metal-patched/src/renderpass.rs +443 -0
- package/native/tvos/metal-patched/src/resource.rs +182 -0
- package/native/tvos/metal-patched/src/sampler.rs +165 -0
- package/native/tvos/metal-patched/src/sync.rs +178 -0
- package/native/tvos/metal-patched/src/texture.rs +352 -0
- package/native/tvos/metal-patched/src/types.rs +90 -0
- package/native/tvos/metal-patched/src/vertexdescriptor.rs +250 -0
- package/native/tvos/src/audio_backend.rs +197 -0
- package/native/tvos/src/lib.rs +1891 -0
- package/native/visionos/Cargo.lock +1693 -0
- package/native/visionos/Cargo.toml +40 -0
- package/native/visionos/src/audio_backend.rs +197 -0
- package/native/visionos/src/lib.rs +1887 -0
- package/native/watchos/Cargo.lock +16 -0
- package/native/watchos/Cargo.toml +19 -0
- package/native/watchos/shaders/bloom_postfx.metal +99 -0
- package/native/watchos/src/BloomWatchApp.swift +1267 -0
- package/native/watchos/src/BloomWatchAudio.swift +179 -0
- package/native/watchos/src/audio.rs +55 -0
- package/native/watchos/src/draw_list.rs +229 -0
- package/native/watchos/src/ffi_stubs.rs +915 -0
- package/native/watchos/src/ffi_stubs_manual.rs +35 -0
- package/native/watchos/src/lib.rs +1124 -0
- package/native/watchos/src/models.rs +746 -0
- package/native/watchos/src/postfx.rs +95 -0
- package/native/watchos/src/scene.rs +534 -0
- package/native/watchos/src/textures.rs +184 -0
- package/native/web/Cargo.lock +1657 -0
- package/native/web/Cargo.toml +43 -0
- package/native/web/bloom_glue.js +695 -0
- package/native/web/build.sh +131 -0
- package/native/web/index.html +35 -0
- package/native/web/jolt_bridge.js +1519 -0
- package/native/web/src/input_ffi.rs +286 -0
- package/native/web/src/lib.rs +1796 -0
- package/native/web/src/material_ffi.rs +710 -0
- package/native/web/src/parity_ffi.rs +343 -0
- package/native/web/src/physics_ffi.rs +643 -0
- package/native/web/src/ragdoll_ffi.rs +250 -0
- package/native/web/src/render_settings.rs +98 -0
- package/native/windows/Cargo.lock +1815 -0
- package/native/windows/Cargo.toml +68 -0
- package/native/windows/src/lib.rs +1486 -0
- package/package.json +4279 -0
- package/src/audio/index.ts +315 -0
- package/src/core/colors.ts +63 -0
- package/src/core/index.ts +1206 -0
- package/src/core/keys.ts +63 -0
- package/src/core/types.ts +104 -0
- package/src/index.ts +171 -0
- package/src/math/index.ts +516 -0
- package/src/mobile/index.ts +294 -0
- package/src/models/index.ts +1258 -0
- package/src/physics/index.ts +1134 -0
- package/src/scene/index.ts +698 -0
- package/src/shapes/index.ts +120 -0
- package/src/text/index.ts +48 -0
- package/src/textures/index.ts +187 -0
- package/src/vfx/index.ts +191 -0
- package/src/world/index.ts +24 -0
- package/src/world/loader.ts +423 -0
- package/src/world/prefab.ts +217 -0
- package/src/world/render.ts +172 -0
- package/src/world/saver.ts +108 -0
- package/src/world/serialize.ts +301 -0
- package/src/world/terrain.ts +355 -0
- package/src/world/types.ts +160 -0
- package/src/world/validate.ts +319 -0
- 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
|
+
}
|