UNPKG

@bitowl/three-instanced-mesh

Version:

Scene graph level abstraction for three.js InstancedBufferGeometry

71 lines (45 loc) 1.7 kB
/************************** * Dusan Bosnjak @pailhead **************************/ module.exports = [ "#ifdef INSTANCE_TRANSFORM", "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;", "#if defined( INSTANCE_COLOR )", "attribute vec3 instanceColor;", "varying vec3 vInstanceColor;", "#endif", "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", ");", "}", "#endif" ].join("\n");