code wiki / (root) / nx_gltf_writer.nx

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)}