code wiki / (root) / nx_solarsim.nx

nx_solarsim.nx

buildroot/runtime/nx_solarsim.nx

8183 B151 linesdepth 0pulls 0 transitivereach 1 importersview sourcekind librarytopic solarsim
docsdependenciesstructsconstsfunctions

about

nx_solarsim.nx -- Simulates the solar system with integer-based N-body physics, rendering planets and trails in a packed RGB framebuffer.

dependencies 0 imports · 1 importers

nx_solarsim.nx nx_solarsim_gate.nx

imports: none

imported by: nx_solarsim_gate.nx

structs

none

consts

2const O_MAGIC_38700: i64 = 38700
3const O_MAGIC_72300: i64 = 72300
4const O_MAGIC_100000: i64 = 100000
5const O_MAGIC_152400: i64 = 152400
6const O_MAGIC_520300: i64 = 520300
7const O_MAGIC_4096: i64 = 4096
19const W: i64 = 256
20const H: i64 = 256
21const O_FB: i64 = 0 // framebuffer W*H i64 packed-RGB at offset 0 (W*H*8 = 524288 bytes)
22const N: i64 = 5 // planets: Mercury, Venus, Earth, Mars, Jupiter
23const O_X: i64 = 524288 // x[N] (true coords, AU*SC)
24const O_Y: i64 = 524328 // y[N]
25const O_VSX: i64 = 524368 // vsx[N] (velocity * VS)
26const O_VSY: i64 = 524408 // vsy[N]
27const O_R0: i64 = 524448 // r0[N] initial radius (for display scale + period)
28const O_RPX: i64 = 524488 // rpx[N] display radius in pixels
29const O_TH: i64 = 524528 // trail head[N]
30const O_TC: i64 = 524568 // trail count[N]
31const O_STEP: i64 = 524608 // [0] global step counter
32const O_TR: i64 = 524616 // trails: N*TRAILN points * 2 i64 (px,py)
33const TRAILN: i64 = 80
34const SC: i64 = 100000 // 1 AU = 100000 units
35const GM: i64 = 15625000000000 // (SC/8)^2 * SC -> circular speed SC/8 at r=SC (Earth period ~3222 steps)
36const DD2: i64 = 8192 // position-step divisor (= 2*D*D, D=64)
37const VS: i64 = 128 // velocity scale (= 2*D, exact symplectic half-kick)
38const CX: i64 = 128
39const CY: i64 = 128
40const STEPS_PER_TICK: i64 = 24

functions

42func rgb(r: i64, g: i64, b: i64) -> i64 { return (r & 255) | ((g & 255) << 8) | ((b & 255) << 16) }
43func isqrt(N0: i64) -> i64 { if N0<2 { return N0 } var x: i64=N0; var y: i64=(x+1)/2; while y<x { x=y; y=(x + N0/x)/2 } return x }
44func color_of(p: i64) -> i64
called by 1: render_impl calls 1: rgb
51func dim(c: i64) -> i64 { return rgb((c&255)*2/5, ((c>>8)&255)*2/5, ((c>>16)&255)*2/5) }
called by 1: render_impl calls 1: rgb
52func radius_of(p: i64) -> i64 { if p==4 { return 4 } return 2 } // Jupiter a touch bigger
called by 1: render_impl
54func putpx(base: i64, px: i64, py: i64, c: i64) -> i64
called by 2: discrender_impl
58func disc(base: i64, px: i64, py: i64, r: i64, c: i64) -> i64
called by 1: render_impl calls 1: putpx
65func clear_fb(base: i64, c: i64) -> i64 { let fb: *i64=(base+O_FB) as *i64; var i: i64=0; while i<W*H { fb[i]=c; i=i+1 } return 0 }
called by 1: render_impl
68func energy_p(base: i64, p: i64) -> i64
called by 1: main calls 1: isqrt
74func set_planet(base: i64, p: i64, a: i64) -> i64
called by 1: init_impl calls 1: isqrt
83func init_impl(base: i64) -> i64
94func step_one_impl(base: i64, p: i64) -> i64
called by 2: tick_implmeasure_period calls 1: isqrt
107func record_trail(base: i64, p: i64) -> i64
called by 1: tick_impl
116func tick_impl(base: i64, cmd: i64) -> i64
127func render_impl(base: i64) -> i64
145func ww() -> i64 { return W }
called by 1: main
146func hh() -> i64 { return H }
called by 1: main
147func fb_off() -> i64 { return O_FB }
called by 1: main
148func init() -> i64 { return init_impl(0) }
calls 1: init_impl
149func tick(cmd: i64) -> i64 { return tick_impl(0, cmd) }
calls 1: tick_impl
150func render() -> i64 { return render_impl(0) }
calls 1: render_impl
151func mem_bytes() -> i64 { return O_TR + N*TRAILN*2*8 + O_MAGIC_4096 }