UNPKG

@polygonjs/polygonjs

Version:

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

73 lines (72 loc) 2.83 kB
"use strict"; 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];