Added orx-olive test

This commit is contained in:
Edwin Jakobs
2019-05-20 20:17:43 +02:00
parent e195a8b389
commit b5db7998b7
7 changed files with 147 additions and 3 deletions

10
orx-olive/build.gradle Normal file
View File

@@ -0,0 +1,10 @@
dependencies {
compile project(":orx-file-watcher")
runtime "org.openrndr:openrndr-gl3:0.4.0-SNAPSHOT"
runtime "org.openrndr:openrndr-gl3-natives-linux-x64:0.4.0-SNAPSHOT"
compile "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable"
compile "org.jetbrains.kotlin:kotlin-compiler-embeddable"
compile "org.jetbrains.kotlin:kotlin-script-runtime"
compile "org.jetbrains.kotlin:kotlin-script-util"
runtime "org.jetbrains.kotlin:kotlin-scripting-compiler"
}

View File

@@ -0,0 +1,15 @@
package org.openrndr.extra.olive
import org.openrndr.Program
import org.openrndr.application
class StupidProgram:Program() {
val thisIsStupid = 5
}
fun main() = application{
program(StupidProgram()) {
extend(Olive<StupidProgram>())
}
}

View File

@@ -0,0 +1,37 @@
package org.openrndr.extra.olive
import java.io.InputStream
import java.io.Reader
import javax.script.ScriptEngineManager
class LoadException(message: String? = null, cause: Throwable? = null) : RuntimeException(message, cause)
class KtsObjectLoader(classLoader: ClassLoader? = Thread.currentThread().contextClassLoader) {
val engine = ScriptEngineManager(classLoader).getEngineByExtension("kts")
init {
if (engine == null) {
throw RuntimeException("could not create scripting engine")
}
}
inline fun <R> safeEval(noinline evaluation: () -> R?) = try {
println(evaluation)
evaluation()
} catch (e: Exception) {
e.printStackTrace()
throw LoadException("Cannot load script", e)
}
inline fun <reified T> Any?.castOrError() = takeIf { it is T }?.let { it as T }
?: throw IllegalArgumentException("Cannot cast $this to expected type ${T::class}")
inline fun <reified T> load(script: String): T = safeEval { engine.eval(script) }.castOrError()
inline fun <reified T> load(reader: Reader): T = safeEval { engine.eval(reader) }.castOrError()
inline fun <reified T> load(inputStream: InputStream): T = load(inputStream.reader())
inline fun <reified T> loadAll(vararg inputStream: InputStream): List<T> = inputStream.map(::load)
}

View File

@@ -0,0 +1,73 @@
package org.openrndr.extra.olive
import org.openrndr.Extension
import org.openrndr.Program
import org.openrndr.draw.Session
import org.operndr.extras.filewatcher.watchFile
import java.io.File
class Olive<P:Program>():Extension {
override var enabled: Boolean = true
var session: Session? = null
var script = "src/main/kotlin/live.kts"
override fun setup(program: Program) {
val f = File(script)
if (!f.exists()) {
f.parentFile.mkdirs()
f.writeText("""
@file:Suppress("UNUSED_LAMBDA_EXPRESSION")
import org.openrndr.Program
import org.openrndr.draw.*
{ program: ${program.javaClass.name} ->
program.apply {
extend {
}
}
}
""".trimIndent())
}
program.watchFile(File(script)) {
try {
val script =it.readText()
println(script)
val func = KtsObjectLoader().load<P.() -> Unit>(script)
program.extensions.clear()
program.keyboard.keyDown.listeners.clear()
program.keyboard.keyUp.listeners.clear()
program.keyboard.character.listeners.clear()
program.keyboard.keyRepeat.listeners.clear()
program.mouse.clicked.listeners.clear()
program.mouse.buttonDown.listeners.clear()
program.mouse.dragged.listeners.clear()
program.mouse.buttonUp.listeners.clear()
program.mouse.moved.listeners.clear()
program.window.drop.listeners.clear()
program.window.focused.listeners.clear()
program.window.minimized.listeners.clear()
program.window.unfocused.listeners.clear()
program.window.restored.listeners.clear()
program.window.sized.listeners.clear()
session?.end()
session = Session()
session?.start()
func(program as P)
} catch (e: Throwable) {
e.printStackTrace()
}
}
}
}

View File

@@ -0,0 +1 @@
org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory