@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
100 lines (99 loc) • 3.59 kB
JavaScript
;
import { VAR_OBJECT, VAR_ENTITIES, CLASS_CORE_POINT, CLASS_THREEJS_POINT, FUNC_GET_ENTITIES_ATTRIBUTE } from "./Common";
export class AttributeRequirementsController {
constructor() {
}
reset() {
if (this._attributeNames) {
this._attributeNames.clear();
}
}
assignAttributesLines() {
if (this._attributeNames) {
const lines = [];
for (const attribName of this._attributeNames) {
lines.push(AttributeRequirementsController.assignAttributeLine(attribName));
}
return lines.join(";\n");
} else {
return "";
}
}
assignArraysLines() {
if (this._attributeNames) {
const lines = [];
if (this._attributeNames.size > 0) {
const objectLine = `const ${VAR_OBJECT} = entities[0].object()`;
lines.push(objectLine);
}
for (const attribName of this._attributeNames) {
lines.push(AttributeRequirementsController.assignItemSizeLine(attribName));
lines.push(AttributeRequirementsController.assignArrayLine(attribName));
}
return lines.join(";\n");
} else {
return "";
}
}
attributePresenceCheckLine() {
if (this._attributeNames) {
const varNames = [];
for (const attribName of this._attributeNames) {
const varName = AttributeRequirementsController._varAttribute(attribName);
varNames.push(varName);
}
if (varNames.length > 0) {
return varNames.join(" && ");
}
}
return "true";
}
missingAttributesLine() {
if (this._attributeNames) {
let lineElements = ["(()=>{", "const missingAttributes = [];"];
for (const attribName of this._attributeNames) {
const varName = AttributeRequirementsController._varAttribute(attribName);
lineElements.push(`if( !${varName} ) { missingAttributes.push('${attribName}'); }`);
}
lineElements.push("return missingAttributes;", "})");
return lineElements.join("");
}
return "[]";
}
add(attribName) {
this._attributeNames = this._attributeNames || /* @__PURE__ */ new Set();
this._attributeNames.add(attribName);
}
static assignAttributeLine(attribName) {
const varAttribute = this._varAttribute(attribName);
return `const ${varAttribute} = ${FUNC_GET_ENTITIES_ATTRIBUTE}(${VAR_ENTITIES},'${attribName}')`;
}
static assignItemSizeLine(attribName) {
const varAttribute = this._varAttribute(attribName);
const varAttributeSize = this._varAttribSize(attribName);
return `const ${varAttributeSize} = ${varAttribute}.itemSize`;
}
static assignArrayLine(attribName) {
const varAttribute = this._varAttribute(attribName);
const varArray = this._varArray(attribName);
const isIndexedCondition = `(${VAR_ENTITIES}[0] && ${VAR_ENTITIES}[0] instanceof ${CLASS_THREEJS_POINT} && ${CLASS_CORE_POINT}.isAttribIndexed(${VAR_OBJECT}, '${attribName}'))`;
const indexedArray = `${VAR_ENTITIES}.map(e=>e.indexedAttribValue('${attribName}'))`;
const nonIndexedArray = `${varAttribute}.array`;
return `const ${varArray} = ${isIndexedCondition} ? ${indexedArray} : ${nonIndexedArray};`;
}
static _varAttribute(attribName) {
return `attrib_${attribName}`;
}
static _varAttribSize(attribName) {
return `attribSize_${attribName}`;
}
static _varArray(attribName) {
return `array_${attribName}`;
}
varAttributeSize(attribName) {
return AttributeRequirementsController._varAttribSize(attribName);
}
varArray(attribName) {
return AttributeRequirementsController._varArray(attribName);
}
}