@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
99 lines (98 loc) • 4.32 kB
JavaScript
"use strict";
import { Vector3, Quaternion } from "three";
import { SopType } from "../../poly/registers/nodes/types/Sop";
import { InstanceBuilderPersistedConfig } from "../js/code/assemblers/instanceBuilder/InstanceBuilderPersistedConfig";
import { AssemblerName } from "../../poly/registers/assemblers/_BaseRegister";
import { BasePointBuilderSopNode, BasePointBuilderSopParamsConfig } from "./_BasePointBuilder";
import { InstanceAttrib } from "../../../core/geometry/Instancer";
import { pointsCountFromObject } from "../../../core/geometry/entities/point/CorePointUtils";
import { corePointClassFactory } from "../../../core/geometry/CoreObjectFactory";
const ParamsConfig = new BasePointBuilderSopParamsConfig();
export class InstanceBuilderSopNode extends BasePointBuilderSopNode {
constructor() {
super(...arguments);
this.paramsConfig = ParamsConfig;
this.persisted_config = new InstanceBuilderPersistedConfig(this);
this._pointContainer = {
instancePosition: new Vector3(),
instanceQuaternion: new Quaternion(),
instanceScale: new Vector3(),
ptnum: -1,
objnum: -1
};
}
static type() {
return SopType.INSTANCE_BUILDER;
}
usedAssembler() {
return AssemblerName.JS_INSTANCE_BUILDER;
}
_processObject(object, objnum, evaluator) {
this._pointContainer.objnum = objnum;
const readAttributeOptions = this._checkRequiredReadAttributes(object);
const writeAttributeOptions = this._checkRequiredWriteAttributes(object);
const readAttribNames = readAttributeOptions ? readAttributeOptions.attribNames : [];
const readAttributeByName = readAttributeOptions ? readAttributeOptions.attributeByName : /* @__PURE__ */ new Map();
const attribTypeByName = readAttributeOptions ? readAttributeOptions.attribTypeByName : /* @__PURE__ */ new Map();
const writeAttribNames = writeAttributeOptions ? writeAttributeOptions.attribNames : [];
const writeAttributeByName = writeAttributeOptions ? writeAttributeOptions.attributeByName : /* @__PURE__ */ new Map();
this._resetRequiredAttributes();
const pointsCount = pointsCountFromObject(object);
const corePointClass = corePointClassFactory(object);
const positionAttrib = corePointClass.attribute(object, InstanceAttrib.POSITION);
const quaternionAttrib = corePointClass.attribute(object, InstanceAttrib.QUATERNION);
const scaleAttrib = corePointClass.attribute(object, InstanceAttrib.SCALE);
const hasPosition = positionAttrib != null;
const hasQuaternion = quaternionAttrib != null;
const hasScale = scaleAttrib != null;
if (!hasPosition) {
this._pointContainer.instancePosition.set(0, 0, 0);
}
if (!hasQuaternion) {
this._pointContainer.instanceQuaternion.identity();
}
if (!hasScale) {
this._pointContainer.instanceScale.set(1, 1, 1);
}
for (let ptnum = 0; ptnum < pointsCount; ptnum++) {
this._pointContainer.ptnum = ptnum;
if (hasPosition) {
this._pointContainer.instancePosition.fromBufferAttribute(positionAttrib, ptnum);
}
if (hasQuaternion) {
this._pointContainer.instanceQuaternion.fromBufferAttribute(quaternionAttrib, ptnum);
}
if (hasScale) {
this._pointContainer.instanceScale.fromBufferAttribute(scaleAttrib, ptnum);
}
this._readRequiredAttributes(ptnum, readAttribNames, readAttributeByName, attribTypeByName);
evaluator();
if (hasPosition) {
positionAttrib.setXYZ(
ptnum,
this._pointContainer.instancePosition.x,
this._pointContainer.instancePosition.y,
this._pointContainer.instancePosition.z
);
}
if (hasQuaternion) {
quaternionAttrib.setXYZW(
ptnum,
this._pointContainer.instanceQuaternion.x,
this._pointContainer.instanceQuaternion.y,
this._pointContainer.instanceQuaternion.z,
this._pointContainer.instanceQuaternion.w
);
}
if (hasScale) {
scaleAttrib.setXYZ(
ptnum,
this._pointContainer.instanceScale.x,
this._pointContainer.instanceScale.y,
this._pointContainer.instanceScale.z
);
}
this._writeRequiredAttributes(ptnum, writeAttribNames, writeAttributeByName);
}
}
}