UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

100 lines (99 loc) 3.59 kB
"use strict"; 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); } }