nx_gltf_writer.nx source
↩ module page · 16 lines · 1114 B
1// Shared checked two-pass glTF serialization; extracted from the existing render descriptor.
2// Internal writer ABI: output pointer, capacity, position, sticky failure; null output counts bytes.
3// Caller initializes all four words. Signed minimum is deliberately unsupported, preserving legacy behavior.
4const GLW_I64_MAX:i64=9223372036854775807
5func glw_put(w:*i64,s:*u8,n:i64)->i64{
6 if w[3]!=0{return -1};if n<0||w[2]>GLW_I64_MAX-n{w[3]=-1;return -1}
7 if w[0]>0{if n>w[1]-w[2]{w[3]=-1;return -1};let b:*u8=w[0] as *u8;var i:i64=0;while i<n{b[w[2]+i]=s[i];i=i+1}}
8 w[2]=w[2]+n;return 0
9}
10func glw_s(w:*i64,s:*u8)->i64{return glw_put(w,s,glw_len(s))}
11func glw_n(w:*i64,n:i64)->i64{
12 if n<0{w[3]=-1;return -1};var d:i64=1;while d<=n/10{d=d*10};var left:i64=n
13 while d>0{let digit:i64=48+left/d;let chars:*u8="0123456789";if glw_put(w,(chars as i64+digit-48) as *u8,1)!=0{return -1};left=left%d;d=d/10};return 0
14}
15func glw_len(s:*u8)->i64{var n:i64=0;while s[n]!=(0 as u8){n=n+1};return n}
16func glw_i(w:*i64,n:i64)->i64{if n==0-GLW_I64_MAX-1{return -1};if n<0{glw_s(w,"-");return glw_n(w,0-n)};return glw_n(w,n)}