49 lines
1.6 KiB
Plaintext
49 lines
1.6 KiB
Plaintext
// RDM disk format helpers shared by the baking tool (tacoma) and the
|
|
// sfetch-based streaming loader (rdm_loader.jai).
|
|
|
|
RDM_File_Header :: struct {
|
|
magic: u32;
|
|
width: s32;
|
|
height: s32;
|
|
}
|
|
|
|
RDM_FILE_MAGIC :: u32.[0x4D445254][0]; // "TRDM" as little-endian u32
|
|
|
|
rdm_global_atlas_filename :: (world_name: string) -> string {
|
|
return sprint("%/worlds/%/rdm_atlas.rdm", GAME_RESOURCES_DIR, world_name);
|
|
}
|
|
|
|
rdm_global_manifest_filename :: (world_name: string) -> string {
|
|
return sprint("%/worlds/%/rdm_manifest.json", GAME_RESOURCES_DIR, world_name);
|
|
}
|
|
|
|
// SH probe grid (1 probe per trile per axis = 32x32x32 per 32x32x32 chunk)
|
|
|
|
SH_FILE_MAGIC :: u32.[0x44475348][0]; // "SHGD" as little-endian u32
|
|
SH_PROBE_N :: 32; // probes per axis (1 per trile in a 32-trile chunk)
|
|
SH_TEX_W :: SH_PROBE_N * 3; // 96 — 3 RGBA texels per probe along X
|
|
|
|
SH_Grid_File_Header :: struct {
|
|
magic: u32;
|
|
version: u16;
|
|
probe_n: s32;
|
|
}
|
|
|
|
shgrid_filename :: (world_name: string, chunk_key: Chunk_Key) -> string {
|
|
return sprint("%/worlds/%/%_%_%.shgrid", GAME_RESOURCES_DIR, world_name, chunk_key.x, chunk_key.y, chunk_key.z);
|
|
}
|
|
|
|
f32_to_f16 :: (f: float) -> u16 {
|
|
b := (cast(*u32) *f).*;
|
|
sign := (b >> 31) & 0x1;
|
|
exp := cast(s32)((b >> 23) & 0xFF) - 127;
|
|
mant := b & 0x7FFFFF;
|
|
if exp >= 16 return cast(u16)((sign << 15) | 0x7C00); // clamp to inf
|
|
if exp >= -14 return cast(u16)((sign << 15) | (cast(u32)(exp + 15) << 10) | (mant >> 13));
|
|
if exp >= -24 {
|
|
shift := cast(u32)(-exp - 1);
|
|
return cast(u16)((sign << 15) | ((mant | 0x800000) >> shift));
|
|
}
|
|
return cast(u16)(sign << 15); // underflow → ±0
|
|
}
|