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.

46 lines 1.8 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; } } //# sourceMappingURL=EXT_mesh_gpu_instancing_exporter.js.map