playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
56 lines (55 loc) • 1.94 kB
JavaScript
import { Mat4 } from "../../../../core/math/mat4.js";
import { Quat } from "../../../../core/math/quat.js";
import { Vec3 } from "../../../../core/math/vec3.js";
import { GltfAccessor } from "../gltf-accessor.js";
const createInstancing = (device, gltf, nodeInstancingMap, bufferViews) => {
const accessors = gltf.accessors;
nodeInstancingMap.forEach((data, entity) => {
const attributes = data.ext.attributes;
let translations;
if (attributes.hasOwnProperty("TRANSLATION")) {
const accessor = accessors[attributes.TRANSLATION];
translations = GltfAccessor.getDataFloat32(accessor, bufferViews);
}
let rotations;
if (attributes.hasOwnProperty("ROTATION")) {
const accessor = accessors[attributes.ROTATION];
rotations = GltfAccessor.getDataFloat32(accessor, bufferViews);
}
let scales;
if (attributes.hasOwnProperty("SCALE")) {
const accessor = accessors[attributes.SCALE];
scales = GltfAccessor.getDataFloat32(accessor, bufferViews);
}
const instanceCount = (translations ? translations.length / 3 : 0) || (rotations ? rotations.length / 4 : 0) || (scales ? scales.length / 3 : 0);
if (instanceCount) {
const matrices = new Float32Array(instanceCount * 16);
const pos = new Vec3();
const rot = new Quat();
const scl = new Vec3(1, 1, 1);
const matrix = new Mat4();
let matrixIndex = 0;
for (let i = 0; i < instanceCount; i++) {
const i3 = i * 3;
if (translations) {
pos.set(translations[i3], translations[i3 + 1], translations[i3 + 2]);
}
if (rotations) {
const i4 = i * 4;
rot.set(rotations[i4], rotations[i4 + 1], rotations[i4 + 2], rotations[i4 + 3]);
}
if (scales) {
scl.set(scales[i3], scales[i3 + 1], scales[i3 + 2]);
}
matrix.setTRS(pos, rot, scl);
for (let m = 0; m < 16; m++) {
matrices[matrixIndex++] = matrix.data[m];
}
}
data.matrices = matrices;
}
});
};
export {
createInstancing
};