polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
84 lines (79 loc) • 2.75 kB
text/typescript
export class AttributeRequirementsController {
private _attribute_names: Set<string> | undefined;
constructor() {}
reset() {
if (this._attribute_names) {
this._attribute_names.clear();
}
}
assign_attributes_lines(): string {
if (this._attribute_names) {
const lines: string[] = [];
this._attribute_names?.forEach((attribute_name: string) => {
lines.push(AttributeRequirementsController.assign_attribute_line(attribute_name));
});
return lines.join(';\n');
} else {
return '';
}
}
assign_arrays_lines(): string {
if (this._attribute_names) {
const lines: string[] = [];
this._attribute_names?.forEach((attribute_name: string) => {
lines.push(AttributeRequirementsController.assign_item_size_line(attribute_name));
lines.push(AttributeRequirementsController.assign_array_line(attribute_name));
});
return lines.join(';\n');
} else {
return '';
}
}
attribute_presence_check_line(): string {
if (this._attribute_names) {
const var_names: string[] = [];
this._attribute_names?.forEach((attribute_name: string) => {
const var_name = AttributeRequirementsController.var_attribute(attribute_name);
var_names.push(var_name);
});
if (var_names.length > 0) {
return var_names.join(' && ');
}
}
// TODO: add test that a Point Sop can take an expression that does not require attributes
return 'true';
}
add(attribute_name: string) {
this._attribute_names = this._attribute_names || new Set<string>();
this._attribute_names.add(attribute_name);
}
static assign_attribute_line(attribute_name: string) {
const var_attribute = this.var_attribute(attribute_name);
return `const ${var_attribute} = entities[0].geometry().attributes['${attribute_name}']`;
}
static assign_item_size_line(attribute_name: string) {
const var_attribute = this.var_attribute(attribute_name);
const var_attribute_size = this.var_attribute_size(attribute_name);
return `const ${var_attribute_size} = ${var_attribute}.itemSize`;
}
static assign_array_line(attribute_name: string) {
const var_attribute = this.var_attribute(attribute_name);
const var_array = this.var_array(attribute_name);
return `const ${var_array} = ${var_attribute}.array`;
}
static var_attribute(attribute_name: string) {
return `attrib_${attribute_name}`;
}
static var_attribute_size(attribute_name: string) {
return `attrib_size_${attribute_name}`;
}
static var_array(attribute_name: string) {
return `array_${attribute_name}`;
}
var_attribute_size(attribute_name: string) {
return AttributeRequirementsController.var_attribute_size(attribute_name);
}
var_array(attribute_name: string) {
return AttributeRequirementsController.var_array(attribute_name);
}
}