From 9336bbfa18273eff201536fecc5d102d54ec8bd0 Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Mon, 23 Oct 2023 21:28:47 +0200 Subject: [PATCH] [orx-shapes] Add support for multiple selections --- .../kotlin/adjust/ContourAdjuster.kt | 74 +++++++++++++------ .../src/jvmDemo/kotlin/DemoAdjustContour05.kt | 15 ++-- 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/orx-shapes/src/commonMain/kotlin/adjust/ContourAdjuster.kt b/orx-shapes/src/commonMain/kotlin/adjust/ContourAdjuster.kt index 1aba4755..65ec6d94 100644 --- a/orx-shapes/src/commonMain/kotlin/adjust/ContourAdjuster.kt +++ b/orx-shapes/src/commonMain/kotlin/adjust/ContourAdjuster.kt @@ -19,6 +19,10 @@ class ContourAdjuster(var contour: ShapeContour) { */ var edgeIndices = listOf(0) + private var vertexWorkingSet = emptyList() + private var edgeWorkingSet = emptyList() + + /** * the selected vertex */ @@ -27,6 +31,19 @@ class ContourAdjuster(var contour: ShapeContour) { return ContourAdjusterVertex(this, vertexIndices.first()) } + val vertices: Sequence + get() { + vertexWorkingSet = vertexIndices + return sequence { + while (vertexWorkingSet.isNotEmpty()) { + val head = vertexWorkingSet.first() + vertexWorkingSet = vertexWorkingSet.drop(1) + yield(ContourAdjusterVertex(this@ContourAdjuster, head)) + } + } + } + + /** * the selected edge */ @@ -35,6 +52,18 @@ class ContourAdjuster(var contour: ShapeContour) { return ContourAdjusterEdge(this, edgeIndices.first()) } + val edges: Sequence + get() { + edgeWorkingSet = edgeIndices + return sequence { + while (edgeWorkingSet.isNotEmpty()) { + val head = edgeWorkingSet.first() + edgeWorkingSet = edgeWorkingSet.drop(1) + yield(ContourAdjusterEdge(this@ContourAdjuster, head)) + } + } + } + /** * select a vertex by index */ @@ -70,7 +99,7 @@ class ContourAdjuster(var contour: ShapeContour) { fun selectVertices(predicate: (Int, ContourVertex) -> Boolean) { vertexIndices = (0 until if (contour.closed) contour.segments.size else contour.segments.size + 1).filter { index -> - predicate(index, ContourVertex(contour, index) ) + predicate(index, ContourVertex(contour, index)) } } @@ -102,13 +131,11 @@ class ContourAdjuster(var contour: ShapeContour) { fun selectEdges(predicate: (Int, ContourEdge) -> Boolean) { vertexIndices = (0 until if (contour.closed) contour.segments.size else contour.segments.size + 1).filter { index -> - predicate(index, ContourEdge(contour, index) ) + predicate(index, ContourEdge(contour, index)) } } fun updateSelection(adjustments: List) { - var newVertexIndices = vertexIndices - var newEdgeIndices = edgeIndices for (adjustment in adjustments) { when (adjustment) { @@ -120,29 +147,28 @@ class ContourAdjuster(var contour: ShapeContour) { it } } - newVertexIndices = insert(newVertexIndices) - newEdgeIndices = insert(newEdgeIndices) + vertexIndices = insert(vertexIndices) + edgeIndices = insert(edgeIndices) + vertexWorkingSet = insert(vertexWorkingSet) + edgeWorkingSet = insert(edgeWorkingSet) } + is SegmentOperation.Remove -> { + + fun remove(list: List) = list.mapNotNull { + if (it in adjustment.index.. adjustment.index) { + it - adjustment.amount + } else { + it + } + } // TODO: handling of vertices in open contours is wrong here - newVertexIndices = newVertexIndices.mapNotNull { - if (it in adjustment.index ..< adjustment.index+adjustment.amount) { - null - } else if (it > adjustment.index) { - it - adjustment.amount - } else { - it - } - } - newEdgeIndices = newEdgeIndices.mapNotNull { - if (it in adjustment.index ..< adjustment.index+adjustment.amount) { - null - } else if (it > adjustment.index) { - it - adjustment.amount - } else { - it - } - } + vertexIndices = remove(vertexIndices) + edgeIndices = remove(edgeIndices) + vertexWorkingSet = remove(vertexWorkingSet) + edgeWorkingSet = remove(edgeWorkingSet) } } } diff --git a/orx-shapes/src/jvmDemo/kotlin/DemoAdjustContour05.kt b/orx-shapes/src/jvmDemo/kotlin/DemoAdjustContour05.kt index 2b0135fa..95b4717a 100644 --- a/orx-shapes/src/jvmDemo/kotlin/DemoAdjustContour05.kt +++ b/orx-shapes/src/jvmDemo/kotlin/DemoAdjustContour05.kt @@ -1,10 +1,7 @@ import org.openrndr.application import org.openrndr.color.ColorRGBa import org.openrndr.extra.shapes.adjust.adjustContour -import org.openrndr.math.Vector2 import org.openrndr.shape.Circle -import kotlin.math.cos -import kotlin.math.sin fun main() { application { @@ -18,9 +15,15 @@ fun main() { Circle(drawer.bounds.center, 300.0).contour contour = adjustContour(contour) { - for (i in 0 until 4) { - selectEdge(i) - edge.sub(0.2, 0.8) + selectEdges(0, 1, 2, 3) + edges.forEachIndexed { index, it -> + it.replaceWith(0.5) +// if (index == seconds.mod(4.0).toInt()) { +// it.replaceWith(0.5) +// } else { +// val v = cos(seconds) * 0.15 + 0.25 +// it.sub(0.5 - v, 0.5 + v) +// } } } drawer.stroke = ColorRGBa.RED