UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 1.93 kB
import{Vec2 as e}from"../../core/math/vec2.js";import{Vec3 as t}from"../../core/math/vec3.js";const n=(e,n)=>{const s=n.length/3,o=e.length/3,r=new t,y=new t,w=new t,x=new t,c=new t,l=new t,z=[];for(let t=0;t<e.length;t++)z[t]=0;for(let t=0;t<s;t++){const s=n[3*t],o=n[3*t+1],a=n[3*t+2];r.set(e[3*s],e[3*s+1],e[3*s+2]),y.set(e[3*o],e[3*o+1],e[3*o+2]),w.set(e[3*a],e[3*a+1],e[3*a+2]),x.sub2(y,r),c.sub2(w,r),l.cross(x,c).normalize(),z[3*s]+=l.x,z[3*s+1]+=l.y,z[3*s+2]+=l.z,z[3*o]+=l.x,z[3*o+1]+=l.y,z[3*o+2]+=l.z,z[3*a]+=l.x,z[3*a+1]+=l.y,z[3*a+2]+=l.z}for(let e=0;e<o;e++){const t=z[3*e],n=z[3*e+1],s=z[3*e+2],o=1/Math.sqrt(t*t+n*n+s*s);z[3*e]*=o,z[3*e+1]*=o,z[3*e+2]*=o}return z},s=(n,s,o,r)=>{const y=r.length/3,w=n.length/3,x=new t,c=new t,l=new t,z=new e,a=new e,m=new e,f=new t,h=new t,u=new Float32Array(3*w),g=new Float32Array(3*w),i=[];for(let e=0;e<y;e++){const t=r[3*e],s=r[3*e+1],y=r[3*e+2];x.set(n[3*t],n[3*t+1],n[3*t+2]),c.set(n[3*s],n[3*s+1],n[3*s+2]),l.set(n[3*y],n[3*y+1],n[3*y+2]),z.set(o[2*t],o[2*t+1]),a.set(o[2*s],o[2*s+1]),m.set(o[2*y],o[2*y+1]);const w=c.x-x.x,i=l.x-x.x,p=c.y-x.y,b=l.y-x.y,d=c.z-x.z,j=l.z-x.z,v=a.x-z.x,A=m.x-z.x,F=a.y-z.y,q=m.y-z.y,M=v*q-A*F;if(0===M)f.set(0,1,0),h.set(1,0,0);else{const e=1/M;f.set((q*w-F*i)*e,(q*p-F*b)*e,(q*d-F*j)*e),h.set((v*i-A*w)*e,(v*b-A*p)*e,(v*j-A*d)*e)}u[3*t+0]+=f.x,u[3*t+1]+=f.y,u[3*t+2]+=f.z,u[3*s+0]+=f.x,u[3*s+1]+=f.y,u[3*s+2]+=f.z,u[3*y+0]+=f.x,u[3*y+1]+=f.y,u[3*y+2]+=f.z,g[3*t+0]+=h.x,g[3*t+1]+=h.y,g[3*t+2]+=h.z,g[3*s+0]+=h.x,g[3*s+1]+=h.y,g[3*s+2]+=h.z,g[3*y+0]+=h.x,g[3*y+1]+=h.y,g[3*y+2]+=h.z}const p=new t,b=new t,d=new t,j=new t;for(let e=0;e<w;e++){d.set(s[3*e],s[3*e+1],s[3*e+2]),p.set(u[3*e],u[3*e+1],u[3*e+2]),b.set(g[3*e],g[3*e+1],g[3*e+2]);const t=d.dot(p);j.copy(d).mulScalar(t),j.sub2(p,j).normalize(),i[4*e]=j.x,i[4*e+1]=j.y,i[4*e+2]=j.z,j.cross(d,p),i[4*e+3]=j.dot(b)<0?-1:1}return i};export{n as calculateNormals,s as calculateTangents};