[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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user