From e8f50b3dd153ed82de121e9017cf42f6ea95ac8e Mon Sep 17 00:00:00 2001 From: Abe Pazos Date: Mon, 23 Jun 2025 07:48:48 +0200 Subject: [PATCH] [orx-composition] Fix issue in parallel execution (#360) Adding items to a mutableList from inside a pForEach leads to unpredictable results. Use pmap instead. --- .../src/commonMain/kotlin/CompositionDrawer.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt b/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt index 1a7ae093..ad5bb186 100644 --- a/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt +++ b/orx-composition/src/commonMain/kotlin/CompositionDrawer.kt @@ -1,7 +1,7 @@ package org.openrndr.extra.composition import org.openrndr.collections.pflatMap -import org.openrndr.collections.pforEach +import org.openrndr.collections.pmap import org.openrndr.color.ColorRGBa import org.openrndr.draw.ColorBuffer import org.openrndr.draw.LineCap @@ -427,8 +427,7 @@ class CompositionDrawer(documentBounds: CompositionDimensions = defaultCompositi } else -> { val shapeNodes = (if (!clipMode.grouped) composition.findShapes() else cursor.findShapes()) - val toRemove = mutableListOf() - shapeNodes.pforEach { shapeNode -> + val toRemove = shapeNodes.pmap { shapeNode -> val inverse = shapeNode.effectiveTransform.inversed val transformedShape = postShape.transform(inverse * model) val operated = @@ -438,16 +437,15 @@ class CompositionDrawer(documentBounds: CompositionDimensions = defaultCompositi ClipOp.DIFFERENCE -> difference(shapeNode.shape, transformedShape) else -> error("unsupported base op ${clipMode.op}") } - if (!operated.empty) { + return@pmap if (!operated.empty) { shapeNode.shape = operated + null } else { - //synchronized(toRemove) { - toRemove.add(shapeNode) - //} + shapeNode } } for (node in toRemove) { - node.remove() + node?.remove() } null }