@lume/three-instanced-mesh
Version:
Scene graph level abstraction for three.js InstancedBufferGeometry
75 lines (48 loc) • 1.78 kB
JavaScript
export default /* glsl */ `
varying vec2 vUv;
uniform mat3 uvTransform;
mat3 inverse(mat3 m) {
float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];
float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];
float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];
float b01 = a22 * a11 - a12 * a21;
float b11 = -a22 * a10 + a12 * a20;
float b21 = a21 * a10 - a11 * a20;
float det = a00 * b01 + a01 * b11 + a02 * b21;
return mat3(b01, (-a22 * a01 + a02 * a21), ( a12 * a01 - a02 * a11),
b11, ( a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),
b21, (-a21 * a00 + a01 * a20), ( a11 * a00 - a01 * a10)) / det;
}
//for dynamic, avoid computing the matrices on the cpu
attribute vec3 instancePosition;
attribute vec4 instanceQuaternion;
attribute vec3 instanceScale;
attribute vec3 instanceColor;
varying vec3 vInstanceColor;
attribute float instanceOpacity;
varying float vInstanceOpacity;
mat4 getInstanceMatrix(){
vec4 q = instanceQuaternion;
vec3 s = instanceScale;
vec3 v = instancePosition;
vec3 q2 = q.xyz + q.xyz;
vec3 a = q.xxx * q2.xyz;
vec3 b = q.yyz * q2.yzz;
vec3 c = q.www * q2.xyz;
vec3 r0 = vec3( 1.0 - (b.x + b.z) , a.y + c.z , a.z - c.y ) * s.xxx;
vec3 r1 = vec3( a.y - c.z , 1.0 - (a.x + b.z) , b.y + c.x ) * s.yyy;
vec3 r2 = vec3( a.z + c.y , b.y - c.x , 1.0 - (a.x + b.x) ) * s.zzz;
return mat4(
r0 , 0.0,
r1 , 0.0,
r2 , 0.0,
v , 1.0
);
}
`;