nx_gltf_render_prepare_candidate_t230.nx source
↩ module page · 50 lines · 3863 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_candidate_t230.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}