94 lines
3.0 KiB
Kotlin
94 lines
3.0 KiB
Kotlin
package org.openrndr.extra.composition
|
|
|
|
import org.openrndr.draw.Drawer
|
|
import org.openrndr.shape.*
|
|
|
|
/**
|
|
* Draws a [Composition]
|
|
* @param composition The composition to draw
|
|
* @see contour
|
|
* @see contours
|
|
* @see shape
|
|
* @see shapes
|
|
*/
|
|
fun Drawer.composition(composition: Composition) {
|
|
pushModel()
|
|
pushStyle()
|
|
|
|
// viewBox transformation
|
|
model *= composition.calculateViewportTransform()
|
|
|
|
fun node(compositionNode: CompositionNode) {
|
|
pushModel()
|
|
pushStyle()
|
|
model *= compositionNode.style.transform.value
|
|
|
|
shadeStyle = (compositionNode.style.shadeStyle as Shade.Value).value
|
|
|
|
when (compositionNode) {
|
|
is ShapeNode -> {
|
|
|
|
compositionNode.style.stroke.let {
|
|
stroke = when (it) {
|
|
is Paint.RGB -> it.value.copy(alpha = 1.0)
|
|
Paint.None -> null
|
|
Paint.CurrentColor -> null
|
|
}
|
|
}
|
|
compositionNode.style.strokeOpacity.let {
|
|
stroke = when (it) {
|
|
is Numeric.Rational -> stroke?.opacify(it.value)
|
|
}
|
|
}
|
|
compositionNode.style.strokeWeight.let {
|
|
strokeWeight = when (it) {
|
|
is Length.Pixels -> it.value
|
|
is Length.Percent -> composition.normalizedDiagonalLength() * it.value / 100.0
|
|
}
|
|
}
|
|
compositionNode.style.miterLimit.let {
|
|
miterLimit = when (it) {
|
|
is Numeric.Rational -> it.value
|
|
}
|
|
}
|
|
compositionNode.style.lineCap.let {
|
|
lineCap = it.value
|
|
}
|
|
compositionNode.style.lineJoin.let {
|
|
lineJoin = it.value
|
|
}
|
|
compositionNode.style.fill.let {
|
|
fill = when (it) {
|
|
is Paint.RGB -> it.value.copy(alpha = 1.0)
|
|
is Paint.None -> null
|
|
is Paint.CurrentColor -> null
|
|
}
|
|
}
|
|
compositionNode.style.fillOpacity.let {
|
|
fill = when (it) {
|
|
is Numeric.Rational -> fill?.opacify(it.value)
|
|
}
|
|
}
|
|
compositionNode.style.opacity.let {
|
|
when (it) {
|
|
is Numeric.Rational -> {
|
|
stroke = stroke?.opacify(it.value)
|
|
fill = fill?.opacify(it.value)
|
|
}
|
|
}
|
|
}
|
|
shape(compositionNode.shape)
|
|
}
|
|
is ImageNode -> {
|
|
image(compositionNode.image)
|
|
}
|
|
is TextNode -> TODO()
|
|
is GroupNode -> compositionNode.children.forEach { node(it) }
|
|
}
|
|
popModel()
|
|
popStyle()
|
|
}
|
|
node(composition.root)
|
|
popModel()
|
|
popStyle()
|
|
} |