MCPcopy Index your code
hub / github.com/processing/p5.js / generateExpression

Function generateExpression

src/webgl/strands_glslBackend.js:266–404  ·  view source on GitHub ↗
(generationContext, dag, nodeID)

Source from the content-addressed store, hash-verified

264 generationContext.write(`return ${this.generateExpression(generationContext, dag, rootNodeID)};`);
265 },
266 generateExpression(generationContext, dag, nodeID) {
267 const node = getNodeDataFromID(dag, nodeID);
268 if (generationContext.tempNames?.[nodeID]) {
269 return generationContext.tempNames[nodeID];
270 }
271 switch (node.nodeType) {
272 case NodeType.LITERAL:
273 if (node.baseType === BaseType.FLOAT) {
274 return node.value.toFixed(4);
275 }
276 else {
277 return node.value;
278 }
279 case NodeType.VARIABLE:
280 // Track shared variable usage context
281 if (generationContext.shaderContext && generationContext.strandsContext?.sharedVariables?.has(node.identifier)) {
282 const sharedVar = generationContext.strandsContext.sharedVariables.get(node.identifier);
283 if (generationContext.shaderContext === 'vertex') {
284 sharedVar.usedInVertex = true;
285 } else if (generationContext.shaderContext === 'fragment') {
286 sharedVar.usedInFragment = true;
287 }
288 }
289
290 // Detect instanceID usage in fragment context and rewrite to varying name
291 if (node.identifier === this.instanceIdReference() && generationContext.shaderContext === 'fragment') {
292 generationContext.strandsContext._instanceIDUsedInFragment = true;
293 return INSTANCE_ID_VARYING_NAME;
294 }
295
296 return node.identifier;
297 case NodeType.OPERATION:
298 const useParantheses = node.usedBy.length > 0;
299 if (node.opCode === OpCode.Nary.CONSTRUCTOR) {
300 // TODO: differentiate casts and constructors for more efficient codegen.
301 // if (node.dependsOn.length === 1 && node.dimension === 1) {
302 // return this.generateExpression(generationContext, dag, node.dependsOn[0]);
303 // }
304 if (node.baseType === BaseType.SAMPLER2D) {
305 return this.generateExpression(generationContext, dag, node.dependsOn[0]);
306 }
307 const T = this.getTypeName(node.baseType, node.dimension);
308 const deps = node.dependsOn.map((dep) => this.generateExpression(generationContext, dag, dep));
309 return `${T}(${deps.join(', ')})`;
310 }
311 if (node.opCode === OpCode.Nary.FUNCTION_CALL) {
312 const functionArgs = node.dependsOn.map(arg =>this.generateExpression(generationContext, dag, arg));
313 return `${node.identifier}(${functionArgs.join(', ')})`;
314 }
315 if (node.opCode === OpCode.Nary.TERNARY) {
316 const [condID, trueID, falseID] = node.dependsOn;
317 const cond = this.generateExpression(generationContext, dag, condID);
318 const trueExpr = this.generateExpression(generationContext, dag, trueID);
319 const falseExpr = this.generateExpression(generationContext, dag, falseID);
320 return `(${cond} ? ${trueExpr} : ${falseExpr})`;
321 }
322 if (node.opCode === OpCode.Binary.MEMBER_ACCESS) {
323 const [lID, rID] = node.dependsOn;

Callers

nothing calls this directly

Calls 3

getNodeDataFromIDFunction · 0.90
getMethod · 0.45
filterMethod · 0.45

Tested by

no test coverage detected