From b9a75662db53d499f181076862f5364d7c3869d8 Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Sat, 6 Jul 2019 23:24:09 +0200 Subject: [PATCH 1/6] Upgrade Gradle, Kotlin, and libraries --- extras/EsotericSoftwareSpine/build.gradle | 25 ++++++------------ .../gradle/wrapper/gradle-wrapper.jar | Bin 54727 -> 56177 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +-- .../rhubarb_for_spine/AnimationFileModel.kt | 5 ++-- .../rhubarb_for_spine/MainView.kt | 14 +++++----- .../rhubarb_for_spine/RhubarbTask.kt | 5 +--- .../rhubarb_for_spine/SpineJson.kt | 2 +- 7 files changed, 22 insertions(+), 33 deletions(-) diff --git a/extras/EsotericSoftwareSpine/build.gradle b/extras/EsotericSoftwareSpine/build.gradle index 21e6aa7..c459cbb 100644 --- a/extras/EsotericSoftwareSpine/build.gradle +++ b/extras/EsotericSoftwareSpine/build.gradle @@ -1,3 +1,7 @@ +plugins { + id 'org.jetbrains.kotlin.jvm' version '1.3.41' +} + def getVersion() { // Dynamically read version from CMake file String text = new File('../../appInfo.cmake').getText('UTF-8') @@ -12,29 +16,16 @@ def getVersion() { group 'com.rhubarb_lip_sync' version = getVersion() -buildscript { - ext.kotlin_version = '1.1.60' - - repositories { - mavenCentral() - } - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -apply plugin: 'kotlin' - repositories { mavenCentral() jcenter() } dependencies { - compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" - compile 'com.beust:klaxon:0.30' - compile 'org.apache.commons:commons-lang3:3.7' - compile 'no.tornado:tornadofx:1.7.12' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + implementation 'com.beust:klaxon:5.0.1' + implementation 'org.apache.commons:commons-lang3:3.9' + implementation 'no.tornado:tornadofx:1.7.19' } compileKotlin { diff --git a/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.jar b/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.jar index 27768f1bbac3ce2d055b20d521f12da78d331e8e..94336fcae912db8a11d55634156fa011f4686124 100644 GIT binary patch delta 50065 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≫UTSDPWw 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 I_Wfh~f4qVHCjbBd diff --git a/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties b/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties index 62e1e30..b0acbdc 100644 --- a/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties +++ b/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionUrl=https\://services.gradle.org/distributions/gradle-4.3-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-bin.zip zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt index 1f5c884..cb8edd5 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt @@ -6,6 +6,7 @@ import javafx.beans.property.SimpleListProperty import javafx.beans.property.SimpleObjectProperty import javafx.beans.property.SimpleStringProperty import javafx.collections.ObservableList +import tornadofx.asObservable import java.nio.file.Path import tornadofx.getValue import tornadofx.observable @@ -61,7 +62,7 @@ class AnimationFileModel(val parentModel: MainModel, animationFilePath: Path, pr audioFileModel = AudioFileModel(event, this, executor, reportResult) return@map audioFileModel } - .observable() + .asObservable() ) val audioFileModels: ObservableList by audioFileModelsProperty @@ -97,7 +98,7 @@ class AnimationFileModel(val parentModel: MainModel, animationFilePath: Path, pr } init { - slots = spineJson.slots.observable() + slots = spineJson.slots.asObservable() mouthSlot = spineJson.guessMouthSlot() } diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt index 7a67e91..abdd109 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt @@ -115,13 +115,13 @@ class MainView : View() { placeholder = Label("There are no events with associated audio files.") columnResizePolicy = SmartResize.POLICY column("Event", AudioFileModel::eventNameProperty) - .weigthedWidth(1.0) + .weightedWidth(1.0) column("Animation name", AudioFileModel::animationNameProperty) - .weigthedWidth(1.0) + .weightedWidth(1.0) column("Audio file", AudioFileModel::displayFilePathProperty) - .weigthedWidth(1.0) + .weightedWidth(1.0) column("Dialog", AudioFileModel::dialogProperty).apply { - weigthedWidth(3.0) + weightedWidth(3.0) // Make dialog column wrap setCellFactory { tableColumn -> return@setCellFactory TableCell().also { cell -> @@ -138,7 +138,7 @@ class MainView : View() { } } column("Status", AudioFileModel::audioFileStateProperty).apply { - weigthedWidth(1.0) + weightedWidth(1.0) setCellFactory { return@setCellFactory object : TableCell() { override fun updateItem(state: AudioFileState?, empty: Boolean) { @@ -176,7 +176,7 @@ class MainView : View() { } } column("", AudioFileModel::actionLabelProperty).apply { - weigthedWidth(1.0) + weightedWidth(1.0) // Show button setCellFactory { return@setCellFactory object : TableCell() { @@ -254,4 +254,4 @@ class MainView : View() { ) } } -} \ No newline at end of file +} diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt index 0694e79..d615ef2 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt @@ -1,9 +1,6 @@ package com.rhubarb_lip_sync.rhubarb_for_spine import com.beust.klaxon.JsonObject -import com.beust.klaxon.array -import com.beust.klaxon.double -import com.beust.klaxon.string import com.beust.klaxon.Parser as JsonParser import org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS import java.io.* @@ -78,7 +75,7 @@ class RhubarbTask( } } - private val jsonParser = JsonParser() + private val jsonParser = JsonParser.default() private fun parseJsonObject(jsonString: String): JsonObject { return jsonParser.parse(StringReader(jsonString)) as JsonObject } diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt index 2fe77b8..fbf6cae 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt @@ -17,7 +17,7 @@ class SpineJson(private val filePath: Path) { throw EndUserException("File '$filePath' does not exist.") } try { - json = Parser().parse(filePath.toString()) as JsonObject + json = Parser.default().parse(filePath.toString()) as JsonObject } catch (e: Exception) { throw EndUserException("Wrong file format. This is not a valid JSON file.") } From d803140e68479a0418e3031c95ba078499068732 Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Mon, 8 Jul 2019 20:53:10 +0200 Subject: [PATCH 2/6] Simplify directory structure by un-nesting Kotlin files --- .../rhubarb_lip_sync/rhubarb_for_spine => }/AnimationFileModel.kt | 0 .../rhubarb_lip_sync/rhubarb_for_spine => }/AudioFileModel.kt | 0 .../rhubarb_lip_sync/rhubarb_for_spine => }/EndUserException.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/ErrorProperty.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainApp.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainModel.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainView.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthCue.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthNaming.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthShape.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/RhubarbTask.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/SpineJson.kt | 0 .../{com/rhubarb_lip_sync/rhubarb_for_spine => }/classLocation.kt | 0 .../kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/main.kt | 0 .../kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/tools.kt | 0 15 files changed, 0 insertions(+), 0 deletions(-) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/AnimationFileModel.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/AudioFileModel.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/EndUserException.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/ErrorProperty.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainApp.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainModel.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MainView.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthCue.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthNaming.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/MouthShape.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/RhubarbTask.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/SpineJson.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/classLocation.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/main.kt (100%) rename extras/EsotericSoftwareSpine/src/main/kotlin/{com/rhubarb_lip_sync/rhubarb_for_spine => }/tools.kt (100%) diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/AnimationFileModel.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AnimationFileModel.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/AnimationFileModel.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AudioFileModel.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/AudioFileModel.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/AudioFileModel.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/AudioFileModel.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/EndUserException.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/EndUserException.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/EndUserException.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/EndUserException.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/ErrorProperty.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/ErrorProperty.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/ErrorProperty.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/ErrorProperty.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainApp.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MainApp.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainApp.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MainApp.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainModel.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MainModel.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainModel.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MainModel.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MainView.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MainView.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MainView.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthCue.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MouthCue.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthCue.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MouthCue.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthNaming.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MouthNaming.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthNaming.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MouthNaming.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthShape.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/MouthShape.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/MouthShape.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/MouthShape.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/RhubarbTask.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/RhubarbTask.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/RhubarbTask.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/SpineJson.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/classLocation.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/classLocation.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/classLocation.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/classLocation.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/main.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/main.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/main.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/main.kt diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/tools.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/tools.kt similarity index 100% rename from extras/EsotericSoftwareSpine/src/main/kotlin/com/rhubarb_lip_sync/rhubarb_for_spine/tools.kt rename to extras/EsotericSoftwareSpine/src/main/kotlin/tools.kt From b012c4f7f243fe2ad45c70b2fec98d7e3d78f746 Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Tue, 9 Jul 2019 21:12:46 +0200 Subject: [PATCH 3/6] Add Gradle sources --- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties b/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties index b0acbdc..e0c4de3 100644 --- a/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties +++ b/extras/EsotericSoftwareSpine/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 3f55afa9a8b90d8d094e32d9c99b32eba6e3476a Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Thu, 11 Jul 2019 21:08:10 +0200 Subject: [PATCH 4/6] Migrate to Gradle Kotlin DSL, fix fat JAR --- extras/EsotericSoftwareSpine/CMakeLists.txt | 2 +- extras/EsotericSoftwareSpine/build.gradle | 47 ------------------ extras/EsotericSoftwareSpine/build.gradle.kts | 48 +++++++++++++++++++ extras/EsotericSoftwareSpine/settings.gradle | 2 - .../EsotericSoftwareSpine/settings.gradle.kts | 1 + 5 files changed, 50 insertions(+), 50 deletions(-) delete mode 100644 extras/EsotericSoftwareSpine/build.gradle create mode 100644 extras/EsotericSoftwareSpine/build.gradle.kts delete mode 100644 extras/EsotericSoftwareSpine/settings.gradle create mode 100644 extras/EsotericSoftwareSpine/settings.gradle.kts diff --git a/extras/EsotericSoftwareSpine/CMakeLists.txt b/extras/EsotericSoftwareSpine/CMakeLists.txt index 28786d2..c341cdd 100644 --- a/extras/EsotericSoftwareSpine/CMakeLists.txt +++ b/extras/EsotericSoftwareSpine/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.2) add_custom_target( rhubarbForSpine ALL - "./gradlew" "jar" + "./gradlew" "shadowJar" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" COMMENT "Building Rhubarb for Spine through Gradle." ) diff --git a/extras/EsotericSoftwareSpine/build.gradle b/extras/EsotericSoftwareSpine/build.gradle deleted file mode 100644 index c459cbb..0000000 --- a/extras/EsotericSoftwareSpine/build.gradle +++ /dev/null @@ -1,47 +0,0 @@ -plugins { - id 'org.jetbrains.kotlin.jvm' version '1.3.41' -} - -def getVersion() { - // Dynamically read version from CMake file - String text = new File('../../appInfo.cmake').getText('UTF-8') - String major = (text =~ /appVersionMajor\s+(\d+)/)[0][1] - String minor = (text =~ /appVersionMinor\s+(\d+)/)[0][1] - String patch = (text =~ /appVersionPatch\s+(\d+)/)[0][1] - String suffix = (text =~ /appVersionSuffix\s+"(.*?)"/)[0][1] - String result = "${major}.${minor}.${patch}${suffix}" - return result -} - -group 'com.rhubarb_lip_sync' -version = getVersion() - -repositories { - mavenCentral() - jcenter() -} - -dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" - implementation 'com.beust:klaxon:5.0.1' - implementation 'org.apache.commons:commons-lang3:3.9' - implementation 'no.tornado:tornadofx:1.7.19' -} - -compileKotlin { - kotlinOptions.jvmTarget = '1.8' -} -compileTestKotlin { - kotlinOptions.jvmTarget = '1.8' -} - -jar { - manifest { - attributes 'Main-Class': 'com.rhubarb_lip_sync.rhubarb_for_spine.MainKt' - } - - // This line of code recursively collects and copies all of a project's files - // and adds them to the JAR itself. One can extend this task, to skip certain - // files or particular types at will - from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } -} \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/build.gradle.kts b/extras/EsotericSoftwareSpine/build.gradle.kts new file mode 100644 index 0000000..6eae674 --- /dev/null +++ b/extras/EsotericSoftwareSpine/build.gradle.kts @@ -0,0 +1,48 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import java.io.File +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + kotlin("jvm") version "1.3.41" + id("com.github.johnrengelman.shadow") version "5.1.0" +} + +fun getVersion(): String { + // Dynamically read version from CMake file + val file = File(rootDir.parentFile.parentFile, "appInfo.cmake") + val text = file.readText() + val major = Regex("""appVersionMajor\s+(\d+)""").find(text)!!.groupValues[1] + val minor = Regex("""appVersionMinor\s+(\d+)""").find(text)!!.groupValues[1] + val patch = Regex("""appVersionPatch\s+(\d+)""").find(text)!!.groupValues[1] + val suffix = Regex("""appVersionSuffix\s+"(.*?)"""").find(text)!!.groupValues[1] + return "$major.$minor.$patch$suffix" +} + +group = "com.rhubarb_lip_sync" +version = getVersion() + +repositories { + mavenCentral() + jcenter() +} + +dependencies { + implementation(kotlin("stdlib-jdk8")) + implementation("com.beust:klaxon:5.0.1") + implementation("org.apache.commons:commons-lang3:3.9") + implementation("no.tornado:tornadofx:1.7.19") +} + +tasks.withType { + kotlinOptions.jvmTarget = "1.8" +} + +tasks.jar { + manifest { + attributes("Main-Class" to "com.rhubarb_lip_sync.rhubarb_for_spine.MainKt") + } +} + +tasks.shadowJar { + archiveClassifier.set(null as String?) +} diff --git a/extras/EsotericSoftwareSpine/settings.gradle b/extras/EsotericSoftwareSpine/settings.gradle deleted file mode 100644 index dc991a3..0000000 --- a/extras/EsotericSoftwareSpine/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'rhubarb-for-spine' - diff --git a/extras/EsotericSoftwareSpine/settings.gradle.kts b/extras/EsotericSoftwareSpine/settings.gradle.kts new file mode 100644 index 0000000..6e921c8 --- /dev/null +++ b/extras/EsotericSoftwareSpine/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "rhubarb-for-spine" From 01d37d110ae70434903e2661d28853e5ca7d8998 Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Wed, 17 Jul 2019 21:44:25 +0200 Subject: [PATCH 5/6] Add minimal unit tests for Spine integration --- extras/EsotericSoftwareSpine/build.gradle.kts | 17 ++- .../src/main/kotlin/SpineJson.kt | 4 +- .../src/test/data/jsonFiles/audio/.gitkeep | 0 .../src/test/data/jsonFiles/images/.gitkeep | 0 .../data/jsonFiles/matt-3.7-essential.json | 121 ++++++++++++++++++ .../src/test/data/jsonFiles/matt-3.7.json | 95 ++++++++++++++ .../src/test/kotlin/SpineJsonTest.kt | 39 ++++++ .../test/resources/junit-platform.properties | 1 + 8 files changed, 270 insertions(+), 7 deletions(-) create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/audio/.gitkeep create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/images/.gitkeep create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7-essential.json create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7.json create mode 100644 extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt create mode 100644 extras/EsotericSoftwareSpine/src/test/resources/junit-platform.properties diff --git a/extras/EsotericSoftwareSpine/build.gradle.kts b/extras/EsotericSoftwareSpine/build.gradle.kts index 6eae674..97a95f1 100644 --- a/extras/EsotericSoftwareSpine/build.gradle.kts +++ b/extras/EsotericSoftwareSpine/build.gradle.kts @@ -31,18 +31,25 @@ dependencies { implementation("com.beust:klaxon:5.0.1") implementation("org.apache.commons:commons-lang3:3.9") implementation("no.tornado:tornadofx:1.7.19") + testImplementation("org.junit.jupiter:junit-jupiter:5.5.0") + testCompile("org.assertj:assertj-core:3.11.1") } tasks.withType { kotlinOptions.jvmTarget = "1.8" } -tasks.jar { +tasks.test { + useJUnitPlatform() +} + +tasks.shadowJar { + dependsOn(tasks.test) + + // Modified by shadow plugin + archiveClassifier.set(null as String?) + manifest { attributes("Main-Class" to "com.rhubarb_lip_sync.rhubarb_for_spine.MainKt") } } - -tasks.shadowJar { - archiveClassifier.set(null as String?) -} diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt index fbf6cae..eb8688c 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt @@ -35,7 +35,7 @@ class SpineJson(private val filePath: Path) { private val imagesDirectoryPath: Path get() { val relativeImagesDirectory = skeleton.string("images") ?: throw EndUserException("JSON file is incomplete: Images path is missing." - + "Make sure to check 'Nonessential data' when exporting.") + + " Make sure to check 'Nonessential data' when exporting.") val imagesDirectoryPath = fileDirectoryPath.resolve(relativeImagesDirectory).normalize() if (!Files.exists(imagesDirectoryPath)) { @@ -49,7 +49,7 @@ class SpineJson(private val filePath: Path) { val audioDirectoryPath: Path get() { val relativeAudioDirectory = skeleton.string("audio") ?: throw EndUserException("JSON file is incomplete: Audio path is missing." - + "Make sure to check 'Nonessential data' when exporting.") + + " Make sure to check 'Nonessential data' when exporting.") val audioDirectoryPath = fileDirectoryPath.resolve(relativeAudioDirectory).normalize() if (!Files.exists(audioDirectoryPath)) { diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/audio/.gitkeep b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/audio/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/images/.gitkeep b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/images/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7-essential.json b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7-essential.json new file mode 100644 index 0000000..a69b47c --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7-essential.json @@ -0,0 +1,121 @@ +{ +"skeleton": { "hash": "voNIQumqp3+UQAl32SwHzLMEDaI", "spine": "3.7.04-beta", "width": 795, "height": 1249.62 }, +"bones": [ + { "name": "root" }, + { "name": "torso", "parent": "root", "length": 394.49, "rotation": 90, "y": 100 }, + { "name": "head", "parent": "torso", "length": 515.83, "x": 390 }, + { "name": "legs", "parent": "torso", "length": 79.85, "rotation": 180, "x": -6 } +], +"slots": [ + { "name": "legs", "bone": "legs", "attachment": "legs" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "mouth", "bone": "head", "attachment": "mouth_d" } +], +"skins": { + "default": { + "head": { + "head": { "x": 305.19, "y": -3.37, "rotation": -90, "width": 795, "height": 908 } + }, + "legs": { + "legs": { "x": 20.93, "y": 9.45, "rotation": 90, "width": 602, "height": 147 } + }, + "mouth": { + "mouth_a": { "x": -53.21, "y": -2.6, "rotation": -90, "width": 118, "height": 27 }, + "mouth_b": { "x": -38.68, "y": -0.88, "rotation": -90, "width": 170, "height": 59 }, + "mouth_c": { "x": -45.57, "y": -2.21, "rotation": -90, "width": 145, "height": 71 }, + "mouth_d": { "x": -50.58, "y": -16.55, "rotation": -90, "width": 122, "height": 91 }, + "mouth_e": { "x": -47.51, "y": 1.69, "rotation": -90, "width": 105, "height": 73 }, + "mouth_f": { "x": -42.7, "y": -1.9, "rotation": -90, "width": 55, "height": 54 }, + "mouth_g": { "x": -42.77, "y": 2.56, "rotation": -90, "width": 141, "height": 37 }, + "mouth_h": { "x": -44.53, "y": 1.07, "rotation": -90, "width": 141, "height": 71 } + }, + "torso": { + "torso": { "x": 185.9, "y": 0.39, "rotation": -90, "width": 741, "height": 449 } + } + } +}, +"events": { + "doornail": { + "string": "Marley was dead: to begin with. There is no doubt whatever about that. The register of his burial was signed by the clergyman, the clerk, the undertaker, and the chief mourner. Scrooge signed it: and Scrooge's name was good upon 'Change, for anything he chose to put his hand to. Old Marley was as dead as a door-nail.Mind! I don't mean to say that I know, of my own knowledge, what there is particularly dead about a door-nail. I might have been inclined, myself, to regard a coffin-nail as the deadest piece of ironmongery in the trade. But the wisdom of our ancestors is in the simile; and my unhallowed hands shall not disturb it, or the Country's done for. You will therefore permit me to repeat, emphatically, that Marley was as dead as a door-nail.", + "audio": "doornail.wav" + }, + "hi": { "audio": "hi.wav" } +}, +"animations": { + "say_test": { + "slots": { + "mouth": { + "attachment": [ + { "time": 0, "name": "mouth_a" }, + { "time": 0.1, "name": "mouth_b" }, + { "time": 0.2, "name": "mouth_c" }, + { "time": 0.2667, "name": "mouth_d" }, + { "time": 0.3667, "name": "mouth_c" }, + { "time": 0.4333, "name": "mouth_a" }, + { "time": 0.5333, "name": "mouth_e" }, + { "time": 0.6, "name": "mouth_f" }, + { "time": 0.7, "name": "mouth_e" }, + { "time": 0.8, "name": "mouth_g" }, + { "time": 0.8667, "name": "mouth_c" }, + { "time": 0.9667, "name": "mouth_h" }, + { "time": 1.0667, "name": "mouth_a" } + ] + } + }, + "events": [ + { "time": 0.8667, "name": "doornail", "string": "" } + ] + }, + "shake_head": { + "bones": { + "head": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.1667, + "angle": 10.02, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.5, + "angle": -9.37, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.8333, + "angle": 10.39, + "curve": [ 0.574, 0, 0.666, 1 ] + }, + { "time": 1.5, "angle": 0 } + ] + } + } + }, + "walk": { + "bones": { + "torso": { + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0, 0.5, 0.75, 1 ] + }, + { + "time": 0.1333, + "x": 0, + "y": 30, + "curve": [ 0.25, 0, 1, 0.49 ] + }, + { "time": 0.2667, "x": 0, "y": 0 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7.json b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7.json new file mode 100644 index 0000000..cd600ac --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.7.json @@ -0,0 +1,95 @@ +{ +"skeleton": { "hash": "nWA5IiZBBeDJ6tKyTnjtIfu1GXE", "spine": "3.7.94", "width": 795, "height": 1249.62, "images": "./images/", "audio": "./audio/" }, +"bones": [ + { "name": "root" }, + { "name": "torso", "parent": "root", "length": 394.49, "rotation": 90, "y": 100 }, + { "name": "head", "parent": "torso", "length": 515.83, "x": 390 }, + { "name": "legs", "parent": "torso", "length": 79.85, "rotation": 180, "x": -6 } +], +"slots": [ + { "name": "legs", "bone": "legs", "attachment": "legs" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "mouth", "bone": "head", "attachment": "mouth_c" } +], +"skins": { + "default": { + "head": { + "head": { "x": 305.19, "y": -3.37, "rotation": -90, "width": 795, "height": 908 } + }, + "legs": { + "legs": { "x": 20.93, "y": 9.45, "rotation": 90, "width": 602, "height": 147 } + }, + "mouth": { + "mouth_a": { "x": -53.21, "y": -2.6, "rotation": -90, "width": 118, "height": 27 }, + "mouth_b": { "x": -38.68, "y": -0.88, "rotation": -90, "width": 170, "height": 59 }, + "mouth_c": { "x": -45.57, "y": -2.21, "rotation": -90, "width": 145, "height": 71 }, + "mouth_d": { "x": -50.58, "y": -16.55, "rotation": -90, "width": 122, "height": 91 }, + "mouth_e": { "x": -47.51, "y": 1.69, "rotation": -90, "width": 105, "height": 73 }, + "mouth_f": { "x": -42.7, "y": -1.9, "rotation": -90, "width": 55, "height": 54 }, + "mouth_g": { "x": -42.77, "y": 2.56, "rotation": -90, "width": 141, "height": 37 }, + "mouth_h": { "x": -44.53, "y": 1.07, "rotation": -90, "width": 141, "height": 71 } + }, + "torso": { + "torso": { "x": 185.9, "y": 0.39, "rotation": -90, "width": 741, "height": 449 } + } + } +}, +"events": { + "1-have-you-heard": { "audio": "1-have-you-heard.wav" }, + "2-it's-a-tool": { "audio": "2-it's-a-tool.wav" }, + "3-and-now-you-can": { "audio": "3-and-now-you-can.wav" } +}, +"animations": { + "shake_head": { + "bones": { + "head": { + "rotate": [ + { + "time": 0, + "angle": 0, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.1667, + "angle": 10.02, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.5, + "angle": -9.37, + "curve": [ 0.25, 0, 0.75, 1 ] + }, + { + "time": 0.8333, + "angle": 10.39, + "curve": [ 0.574, 0, 0.666, 1 ] + }, + { "time": 1.5, "angle": 0 } + ] + } + } + }, + "walk": { + "bones": { + "torso": { + "translate": [ + { + "time": 0, + "x": 0, + "y": 0, + "curve": [ 0, 0.5, 0.75, 1 ] + }, + { + "time": 0.1333, + "x": 0, + "y": 30, + "curve": [ 0.25, 0, 1, 0.49 ] + }, + { "time": 0.2667, "x": 0, "y": 0 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt b/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt new file mode 100644 index 0000000..85e8258 --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt @@ -0,0 +1,39 @@ +package com.rhubarb_lip_sync.rhubarb_for_spine + +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test +import java.nio.file.Paths +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.catchThrowable + +class SpineJsonTest { + @Nested + inner class `file format 3_7` { + @Test + fun `correctly reads valid file`() { + val path = Paths.get("src/test/data/jsonFiles/matt-3.7.json").toAbsolutePath() + val spine = SpineJson(path) + + assertThat(spine.audioDirectoryPath) + .isEqualTo(Paths.get("src/test/data/jsonFiles/audio").toAbsolutePath()) + assertThat(spine.frameRate).isEqualTo(30.0) + assertThat(spine.slots).containsExactly("legs", "torso", "head", "mouth") + assertThat(spine.guessMouthSlot()).isEqualTo("mouth") + assertThat(spine.audioEvents).containsExactly( + SpineJson.AudioEvent("1-have-you-heard", "1-have-you-heard.wav", null), + SpineJson.AudioEvent("2-it's-a-tool", "2-it's-a-tool.wav", null), + SpineJson.AudioEvent("3-and-now-you-can", "3-and-now-you-can.wav", null) + ) + assertThat(spine.getSlotAttachmentNames("mouth")).isEqualTo(('a'..'h').map{ "mouth_$it" }) + assertThat(spine.animationNames).containsExactly("shake_head", "walk") + } + + @Test + fun `throws on file without nonessential data`() { + val path = Paths.get("src/test/data/jsonFiles/matt-3.7-essential.json").toAbsolutePath() + val throwable = catchThrowable { SpineJson(path) } + assertThat(throwable) + .hasMessage("JSON file is incomplete: Images path is missing. Make sure to check 'Nonessential data' when exporting.") + } + } +} diff --git a/extras/EsotericSoftwareSpine/src/test/resources/junit-platform.properties b/extras/EsotericSoftwareSpine/src/test/resources/junit-platform.properties new file mode 100644 index 0000000..d265fd8 --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/resources/junit-platform.properties @@ -0,0 +1 @@ +junit.jupiter.testinstance.lifecycle.default = per_class From 5fcc8816f4be05c4394a62ae6b1b6c7997cfb024 Mon Sep 17 00:00:00 2001 From: Daniel Wolf Date: Wed, 17 Jul 2019 21:46:23 +0200 Subject: [PATCH 6/6] Add support for Spine 3.8 JSON format Fixes #74 --- CHANGELOG.md | 1 + .../src/main/kotlin/SpineJson.kt | 20 +++-- .../data/jsonFiles/matt-3.8-essential.json | 72 +++++++++++++++++ .../src/test/data/jsonFiles/matt-3.8.json | 81 +++++++++++++++++++ .../src/test/kotlin/SpineJsonTest.kt | 30 +++++++ 5 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8-essential.json create mode 100644 extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8.json diff --git a/CHANGELOG.md b/CHANGELOG.md index da932ff..afe1e5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Unreleased * **Added** switch data file exporter for Moho (formerly Anime Studio) and OpenToonz ([issue #69](https://github.com/DanielSWolf/rhubarb-lip-sync/issues/69)) +* **Added** support for Spine 3.8 beta ([issue #74](https://github.com/DanielSWolf/rhubarb-lip-sync/issues/74)) * **Improved** animation rule for OW sound: animating it as E-F rather than F. ## Version 1.9.1 diff --git a/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt b/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt index eb8688c..22d4bef 100644 --- a/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt +++ b/extras/EsotericSoftwareSpine/src/main/kotlin/SpineJson.kt @@ -22,8 +22,13 @@ class SpineJson(private val filePath: Path) { throw EndUserException("Wrong file format. This is not a valid JSON file.") } skeleton = json.obj("skeleton") ?: throw EndUserException("JSON file is corrupted.") - val skins = json.obj("skins") ?: throw EndUserException("JSON file doesn't contain skins.") - defaultSkin = skins.obj("default") ?: throw EndUserException("JSON file doesn't have a default skin.") + val skins = json["skins"] ?: throw EndUserException("JSON file doesn't contain skins.") + defaultSkin = when (skins) { + is JsonObject -> skins.obj("default") + is JsonArray<*> -> (skins as JsonArray).find { it.string("name") == "default" } + else -> null + } ?: throw EndUserException("JSON file doesn't have a default skin.") + validateProperties() } @@ -91,7 +96,9 @@ class SpineJson(private val filePath: Path) { } fun getSlotAttachmentNames(slotName: String): List { - val attachments = defaultSkin.obj(slotName) ?: JsonObject() + val attachments = defaultSkin.obj(slotName) + ?: defaultSkin.obj("attachments")?.obj(slotName) + ?: JsonObject() return attachments.map { it.key } } @@ -142,8 +149,11 @@ class SpineJson(private val filePath: Path) { animationNames.add(animationName) } + override fun toString(): String { + return json.toJsonString(prettyPrint = true) + } + fun save() { - var string = json.toJsonString(prettyPrint = true) - Files.write(filePath, listOf(string), StandardCharsets.UTF_8) + Files.write(filePath, listOf(toString()), StandardCharsets.UTF_8) } } \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8-essential.json b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8-essential.json new file mode 100644 index 0000000..5c63e75 --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8-essential.json @@ -0,0 +1,72 @@ +{ +"skeleton": { "hash": "rSEJPpMBeapC2jv56cUew+IkQd0", "spine": "3.8.42-beta", "x": -394.13, "y": -0.43, "width": 795, "height": 1249.62 }, +"bones": [ + { "name": "root" }, + { "name": "torso", "parent": "root", "length": 394.49, "rotation": 90, "y": 100 }, + { "name": "head", "parent": "torso", "length": 515.83, "x": 390 }, + { "name": "legs", "parent": "torso", "length": 79.85, "rotation": 180, "x": -6 } +], +"slots": [ + { "name": "legs", "bone": "legs", "attachment": "legs" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "mouth", "bone": "head", "attachment": "mouth_c" } +], +"skins": [ + { + "name": "default", + "attachments": { + "mouth": { + "mouth_a": { "x": -53.21, "y": -2.6, "rotation": -90, "width": 118, "height": 27 }, + "mouth_b": { "x": -38.68, "y": -0.88, "rotation": -90, "width": 170, "height": 59 }, + "mouth_c": { "x": -45.57, "y": -2.21, "rotation": -90, "width": 145, "height": 71 }, + "mouth_d": { "x": -50.58, "y": -16.55, "rotation": -90, "width": 122, "height": 91 }, + "mouth_e": { "x": -47.51, "y": 1.69, "rotation": -90, "width": 105, "height": 73 }, + "mouth_f": { "x": -42.7, "y": -1.9, "rotation": -90, "width": 55, "height": 54 }, + "mouth_g": { "x": -42.77, "y": 2.56, "rotation": -90, "width": 141, "height": 37 }, + "mouth_h": { "x": -44.53, "y": 1.07, "rotation": -90, "width": 141, "height": 71 } + }, + "head": { + "head": { "x": 305.19, "y": -3.37, "rotation": -90, "width": 795, "height": 908 } + }, + "legs": { + "legs": { "x": 20.93, "y": 9.45, "rotation": 90, "width": 602, "height": 147 } + }, + "torso": { + "torso": { "x": 185.9, "y": 0.39, "rotation": -90, "width": 741, "height": 449 } + } + } + } +], +"events": { + "1-have-you-heard": { "audio": "1-have-you-heard.wav" }, + "2-it's-a-tool": { "audio": "2-it's-a-tool.wav" }, + "3-and-now-you-can": { "audio": "3-and-now-you-can.wav" } +}, +"animations": { + "shake_head": { + "bones": { + "head": { + "rotate": [ + { "curve": 0.25, "c3": 0.75 }, + { "time": 0.1667, "angle": 10.02, "curve": 0.25, "c3": 0.75 }, + { "time": 0.5, "angle": -9.37, "curve": 0.25, "c3": 0.75 }, + { "time": 0.8333, "angle": 10.39, "curve": 0.574, "c3": 0.666 }, + { "time": 1.5 } + ] + } + } + }, + "walk": { + "bones": { + "torso": { + "translate": [ + { "curve": 0, "c2": 0.5, "c3": 0.75 }, + { "time": 0.1333, "y": 30, "curve": 0.25, "c4": 0.49 }, + { "time": 0.2667 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8.json b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8.json new file mode 100644 index 0000000..583d70b --- /dev/null +++ b/extras/EsotericSoftwareSpine/src/test/data/jsonFiles/matt-3.8.json @@ -0,0 +1,81 @@ +{ +"skeleton": { + "hash": "sH1atSHvppLIr/A6E6H7PXWiU4s", + "spine": "3.8.42-beta", + "x": -394.13, + "y": -0.43, + "width": 795, + "height": 1249.62, + "images": "./images/", + "audio": "./audio/" +}, +"bones": [ + { "name": "root" }, + { "name": "torso", "parent": "root", "length": 394.49, "rotation": 90, "y": 100 }, + { "name": "head", "parent": "torso", "length": 515.83, "x": 390 }, + { "name": "legs", "parent": "torso", "length": 79.85, "rotation": 180, "x": -6 } +], +"slots": [ + { "name": "legs", "bone": "legs", "attachment": "legs" }, + { "name": "torso", "bone": "torso", "attachment": "torso" }, + { "name": "head", "bone": "head", "attachment": "head" }, + { "name": "mouth", "bone": "head", "attachment": "mouth_c" } +], +"skins": [ + { + "name": "default", + "attachments": { + "mouth": { + "mouth_a": { "x": -53.21, "y": -2.6, "rotation": -90, "width": 118, "height": 27 }, + "mouth_b": { "x": -38.68, "y": -0.88, "rotation": -90, "width": 170, "height": 59 }, + "mouth_c": { "x": -45.57, "y": -2.21, "rotation": -90, "width": 145, "height": 71 }, + "mouth_d": { "x": -50.58, "y": -16.55, "rotation": -90, "width": 122, "height": 91 }, + "mouth_e": { "x": -47.51, "y": 1.69, "rotation": -90, "width": 105, "height": 73 }, + "mouth_f": { "x": -42.7, "y": -1.9, "rotation": -90, "width": 55, "height": 54 }, + "mouth_g": { "x": -42.77, "y": 2.56, "rotation": -90, "width": 141, "height": 37 }, + "mouth_h": { "x": -44.53, "y": 1.07, "rotation": -90, "width": 141, "height": 71 } + }, + "head": { + "head": { "x": 305.19, "y": -3.37, "rotation": -90, "width": 795, "height": 908 } + }, + "legs": { + "legs": { "x": 20.93, "y": 9.45, "rotation": 90, "width": 602, "height": 147 } + }, + "torso": { + "torso": { "x": 185.9, "y": 0.39, "rotation": -90, "width": 741, "height": 449 } + } + } + } +], +"events": { + "1-have-you-heard": { "audio": "1-have-you-heard.wav" }, + "2-it's-a-tool": { "audio": "2-it's-a-tool.wav" }, + "3-and-now-you-can": { "audio": "3-and-now-you-can.wav" } +}, +"animations": { + "shake_head": { + "bones": { + "head": { + "rotate": [ + { "curve": 0.25, "c3": 0.75 }, + { "time": 0.1667, "angle": 10.02, "curve": 0.25, "c3": 0.75 }, + { "time": 0.5, "angle": -9.37, "curve": 0.25, "c3": 0.75 }, + { "time": 0.8333, "angle": 10.39, "curve": 0.574, "c3": 0.666 }, + { "time": 1.5 } + ] + } + } + }, + "walk": { + "bones": { + "torso": { + "translate": [ + { "curve": 0, "c2": 0.5, "c3": 0.75 }, + { "time": 0.1333, "y": 30, "curve": 0.25, "c4": 0.49 }, + { "time": 0.2667 } + ] + } + } + } +} +} \ No newline at end of file diff --git a/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt b/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt index 85e8258..166054f 100644 --- a/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt +++ b/extras/EsotericSoftwareSpine/src/test/kotlin/SpineJsonTest.kt @@ -36,4 +36,34 @@ class SpineJsonTest { .hasMessage("JSON file is incomplete: Images path is missing. Make sure to check 'Nonessential data' when exporting.") } } + + @Nested + inner class `file format 3_8` { + @Test + fun `correctly reads valid file`() { + val path = Paths.get("src/test/data/jsonFiles/matt-3.8.json").toAbsolutePath() + val spine = SpineJson(path) + + assertThat(spine.audioDirectoryPath) + .isEqualTo(Paths.get("src/test/data/jsonFiles/audio").toAbsolutePath()) + assertThat(spine.frameRate).isEqualTo(30.0) + assertThat(spine.slots).containsExactly("legs", "torso", "head", "mouth") + assertThat(spine.guessMouthSlot()).isEqualTo("mouth") + assertThat(spine.audioEvents).containsExactly( + SpineJson.AudioEvent("1-have-you-heard", "1-have-you-heard.wav", null), + SpineJson.AudioEvent("2-it's-a-tool", "2-it's-a-tool.wav", null), + SpineJson.AudioEvent("3-and-now-you-can", "3-and-now-you-can.wav", null) + ) + assertThat(spine.getSlotAttachmentNames("mouth")).isEqualTo(('a'..'h').map{ "mouth_$it" }) + assertThat(spine.animationNames).containsExactly("shake_head", "walk") + } + + @Test + fun `throws on file without nonessential data`() { + val path = Paths.get("src/test/data/jsonFiles/matt-3.8-essential.json").toAbsolutePath() + val throwable = catchThrowable { SpineJson(path) } + assertThat(throwable) + .hasMessage("JSON file is incomplete: Images path is missing. Make sure to check 'Nonessential data' when exporting.") + } + } }