UNPKG

@polygonjs/polygonjs

Version:

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

84 lines (83 loc) 2.75 kB
"use strict"; import { TypedSopNode } from "./_Base"; import { NodeParamsConfig, ParamConfig } from "../utils/params/ParamsConfig"; import { SopType } from "../../poly/registers/nodes/types/Sop"; import { InputCloneMode } from "../../poly/InputCloneMode"; import { WFCSolver } from "../../../core/wfc/WFCSolver"; import { filterTileObjects, filterRuleObjects } from "../../../core/wfc/WFCUtils"; import { registerWFCSolver } from "../../../core/wfc/WFCRegister"; class WFCSolverSopParamsConfig extends NodeParamsConfig { constructor() { super(...arguments); /** @param iterations */ this.stepsCount = ParamConfig.INTEGER(-1, { range: [-1, 1e3], rangeLocked: [true, false] }); /** @param max resolved quads */ this.maxCount = ParamConfig.INTEGER(-1, { range: [-1, 1e3], rangeLocked: [true, false], separatorAfter: true }); /** @param quadSeed */ this.quadSeed = ParamConfig.INTEGER(0, { range: [-100, 100], rangeLocked: [false, false] }); /** @param configSeed */ this.configSeed = ParamConfig.INTEGER(0, { range: [-100, 100], rangeLocked: [false, false] }); } } const ParamsConfig = new WFCSolverSopParamsConfig(); export class WFCSolverSopNode extends TypedSopNode { constructor() { super(...arguments); this.paramsConfig = ParamsConfig; } static type() { return SopType.WFC_SOLVER; } initializeNode() { this.io.inputs.setCount(2); this.io.inputs.initInputsClonedState([InputCloneMode.FROM_NODE, InputCloneMode.NEVER]); } cook(inputCoreGroups) { const coreGroup0 = inputCoreGroups[0]; const coreGroup1 = inputCoreGroups[1]; const quadObjects = coreGroup0.quadObjects(); if (!quadObjects || quadObjects.length == 0) { this.states.error.set("no quad objects found"); return; } const tileAndRuleObjects = coreGroup1.threejsObjects(); const tileObjects = filterTileObjects(tileAndRuleObjects); const ruleObjects = filterRuleObjects(tileAndRuleObjects); if (tileObjects.length == 0) { this.states.error.set("no tile objects found"); return; } if (ruleObjects.length == 0) { this.states.error.set("no rule objects found"); return; } const { maxCount } = this.pv; for (const quadObject of quadObjects) { const solver = new WFCSolver({ tileAndRuleObjects, quadObject, maxResolvedQuadsCount: maxCount }); registerWFCSolver(solver, quadObject); solver.process(this.pv); } this.setObjects(quadObjects); } // public override updateObjectOnAdd(object: Object3D) { // console.log('updateObjectOnAdd', object); // console.log(getWFCsolver(object)); // } }