@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
94 lines (93 loc) • 3.22 kB
JavaScript
;
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 { CoreWFCTileAttribute } from "../../../core/wfc/WFCAttributes";
import { isBooleanTrue } from "../../../core/Type";
import { filterCoreObjectsFromCoreGroup } from "../../../core/geometry/Mask";
class WFCTilePropertiesSopParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
/** @param group to assign the material to */
this.group = ParamConfig.STRING("", {
objectMask: true
});
/** @param addId */
this.addId = ParamConfig.BOOLEAN(1);
/** @param addId */
this.id = ParamConfig.STRING("`$OS`-`@objnum`", {
visibleIf: { addId: 1 },
expression: { forEntities: true }
});
/** @param addName */
this.addName = ParamConfig.BOOLEAN(1, {
visibleIf: { addId: 1 }
});
/** @param allowedRotationY */
this.allowedRotationY = ParamConfig.BOOLEAN(1, {
expression: { forEntities: true }
});
}
}
const ParamsConfig = new WFCTilePropertiesSopParamsConfig();
export class WFCTilePropertiesSopNode extends TypedSopNode {
constructor() {
super(...arguments);
this.paramsConfig = ParamsConfig;
}
static type() {
return SopType.WFC_TILE_PROPERTIES;
}
initializeNode() {
this.io.inputs.setCount(1);
this.io.inputs.initInputsClonedState(InputCloneMode.FROM_NODE);
}
async cook(inputCoreGroups) {
const coreGroup = inputCoreGroups[0];
const coreObjects = filterCoreObjectsFromCoreGroup(coreGroup, this.pv);
const promises = [];
const { addName, addId } = this.pv;
if (isBooleanTrue(addId)) {
promises.push(
this._computeStringParam(this.p.id, coreObjects, (object, value) => {
if (addName) {
object.name = value;
}
CoreWFCTileAttribute.setTileId(object, value);
})
);
}
promises.push(
this._computeBooleanParam(
this.p.allowedRotationY,
coreObjects,
CoreWFCTileAttribute.setRotationYAllowed.bind(CoreWFCTileAttribute)
)
);
await Promise.all(promises);
this.setCoreGroup(coreGroup);
}
async _computeStringParam(param, coreObjects, applyMethod) {
if (param.expressionController && param.expressionController.entitiesDependent()) {
await param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value) => {
applyMethod(coreObject.object(), value);
});
} else {
for (const coreObject of coreObjects) {
applyMethod(coreObject.object(), param.value);
}
}
}
async _computeBooleanParam(param, coreObjects, applyMethod) {
if (param.expressionController && param.expressionController.entitiesDependent()) {
await param.expressionController.computeExpressionForObjects(coreObjects, (coreObject, value) => {
applyMethod(coreObject.object(), value);
});
} else {
for (const coreObject of coreObjects) {
applyMethod(coreObject.object(), param.value);
}
}
}
}