@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
46 lines (44 loc) • 1.74 kB
text/typescript
import {BaseSopOperation} from './_Base';
import {CoreGroup} from '../../../core/geometry/Group';
import {InputCloneMode} from '../../../engine/poly/InputCloneMode';
import {DefaultOperationParams} from '../../../core/operations/_Base';
import {AttribClass, ATTRIBUTE_CLASSES} from '../../../core/geometry/Constant';
import {ENTITY_CLASS_FACTORY} from '../../../core/geometry/CoreObjectFactory';
import {filterObjectsFromCoreGroup} from '../../../core/geometry/Mask';
interface AttribDeleteSopParams extends DefaultOperationParams {
group: string;
class: number;
name: string;
}
export class AttribDeleteSopOperation extends BaseSopOperation {
static override readonly DEFAULT_PARAMS: AttribDeleteSopParams = {
group: '',
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),
name: '',
};
static override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;
static override type(): Readonly<'attribDelete'> {
return 'attribDelete';
}
override cook(inputCoreGroups: CoreGroup[], params: AttribDeleteSopParams) {
const coreGroup = inputCoreGroups[0];
const objects = filterObjectsFromCoreGroup(coreGroup, params);
const attribClass = ATTRIBUTE_CLASSES[params.class];
const factory = ENTITY_CLASS_FACTORY[attribClass];
if (factory) {
for (const object of objects) {
const entityClass = factory(object);
const attribNames = entityClass.attributeNamesMatchingMask(object, params.name);
for (const attribName of attribNames) {
entityClass.deleteAttribute(object, attribName);
}
}
} else {
const attribNames = coreGroup.attributeNamesMatchingMask(params.name);
for (const attribName of attribNames) {
coreGroup.deleteAttribute(attribName);
}
}
return coreGroup;
}
}