code wiki / (root) / nx_gltf_render_prepare_normal_t281.nx

nx_gltf_render_prepare_normal_t281.nx source

↩ module page · 50 lines · 3860 B

1// Source descriptor and rig preservation, not automatic rig creation. 2// This boundary releases its own mappings on every return. Dependency ENOMEM behavior remains separate. 3import "nx_gltf_rig_descriptor_normal_t281.nx" 4import "nx_fs_create_lib.nx" 5func grc_index(s:*u8)->i64{ 6 var i:i64=0;var v:i64=0;if s[0]==0{return -1};if s[0]==48&&s[1]!=0{return -1} 7 while s[i]!=0{let d:i64=(s[i] as i64)-48;if d<0||d>9{return -1};if v>(GLD_I64_MAX-d)/10{return -1};v=v*10+d;i=i+1};return v 8} 9func grc_same(a:*u8,an:i64,b:*u8,bn:i64)->i64{if an!=bn{return 0};var i:i64=0;while i<an{if a[i]!=b[i]{return 0};i=i+1};return 1} 10func grc_error(code:*u8,status:i64,cause:i64)->i64{ 11 fsx_puts("{\"schema\":\"nishi-character-prepare-result/1\",\"ok\":false,\"code\":\"");fsx_puts(code);fsx_puts("\",\"status\":");fsx_putn(status);fsx_puts(",\"cause\":");fsx_putn(cause);fsx_puts("}\n");return 1 12} 13func main(argc:i64,argv:*i64)->i64{ 14 if argc!=5{grc_error("invalid_arguments",400,0);return 2} 15 let mesh:i64=grc_index(argv[2] as *u8);let skin:i64=grc_index(argv[3] as *u8);if mesh<0||skin<0{grc_error("invalid_index",400,0);return 2} 16 // Metadata layout is derived from type sizes and existing descriptor contract. 17 let words:i64=GLD_CONTEXT_WORDS+4+2 18 let meta:*i64=sys_mmap_try(words*__size_of(i64)) as *i64 19 if (meta as i64)==0{grc_error("allocation_unavailable",503,0);return 5} 20 var i:i64=0;while i<words{meta[i]=0;i=i+1} 21 let cx:*i64=meta;let w:*i64=(meta as i64+GLD_CONTEXT_WORDS*8) as *i64;let ln:*i64=(w as i64+32) as *i64;let rn:*i64=(ln as i64+8) as *i64 22 var src:*u8=0 as *u8;var out:*u8=0 as *u8;var readback:*u8=0 as *u8;var digest:*u8=0 as *u8 23 var rc:i64=0;var cause:i64=0;var n:i64=0;var reused:i64=0 24 src=sys_map_file(argv[1] as *u8,ln);if (src as i64)==0{rc=3} 25 if rc==0{cause=gltf_view_open(src,ln[0],cx);if cause==0{cause=gltf_render_descriptor_with_rig(cx,mesh,skin,w)};if cause!=0{rc=4}} 26 if rc==0{n=w[2];if n<=0{rc=4;cause=-3}else{out=sys_mmap_try(n);if (out as i64)==0{rc=5}}} 27 if rc==0{w[0]=out as i64;w[1]=n;w[2]=0;w[3]=0;cause=gltf_render_descriptor_with_rig(cx,mesh,skin,w);if cause!=0||w[2]!=n{rc=4}} 28 // Compute response evidence before committing an artifact. 29 if rc==0{digest=sys_mmap_try(32);if (digest as i64)==0{rc=5}else{sha256_digest(out,n,digest)}} 30 if rc==0{cause=fxc_create(argv[4] as *u8,out,n);if cause==FXC_EXISTS{reused=1}else{if cause!=n{rc=6}}} 31 if rc==0{readback=sys_map_file(argv[4] as *u8,rn);if (readback as i64)==0{rc=6}else{if grc_same(out,n,readback,rn[0])!=1{if reused==1{rc=7}else{rc=6}}}} 32 if rc==0{ 33 fsx_puts("{\"schema\":\"nishi-character-prepare-result/1\",\"ok\":true,\"scope\":\"source-descriptor-and-rig\",\"bytes\":");fsx_putn(n);fsx_puts(",\"reused\":");fsx_putn(reused);fsx_puts(",\"sha256\":\"") 34 let hex:*u8="0123456789abcdef";var k:i64=0;while k<32{let b:i64=digest[k] as i64;sys_write(1,(hex as i64+b/16) as *u8,1);sys_write(1,(hex as i64+b%16) as *u8,1);k=k+1};fsx_puts("\"}\n") 35 // Preserve the existing CLI receipt while exposing additive structured evidence. 36 fsx_puts("descriptor_sha256=");k=0;while k<32{let b:i64=digest[k] as i64;sys_write(1,(hex as i64+b/16) as *u8,1);sys_write(1,(hex as i64+b%16) as *u8,1);k=k+1};fsx_puts(" bytes=");fsx_putn(n);fsx_puts("\nDESCRIPTOR_WITH_RIG_VERIFIED\n") 37 } 38 if (readback as i64)!=0{sys_munmap_direct(readback,rn[0])} 39 if (digest as i64)!=0{sys_munmap_direct(digest,32)} 40 if (out as i64)!=0{sys_munmap_direct(out,n)} 41 gltf_view_close(cx) 42 if (src as i64)!=0{sys_munmap_direct(src,ln[0])} 43 sys_munmap_direct(meta as *u8,words*__size_of(i64)) 44 if rc==3{grc_error("source_unavailable_or_empty",422,cause)} 45 if rc==4{grc_error("invalid_source_descriptor",422,cause)} 46 if rc==5{grc_error("allocation_unavailable",503,cause)} 47 if rc==6{grc_error("artifact_commit_or_verification_failed",500,cause)} 48 if rc==7{grc_error("artifact_conflict",409,cause)} 49 return rc 50}