nx_person_field_candidate_t343.nx source
↩ module page · 40 lines · 2511 B
1// ORIGINAL. Composes complete native feature arenas without flattening their ABI.
2import "nx_persongen.nx"
3struct NativePersonField { body:i64, head:i64, scale_num:i64, scale_den:i64, translate_y:i64, blend:i64, }
4// Copies every per-part channel; source identity is retained separately in the caller's map.
5func npf_copy_part(dst:i64,di:i64,src:i64,si:i64)->i64{
6 if di<0||di>=PARTS_CAP||si<0||si>=PARTS_CAP{return -1}
7 let dp:*i64=(dst+O_PARTS) as *i64;let sp:*i64=(src+O_PARTS) as *i64
8 let dr:*i64=(dst+O_ROT) as *i64;let sr:*i64=(src+O_ROT) as *i64
9 let dl:*i64=(dst+O_ROLL) as *i64;let sl:*i64=(src+O_ROLL) as *i64
10 let dq:*i64=(dst+O_PRIM) as *i64;let sq:*i64=(src+O_PRIM) as *i64
11 var j:i64=0;while j<SDF_PART_FIELDS{dp[di*SDF_PART_FIELDS+j]=sp[si*SDF_PART_FIELDS+j];j=j+1}
12 j=0;while j<SDF_ROT_FIELDS{dr[di*SDF_ROT_FIELDS+j]=sr[si*SDF_ROT_FIELDS+j];dl[di*SDF_ROT_FIELDS+j]=sl[si*SDF_ROT_FIELDS+j];j=j+1}
13 j=0;while j<SDF_PRIM_FIELDS{dq[di*SDF_PRIM_FIELDS+j]=sq[si*SDF_PRIM_FIELDS+j];j=j+1}
14 let dop:*i64=(dst+O_OPS) as *i64;let sop:*i64=(src+O_OPS) as *i64;dop[di]=sop[si]
15 let dm:*i64=(dst+O_MATS) as *i64;let sm:*i64=(src+O_MATS) as *i64;dm[di]=sm[si]
16 let dk:*i64=(dst+O_KB2) as *i64;let sk:*i64=(src+O_KB2) as *i64;dk[di]=sk[si]
17 return 0
18}
19// Uniform similarity is evaluated in head-local coordinates: rotations, lid shells,
20// lipsweep dimensionless parameters and per-feature blends remain untouched.
21// The caller admits the sampled coordinate domain before this hot-path evaluation.
22func npf_eval(c:*NativePersonField,x:i64,y:i64,z:i64)->i64{
23 let h:i64=sdf_eval(c.head,x*c.scale_den/c.scale_num,(y-c.translate_y)*c.scale_den/c.scale_num,z*c.scale_den/c.scale_num)*c.scale_num/c.scale_den
24 let b:i64=sdf_eval(c.body,x,y,z)
25 return sdf_smin(b,h,c.blend)
26}
27func npf_build(c:*NativePersonField,body:i64,head:i64,seed:i64,num:i64,den:i64,ty:i64,blend:i64,skin:*i64,identity:*i64,genes:*i64,source_parts:*i64)->i64{
28 if body<=0||head<=0||body==head||num<=0||den<=0||blend<=0{return -1}
29 sdf_body(body)
30 let bn:*i64=(body+O_NPART) as *i64
31 if bn[0]!=NPART||bn[0]>PARTS_CAP{return -2}
32 persongen_build_eye(head,seed,skin,identity,genes)
33 let hn:*i64=(head+O_NPART) as *i64
34 if hn[0]!=FA_NPARTS||hn[0]>PARTS_CAP{return -3}
35 var i:i64=1;while i<bn[0]{if npf_copy_part(body,i-1,body,i)!=0{return -4};source_parts[i-1]=i;i=i+1}
36 bn[0]=bn[0]-1
37 i=0;while i<hn[0]{source_parts[bn[0]+i]=i;i=i+1}
38 c.body=body;c.head=head;c.scale_num=num;c.scale_den=den;c.translate_y=ty;c.blend=blend
39 return bn[0]+hn[0]
40}