[orx-shapes] Add support for multiple selections
This commit is contained in:
@@ -19,6 +19,10 @@ class ContourAdjuster(var contour: ShapeContour) {
|
||||
*/
|
||||
var edgeIndices = listOf(0)
|
||||
|
||||
private var vertexWorkingSet = emptyList<Int>()
|
||||
private var edgeWorkingSet = emptyList<Int>()
|
||||
|
||||
|
||||
/**
|
||||
* the selected vertex
|
||||
*/
|
||||
@@ -27,6 +31,19 @@ class ContourAdjuster(var contour: ShapeContour) {
|
||||
return ContourAdjusterVertex(this, vertexIndices.first())
|
||||
}
|
||||
|
||||
val vertices: Sequence<ContourAdjusterVertex>
|
||||
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<ContourAdjusterEdge>
|
||||
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<SegmentOperation>) {
|
||||
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<Int>) = list.mapNotNull {
|
||||
if (it in adjustment.index..<adjustment.index + adjustment.amount) {
|
||||
null
|
||||
} else if (it > 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user