diff --git a/.github/workflows/build-on-commit.yaml b/.github/workflows/build-on-commit.yaml index 3d6e6b2..8349492 100644 --- a/.github/workflows/build-on-commit.yaml +++ b/.github/workflows/build-on-commit.yaml @@ -3,13 +3,14 @@ on: push: branches: - master + - next-version jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' diff --git a/.github/workflows/publish-binaries.yaml b/.github/workflows/publish-binaries.yaml index c1c67d8..2b975cf 100644 --- a/.github/workflows/publish-binaries.yaml +++ b/.github/workflows/publish-binaries.yaml @@ -23,10 +23,10 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' @@ -48,7 +48,7 @@ jobs: run: mv ./build/distributions/openrndr-application.zip ./build/distributions/openrndr-application-${{env.OR_TARGET_NAME}}.zip - name: Create Release - uses: ncipollo/release-action@v1.12.0 + uses: ncipollo/release-action@v1.14.0 id: create_release with: token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 3fdd31c..07feaf6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ build out .idea .gradle +.kotlin .lwjgl video/ screenshots/ diff --git a/README.md b/README.md index dfa4553..6eb172b 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,16 @@ go-to starting point for writing OPENRNDR-based software. If you are looking at this from IntelliJ IDEA you can start by expanding the _project_ tab on the left. You will find a template program in `src/main/kotlin/TemplateProgram.kt` and a live-coding example in `src/main/kotlin/TemplateLiveProgram.kt`. -You will find some [basic instructions](https://guide.openrndr.org/setUpYourFirstProgram.html) in the [OPENRNDR guide](https://guide.openrndr.org) +You will find some [basic instructions](https://guide.openrndr.org/setUpYourFirstProgram.html) in the [OPENRNDR guide](https://guide.openrndr.org). ## Gradle tasks - - `./gradlew run` runs the TemplateProgram (Use `gradlew.bat run` under Windows) + - `./gradlew run` runs `TemplateProgram.kt` (Use `gradlew.bat run` under Windows) + - `./gradlew run -Popenrndr.application=MyProgramKt` runs `src/main/kotlin/myProgram.kt` + - `./gradlew run -Popenrndr.application=foo.bar.MyProgramKt` runs `src/main/kotlin/foo/bar/myProgram.kt` (assuming `package foo.bar` is used in myProgram.kt) - `./gradlew shadowJar` creates an executable platform specific jar file with all dependencies. Run the resulting program by typing `java -jar build/libs/openrndr-template-1.0.0-all.jar` in a terminal from the project root. If your project contains multiple `main` methods, specify which one to run with `java -cp build/libs/openrndr-template-1.0.0-all.jar MyProgramKt`, where `MyProgramKt` can also be `foo.bar.MyProgramKt` if it's in the package `foo.bar`. - - `./gradlew jpackageZip` creates a zip with a stand-alone executable for the current platform (works with Java 14 only) + - `./gradlew jpackageZip` creates a zip with a stand-alone executable for the current platform (works with Java 14 only). Run it like this: `cd build/jpackage/openrndr-application/ && bin/openrndr-application`. + - `./gradlew dependencyUpydates` checks whether any dependencies have newer versions. ## Cross builds @@ -21,33 +24,27 @@ To create a runnable jar for a platform different from your current platform, us ## Updating OPENRNDR, ORX and other dependencies -The openrndr-template depends on various packages including the core [openrndr](https://github.com/openrndr/openrndr/) and the [orx](https://github.com/openrndr/orx/) extensions. The version numbers of these dependencies are specified in your [libs.versions.toml](gradle/libs.versions.toml) file. Learn more about this file in the [Gradle documentation](https://docs.gradle.org/current/userguide/platforms.html#sub:conventional-dependencies-toml) website. +The openrndr-template depends on various packages including the core [openrndr](https://github.com/openrndr/openrndr/) and the [orx](https://github.com/openrndr/orx/) extensions and +provides the optional [orsl](https://github.com/openrndr/orsl/) shader helper modules. +The version numbers of these dependencies are specified in your [libs.versions.toml](gradle/libs.versions.toml) file. +Learn more about this file in the [Gradle documentation](https://docs.gradle.org/current/userguide/platforms.html#sub:conventional-dependencies-toml) website. -Newer versions of OPENRNDR and ORX bring useful features and bug fixes. The most recent versions are +Newer versions bring useful features and bug fixes. The most recent versions are
![Maven Central Version](https://img.shields.io/maven-central/v/org.openrndr/openrndr-math-jvm?label=OPENRNDR&color=%23FFC0CB) -![Maven Central Version](https://img.shields.io/maven-central/v/org.openrndr.extra/orx-noise-jvm?label=ORX&color=%23FFC0CB). +![Maven Central Version](https://img.shields.io/maven-central/v/org.openrndr.extra/orx-noise-jvm?label=ORX&color=%23FFC0CB) +![Maven Central Version](https://img.shields.io/maven-central/v/org.openrndr.orsl/orsl-shader-generator-jvm?label=ORSL&color=%23FFC0CB). -Switch to the [next-version branch](https://github.com/openrndr/openrndr-template/tree/next-version) or enter these versions manually in your toml file. They can look like "0.4.3" or "0.4.3-alpha4". Use the complete string, as in: +Switch to the [next-version branch](https://github.com/openrndr/openrndr-template/tree/next-version) or enter these versions manually in your toml file. +They can look like "0.4.3" or "0.4.3-alpha4". Use the complete string, as in: - openrndr = "0.4.3-alpha4" - orx = "0.4.3-alpha4" + openrndr = "0.4.5-alpha5" + orx = "0.4.5-alpha5" + orsl = "0.4.5-alpha5" You can add other dependencies needed by your project to your [build.gradle.kts](build.gradle.kts) file, inside the `dependencies { }` block. ⚠️ Remember to reload the Gradle configuration after changing any dependencies. -## Run other Kotlin programs from the command line - -By default `./gradlew run` runs a program called `TemplateProgram.kt` but a different one can be provided as an argument: - -To run `src/main/kotlin/myProgram.kt` - - ./gradlew run -Popenrndr.application=MyProgramKt - -To run `src/main/kotlin/foo/bar/myProgram.kt` (assuming `package foo.bar` in myProgram.kt) - - ./gradlew run -Popenrndr.application=foo.bar.MyProgramKt - ## Github Actions This repository contains various Github Actions under `./github/workflows`: diff --git a/build.gradle.kts b/build.gradle.kts index 2310254..0124af9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,8 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.internal.os.OperatingSystem import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion group = "org.openrndr.template" version = "1.0.0" @@ -10,10 +11,12 @@ val applicationMainClass = "TemplateProgramKt" /** ## additional ORX features to be added to this project */ val orxFeatures = setOf( +// "orx-axidraw", // "orx-boofcv", "orx-camera", // "orx-chataigne", "orx-color", +// "orx-composition", "orx-compositor", // "orx-compute-graph", // "orx-compute-graph-nodes", @@ -22,6 +25,8 @@ val orxFeatures = setOf( // "orx-easing", "orx-envelopes", // "orx-expression-evaluator", +// "orx-fcurve", +// "orx-fft", // "orx-file-watcher", "orx-fx", // "orx-git-archiver", @@ -37,6 +42,7 @@ val orxFeatures = setOf( // "orx-kinect-v1", // "orx-kotlin-parser", // "orx-marching-squares", +// "orx-math", // "orx-mesh-generators", // "orx-midi", // "orx-minim", @@ -57,9 +63,11 @@ val orxFeatures = setOf( "orx-shade-styles", // "orx-shader-phrases", "orx-shapes", +// "orx-svg", // "orx-syphon", // "orx-temporal-blur", // "orx-tensorflow", +// "orx-text-writer", // "orx-time-operators", // "orx-timer", // "orx-triangulation", @@ -101,6 +109,7 @@ plugins { alias(libs.plugins.runtime) alias(libs.plugins.gitarchive.tomarkdown).apply(false) alias(libs.plugins.versions) + alias(libs.plugins.kotlin.serialization) } repositories { @@ -111,20 +120,28 @@ repositories { dependencies { // implementation(libs.jsoup) -// implementation(libs.gson) // implementation(libs.csv) + /* ORSL dependencies */ + +// implementation(libs.orsl.shader.generator) +// implementation(libs.orsl.extension.color) +// implementation(libs.orsl.extension.easing) +// implementation(libs.orsl.extension.gradient) +// implementation(libs.orsl.extension.noise) +// implementation(libs.orsl.extension.pbr) +// implementation(libs.orsl.extension.raymarching) +// implementation(libs.orsl.extension.sdf) + implementation(libs.kotlinx.coroutines.core) + implementation(libs.kotlinx.serialization.core) + implementation(libs.kotlinx.serialization.json) implementation(libs.slf4j.api) implementation(libs.kotlin.logging) when (applicationLogging) { - Logging.NONE -> { - runtimeOnly(libs.slf4j.nop) - } - Logging.SIMPLE -> { - runtimeOnly(libs.slf4j.simple) - } + Logging.NONE -> runtimeOnly(libs.slf4j.nop) + Logging.SIMPLE -> runtimeOnly(libs.slf4j.simple) Logging.FULL -> { runtimeOnly(libs.log4j.slf4j2) runtimeOnly(libs.log4j.core) @@ -139,21 +156,24 @@ dependencies { // ------------------------------------------------------------------------------------------------------------------ // java { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } -tasks.withType { - kotlinOptions.jvmTarget = "11" +kotlin { + compilerOptions { + languageVersion = KotlinVersion.KOTLIN_2_0 + apiVersion = KotlinVersion.KOTLIN_2_0 + jvmTarget = JvmTarget.JVM_17 + } } // ------------------------------------------------------------------------------------------------------------------ // -project.setProperty("mainClassName", applicationMainClass) - application { - if (hasProperty("openrndr.application")) { - mainClass.set("${property("openrndr.application")}") - } + mainClass = if (hasProperty("openrndr.application")) + "${property("openrndr.application")}" + else + applicationMainClass } tasks { @@ -172,34 +192,33 @@ tasks { exclude(dependency("org.bytedeco:.*")) } } +} + +// ------------------------------------------------------------------------------------------------------------------ // + +tasks { named("jpackage") { doLast { - val destPath = if(OperatingSystem.current().isMacOsX) + val destPath = if (OperatingSystem.current().isMacOsX) "build/jpackage/openrndr-application.app/Contents/Resources/data" else "build/jpackage/openrndr-application/data" copy { - from("data") { - include("**/*") - } + from("data") { include("**/*") } into(destPath) } } } -} -// ------------------------------------------------------------------------------------------------------------------ // - -tasks.register("jpackageZip") { - archiveFileName.set("openrndr-application.zip") - from("${layout.buildDirectory.get()}/jpackage") { - include("**/*") + register("jpackageZip") { + archiveFileName = "openrndr-application.zip" + from("${layout.buildDirectory.get()}/jpackage") { + include("**/*") + } + dependsOn("jpackage") } } -tasks.findByName("jpackageZip")?.dependsOn("jpackage") - -// ------------------------------------------------------------------------------------------------------------------ // runtime { jpackage { @@ -210,14 +229,16 @@ runtime { jvmArgs.add("-Duser.dir=${"$"}APPDIR/../Resources") } } - options.set(listOf("--strip-debug", "--compress", "1", "--no-header-files", "--no-man-pages")) - modules.set(listOf("jdk.unsupported", "java.management", "java.desktop")) + options = listOf("--strip-debug", "--compress", "1", "--no-header-files", "--no-man-pages") + modules = listOf("jdk.unsupported", "java.management", "java.desktop") } // ------------------------------------------------------------------------------------------------------------------ // -tasks.register("gitArchiveToMarkDown") { - historySize.set(20) +tasks { + register("gitArchiveToMarkDown") { + historySize = 20 + } } // ------------------------------------------------------------------------------------------------------------------ // @@ -228,9 +249,7 @@ tasks { val nonStableKeywords = listOf("alpha", "beta", "rc") - fun isNonStable( - version: String - ) = nonStableKeywords.any { + fun isNonStable(version: String) = nonStableKeywords.any { version.lowercase().contains(it) } @@ -266,11 +285,13 @@ class Openrndr { "aarch64", "arm-v8" -> "macos-arm64" else -> "macos" } + currOs.isLinux -> when (currArch) { "x86-64" -> "linux-x64" "aarch64" -> "linux-arm64" else -> throw IllegalArgumentException("architecture not supported: $currArch") } + else -> throw IllegalArgumentException("os not supported: ${currOs.name}") } @@ -287,7 +308,6 @@ class Openrndr { implementation(openrndr("openal")) runtimeOnly(openrndrNatives("openal")) implementation(openrndr("application")) - implementation(openrndr("svg")) implementation(openrndr("animatable")) implementation(openrndr("extensions")) implementation(openrndr("filter")) @@ -308,25 +328,26 @@ class Openrndr { } } } + val openrndr = Openrndr() if (properties["openrndr.tasks"] == "true") { - task("create executable jar for $applicationMainClass") { + tasks.register("create executable jar for $applicationMainClass") { group = " \uD83E\uDD8C OPENRNDR" dependsOn("shadowJar") } - task("run $applicationMainClass") { + tasks.register("run $applicationMainClass") { group = " \uD83E\uDD8C OPENRNDR" dependsOn("run") } - task("create standalone executable for $applicationMainClass") { + tasks.register("create standalone executable for $applicationMainClass") { group = " \uD83E\uDD8C OPENRNDR" dependsOn("jpackageZip") } - task("add IDE file scopes") { + tasks.register("add IDE file scopes") { group = " \uD83E\uDD8C OPENRNDR" val scopesFolder = File("${project.projectDir}/.idea/scopes") scopesFolder.mkdirs() diff --git a/gradle.properties b/gradle.properties index d847ff6..f565d97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,6 @@ openrndr.tasks=true kotlin.code.style=official #org.gradle.configuration-cache=true -#org.gradle.configuration-cache.problems=warn \ No newline at end of file +#org.gradle.configuration-cache.parallel=true +#org.gradle.configuration-cache.problems=warn + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4a6fdd7..5a37ace 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,12 +1,21 @@ [versions] -kotlin = "1.9.22" -openrndr = "0.4.4" -orx = "0.4.4" +kotlin = "2.2.10" +openrndr = "0.4.5" +orx = "0.4.5" +orsl = "0.4.5-alpha5" orml = "0.4.1" - -slf4j = "2.0.10" -log4j = "2.22.1" -jackson = "2.16.1" +slf4j = "2.0.17" +log4j = "2.23.1" +jackson = "2.17.2" +junit = "4.13.2" +kotlinxCoroutines = "1.10.2" +kotlinxSerialization = "1.9.0" +kotlinLogging = "7.0.13" +kotlinCsvJvm = "1.9.3" +jsoup = "1.17.1" +shadow = "9.1.0" +runtime = "1.13.1" +versions = "0.52.0" [libraries] kotlin-script-runtime = { group = "org.jetbrains.kotlin", name = "kotlin-script-runtime", version.ref = "kotlin" } @@ -19,17 +28,27 @@ log4j-core = { group = "org.apache.logging.log4j", name = "log4j-core", version. jackson-databind = { group = "com.fasterxml.jackson.core", name = "jackson-databind", version.ref = "jackson" } jackson-json = { group = "com.fasterxml.jackson.dataformat", name = "jackson-dataformat-yaml", version.ref = "jackson" } -kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version = "1.7.3" } -kotlin-logging = { group = "io.github.microutils", name = "kotlin-logging", version = "3.0.5" } -junit = { group = "junit", name = "junit", version = "4.13.2" } -jsoup = { group = "org.jsoup", name = "jsoup", version = "1.17.1" } -gson = { group = "com.google.code.gson", name = "gson", version = "2.10.1" } -csv = { group = "com.github.doyaaaaaken", name = "kotlin-csv-jvm", version = "1.9.2" } +orsl-shader-generator = { group = "org.openrndr.extra", name = "orsl-shader-generator", version.ref = "orsl" } +orsl-extension-color = { group = "org.openrndr.extra", name = "orsl-extension-color", version.ref = "orsl" } +orsl-extension-easing = { group = "org.openrndr.extra", name = "orsl-extension-easing", version.ref = "orsl" } +orsl-extension-gradient = { group = "org.openrndr.extra", name = "orsl-extension-gradient", version.ref = "orsl" } +orsl-extension-noise = { group = "org.openrndr.extra", name = "orsl-extension-noise", version.ref = "orsl" } +orsl-extension-pbr = { group = "org.openrndr.extra", name = "orsl-extension-pbr", version.ref = "orsl" } +orsl-extension-raymarching = { group = "org.openrndr.extra", name = "orsl-extension-raymarching", version.ref = "orsl" } +orsl-extension-sdf = { group = "org.openrndr.extra", name = "orsl-extension-sdf", version.ref = "orsl" } + +kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } +kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" } +kotlinx-serialization-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-core", version.ref = "kotlinxSerialization" } +kotlin-logging = { group = "io.github.oshai", name = "kotlin-logging", version.ref = "kotlinLogging" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoup" } +csv = { group = "com.github.doyaaaaaken", name = "kotlin-csv-jvm", version.ref = "kotlinCsvJvm" } [plugins] kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } -shadow = { id = "com.github.johnrengelman.shadow", version = "8.1.1" } -runtime = { id = "org.beryx.runtime", version = "1.13.0" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } +runtime = { id = "org.beryx.runtime", version.ref = "runtime" } gitarchive-tomarkdown = { id = "org.openrndr.extra.gitarchiver.tomarkdown", version.ref = "orx" } -versions = { id = "com.github.ben-manes.versions", version = "0.50.0" } - +versions = { id = "com.github.ben-manes.versions", version.ref = "versions" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c35211..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9355b41..d4081da 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/kotlin/TemplateProgram.kt b/src/main/kotlin/TemplateProgram.kt index 5d13057..b8e2afe 100644 --- a/src/main/kotlin/TemplateProgram.kt +++ b/src/main/kotlin/TemplateProgram.kt @@ -2,7 +2,7 @@ import org.openrndr.application import org.openrndr.color.ColorRGBa import org.openrndr.draw.loadFont import org.openrndr.draw.loadImage -import org.openrndr.draw.tint +import org.openrndr.extra.color.colormatrix.tint import kotlin.math.cos import kotlin.math.sin