@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
73 lines (72 loc) • 2.83 kB
JavaScript
;
import { TypeAssert } from "./../../poly/Assert";
import { BaseSopOperation } from "./_Base";
import { BufferGeometry } from "three";
import { InputCloneMode } from "../../../engine/poly/InputCloneMode";
export var SetGeometryMode = /* @__PURE__ */ ((SetGeometryMode2) => {
SetGeometryMode2["ONE_GEO_PER_OBJECT"] = "One Geometry Per Object";
SetGeometryMode2["FIRST_GEO_TO_EACH_OBJECT"] = "First Geometry To Each Object";
return SetGeometryMode2;
})(SetGeometryMode || {});
export const SET_GEOMETRY_MODES = [
"One Geometry Per Object" /* ONE_GEO_PER_OBJECT */,
"First Geometry To Each Object" /* FIRST_GEO_TO_EACH_OBJECT */
];
const _SetGeometrySopOperation = class extends BaseSopOperation {
static type() {
return "setGeometry";
}
cook(inputCoreGroups, params) {
const coreGroupDest = inputCoreGroups[0];
const coreGroupSrc = inputCoreGroups[1];
this._applyMode(coreGroupDest, coreGroupSrc, params);
return coreGroupDest;
}
_applyMode(coreGroupDest, coreGroupSrc, params) {
const mode = SET_GEOMETRY_MODES[params.mode];
switch (mode) {
case "One Geometry Per Object" /* ONE_GEO_PER_OBJECT */: {
return this._oneGeoPerObject(coreGroupDest, coreGroupSrc);
}
case "First Geometry To Each Object" /* FIRST_GEO_TO_EACH_OBJECT */: {
return this._firstGeoToEachObject(coreGroupDest, coreGroupSrc);
}
}
TypeAssert.unreachable(mode);
}
_oneGeoPerObject(coreGroupDest, coreGroupSrc) {
const destObjects = coreGroupDest.threejsObjects();
const srcObjects = coreGroupSrc.threejsObjects();
for (let i = 0; i < destObjects.length; i++) {
const destObject = destObjects[i];
const srcObject = srcObjects[i];
if (destObject) {
destObject.geometry = srcObject ? srcObject.geometry : _SetGeometrySopOperation._emptyGeometry();
}
}
}
_firstGeoToEachObject(coreGroupDest, coreGroupSrc) {
const destObjects = coreGroupDest.threejsObjects();
const srcObjects = coreGroupSrc.threejsObjects();
let firstGeometry;
for (let srcObject of srcObjects) {
if (srcObject.geometry) {
firstGeometry = srcObject.geometry;
}
}
for (let i = 0; i < destObjects.length; i++) {
const destObject = destObjects[i];
if (destObject) {
destObject.geometry = firstGeometry || _SetGeometrySopOperation._emptyGeometry();
}
}
}
static _emptyGeometry() {
return this.__emptyGeometry = this.__emptyGeometry || new BufferGeometry();
}
};
export let SetGeometrySopOperation = _SetGeometrySopOperation;
SetGeometrySopOperation.DEFAULT_PARAMS = {
mode: SET_GEOMETRY_MODES.indexOf("One Geometry Per Object" /* ONE_GEO_PER_OBJECT */)
};
SetGeometrySopOperation.INPUT_CLONED_STATE = [InputCloneMode.FROM_NODE, InputCloneMode.NEVER];