UNPKG

@needle-tools/engine

Version:

Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.

67 lines (49 loc) 1.55 kB
/** * Mesh GPU Instancing extension * * Specification: https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Vendor/EXT_mesh_gpu_instancing */ import { BufferAttribute, Matrix4, Vector3, Quaternion, } from 'three'; export default class GLTFMeshGPUInstancingExtension { constructor( writer ) { this.writer = writer; this.name = 'EXT_mesh_gpu_instancing'; } writeNode( node, nodeDef ) { if(node.constructor.name !== "InstancedMesh") return; const writer = this.writer; const extensionsUsed = writer.extensionsUsed; const extensionDef = {}; nodeDef.extensions = nodeDef.extensions || {}; nodeDef.extensions[ this.name ] = extensionDef; let mat = new Matrix4(); const pos0 = new Array(); const rot0 = new Array(); const scl0 = new Array(); for(let i = 0; i < node.count; i++) { node.getMatrixAt(i, mat); let p = new Vector3(); let r = new Quaternion(); let s = new Vector3(); mat.decompose(p,r,s); pos0.push(p.x,p.y,p.z); rot0.push(r.x,r.y,r.z,r.w); scl0.push(s.x,s.y,s.z); }; const pos = new Float32Array(pos0); const rot = new Float32Array(rot0); const scl = new Float32Array(scl0); extensionDef.attributes = { "TRANSLATION" : writer.processAccessor( new BufferAttribute( pos, 3 ) ), "ROTATION" : writer.processAccessor( new BufferAttribute( rot, 4 ) ), "SCALE" : writer.processAccessor( new BufferAttribute( scl, 3 ) ), }; extensionsUsed[ this.name ] = true; } }