UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

99 lines (98 loc) 4.32 kB
"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); } } }