nx_material_normal_page_candidate_t302.nx source
↩ module page · 4 lines · 2427 B
1// Candidate emitted-page admission boundary; native glTF descriptor remains source parser.
2func gpe_material_normal_admission_t302(out:*u8,pos:i64)->i64{
3 return gpe_ap(out,pos,"function nxPreparedNormalState(source,part,P,indices){\n const fail=reason=>({state:'refused',reason,scope:'mapped-input-admission'});\n const m=part.material,n=m.normalMap;\n if(n===undefined){return m.mapInputs?.normalTexture==null?{state:'absent'}:fail('normal-map-descriptor-required');}\n if(!n||typeof n!=='object'||n.state!=='prepared')return fail(n?.reason||'normal-map-descriptor-refused');\n if(n.sourceIdentity!=='descriptor.sourceSha256+sourceBytes'||n.texCoord!==0||n.tangentFrame!=='gltf-tangent-xyz-and-w-handedness')return fail('normal-map-source-frame-contract');\n const e=n.normalEncoding;\n if(!e||e.id!==2||e.name!=='gltf-rgb8-unorm-v1'||e.linearTransfer!==true||e.normalizationRequired!==true)return fail('normal-map-explicit-encoding-required');\n if(!Number.isFinite(n.scale)||!Number.isFinite(Math.fround(n.scale))||(n.scale!==0&&Math.fround(n.scale)===0))return fail('normal-map-scale-not-representable');\n const image=n.image;\n if(!image||image.mime!=='image/png'||!Number.isSafeInteger(image.offset)||!Number.isSafeInteger(image.bytes)||image.offset<0||image.bytes<=0||image.offset>source.byteLength||image.bytes>source.byteLength-image.offset)return fail('normal-map-image-range');\n const s=image.sampler;\n if(!s||![9728,9729].includes(s.mag)||![9728,9729,9984,9985,9986,9987].includes(s.min)||![10497,33071,33648].includes(s.wrapS)||![10497,33071,33648].includes(s.wrapT))return fail('normal-map-source-sampler');\n const t=P.tangent,N=P.nrm;\n if(!(t instanceof Float32Array)||t.length/4!==N.length/3||!t.every(Number.isFinite))return fail('normal-map-tangent-stream');\n for(let i=0,j=0;i<t.length;i+=4,j+=3){\n if(t[i+3]!==1&&t[i+3]!==-1)return fail('normal-map-tangent-handedness');\n const x=N[j+1]*t[i+2]-N[j+2]*t[i+1],y=N[j+2]*t[i]-N[j]*t[i+2],z=N[j]*t[i+1]-N[j+1]*t[i];\n if(x===0&&y===0&&z===0)return fail('normal-map-degenerate-tangent-frame');\n }\n for(let i=0;i<indices.length;i+=3){const w=t[indices[i]*4+3];if(w!==t[indices[i+1]*4+3]||w!==t[indices[i+2]*4+3])return fail('normal-map-mixed-triangle-handedness');}\n return {state:'admitted-inputs',image,scale:n.scale,encoding:e,scope:'Source frame and map inputs only; posed determinant, upload and draw qualification separate'};\n}\n" as *u8)
4}