[orx-composition] Fix issue in parallel execution (#360)

Adding items to a mutableList from inside a pForEach leads to unpredictable results. Use pmap instead.
This commit is contained in:
Abe Pazos
2025-06-23 07:48:48 +02:00
committed by GitHub
parent e402656155
commit e8f50b3dd1

View File

@@ -1,7 +1,7 @@
package org.openrndr.extra.composition package org.openrndr.extra.composition
import org.openrndr.collections.pflatMap import org.openrndr.collections.pflatMap
import org.openrndr.collections.pforEach import org.openrndr.collections.pmap
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorBuffer import org.openrndr.draw.ColorBuffer
import org.openrndr.draw.LineCap import org.openrndr.draw.LineCap
@@ -427,8 +427,7 @@ class CompositionDrawer(documentBounds: CompositionDimensions = defaultCompositi
} }
else -> { else -> {
val shapeNodes = (if (!clipMode.grouped) composition.findShapes() else cursor.findShapes()) val shapeNodes = (if (!clipMode.grouped) composition.findShapes() else cursor.findShapes())
val toRemove = mutableListOf<CompositionNode>() val toRemove = shapeNodes.pmap { shapeNode ->
shapeNodes.pforEach { shapeNode ->
val inverse = shapeNode.effectiveTransform.inversed val inverse = shapeNode.effectiveTransform.inversed
val transformedShape = postShape.transform(inverse * model) val transformedShape = postShape.transform(inverse * model)
val operated = val operated =
@@ -438,16 +437,15 @@ class CompositionDrawer(documentBounds: CompositionDimensions = defaultCompositi
ClipOp.DIFFERENCE -> difference(shapeNode.shape, transformedShape) ClipOp.DIFFERENCE -> difference(shapeNode.shape, transformedShape)
else -> error("unsupported base op ${clipMode.op}") else -> error("unsupported base op ${clipMode.op}")
} }
if (!operated.empty) { return@pmap if (!operated.empty) {
shapeNode.shape = operated shapeNode.shape = operated
null
} else { } else {
//synchronized(toRemove) { shapeNode
toRemove.add(shapeNode)
//}
} }
} }
for (node in toRemove) { for (node in toRemove) {
node.remove() node?.remove()
} }
null null
} }