Add screenshot generation

This commit is contained in:
Edwin Jakobs
2020-04-22 21:56:08 +02:00
parent 6a29853c71
commit 60a64806fc
66 changed files with 1316 additions and 84 deletions

View File

@@ -16,7 +16,7 @@ buildscript {
apply plugin: 'org.jetbrains.dokka' apply plugin: 'org.jetbrains.dokka'
project.ext { project.ext {
openrndrVersion = "0.3.41" openrndrVersion = "0.4.0-SNAPSHOT"
kotlinVersion = "1.3.72" kotlinVersion = "1.3.72"
spekVersion = "2.0.10" spekVersion = "2.0.10"
libfreenectVersion = "0.5.7-1.5.3" libfreenectVersion = "0.5.7-1.5.3"
@@ -62,6 +62,7 @@ allprojects {
group 'org.openrndr.extra' group 'org.openrndr.extra'
repositories { repositories {
mavenLocal()
mavenCentral() mavenCentral()
jcenter() jcenter()
maven { maven {
@@ -124,4 +125,39 @@ allprojects {
includeEngines 'spek2' includeEngines 'spek2'
} }
} }
}
task collectScreenshots(dependsOn: 'classes') {
doFirst {
for (sub in project.subprojects) {
if (sub.sourceSets.hasProperty("demo")) {
def set = sub.sourceSets.demo
def ucl = new URLClassLoader(set.runtimeClasspath.collect { it.toURI().toURL() } as URL[])
for (x in set.output) {
if (x.exists()) {
for (y in x.listFiles()) {
def name = y.name
if (!name.contains('$') && name.contains(".class")) {
def klass = ucl.loadClass(y.name.replace(".class", ""))
try {
def mainMethod = klass.getMethod("main")
javaexec {
classpath set.runtimeClasspath
def className = y.name.replace(".class", "")
main = className
jvmArgs += "-DtakeScreenshot=true"
jvmArgs += "-DscreenshotPath=${sub.name}/images/${className}.png"
}
} catch (e) {
// skip?
}
}
}
}
}
}
}
}
} }

View File

@@ -29,3 +29,7 @@ Using the `Easing` enumeration
```kotlin ```kotlin
val et = Easing.QuadIn.function(t, 0.0, 1.0, 1.0) val et = Easing.QuadIn.function(t, 0.0, 1.0, 1.0)
``` ```
## Demos
[DemoEasings01Kt](src/demo/kotlin/DemoEasings01.kt)
![Screenshot](images/DemoEasings01Kt.png)

View File

@@ -14,6 +14,7 @@ dependencies {
demoImplementation(project(":orx-camera")) demoImplementation(project(":orx-camera"))
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,11 +1,11 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.easing.* import org.openrndr.extras.easing.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
fun main() { fun main() {
application { application {
configure { configure {
width = 1280 width = 1280
height = 1080 height = 1080
@@ -19,14 +19,17 @@ fun main() {
points.add(Vector2(i*10.0, y)) points.add(Vector2(i*10.0, y))
} }
drawer.lineStrip(points) drawer.lineStrip(points)
drawer.stroke = ColorRGBa.GRAY drawer.stroke = ColorRGBa.GRAY
drawer.lineSegment(0.0, 40.0, 400.0, 40.0) drawer.lineSegment(0.0, 40.0, 400.0, 40.0)
drawer.lineSegment(0.0, 20.0, 400.0, 20.0) drawer.lineSegment(0.0, 20.0, 400.0, 20.0)
} }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
drawer.stroke = ColorRGBa.WHITE drawer.stroke = ColorRGBa.WHITE
@@ -62,9 +65,7 @@ fun main() {
::easeBounceIn, ::easeBounceIn,
::easeBounceOut, ::easeBounceOut,
::easeBounceInOut ::easeBounceInOut
) )
var i = 0 var i = 0
for (f in functions) { for (f in functions) {
drawEasing(f) drawEasing(f)
@@ -78,5 +79,4 @@ fun main() {
} }
} }
} }
} }

View File

@@ -1,3 +1,19 @@
sourceSets {
demo {
java {
srcDirs = ["src/demo/kotlin"]
compileClasspath += main.getCompileClasspath()
runtimeClasspath += main.getRuntimeClasspath()
}
}
}
dependencies { dependencies {
api project(":orx-parameters") api project(":orx-parameters")
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output)
} }

View File

@@ -0,0 +1,30 @@
import org.openrndr.application
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.fx.distort.FluidDistort
import org.openrndr.extra.fx.patterns.Checkers
fun main() {
application {
program {
val fd = FluidDistort()
val checkers = Checkers()
val image = colorBuffer(width, height)
val distorted = image.createEquivalent()
checkers.size = 64.0
checkers.apply(emptyArray(), image)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend {
fd.blend = mouse.position.x/width
fd.apply(image, distorted)
drawer.image(distorted)
}
}
}
}

View File

@@ -0,0 +1,8 @@
package org.openrndr.extra.fx.color
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.fx.filterFragmentUrl
class RgbToYCbcr : Filter(filterShaderFromUrl(filterFragmentUrl("color/rgb-to-ycbcr.frag")))
class YcbcrToRgb : Filter(filterShaderFromUrl(filterFragmentUrl("color/ycbcr-to-rgb.frag")))

View File

@@ -0,0 +1,68 @@
package org.openrndr.extra.fx.distort
import org.openrndr.draw.ColorBuffer
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.fx.filterFragmentUrl
import kotlin.math.cos
private class UVMap: Filter(filterShaderFromUrl(filterFragmentUrl("distort/uvmap.frag"))) {
}
private class FluidDistortFilter : Filter(filterShaderFromUrl(filterFragmentUrl("distort/fluid-distort.frag"))) {
var blend : Double by parameters
var random: Double by parameters
init {
blend = 0.0
random = 0.0
}
}
class FluidDistort : Filter() {
var blend: Double = 1.0
var outputUV = false
private val distort = FluidDistortFilter()
private val uvmap = UVMap()
private var buffer0: ColorBuffer? = null
private var buffer1: ColorBuffer? = null
private var index = 0
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
distort.blend = blend
distort.random = cos(index*0.5)*0.5+0.5
buffer0?.let {
if (!it.isEquivalentTo(target[0])) {
it.destroy()
}
}
if (buffer0 == null) {
buffer0 = target[0].createEquivalent()
}
buffer1?.let {
if (!it.isEquivalentTo(target[0])) {
it.destroy()
}
}
if (buffer1 == null) {
buffer1 = target[0].createEquivalent()
}
val buffers = arrayOf(buffer0!!, buffer1!!)
distort.apply(buffers[index%2], buffers[(index+1)%2])
if (!outputUV) {
uvmap.apply(arrayOf(buffers[(index + 1) % 2], source[0]), target[0])
} else {
buffers[(index+1)%2].copyTo(target[0])
}
index++
blend = 0.0
}
}

View File

@@ -2,9 +2,8 @@ package org.openrndr.extra.fx.distort
import org.openrndr.draw.* import org.openrndr.draw.*
import org.openrndr.extra.fx.filterFragmentUrl import org.openrndr.extra.fx.filterFragmentUrl
import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.*
import org.openrndr.extra.parameters.DoubleParameter import org.openrndr.math.Vector2
import org.openrndr.extra.parameters.IntParameter
import org.openrndr.math.Vector3 import org.openrndr.math.Vector3
import org.openrndr.math.Vector4 import org.openrndr.math.Vector4
@@ -15,37 +14,41 @@ class Perturb : Filter(filterShaderFromUrl(filterFragmentUrl("distort/perturb.fr
/** /**
* base noise scale, default is Vector3(1.0, 1.0, 1.0) * base noise scale, default is Vector3(1.0, 1.0, 1.0)
*/ */
@DoubleParameter("scale", 0.01, 8.0) @DoubleParameter("scale", 0.01, 8.0, order = 0)
var scale: Double by parameters var scale: Double by parameters
@DoubleParameter("phase", -2.0, 2.0) @DoubleParameter("phase", -2.0, 2.0, order = 1)
var phase: Double by parameters var phase: Double by parameters
/** /**
* lacunarity is the amount by which scale is modulated per octave, default is Vector3(2.0, 2.0, 2.0) * lacunarity is the amount by which scale is modulated per octave, default is Vector3(2.0, 2.0, 2.0)
*/ */
@DoubleParameter("lacunarity", 0.0, 1.0) @DoubleParameter("lacunarity", 0.0, 1.0, order = 2)
var lacunarity: Double by parameters var lacunarity: Double by parameters
@DoubleParameter("gain", 0.0, 1.0) @DoubleParameter("gain", 0.0, 1.0, order = 3)
var gain: Double by parameters var gain: Double by parameters
@DoubleParameter("decay", 0.0, 1.0) @DoubleParameter("decay", 0.0, 1.0, order = 4)
var decay: Double by parameters var decay: Double by parameters
/** /**
* the number of octaves of noise to generate, default is 4 * the number of octaves of noise to generate, default is 4
*/ */
@IntParameter("octaves", 1, 10) @IntParameter("octaves", 1, 10, order = 5)
var octaves: Int by parameters var octaves: Int by parameters
@IntParameter("x segments", 0, 256, order = 6)
@IntParameter("x segments", 0, 256)
var xSegments: Int by parameters var xSegments: Int by parameters
@IntParameter("y segments", 0, 256) @IntParameter("y segments", 0, 256, order = 7)
var ySegments: Int by parameters var ySegments: Int by parameters
@BooleanParameter("output UV", order = 8)
var outputUV: Boolean by parameters
@Vector2Parameter("offset", -1.0, 1.0, order = 9)
var offset: Vector2 by parameters
init { init {
@@ -58,6 +61,8 @@ class Perturb : Filter(filterShaderFromUrl(filterFragmentUrl("distort/perturb.fr
phase = 0.0 phase = 0.0
xSegments = 0 xSegments = 0
ySegments = 0 ySegments = 0
outputUV = false
offset = Vector2.ZERO
} }
var bicubicFiltering = true var bicubicFiltering = true
@@ -68,5 +73,4 @@ class Perturb : Filter(filterShaderFromUrl(filterFragmentUrl("distort/perturb.fr
} }
super.apply(source, target) super.apply(source, target)
} }
} }

View File

@@ -0,0 +1,18 @@
#version 330
uniform vec4 tint;
in vec2 v_texCoord0;
uniform sampler2D tex0;
out vec4 o_color;
void main() {
vec4 c = texture(tex0, v_texCoord0);
if (c.a != 0.0) {
c.rgb /= c.a;
}
c.rgb *= 255.0;
float y = 0.0 + 0.299 * c.r + 0.587 * c.g + 0.114 * c.b;
float cb = 128 - (0.168736 * c.r) - (0.331264 * c.g) + (0.5 * c.b);
float cr = 128 + (0.5 * c.r) - 0.418688 * c.g - 0.081312 * c.b;
o_color = vec4(y/255.0, cb/255.0, cr/255.0, 1.0) * c.a;
}

View File

@@ -0,0 +1,26 @@
#version 330
uniform vec4 tint;
in vec2 v_texCoord0;
uniform sampler2D tex0;
out vec4 o_color;
void main() {
vec2 ts = textureSize(tex0, 0);
vec4 c = texture(tex0, v_texCoord0);
if (c.a != 0.0) {
c.rgb /= c.a;
}
c.rgb *= 255.0;
float y = c.r;
float cb = c.g;
float cr = c.b;
float r = y + 1.402 * (cr - 128.0);
float g = y - 0.344136 * (cb - 128.0) - 0.714136 * (cr - 128.0);
float b = y + 1.772 * (cb - 128.0);
o_color = vec4(r/255.0, g/255.0, b/255.0, 1.0) * c.a;
}

View File

@@ -0,0 +1,73 @@
#version 330
// created by florian berger (flockaroo) - 2016
// License Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.
// single pass CFD
// ---------------
// this is some "computational flockarooid dynamics" ;)
// the self-advection is done purely rotational on all scales.
// therefore i dont need any divergence-free velocity field.
// with stochastic sampling i get the proper "mean values" of rotations
// over time for higher order scales.
//
// try changing "RotNum" for different accuracies of rotation calculation
// for even RotNum uncomment the line #define SUPPORT_EVEN_ROTNUM
#define RotNum 5
//#define SUPPORT_EVEN_ROTNUM
//#define keyTex iChannel3
//#define KEY_I texture(keyTex,vec2((105.5-32.0)/256.0,(0.5+0.0)/3.0)).x
const float ang = 2.0*3.1415926535/float(RotNum);
mat2 m = mat2(cos(ang), sin(ang), -sin(ang), cos(ang));
mat2 mh = mat2(cos(ang*0.5), sin(ang*0.5), -sin(ang*0.5), cos(ang*0.5));
uniform sampler2D tex0;
uniform float time;
uniform float random;
in vec2 v_texCoord0;
uniform vec2 targetSize;
uniform float blend;
out vec4 o_color;
float getRot(vec2 pos, vec2 b) {
vec2 Res = textureSize(tex0, 0);
vec2 p = b;
float rot = 0.0;
for (int i = 0; i < RotNum; i++) {
rot += dot(texture(tex0, fract((pos + p) / Res.xy)).xy -vec2(0.5), p.yx * vec2(1, -1));
p = m * p;
}
return rot / float(RotNum)/dot(b, b);
}
void main() {
vec2 pos = v_texCoord0 * targetSize;
vec2 Res = textureSize(tex0, 0);
vec2 b = vec2(cos(ang * random), sin(ang * random));
vec2 v = vec2(0);
float bbMax = 0.5 * Res.y;
bbMax *= bbMax;
for (int l = 0; l < 20; l++) {
if (dot(b, b) > bbMax) break;
vec2 p = b;
for (int i = 0; i < RotNum; i++) {
#ifdef SUPPORT_EVEN_ROTNUM
v += p.yx * getRot(pos + p, -mh * b);
#else
// this is faster but works only for odd RotNum
v += p.yx * getRot(pos + p, b);
#endif
p = m*p;
}
b *= 2.0;
}
o_color = vec4(0.0, 0.0, 0.0, 1.0);
o_color.xy = texture(tex0, fract((pos + v * vec2(-1, 1) * 2.0) / Res.xy)).xy * (1.0-blend) + v_texCoord0 * blend;
}

View File

@@ -15,6 +15,9 @@ uniform sampler2D tex0;
uniform int xSegments; uniform int xSegments;
uniform int ySegments; uniform int ySegments;
uniform bool outputUV;
uniform vec2 offset;
// varyings // varyings
in vec2 v_texCoord0; in vec2 v_texCoord0;
@@ -143,7 +146,7 @@ void main() {
vec3 xseed = vec3(seed.xy, seed.z+cos(phase*3.1415926535)); vec3 xseed = vec3(seed.xy, seed.z+cos(phase*3.1415926535));
vec3 yseed = vec3(seed.yx, seed.z+sin(phase*3.1415926535)); vec3 yseed = vec3(seed.yx, seed.z+sin(phase*3.1415926535));
vec3 uv = vec3(v_texCoord0, 1.0) * 2.0 - 1.0; vec3 uv = vec3(v_texCoord0 + offset, 1.0) * 2.0 - 1.0;
vec3 px = ((segment(uv, xSegments, ySegments) + xseed) * scale); vec3 px = ((segment(uv, xSegments, ySegments) + xseed) * scale);
vec3 py = ((segment(uv, xSegments, ySegments) + yseed + vec3(100.37, 40.51, 9.43)) * scale); vec3 py = ((segment(uv, xSegments, ySegments) + yseed + vec3(100.37, 40.51, 9.43)) * scale);
@@ -157,8 +160,8 @@ void main() {
vec2 distCoord = v_texCoord0 + vec2(tx, ty); vec2 distCoord = v_texCoord0 + vec2(tx, ty);
if (!outputUV) {
if (distCoord.x >= 0.0 && distCoord.y >= 0.0 && distCoord.x < 1.0 && distCoord.y < 1.0) { if (distCoord.x >= 0.0 && distCoord.y >= 0.0 && distCoord.x < 1.0 && distCoord.y < 1.0) {
if (xSegments == 0 && ySegments == 0) { if (xSegments == 0 && ySegments == 0) {
o_output = texture(tex0, distCoord); o_output = texture(tex0, distCoord);
} else { } else {
@@ -167,4 +170,7 @@ void main() {
} else { } else {
o_output = vec4(0.0); o_output = vec4(0.0);
} }
} else {
o_output = vec4(distCoord, 0.0, 1.0);
}
} }

View File

@@ -0,0 +1,11 @@
#version 330 core
in vec2 v_texCoord0;
uniform sampler2D tex0;// uvmap
uniform sampler2D tex1;// input
out vec4 o_color;
void main() {
vec2 uv = texture(tex0, v_texCoord0).xy;
o_color = texture(tex1, uv);
}

View File

@@ -15,6 +15,7 @@ dependencies {
implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.code.gson:gson:$gsonVersion"
implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion"
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,5 +1,6 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.gui.GUI import org.openrndr.extra.gui.GUI
import org.openrndr.extra.parameters.* import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
@@ -23,6 +24,11 @@ fun main() = application {
} }
gui.add(settings) gui.add(settings)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(gui) extend(gui)
extend { extend {
when(settings.option) { when(settings.option) {

View File

@@ -1,5 +1,6 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.gui.GUI import org.openrndr.extra.gui.GUI
import org.openrndr.extra.parameters.* import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
@@ -22,10 +23,13 @@ fun main() = application {
@DoubleListParameter("a double list") @DoubleListParameter("a double list")
var adl = MutableList(2) { 0.0 } var adl = MutableList(2) { 0.0 }
} }
gui.add(settings) gui.add(settings)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(gui) extend(gui)
extend { extend {
drawer.fill = settings.color drawer.fill = settings.color

View File

@@ -11,7 +11,11 @@ sourceSets {
dependencies { dependencies {
implementation project(":orx-fx") implementation project(":orx-fx")
demoImplementation project(":orx-noise") demoImplementation project(":orx-noise")
demoImplementation project(":orx-gui")
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-svg:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-ffmpeg:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -0,0 +1,42 @@
import org.openrndr.application
import org.openrndr.draw.ColorFormat
import org.openrndr.draw.ColorType
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.jumpfill.ShapeSDF
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform
import org.openrndr.shape.Circle
import org.openrndr.svg.loadSVG
fun main() {
application {
configure {
width = 1280
height = 720
}
program {
val sdf = ShapeSDF()
val df = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val shapes = loadSVG("orx-jumpflood/src/demo/resources/name.svg").findShapes().map { it.shape }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend {
sdf.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280/2.0, 720.0/2)
translate(-1280/2.0, -720.0/2.0)
})
})
sdf.apply(emptyArray(), df)
drawer.image(df)
}
}
}
}

View File

@@ -0,0 +1,70 @@
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorFormat
import org.openrndr.draw.ColorType
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.jumpfill.ShapeSDF
import org.openrndr.extra.jumpfill.draw.SDFStrokeFill
import org.openrndr.extra.jumpfill.ops.*
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform
import org.openrndr.svg.loadSVG
fun main() {
application {
configure {
width = 1280
height = 720
}
program {
val sdf0 = ShapeSDF()
val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val sdf1 = ShapeSDF()
val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val shapes = loadSVG("orx-jumpflood/src/demo/resources/name.svg").findShapes().map { it.shape }
val union = SDFSmoothIntersection()
val onion = SDFOnion()
val strokeFill = SDFStrokeFill()
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend {
drawer.background(ColorRGBa.PINK)
sdf0.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf1.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
rotate(Vector3.Companion.UNIT_Z, seconds * 45.0)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf0.apply(emptyArray(), df0)
sdf1.apply(emptyArray(), df1)
union.radius = mouse.position.y
union.apply(arrayOf(df0, df1), df0)
onion.radius = 20.0
onion.apply(df0, df0)
strokeFill.strokeWeight = 2.0
strokeFill.apply(df0, df0);
drawer.image(df0)
}
}
}
}

View File

@@ -0,0 +1,74 @@
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorFormat
import org.openrndr.draw.ColorType
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.fx.distort.FluidDistort
import org.openrndr.extra.jumpfill.ShapeSDF
import org.openrndr.extra.jumpfill.draw.SDFStrokeFill
import org.openrndr.extra.jumpfill.ops.*
import org.openrndr.ffmpeg.ScreenRecorder
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform
import org.openrndr.svg.loadSVG
fun main() {
application {
configure {
width = 1280
height = 720
}
program {
val sdf0 = ShapeSDF()
val sdf1 = ShapeSDF()
val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val fd = FluidDistort()
fd.outputUV = true
val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16)
val shapes = loadSVG("orx-jumpflood/src/demo/resources/name.svg").findShapes().map { it.shape }
val union = SDFSmoothDifference()
val strokeFill = SDFStrokeFill()
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend {
drawer.background(ColorRGBa.PINK)
fd.apply(emptyArray(), uvmap)
sdf0.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf1.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf0.useUV = true
sdf0.apply(uvmap, df0)
sdf1.apply(uvmap, df1)
union.radius = 10.0
union.apply(arrayOf(df0, df1), df0)
strokeFill.strokeWeight = 10.0
strokeFill.apply(df0, df0);
drawer.image(df0)
}
}
}
}

View File

@@ -0,0 +1,80 @@
package sketches
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorFormat
import org.openrndr.draw.ColorType
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.fx.distort.Perturb
import org.openrndr.extra.gui.GUI
import org.openrndr.extra.jumpfill.ShapeSDF
import org.openrndr.extra.jumpfill.draw.SDFStrokeFill
import org.openrndr.extra.jumpfill.ops.*
import org.openrndr.math.transforms.transform
import org.openrndr.shape.Circle
import org.openrndr.svg.loadSVG
fun main() {
application {
configure {
width = 1280
height = 720
}
program {
val gui = GUI()
val sdf0 = ShapeSDF()
val sdf1 = ShapeSDF()
val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val perturb = Perturb()
perturb.outputUV = true
val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16)
val circleShapes = List(1) { Circle(width/2.0, height/2.0, 200.0).shape}
val shapes = loadSVG("orx-jumpflood/src/demo/resources/name.svg").findShapes().map { it.shape }
val difference = SDFSmoothDifference()
val strokeFill = SDFStrokeFill()
gui.add(perturb)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(gui)
extend {
drawer.background(ColorRGBa.PINK)
perturb.phase = seconds * 0.1
perturb.apply(uvmap, uvmap)
sdf0.setShapes(circleShapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf1.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf0.useUV = true
sdf0.apply(uvmap, df0)
sdf1.apply(uvmap, df1)
difference.radius = 10.0
difference.apply(arrayOf(df0, df1), df0)
strokeFill.strokeWeight = 10.0
strokeFill.apply(df0, df0);
drawer.image(df0)
}
}
}
}

View File

@@ -0,0 +1,98 @@
import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorFormat
import org.openrndr.draw.ColorType
import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.fx.distort.Perturb
import org.openrndr.extra.gui.GUI
import org.openrndr.extra.jumpfill.ShapeSDF
import org.openrndr.extra.jumpfill.draw.SDFStrokeFill
import org.openrndr.extra.jumpfill.ops.*
import org.openrndr.ffmpeg.ScreenRecorder
import org.openrndr.math.Vector2
import org.openrndr.math.transforms.transform
import org.openrndr.shape.Circle
import org.openrndr.svg.loadSVG
import kotlin.math.cos
import kotlin.math.sin
fun main() {
application {
configure {
width = 1280
height = 720
}
program {
val gui = GUI()
val sdf0 = ShapeSDF()
val sdf1 = ShapeSDF()
val df0 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val df1 = colorBuffer(width, height, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
val perturb = Perturb()
perturb.outputUV = true
val uvmap = colorBuffer(width, height, type = ColorType.FLOAT16)
val uvmap2 = colorBuffer(width, height, type = ColorType.FLOAT16)
val circleShapes = List(1) { Circle(width/2.0, height/2.0, 200.0).shape}
val shapes = loadSVG("orx-jumpflood/src/demo/resources/name.svg").findShapes().map { it.shape }
val difference = SDFSmoothDifference()
val strokeFill = SDFStrokeFill()
sdf0.useUV = true
gui.add(sdf0)
gui.add(perturb)
gui.add(strokeFill)
gui.add(difference)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(ScreenRecorder()) {
frameRate = 60
}
extend(gui)
extend {
drawer.background(ColorRGBa.PINK)
perturb.offset = Vector2(cos(seconds*0.2), sin(seconds*0.2))
perturb.outputUV = true
perturb.phase = seconds * 0.1
perturb.apply(uvmap, uvmap)
perturb.offset = Vector2.ZERO
perturb.outputUV = false
perturb.phase = seconds * 0.05
perturb.apply(uvmap, uvmap2)
sdf0.setShapes(circleShapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf1.setShapes(shapes.mapIndexed { index, it ->
it.transform(transform {
translate(1280 / 2.0, 720.0 / 2)
translate(-1280 / 2.0, -720.0 / 2.0)
})
})
sdf0.apply(uvmap2, df0)
sdf1.apply(uvmap2, df1)
difference.apply(arrayOf(df0, df1), df0)
strokeFill.apply(df0, df0);
drawer.image(df0)
}
}
}
}

View File

@@ -1,11 +1,10 @@
package sketches
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorType import org.openrndr.draw.ColorType
import org.openrndr.draw.isolatedWithTarget import org.openrndr.draw.isolatedWithTarget
import org.openrndr.draw.renderTarget import org.openrndr.draw.renderTarget
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.jumpfill.fx.Skeleton import org.openrndr.extra.jumpfill.fx.Skeleton
import org.openrndr.extra.jumpfill.fx.StraightSkeleton import org.openrndr.extra.jumpfill.fx.StraightSkeleton
import org.openrndr.extra.noise.simplex import org.openrndr.extra.noise.simplex
@@ -23,6 +22,11 @@ fun main() {
colorBuffer() colorBuffer()
} }
val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32) val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
drawer.isolatedWithTarget(input) { drawer.isolatedWithTarget(input) {
// -- draw something interesting // -- draw something interesting

View File

@@ -6,6 +6,7 @@ import org.openrndr.draw.ColorType
import org.openrndr.draw.isolatedWithTarget import org.openrndr.draw.isolatedWithTarget
import org.openrndr.draw.renderTarget import org.openrndr.draw.renderTarget
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.jumpfill.fx.StraightSkeleton import org.openrndr.extra.jumpfill.fx.StraightSkeleton
import org.openrndr.extra.noise.simplex import org.openrndr.extra.noise.simplex
@@ -22,6 +23,12 @@ fun main() {
colorBuffer() colorBuffer()
} }
val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32) val field = input.colorBuffer(0).createEquivalent(type = ColorType.FLOAT32)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
drawer.isolatedWithTarget(input) { drawer.isolatedWithTarget(input) {
// -- draw something interesting // -- draw something interesting

View File

@@ -0,0 +1,12 @@
<svg version="1.1" baseProfile="tiny" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1280 720" xml:space="preserve">
<polygon fill="#FF00FF" stroke="#000000" stroke-miterlimit="2.6131" points="1013.8,424.3 1013.8,238 957.1,238 957.1,238
794.7,238 794.7,294.7 957.1,294.7 957.1,318.9 794.7,318.9 794.7,375.6 957.1,375.6 957.1,424.3 794.7,424.3 794.7,481 957.1,481
1013.8,481 1037.8,481 1037.8,424.3 "/>
<path fill="#FF00FF" stroke="#000000" stroke-miterlimit="2.6131" d="M705.7,263.3H576V239h-56.7v119.2l0,0V401h93.2v24.3h-93.2V482
h243.1v-56.7h-93.2V401h93.2V239h-56.7V263.3L705.7,263.3z M705.7,344.3H576V320h129.7V344.3z"/>
<path fill="#FF00FF" d="M356.6,279L356.6,279L356.6,279z"/>
<path fill="#FF00FF" stroke="#000000" stroke-miterlimit="2.6131" d="M356.6,279c-9.2-3.3-19-5-28.8-5c-47.2,0-85.5,38.3-85.5,85.5
s38.3,85.5,85.5,85.5s85.5-38.3,85.5-85.5c0-0.1,0-0.3,0-0.4C413.3,323.1,390.5,291,356.6,279z M327.8,387.4
c-15.7,0-28.4-12.7-28.4-28.4c0-15.7,12.7-28.4,28.4-28.4c15.6,0,28.4,12.7,28.4,28.4C356.1,374.7,343.4,387.4,327.8,387.4z"/>
<rect x="430.1" y="238" fill="#FF00FF" stroke="#000000" stroke-miterlimit="2.6131" width="56.7" height="243"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,78 @@
package org.openrndr.extra.jumpfill
import org.openrndr.draw.*
import org.openrndr.extra.parameters.BooleanParameter
import org.openrndr.math.Vector4
import org.openrndr.resourceUrl
import org.openrndr.shape.Shape
import org.openrndr.shape.ShapeContour
class ShapeSDF : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/shape-sdf.frag"))) {
private val fromBuffer = bufferTexture(1024, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
private val toBuffer = bufferTexture(1024, format = ColorFormat.RGBa, type = ColorType.FLOAT32)
private var segmentCount = 0
@BooleanParameter("use UV map")
var useUV:Boolean by parameters
@BooleanParameter("rectify distance")
var rectify:Boolean by parameters
init {
useUV = false
rectify = false
}
fun setShapes(shapes: List<Shape>) {
setContours(shapes.flatMap { it.contours })
}
fun setContours(contours: List<ShapeContour>) {
val from = mutableListOf<Vector4>()
val to = mutableListOf<Vector4>()
for (contour in contours) {
val lin = contour.sampleLinear()
var contourLength = 0.0
for (segment in lin.segments) {
contourLength += segment.length
}
var offset = 0.0
for (segment in lin.segments) {
from.add(Vector4(segment.start.x, segment.start.y, offset, contourLength))
offset += segment.length
to.add(Vector4(segment.end.x, segment.end.y, offset, contourLength))
}
}
val fromShadow = fromBuffer.shadow
val fromWriter = fromShadow.writer()
fromWriter.rewind()
for (v in from) {
fromWriter.write(v)
}
fromShadow.upload(0, from.size*4*4)
val toShadow = toBuffer.shadow
val toWriter = toShadow.writer()
toWriter.rewind()
for (v in to) {
toWriter.write(v)
}
toShadow.upload(0, to.size*4*4)
segmentCount = from.size
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
parameters["fromBuffer"] = fromBuffer
parameters["toBuffer"] = toBuffer
parameters["segmentCount"] = segmentCount
super.apply(source, target)
}
}

View File

@@ -0,0 +1,41 @@
package org.openrndr.extra.jumpfill.draw
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.ColorBuffer
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.parameters.ColorParameter
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.resourceUrl
@Description("SDF stroke and fill")
class SDFStrokeFill : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/draw/sdf-stroke-fill.frag"))) {
@DoubleParameter("stroke weight", 0.0, 20.0, order = 0)
var strokeWeight: Double by parameters
@DoubleParameter("stroke feather", 0.0, 20.0, order = 0)
var strokeFeather: Double by parameters
@ColorParameter("stroke color", order = 1)
var strokeColor: ColorRGBa by parameters
@DoubleParameter("fill feather", 0.0, 20.0, order = 0)
var fillFeather: Double by parameters
@ColorParameter("fill color", order = 2)
var fillColor: ColorRGBa by parameters
init {
fillFeather = 1.0
strokeFeather = 1.0
strokeWeight = 1.0
strokeColor = ColorRGBa.BLACK
fillColor = ColorRGBa.WHITE
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
super.apply(source, target)
}
}

View File

@@ -0,0 +1,86 @@
package org.openrndr.extra.jumpfill.ops
import org.openrndr.draw.ColorBuffer
import org.openrndr.draw.ColorType
import org.openrndr.draw.Filter
import org.openrndr.draw.filterShaderFromUrl
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.resourceUrl
class SDFSmoothUnion : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/ops/sdf-smooth-union.frag"))) {
var radius: Double by parameters
init {
radius = 0.0
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
super.apply(source, target)
}
}
class SDFSmoothIntersection : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/ops/sdf-smooth-intersection.frag"))) {
var radius: Double by parameters
init {
radius = 0.0
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
super.apply(source, target)
}
}
@Description("SDF smooth difference")
class SDFSmoothDifference : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/ops/sdf-smooth-difference.frag"))) {
@DoubleParameter("smooth radius", 0.0, 200.0, order = 0)
var radius: Double by parameters
init {
radius = 0.0
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
super.apply(source, target)
}
}
class SDFRound : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/ops/sdf-round.frag"))) {
@DoubleParameter("rounding radius", 0.0, 200.0, order = 0)
var radius: Double by parameters
init {
radius = 0.0
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
super.apply(source, target)
}
}
class SDFOnion : Filter(filterShaderFromUrl(resourceUrl("/shaders/gl3/ops/sdf-onion.frag"))) {
var radius: Double by parameters
init {
radius = 0.0
}
override fun apply(source: Array<ColorBuffer>, target: Array<ColorBuffer>) {
require(target[0].type == ColorType.FLOAT16 || target[0].type == ColorType.FLOAT32) {
"needs a floating point target"
}
super.apply(source, target)
}
}

View File

@@ -0,0 +1,24 @@
#version 330 core
uniform sampler2D tex0;// signed distance
uniform float radius;
uniform vec4 strokeColor;
uniform float strokeWeight;
uniform float strokeFeather;
uniform float fillFeather;
uniform vec4 fillColor;
in vec2 v_texCoord0;
out vec4 o_color;
void main() {
float d = texture(tex0, v_texCoord0).r;
float strokeFactor = smoothstep(strokeWeight + strokeFeather, strokeWeight, abs(d));
float fillFactor = smoothstep(0.0, fillFeather, -d);
vec4 fc = (fillColor * fillColor.a) * fillFactor;
fc = fc * (1.0 - strokeFactor) + strokeFactor * (strokeColor * strokeColor.a);
o_color = fc;
}

View File

@@ -0,0 +1,12 @@
#version 330 core
uniform sampler2D tex0;// signed distance
uniform float radius;
in vec2 v_texCoord0;
out vec4 o_color;
void main() {
float d0 = texture(tex0, v_texCoord0).r;
o_color = vec4(abs(d0)- radius, 0.0, 0.0, 1.0);
}

View File

@@ -0,0 +1,12 @@
#version 330 core
uniform sampler2D tex0; // signed distance
uniform float radius;
in vec2 v_texCoord0;
out vec4 o_color;
void main() {
float d0 = texture(tex0, v_texCoord0).r - radius;
o_color = vec4(d0, 0.0, 0.0, 1.0);
}

View File

@@ -0,0 +1,19 @@
#version 330 core
uniform sampler2D tex0;// signed distance
uniform sampler2D tex1;// signed distance
uniform float radius;
in vec2 v_texCoord0;
out vec4 o_color;
float opSmoothDifference( float d1, float d2, float k ) {
float h = clamp( 0.5 - 0.5*(d2+d1)/k, 0.0, 1.0 );
return mix( d2, -d1, h ) + k*h*(1.0-h); }
void main() {
float d0 = texture(tex0, v_texCoord0).r;
float d1 = texture(tex1, v_texCoord0).r;
o_color = vec4(opSmoothDifference(d0, d1, radius), 0.0, 0.0, 1.0);
}

View File

@@ -0,0 +1,19 @@
#version 330 core
uniform sampler2D tex0;// signed distance
uniform sampler2D tex1;// signed distance
uniform float radius;
in vec2 v_texCoord0;
out vec4 o_color;
float opSmoothIntersection(float d1, float d2, float k) {
float h = clamp(0.5 - 0.5*(d2-d1)/k, 0.0, 1.0);
return mix(d2, d1, h) + k*h*(1.0-h); }
void main() {
float d0 = texture(tex0, v_texCoord0).r;
float d1 = texture(tex1, v_texCoord0).r;
o_color = vec4(opSmoothIntersection(d0, d1, radius), 0.0, 0.0, 1.0);
}

View File

@@ -0,0 +1,19 @@
#version 330 core
uniform sampler2D tex0; // signed distance
uniform sampler2D tex1; // signed distance
uniform float radius;
in vec2 v_texCoord0;
out vec4 o_color;
float opSmoothUnion(float d1, float d2, float k) {
float h = clamp(0.5 + 0.5*(d2-d1)/k, 0.0, 1.0);
return mix(d2, d1, h) - k*h*(1.0-h);
}
void main() {
float d0 = texture(tex0, v_texCoord0).r;
float d1 = texture(tex1, v_texCoord0).r;
o_color = vec4(opSmoothUnion(d0, d1, radius), 0.0, 0.0, 1.0);
}

View File

@@ -0,0 +1,103 @@
#version 330
#extension GL_ARB_derivative_control : enable
in vec2 v_texCoord0;
uniform float iTime;
out vec4 o_color;
uniform bool useUV;
uniform bool rectify;
uniform samplerBuffer toBuffer;
uniform samplerBuffer fromBuffer;
uniform int segmentCount;
uniform vec2 targetSize;
uniform sampler2D tex0; // uv-map
float isLeft( vec2 P0, vec2 P1, vec2 P2 ) {
return ( (P1.x - P0.x) * (P2.y - P0.y)
- (P2.x - P0.x) * (P1.y - P0.y) );
}
float length_squared( vec2 v, vec2 w ) {
return dot(w-v, w-v);
}
int winding_number( vec2 v, vec2 w, vec2 p ) {
if (v.y <= p.y) { // start y <= P.y
if (w.y > p.y) // an upward crossing
if (isLeft( v, w, p) > 0.0) // P left of edge
return 1; // ++wn; // have a valid up intersect
}
else { // start y > P.y (no test needed)
if (w.y <= p.y) // a downward crossing
if (isLeft( v,w,p) < 0.0) // P right of edge
return -1; //--wn; // have a valid down intersect
}
return 0;
}
float minimum_distance(vec2 v, vec2 w, vec2 p) {
// Return minimum distance between line segment vw and point p
float l2 = length_squared(v, w); // i.e. |w-v|^2 - avoid a sqrt
if (l2 == 0.0) return distance(p, v); // v == w case
// Consider the line extending the segment, parameterized as v + t (w - v).
// We find projection of point p onto the line.
// It falls where t = [(p-v) . (w-v)] / |w-v|^2
// We clamp t from [0,1] to handle points outside the segment vw.
float t = max(0.0, min(1.0, dot(p - v, w - v) / l2));
vec2 projection = v + t * (w - v); // Projection falls on the segment
return distance(p, projection);
}
vec3 minimum_distance_and_perpendicular(vec4 v, vec4 w, vec2 p) {
// Return minimum distance between line segment vw and point p
float l2 = length_squared(v.xy, w.xy); // i.e. |w-v|^2 - avoid a sqrt
if (l2 == 0.0) return vec3(distance(p, v.xy), v.z, v.w); // v == w case
// Consider the line extending the segment, parameterized as v + t (w - v).
// We find projection of point p onto the line.
// It falls where t = [(p-v) . (w-v)] / |w-v|^2
// We clamp t from [0,1] to handle points outside the segment vw.
float t = max(0.0, min(1.0, dot(p - v.xy, w.xy - v.xy) / l2));
vec3 projection = v.xyz + t * (w.xyz - v.xyz); // Projection falls on the segment
return vec3(distance(p.xy, projection.xy), projection.z, v.w);
}
void main() {
vec2 uv = v_texCoord0;
vec2 fixDistance = vec2(1.0);
if (useUV) {
vec2 o = 0.5 / textureSize(tex0, 0);
uv = texture(tex0, v_texCoord0 + o).xy;
if (rectify) {
fixDistance = (fwidthFine(uv))*vec2(1280.0, 720.0);
}
}
uv.y = 1.0 - uv.y;
uv *= targetSize;
float mindist = 10E10;
float perpdist = 0.0;
float contourLength = 0.0;
int windingNr = 0;
for (int i = 0; i < segmentCount; i++) {
vec4 from = texelFetch(fromBuffer, i);
vec4 to = texelFetch(toBuffer, i);
vec3 distline_and_perp = minimum_distance_and_perpendicular(from, to, uv.xy);
windingNr += winding_number( from.xy, to.xy, uv.xy );
float distline = distline_and_perp.x;
if (abs(distline) <= mindist) {
mindist = distline;
perpdist = distline_and_perp.y;
contourLength = distline_and_perp.z;
}
}
float signedDistance = mindist * (windingNr==0 ? 1.0 : -1.0);
o_color = vec4(signedDistance / length(fixDistance), perpdist/contourLength, contourLength, 1.0);
}

View File

@@ -39,8 +39,10 @@ dependencies {
implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion")
demoImplementation(project(":orx-camera")) demoImplementation(project(":orx-camera"))
demoImplementation(project(":orx-panel")) demoImplementation(project(":orx-panel"))
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.extra.keyframer.KeyframerFormat import org.openrndr.extra.keyframer.KeyframerFormat
import org.openrndr.resourceUrl import org.openrndr.resourceUrl
@@ -13,7 +14,11 @@ fun main() = application {
} }
val animation = Animation() val animation = Animation()
animation.loadFromJson(URL(resourceUrl("/demo-full-01.json")), format = KeyframerFormat.FULL) animation.loadFromJson(URL(resourceUrl("/demo-full-01.json")), format = KeyframerFormat.FULL)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
animation(seconds) animation(seconds)
drawer.fill = animation.color drawer.fill = animation.color

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.panel.controlManager import org.openrndr.panel.controlManager
import org.openrndr.panel.elements.Range import org.openrndr.panel.elements.Range
@@ -29,8 +30,12 @@ fun main() = application {
} }
} }
} }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(cm) extend(cm)
class Animation: Keyframer() { class Animation: Keyframer() {
val position by Vector2Channel(arrayOf("x", "y")) val position by Vector2Channel(arrayOf("x", "y"))
} }

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.resourceUrl import org.openrndr.resourceUrl
import java.net.URL import java.net.URL
@@ -10,7 +11,11 @@ fun main() = application {
} }
val animation = Animation() val animation = Animation()
animation.loadFromJson(URL(resourceUrl("/demo-simple-01.json"))) animation.loadFromJson(URL(resourceUrl("/demo-simple-01.json")))
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
animation(seconds) animation(seconds)
drawer.circle(animation.position, 100.0) drawer.circle(animation.position, 100.0)

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.resourceUrl import org.openrndr.resourceUrl
import java.net.URL import java.net.URL
@@ -12,6 +13,11 @@ fun main() = application {
} }
val animation = Animation() val animation = Animation()
animation.loadFromJson(URL(resourceUrl("/demo-simple-02.json"))) animation.loadFromJson(URL(resourceUrl("/demo-simple-02.json")))
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
animation(seconds) animation(seconds)
drawer.fill = animation.color drawer.fill = animation.color

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.resourceUrl import org.openrndr.resourceUrl
import java.net.URL import java.net.URL
@@ -13,7 +14,11 @@ fun main() = application {
val animation = Animation() val animation = Animation()
animation.loadFromJson(URL(resourceUrl("/demo-simple-expressions-01.json")), animation.loadFromJson(URL(resourceUrl("/demo-simple-expressions-01.json")),
parameters = mapOf("cycleDuration" to 2.0)) parameters = mapOf("cycleDuration" to 2.0))
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
animation(seconds) animation(seconds)
drawer.circle(animation.position, animation.radius) drawer.circle(animation.position, animation.radius)

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.keyframer.Keyframer import org.openrndr.extra.keyframer.Keyframer
import org.openrndr.resourceUrl import org.openrndr.resourceUrl
import java.net.URL import java.net.URL
@@ -11,7 +12,11 @@ fun main() = application {
} }
val animation = Animation() val animation = Animation()
animation.loadFromJson(URL(resourceUrl("/demo-simple-repetitions-01.json"))) animation.loadFromJson(URL(resourceUrl("/demo-simple-repetitions-01.json")))
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
animation(seconds) animation(seconds)
drawer.circle(animation.position, animation.radius) drawer.circle(animation.position, animation.radius)

View File

@@ -11,6 +11,7 @@ sourceSets {
dependencies { dependencies {
demoImplementation(project(":orx-camera")) demoImplementation(project(":orx-camera"))
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")

View File

@@ -3,8 +3,10 @@ import org.openrndr.color.ColorRGBa
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.colorBuffer import org.openrndr.draw.colorBuffer
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.boxMesh import org.openrndr.extras.meshgenerators.boxMesh
import org.openrndr.math.Vector3
fun main() { fun main() {
application { application {
@@ -18,8 +20,14 @@ fun main() {
} }
} }
s.upload() s.upload()
if (System.getProperty("takeScreenshot") == "true") {
extend(Orbital()) extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
eye = Vector3(1.0, 1.0, 1.0)
}
extend { extend {
drawer.background(ColorRGBa.PINK) drawer.background(ColorRGBa.PINK)
drawer.shadeStyle = shadeStyle { drawer.shadeStyle = shadeStyle {

View File

@@ -1,17 +1,18 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.box import org.openrndr.extras.meshgenerators.box
import org.openrndr.extras.meshgenerators.group import org.openrndr.extras.meshgenerators.group
import org.openrndr.extras.meshgenerators.meshGenerator import org.openrndr.extras.meshgenerators.meshGenerator
import org.openrndr.extras.meshgenerators.sphere import org.openrndr.extras.meshgenerators.sphere
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform import org.openrndr.math.transforms.transform
fun main() { fun main() {
application { application {
program { program {
extend(Orbital())
val m = meshGenerator { val m = meshGenerator {
sphere(32, 32, 1.0) sphere(32, 32, 1.0)
group { group {
@@ -21,6 +22,16 @@ fun main() {
}) })
} }
} }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
this.eye = Vector3(0.0, 3.0, 7.0)
this.lookAt = Vector3(0.0, 2.0, 0.0)
}
extend { extend {
drawer.shadeStyle = shadeStyle { drawer.shadeStyle = shadeStyle {
fragmentTransform = """ fragmentTransform = """

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.* import org.openrndr.extras.meshgenerators.*
import org.openrndr.math.Vector3 import org.openrndr.math.Vector3
@@ -9,7 +10,15 @@ import org.openrndr.math.transforms.transform
fun main() { fun main() {
application { application {
program { program {
extend(Orbital()) if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
this.eye = Vector3(0.0, 10.0, 20.0)
this.lookAt = Vector3(0.0, 5.0, 0.0)
}
val m = meshGenerator { val m = meshGenerator {
group { group {
hemisphere(32, 16, 5.0) hemisphere(32, 16, 5.0)

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.* import org.openrndr.extras.meshgenerators.*
import org.openrndr.math.Vector3 import org.openrndr.math.Vector3
@@ -9,7 +10,15 @@ import org.openrndr.math.transforms.transform
fun main() { fun main() {
application { application {
program { program {
extend(Orbital()) if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
this.eye = Vector3(0.0, 10.0, 20.0)
this.lookAt = Vector3(0.0, 5.0, 0.0)
}
val m = meshGenerator { val m = meshGenerator {
group { group {
hemisphere(32, 16, 5.0) hemisphere(32, 16, 5.0)

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.* import org.openrndr.extras.meshgenerators.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
@@ -10,7 +11,16 @@ import org.openrndr.math.transforms.transform
fun main() { fun main() {
application { application {
program { program {
extend(Orbital()) if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
this.eye = Vector3(0.0, 15.0, 15.0)
}
val m = meshGenerator { val m = meshGenerator {
val sides = 12 val sides = 12
group { group {

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.draw.DrawPrimitive import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle import org.openrndr.draw.shadeStyle
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extras.camera.Orbital import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.* import org.openrndr.extras.meshgenerators.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
@@ -11,7 +12,14 @@ import org.openrndr.shape.Circle
fun main() { fun main() {
application { application {
program { program {
extend(Orbital()) if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(Orbital()) {
this.eye = Vector3(0.0, 30.0, 50.0)
}
val m = meshGenerator { val m = meshGenerator {
grid(5,5, 5) { u, v, w -> grid(5,5, 5) { u, v, w ->

View File

@@ -1,35 +0,0 @@
import org.openrndr.application
import org.openrndr.draw.DrawPrimitive
import org.openrndr.draw.shadeStyle
import org.openrndr.extras.camera.Orbital
import org.openrndr.extras.meshgenerators.*
import org.openrndr.math.Vector2
import org.openrndr.math.Vector3
import org.openrndr.math.transforms.transform
import org.openrndr.shape.Circle
fun main() {
application {
program {
extend(Orbital())
val m = meshGenerator {
grid(5,5, 5) { u, v, w ->
extrudeShape(Circle(0.0, 0.0, 50.0).shape, 4.0, scale = 0.1)
transform(transform{ translate(u*20.0, v*20.0, w * 20.0)} )
}
twist(360.0/200.0, 0.0)
twist(360.0/200.0, 0.0, Vector3.UNIT_X)
twist(360.0/200.0, 0.0, Vector3.UNIT_Z)
}
extend {
drawer.shadeStyle = shadeStyle {
fragmentTransform = """
x_fill.rgb *= v_viewNormal.z;
""".trimIndent()
}
drawer.vertexBuffer(m, DrawPrimitive.TRIANGLES)
}
}
}
}

View File

@@ -14,6 +14,7 @@ dependencies {
demoImplementation(project(":orx-camera")) demoImplementation(project(":orx-camera"))
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,10 +1,10 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.colorBuffer import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.noise.gradientPerturbFractal import org.openrndr.extra.noise.gradientPerturbFractal
import org.openrndr.extra.noise.simplex import org.openrndr.extra.noise.simplex
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
import org.openrndr.math.Vector3
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
fun main() { fun main() {
@@ -12,6 +12,11 @@ fun main() {
program { program {
val cb = colorBuffer(width, height) val cb = colorBuffer(width, height)
val shad = cb.shadow val shad = cb.shadow
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
for (y in 0 until height) { for (y in 0 until height) {
for (x in 0 until width) { for (x in 0 until width) {

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.colorBuffer import org.openrndr.draw.colorBuffer
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.noise.gradientPerturbFractal import org.openrndr.extra.noise.gradientPerturbFractal
import org.openrndr.extra.noise.simplex import org.openrndr.extra.noise.simplex
import org.openrndr.math.Vector3 import org.openrndr.math.Vector3
@@ -11,6 +12,11 @@ fun main() {
program { program {
val cb = colorBuffer(width, height) val cb = colorBuffer(width, height)
val shad = cb.shadow val shad = cb.shadow
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
for (y in 0 until height) { for (y in 0 until height) {
for (x in 0 until width) { for (x in 0 until width) {

View File

@@ -21,6 +21,7 @@ dependencies {
implementation "com.google.zxing:core:3.4.0" implementation "com.google.zxing:core:3.4.0"
implementation "com.google.zxing:javase:3.4.0" implementation "com.google.zxing:javase:3.4.0"
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.loadFont import org.openrndr.draw.loadFont
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.parameters.* import org.openrndr.extra.parameters.*
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
import org.openrndr.math.Vector3 import org.openrndr.math.Vector3
@@ -48,7 +49,11 @@ fun main() = application {
} }
rabbit.add(settings) rabbit.add(settings)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(rabbit) extend(rabbit)
extend { extend {
drawer.background(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK) drawer.background(if (settings.b) ColorRGBa.BLUE else ColorRGBa.BLACK)

View File

@@ -1,6 +1,7 @@
import org.openrndr.KEY_HOME import org.openrndr.KEY_HOME
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.parameters.* import org.openrndr.extra.parameters.*
@@ -19,6 +20,11 @@ fun main() = application {
} }
rabbit.add(settings) rabbit.add(settings)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(rabbit) extend(rabbit)
/** /**

View File

@@ -11,6 +11,7 @@ dependencies {
api project(":orx-parameters") api project(":orx-parameters")
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,5 +1,6 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.shadestyles.radialGradient import org.openrndr.extra.shadestyles.radialGradient
import kotlin.math.cos import kotlin.math.cos
@@ -7,6 +8,11 @@ import kotlin.math.cos
fun main() { fun main() {
application { application {
program { program {
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
drawer.shadeStyle = radialGradient( drawer.shadeStyle = radialGradient(
ColorRGBa.PINK, ColorRGBa.PINK,

View File

@@ -13,6 +13,7 @@ dependencies {
demoImplementation(project(":orx-camera")) demoImplementation(project(":orx-camera"))
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.isolated import org.openrndr.draw.isolated
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.timeoperators.Envelope import org.openrndr.extra.timeoperators.Envelope
import org.openrndr.extra.timeoperators.TimeOperators import org.openrndr.extra.timeoperators.TimeOperators
@@ -10,6 +11,11 @@ fun main() {
val size = Envelope(50.0, 400.0, 0.5, 0.5) val size = Envelope(50.0, 400.0, 0.5, 0.5)
val rotation = Envelope(easingFactor = 0.4) val rotation = Envelope(easingFactor = 0.4)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(TimeOperators()) { extend(TimeOperators()) {
track(size, rotation) track(size, rotation)
} }

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.draw.isolated import org.openrndr.draw.isolated
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.timeoperators.Envelope import org.openrndr.extra.timeoperators.Envelope
import org.openrndr.extra.timeoperators.LFO import org.openrndr.extra.timeoperators.LFO
import org.openrndr.extra.timeoperators.LFOWave import org.openrndr.extra.timeoperators.LFOWave
@@ -11,7 +12,11 @@ fun main() {
program { program {
val size = LFO() val size = LFO()
val rotation = LFO(LFOWave.SINE) val rotation = LFO(LFOWave.SINE)
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend(TimeOperators()) { extend(TimeOperators()) {
track(size, rotation) track(size, rotation)
} }

View File

@@ -10,6 +10,7 @@ sourceSets {
dependencies { dependencies {
demoImplementation("org.openrndr:openrndr-core:$openrndrVersion") demoImplementation("org.openrndr:openrndr-core:$openrndrVersion")
demoImplementation("org.openrndr:openrndr-extensions:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3:$openrndrVersion")
demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion") demoRuntimeOnly("org.openrndr:openrndr-gl3-natives-$openrndrOS:$openrndrVersion")
demoImplementation(sourceSets.getByName("main").output) demoImplementation(sourceSets.getByName("main").output)

View File

@@ -1,4 +1,5 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.timer.repeat import org.openrndr.extra.timer.repeat
fun main() = application { fun main() = application {
@@ -6,6 +7,11 @@ fun main() = application {
repeat(2.0) { repeat(2.0) {
println("hello there $seconds" ) println("hello there $seconds" )
} }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
} }

View File

@@ -1,6 +1,7 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.events.Event import org.openrndr.events.Event
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.timer.repeat import org.openrndr.extra.timer.repeat
/** /**
@@ -17,6 +18,11 @@ fun main() = application {
// -- we can not draw here, so we relay the repeat signal to the event // -- we can not draw here, so we relay the repeat signal to the event
event.trigger(null) event.trigger(null)
} }
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
extend { extend {
drawer.background(ColorRGBa.PINK) drawer.background(ColorRGBa.PINK)
// -- by explicitly calling deliver we know that the drawing code in the listener will be // -- by explicitly calling deliver we know that the drawing code in the listener will be

View File

@@ -1,8 +1,14 @@
import org.openrndr.application import org.openrndr.application
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.timer.timeOut import org.openrndr.extra.timer.timeOut
fun main() = application { fun main() = application {
program { program {
if (System.getProperty("takeScreenshot") == "true") {
extend(SingleScreenshot()) {
this.outputFile = System.getProperty("screenshotPath")
}
}
timeOut(2.0) { timeOut(2.0) {
println("hello there $seconds" ) println("hello there $seconds" )
} }