diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..149f4c4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.bat eol=crlf + diff --git a/.github/workflows/build-on-commit.yaml b/.github/workflows/build-on-commit.yaml new file mode 100644 index 0000000..3d6e6b2 --- /dev/null +++ b/.github/workflows/build-on-commit.yaml @@ -0,0 +1,20 @@ +name: Build on commit +on: + push: + branches: + - master +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + #cache: 'gradle' + + - name: Build sources + run: ./gradlew build + diff --git a/.github/workflows/publish-binaries.yaml b/.github/workflows/publish-binaries.yaml new file mode 100644 index 0000000..c1c67d8 --- /dev/null +++ b/.github/workflows/publish-binaries.yaml @@ -0,0 +1,59 @@ +name: Publish binaries + +on: + push: + tags: + - v1.* + - v1.*.* + +permissions: + contents: write + +# Required to make env var work on Windows +defaults: + run: + shell: bash + +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '17' + #cache: 'gradle' + + - name: Build with Gradle + run: ./gradlew jpackageZip + + - run: echo "OR_TARGET_NAME=linux-x64" >> $GITHUB_ENV + if: matrix.os == 'ubuntu-latest' + + - run: echo "OR_TARGET_NAME=macos" >> $GITHUB_ENV + if: matrix.os == 'macos-latest' + + - run: echo "OR_TARGET_NAME=windows" >> $GITHUB_ENV + if: matrix.os == 'windows-latest' + + - name: Rename jpackage zip + 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 + id: create_release + with: + token: ${{ secrets.GITHUB_TOKEN }} + allowUpdates: true + replacesArtifacts: false + body: Fully automated release + artifacts: "./build/distributions/openrndr-application-${{env.OR_TARGET_NAME}}.zip" + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62c248a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +application.log +build +out +.idea +.gradle +video/ +screenshots/ +gui-parameters/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..1e7537a --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# OPENRNDR template project + +A feature rich template for creating OPENRNDR programs based on [Gradle/Kts](https://en.wikipedia.org/wiki/Gradle). + +The template consists of a configuration for Gradle and two example OPENRNDR programs. The Gradle configuration should serve as the +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) + +## Gradle tasks + + - `./gradlew run` runs the TemplateProgram (Use `gradlew.bat run` under Windows) + - `./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. + - `./gradlew jpackageZip` creates a zip with a stand-alone executable for the current platform (works with Java 14 only) + +## Cross builds + +To create a runnable jar for a platform different from your current platform, use `./gradlew jar -PtargetPlatform=`, where `` is either `windows`, `macos`, `linux-x64`, or `linux-arm64`. + +## 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. If you want to learn about file format visit 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 +
![openrndr version](https://maven-badges.herokuapp.com/maven-central/org.openrndr/openrndr-application/badge.svg) for OPENRNDR. +
![orx version](https://maven-badges.herokuapp.com/maven-central/org.openrndr.extra/orx-parameters-jvm/badge.svg) for ORX. + +You can use those version numbers 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" + +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 a number of Github Actions under `./github/workflows`. + +[build-on-commit.yaml](.github/workflows/build-on-commit.yaml) runs a basic build on every commit, +which can help detect issues in the source code. + +[publish-binaries.yaml](.github/workflows/publish-binaries.yaml) publishes binaries for Linux, Mac and Windows +any time a commit is tagged with a version number like `v1.*`. + +For example, we can create and push a tag with these git commands: + + git tag -a v1.0.0 -m "v1.0.0" + git push origin v1.0.0 + +The progress of the running actions can be followed under the Actions tab in GitHub. +Once complete, the executables will be found under the Releases section. + diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..32b8bbe --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,329 @@ +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 + +group = "org.openrndr.template" +version = "1.0.0" + +val applicationMainClass = "TemplateProgramKt" + +/** ## additional ORX features to be added to this project */ +val orxFeatures = setOf( +// "orx-boofcv", + "orx-camera", +// "orx-chataigne", + "orx-color", + "orx-compositor", +// "orx-compute-graph", +// "orx-compute-graph-nodes", +// "orx-dnk3", +// "orx-easing", +// "orx-expression-evaluator", +// "orx-file-watcher", + "orx-fx", +// "orx-git-archiver", +// "orx-glslify", +// "orx-gradient-descent", + "orx-gui", +// "orx-hash-grid", + "orx-image-fit", +// "orx-integral-image", +// "orx-interval-tree", +// "orx-jumpflood", +// "orx-kdtree", +// "orx-keyframer", +// "orx-kinect-v1", +// "orx-kotlin-parser", +// "orx-marching-squares", +// "orx-mesh-generators", +// "orx-midi", +// "orx-minim", + "orx-no-clear", + "orx-noise", +// "orx-obj-loader", + "orx-olive", +// "orx-osc", +// "orx-palette", + "orx-panel", +// "orx-parameters", +// "orx-poisson-fill", +// "orx-quadtree", +// "orx-rabbit-control", +// "orx-realsense2", +// "orx-runway", + "orx-shade-styles", +// "orx-shader-phrases", + "orx-shapes", +// "orx-syphon", +// "orx-temporal-blur", +// "orx-tensorflow", +// "orx-time-operators", +// "orx-timer", +// "orx-triangulation", +// "orx-turtle", + "orx-video-profiles", + "orx-view-box", +) + +/** ## additional ORML features to be added to this project */ +val ormlFeatures = setOf( +// "orml-blazepose", +// "orml-dbface", +// "orml-facemesh", +// "orml-image-classifier", +// "orml-psenet", +// "orml-ssd", +// "orml-style-transfer", +// "orml-super-resolution", +// "orml-u2net", +) + +/** ## additional OPENRNDR features to be added to this project */ +val openrndrFeatures = setOfNotNull( + if (DefaultNativePlatform("current").architecture.name != "arm-v8") "video" else null +) + +/** ## configure the type of logging this project uses */ +enum class Logging { NONE, SIMPLE, FULL } + +val applicationLogging = Logging.FULL + +// ------------------------------------------------------------------------------------------------------------------ // + +@Suppress("DSL_SCOPE_VIOLATION") +plugins { + java + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.shadow) + alias(libs.plugins.runtime) + alias(libs.plugins.gitarchive.tomarkdown).apply(false) +} + +repositories { + mavenCentral() + mavenLocal() +} + +dependencies { + +// implementation(libs.jsoup) +// implementation(libs.gson) +// implementation(libs.csv) + + implementation(libs.kotlinx.coroutines.core) + implementation(libs.slf4j.api) + implementation(libs.kotlin.logging) + + when (applicationLogging) { + Logging.NONE -> { + runtimeOnly(libs.slf4j.nop) + } + Logging.SIMPLE -> { + runtimeOnly(libs.slf4j.simple) + } + Logging.FULL -> { + runtimeOnly(libs.log4j.slf4j2) + runtimeOnly(libs.log4j.core) + runtimeOnly(libs.jackson.databind) + runtimeOnly(libs.jackson.json) + } + } + implementation(kotlin("stdlib-jdk8")) + testImplementation(libs.junit) +} + +// ------------------------------------------------------------------------------------------------------------------ // + +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 +} +tasks.withType { + kotlinOptions.jvmTarget = "11" +} + +// ------------------------------------------------------------------------------------------------------------------ // + +project.setProperty("mainClassName", applicationMainClass) + +application { + if (hasProperty("openrndr.application")) { + mainClass.set("${property("openrndr.application")}") + } +} + +tasks { + named("shadowJar") { + manifest { + attributes["Main-Class"] = applicationMainClass + attributes["Implementation-Version"] = project.version + } + minimize { + exclude(dependency("org.openrndr:openrndr-gl3:.*")) + exclude(dependency("org.jetbrains.kotlin:kotlin-reflect:.*")) + exclude(dependency("org.slf4j:slf4j-simple:.*")) + exclude(dependency("org.apache.logging.log4j:log4j-slf4j2-impl:.*")) + exclude(dependency("com.fasterxml.jackson.core:jackson-databind:.*")) + exclude(dependency("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:.*")) + } + } + named("jpackage") { + doLast { + val destPath = if(OperatingSystem.current().isMacOsX) + "build/jpackage/openrndr-application.app/Contents/Resources/data" + else + "build/jpackage/openrndr-application/data" + + copy { + from("data") { + include("**/*") + } + into(destPath) + } + } + } +} + +// ------------------------------------------------------------------------------------------------------------------ // + +tasks.register("jpackageZip") { + archiveFileName.set("openrndr-application.zip") + from("$buildDir/jpackage") { + include("**/*") + } +} +tasks.findByName("jpackageZip")?.dependsOn("jpackage") + +// ------------------------------------------------------------------------------------------------------------------ // + +runtime { + jpackage { + imageName = "openrndr-application" + skipInstaller = true + if (OperatingSystem.current().isMacOsX) { + jvmArgs.add("-XstartOnFirstThread") + 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")) +} + +// ------------------------------------------------------------------------------------------------------------------ // + +tasks.register("gitArchiveToMarkDown") { + historySize.set(20) +} + +// ------------------------------------------------------------------------------------------------------------------ // + +class Openrndr { + val openrndrVersion = libs.versions.openrndr.get() + val orxVersion = libs.versions.orx.get() + val ormlVersion = libs.versions.orml.get() + + // choices are "orx-tensorflow-gpu", "orx-tensorflow" + val orxTensorflowBackend = "orx-tensorflow" + + val currArch = DefaultNativePlatform("current").architecture.name + val currOs = OperatingSystem.current() + val os = if (project.hasProperty("targetPlatform")) { + val supportedPlatforms = setOf("windows", "macos", "linux-x64", "linux-arm64") + val platform: String = project.property("targetPlatform") as String + if (platform !in supportedPlatforms) { + throw IllegalArgumentException("target platform not supported: $platform") + } else { + platform + } + } else when { + currOs.isWindows -> "windows" + currOs.isMacOsX -> when (currArch) { + "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}") + } + + fun orx(module: String) = "org.openrndr.extra:$module:$orxVersion" + fun orml(module: String) = "org.openrndr.orml:$module:$ormlVersion" + fun openrndr(module: String) = "org.openrndr:openrndr-$module:$openrndrVersion" + fun openrndrNatives(module: String) = "org.openrndr:openrndr-$module-natives-$os:$openrndrVersion" + fun orxNatives(module: String) = "org.openrndr.extra:$module-natives-$os:$orxVersion" + + init { + dependencies { + runtimeOnly(openrndr("gl3")) + runtimeOnly(openrndrNatives("gl3")) + implementation(openrndr("openal")) + runtimeOnly(openrndrNatives("openal")) + implementation(openrndr("application")) + implementation(openrndr("svg")) + implementation(openrndr("animatable")) + implementation(openrndr("extensions")) + implementation(openrndr("filter")) + implementation(openrndr("dialogs")) + if ("video" in openrndrFeatures) { + implementation(openrndr("ffmpeg")) + runtimeOnly(openrndrNatives("ffmpeg")) + } + for (feature in orxFeatures) { + implementation(orx(feature)) + } + for (feature in ormlFeatures) { + implementation(orml(feature)) + } + if ("orx-tensorflow" in orxFeatures) runtimeOnly("org.openrndr.extra:$orxTensorflowBackend-natives-$os:$orxVersion") + if ("orx-kinect-v1" in orxFeatures) runtimeOnly(orxNatives("orx-kinect-v1")) + if ("orx-olive" in orxFeatures) implementation(libs.kotlin.script.runtime) + } + } +} +val openrndr = Openrndr() + +if (properties["openrndr.tasks"] == "true") { + task("create executable jar for $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("shadowJar") + } + + task("run $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("run") + } + + task("create standalone executable for $applicationMainClass") { + group = " \uD83E\uDD8C OPENRNDR" + dependsOn("jpackageZip") + } + + task("add IDE file scopes") { + group = " \uD83E\uDD8C OPENRNDR" + val scopesFolder = File("${project.projectDir}/.idea/scopes") + scopesFolder.mkdirs() + + val files = listOf( + "Code" to "file:*.kt||file:*.frag||file:*.vert||file:*.glsl", + "Text" to "file:*.txt||file:*.md||file:*.xml||file:*.json", + "Gradle" to "file[*buildSrc*]:*/||file:*gradle.*||file:*.gradle||file:*/gradle-wrapper.properties||file:*.toml", + "Images" to "file:*.png||file:*.jpg||file:*.dds||file:*.exr" + ) + files.forEach { (name, pattern) -> + val file = File(scopesFolder, "__$name.xml") + if (!file.exists()) { + file.writeText( + """ + + + + """.trimIndent() + ) + } + } + } +} diff --git a/data/fonts/default.otf b/data/fonts/default.otf new file mode 100644 index 0000000..8e72e14 Binary files /dev/null and b/data/fonts/default.otf differ diff --git a/data/fonts/license.txt b/data/fonts/license.txt new file mode 100644 index 0000000..f72f765 --- /dev/null +++ b/data/fonts/license.txt @@ -0,0 +1,92 @@ +Copyright © 2017 IBM Corp. with Reserved Font Name "Plex" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. \ No newline at end of file diff --git a/data/images/cheeta.jpg b/data/images/cheeta.jpg new file mode 100644 index 0000000..0bcc9b7 Binary files /dev/null and b/data/images/cheeta.jpg differ diff --git a/data/images/pm5544.png b/data/images/pm5544.png new file mode 100644 index 0000000..4c55c9d Binary files /dev/null and b/data/images/pm5544.png differ diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..fbb0c0b --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +openrndr.tasks=true +kotlin.code.style=official +org.gradle.unsafe.configuration-cache=false + diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 0000000..934c538 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,33 @@ +[versions] +kotlin = "1.8.21" +openrndr = "0.4.3" +orx = "0.4.3" +orml = "0.4.1" + +slf4j = "2.0.7" +log4j = "2.20.0" +jackson = "2.14.2" + +[libraries] +kotlin-script-runtime = { group = "org.jetbrains.kotlin", name = "kotlin-script-runtime", version.ref = "kotlin" } + +slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" } +slf4j-nop = { group = "org.slf4j", name = "slf4j-nop", version.ref = "slf4j" } +slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" } +log4j-slf4j2 = { group = "org.apache.logging.log4j", name = "log4j-slf4j2-impl", version.ref = "log4j" } +log4j-core = { group = "org.apache.logging.log4j", name = "log4j-core", version.ref = "log4j" } +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.6.4" } +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.16.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.0" } + +[plugins] +kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } +shadow = { id = "com.github.johnrengelman.shadow", version = "7.1.2" } +runtime = { id = "org.beryx.runtime", version = "1.13.0" } +gitarchive-tomarkdown = { id = "org.openrndr.extra.gitarchiver.tomarkdown", version.ref = "orx" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..c1962a7 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..37aef8d --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..aeb74cb --- /dev/null +++ b/gradlew @@ -0,0 +1,245 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..31a934b --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,8 @@ +rootProject.name = "openrndr-template" + +pluginManagement { + repositories { + gradlePluginPortal() + mavenLocal() + } +} diff --git a/src/main/kotlin/TemplateLiveProgram.kt b/src/main/kotlin/TemplateLiveProgram.kt new file mode 100644 index 0000000..314bc54 --- /dev/null +++ b/src/main/kotlin/TemplateLiveProgram.kt @@ -0,0 +1,22 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extra.olive.oliveProgram + +/** + * This is a template for a live program. + * + * It uses oliveProgram {} instead of program {}. All code inside the + * oliveProgram {} can be changed while the program is running. + */ + +fun main() = application { + configure { + width = 800 + height = 800 + } + oliveProgram { + extend { + drawer.clear(ColorRGBa.PINK) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/TemplateProgram.kt b/src/main/kotlin/TemplateProgram.kt new file mode 100644 index 0000000..5d13057 --- /dev/null +++ b/src/main/kotlin/TemplateProgram.kt @@ -0,0 +1,31 @@ +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 kotlin.math.cos +import kotlin.math.sin + +fun main() = application { + configure { + width = 768 + height = 576 + } + + program { + val image = loadImage("data/images/pm5544.png") + val font = loadFont("data/fonts/default.otf", 64.0) + + extend { + drawer.drawStyle.colorMatrix = tint(ColorRGBa.WHITE.shade(0.2)) + drawer.image(image) + + drawer.fill = ColorRGBa.PINK + drawer.circle(cos(seconds) * width / 2.0 + width / 2.0, sin(0.5 * seconds) * height / 2.0 + height / 2.0, 140.0) + + drawer.fontMap = font + drawer.fill = ColorRGBa.WHITE + drawer.text("OPENRNDR", width / 2.0, height / 2.0) + } + } +} diff --git a/src/main/resources/log4j2.yaml b/src/main/resources/log4j2.yaml new file mode 100644 index 0000000..021e84d --- /dev/null +++ b/src/main/resources/log4j2.yaml @@ -0,0 +1,21 @@ +Configuration: + status: warn + Appenders: + Console: + - name: Console_Info + target: SYSTEM_ERR + PatternLayout: + Pattern: "%highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=green} %style{[%t]}{white} %style{%-30.30c{1.}}{white} %style{ ↘ %m%n%ex}{white}" + #Pattern: "%style{%d{yyyy-MM-dd HH:mm:ss.SSS}}{white} %highlight{${LOG_LEVEL_PATTERN:-%5p}}{FATAL=red, ERROR=red, WARN=yellow, INFO=green, DEBUG=green, TRACE=green} %style{[%t]}{white} %style{%-30.30c{1.}}{cyan} %style{:%m%n%ex}{white}" + File: + append: false + name: File_Appender + fileName: application.log + PatternLayout: + Pattern: "%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" + Loggers: + Root: + level: info + AppenderRef: + - ref: Console_Info + - ref: File_Appender \ No newline at end of file