polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
237 lines (236 loc) • 8.72 kB
JavaScript
import {TypedSopNode} from "./_Base";
import {
AttribClass,
AttribClassMenuEntries,
ObjectType,
ObjectTypeMenuEntries,
ObjectTypes,
objectTypeFromConstructor,
AttribType,
AttribTypeMenuEntries,
ATTRIBUTE_TYPES,
AttribSize,
ATTRIBUTE_CLASSES,
ATTRIBUTE_SIZE_RANGE
} from "../../../core/geometry/Constant";
import {CoreGeometry} from "../../../core/geometry/Geometry";
import {InputCloneMode as InputCloneMode2} from "../../poly/InputCloneMode";
import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig";
import {EntitySelectionHelper as EntitySelectionHelper2} from "./utils/delete/EntitySelectionHelper";
import {
ByAttributeHelper as ByAttributeHelper2,
ComparisonOperatorMenuEntries,
ComparisonOperator,
COMPARISON_OPERATORS
} from "./utils/delete/ByAttributeHelper";
import {ByExpressionHelper as ByExpressionHelper2} from "./utils/delete/ByExpressionHelper";
import {ByBboxHelper as ByBboxHelper2} from "./utils/delete/ByBboxHelper";
import {ByObjectTypeHelper as ByObjectTypeHelper2} from "./utils/delete/ByObjectTypeHelper";
class DeleteSopParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
this.class = ParamConfig.INTEGER(ATTRIBUTE_CLASSES.indexOf(AttribClass.VERTEX), {
menu: {
entries: AttribClassMenuEntries
}
});
this.invert = ParamConfig.BOOLEAN(0);
this.byObjectType = ParamConfig.BOOLEAN(0, {
visibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)}
});
this.objectType = ParamConfig.INTEGER(ObjectTypes.indexOf(ObjectType.MESH), {
menu: {
entries: ObjectTypeMenuEntries
},
visibleIf: {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT),
byObjectType: true
}
});
this.separatorObjectType = ParamConfig.SEPARATOR(null, {
visibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)}
});
this.byExpression = ParamConfig.BOOLEAN(0);
this.expression = ParamConfig.BOOLEAN("@ptnum==0", {
visibleIf: {byExpression: true},
expression: {forEntities: true}
});
this.separatorExpression = ParamConfig.SEPARATOR();
this.byAttrib = ParamConfig.BOOLEAN(0);
this.attribType = ParamConfig.INTEGER(ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), {
menu: {
entries: AttribTypeMenuEntries
},
visibleIf: {byAttrib: 1}
});
this.attribName = ParamConfig.STRING("", {
visibleIf: {byAttrib: 1}
});
this.attribSize = ParamConfig.INTEGER(1, {
range: ATTRIBUTE_SIZE_RANGE,
rangeLocked: [true, true],
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC)}
});
this.attribComparisonOperator = ParamConfig.INTEGER(COMPARISON_OPERATORS.indexOf(ComparisonOperator.EQUAL), {
menu: {
entries: ComparisonOperatorMenuEntries
},
visibleIf: {
byAttrib: true,
attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC),
attribSize: AttribSize.FLOAT
}
});
this.attribValue1 = ParamConfig.FLOAT(0, {
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 1}
});
this.attribValue2 = ParamConfig.VECTOR2([0, 0], {
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 2}
});
this.attribValue3 = ParamConfig.VECTOR3([0, 0, 0], {
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 3}
});
this.attribValue4 = ParamConfig.VECTOR4([0, 0, 0, 0], {
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.NUMERIC), attribSize: 4}
});
this.attribString = ParamConfig.STRING("", {
visibleIf: {byAttrib: 1, attribType: ATTRIBUTE_TYPES.indexOf(AttribType.STRING)}
});
this.separatorAttrib = ParamConfig.SEPARATOR();
this.byBbox = ParamConfig.BOOLEAN(0, {
visibleIf: {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.VERTEX)
}
});
this.bboxSize = ParamConfig.VECTOR3([1, 1, 1], {
visibleIf: {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.VERTEX),
byBbox: true
}
});
this.bboxCenter = ParamConfig.VECTOR3([0, 0, 0], {
visibleIf: {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.VERTEX),
byBbox: true
}
});
this.separatorBbox = ParamConfig.SEPARATOR(null, {
visibleIf: {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.VERTEX)
}
});
this.keepPoints = ParamConfig.BOOLEAN(0, {
visibleIf: {class: ATTRIBUTE_CLASSES.indexOf(AttribClass.OBJECT)}
});
}
}
const ParamsConfig2 = new DeleteSopParamsConfig();
export class DeleteSopNode extends TypedSopNode {
constructor() {
super(...arguments);
this.params_config = ParamsConfig2;
this._marked_for_deletion_per_object_index = new Map();
this.entity_selection_helper = new EntitySelectionHelper2(this);
this.byBbox_helper = new ByBboxHelper2(this);
this.byExpression_helper = new ByExpressionHelper2(this);
this.byAttribute_helper = new ByAttributeHelper2(this);
this.byObjectType_helper = new ByObjectTypeHelper2(this);
}
static type() {
return "delete";
}
static displayedInputNames() {
return ["geometry to delete from"];
}
initializeNode() {
this.io.inputs.setCount(1);
this.io.inputs.initInputsClonedState(InputCloneMode2.FROM_NODE);
}
async cook(input_contents) {
const core_group = input_contents[0];
switch (this.pv.class) {
case AttribClass.VERTEX:
await this._eval_for_points(core_group);
break;
case AttribClass.OBJECT:
await this._eval_for_objects(core_group);
break;
}
}
set_class(attrib_class) {
this.p.class.set(attrib_class);
}
async _eval_for_objects(core_group) {
const core_objects = core_group.coreObjects();
this.entity_selection_helper.init(core_objects);
this._marked_for_deletion_per_object_index = new Map();
for (let core_object of core_objects) {
this._marked_for_deletion_per_object_index.set(core_object.index(), false);
}
if (this.pv.byExpression) {
await this.byExpression_helper.eval_for_entities(core_objects);
}
if (this.pv.byObjectType) {
this.byObjectType_helper.eval_for_objects(core_objects);
}
if (this.pv.byAttrib && this.pv.attribName != "") {
this.byAttribute_helper.eval_for_entities(core_objects);
}
const core_objects_to_keep = this.entity_selection_helper.entities_to_keep();
const objects_to_keep = core_objects_to_keep.map((co) => co.object());
if (this.pv.keepPoints) {
const core_objects_to_delete = this.entity_selection_helper.entities_to_delete();
for (let core_object_to_delete of core_objects_to_delete) {
const point_object = this._point_object(core_object_to_delete);
if (point_object) {
objects_to_keep.push(point_object);
}
}
}
this.setObjects(objects_to_keep);
}
async _eval_for_points(core_group) {
const core_objects = core_group.coreObjects();
let core_object;
let objects = [];
for (let i = 0; i < core_objects.length; i++) {
core_object = core_objects[i];
let core_geometry = core_object.coreGeometry();
if (core_geometry) {
const object = core_object.object();
const points = core_geometry.pointsFromGeometry();
this.entity_selection_helper.init(points);
const init_points_count = points.length;
if (this.pv.byExpression) {
await this.byExpression_helper.eval_for_entities(points);
}
if (this.pv.byAttrib && this.pv.attribName != "") {
this.byAttribute_helper.eval_for_entities(points);
}
if (this.pv.byBbox) {
this.byBbox_helper.eval_for_points(points);
}
const kept_points = this.entity_selection_helper.entities_to_keep();
if (kept_points.length == init_points_count) {
objects.push(object);
} else {
core_geometry.geometry().dispose();
if (kept_points.length > 0) {
const new_geo = CoreGeometry.geometryFromPoints(kept_points, objectTypeFromConstructor(object.constructor));
if (new_geo) {
object.geometry = new_geo;
objects.push(object);
}
}
}
}
}
this.setObjects(objects);
}
_point_object(core_object) {
const core_points = core_object.points();
const geometry = CoreGeometry.geometryFromPoints(core_points, ObjectType.POINTS);
if (geometry)
return this.create_object(geometry, ObjectType.POINTS);
}
}