Bug 43: Add TeaVM support to Open Eggbert

This commit is contained in:
Robert Vokac 2024-09-18 20:30:43 +02:00
parent 916002bd1f
commit 3cfbd07654
No known key found for this signature in database
GPG Key ID: C459E1E4B4A986BB
8 changed files with 120 additions and 3 deletions

View File

@ -18,6 +18,7 @@ This project was generated with a template including simple application launcher
- `lwjgl3`: Primary desktop platform using LWJGL3.
- `android`: Android mobile platform. Needs Android SDK.
- `html`: Web platform using GWT and WebGL. Supports only Java projects.
- `teavm`: Experimental web platform using TeaVM and WebGL.
## Gradle
@ -40,6 +41,8 @@ Useful Gradle tasks and flags:
- `idea`: generates IntelliJ project data.
- `lwjgl3:jar`: builds application's runnable jar, which can be found at `lwjgl3/build/lib`.
- `lwjgl3:run`: starts the application.
- `teavm:build`: builds the JavaScript application into the build/dist/webapp folder.
- `teavm:run`: serves the JavaScript application at http://localhost:8080 via a local Jetty server.
- `test`: runs unit tests (if any).
Note that most tasks that are not specific to a single project can be run with `name:` prefix, where the `name` should be replaced with the ID of a specific project.

View File

@ -70,6 +70,7 @@ subprojects {
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
maven { url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' }
maven { url 'https://jitpack.io' }
maven { url 'https://teavm.org/maven/repository/' }
maven { url 'https://repo.openeggbert.com' }
maven { url 'https://repo.openeggbert.com/releases/' }

View File

@ -19,4 +19,7 @@ gwtFrameworkVersion=2.11.0
gwtPluginVersion=1.1.29
gdxVersion=1.12.1
pixelVersion=0.0.0-SNAPSHOT
gdxTeaVMVersion=1.0.3
teaVMVersion=0.10.2
netbeans.hint.jdkPlatform=JDK_17
shapeDrawerVersion=2.6.0

View File

@ -21,12 +21,12 @@ package com.openeggbert.lwjgl3.debugging;
import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.backend.libgdx.PixelBackendLibGDX;
import com.pixelgamelibrary.backend.libgdx.assets.AssetsTxt;
import com.pixelgamelibrary.api.utils.AssetsTxt;
import java.util.List;
import java.util.Scanner;
/**
*
*f
* @author robertvokac
*/
public class DebuggingAssetsTxt {

View File

@ -1,4 +1,4 @@
// A list of which subprojects to load as part of the same larger project.
// You can remove Strings from the list and reload the Gradle project
// if you want to temporarily disable a subproject.
include 'lwjgl3', 'android', 'html', 'core'
include 'lwjgl3', 'android', 'html', 'teavm', 'core'

47
teavm/build.gradle Normal file
View File

@ -0,0 +1,47 @@
plugins {
id 'java'
id 'org.gretty' version '3.1.0'
}
gretty {
contextPath = '/'
extraResourceBase 'build/dist/webapp'
}
sourceSets.main.resources.srcDirs += [ rootProject.file('assets').path ]
project.ext.mainClassName = 'com.openeggbert.teavm.TeaVMBuilder'
eclipse.project.name = appName + '-teavm'
// This must be at least 11, and no higher than the JDK version this project is built with.
java.targetCompatibility = "11"
// This should probably be equal to targetCompatibility, above. This only affects the TeaVM module.
java.sourceCompatibility = "11"
dependencies {
implementation "com.github.xpenatan.gdx-teavm:backend-teavm:$gdxTeaVMVersion"
implementation "org.teavm:teavm-classlib:$teaVMVersion"
implementation "org.teavm:teavm-core:$teaVMVersion"
implementation "org.teavm:teavm-jso-apis:$teaVMVersion"
implementation "org.teavm:teavm-jso-impl:$teaVMVersion"
implementation "org.teavm:teavm-jso:$teaVMVersion"
implementation "org.teavm:teavm-tooling:$teaVMVersion"
implementation project(':core')
implementation "com.pixelgamelibrary:pixel:$pixelVersion:sources"
api "com.pixelgamelibrary:pixel-backend-libgdx:$pixelVersion"
implementation "com.pixelgamelibrary:pixel-backend-libgdx:$pixelVersion:sources"
}
tasks.register('buildJavaScript', JavaExec) {
dependsOn classes
setDescription("Transpile bytecode to JavaScript via TeaVM")
mainClass.set(project.mainClassName)
setClasspath(sourceSets.main.runtimeClasspath)
}
build.dependsOn buildJavaScript
tasks.register("run") {
description = "Run the JavaScript application hosted via a local Jetty server at http://localhost:8080/"
dependsOn(buildJavaScript, tasks.named("jettyRun"))
}

View File

@ -0,0 +1,35 @@
package com.openeggbert.teavm;
import com.github.xpenatan.gdx.backends.teavm.config.AssetFileHandle;
import com.github.xpenatan.gdx.backends.teavm.config.TeaBuildConfiguration;
import com.github.xpenatan.gdx.backends.teavm.config.TeaBuilder;
import com.github.xpenatan.gdx.backends.teavm.config.plugins.TeaReflectionSupplier;
import com.github.xpenatan.gdx.backends.teavm.gen.SkipClass;
import java.io.File;
import java.io.IOException;
import org.teavm.tooling.TeaVMTool;
import org.teavm.vm.TeaVMOptimizationLevel;
/** Builds the TeaVM/HTML application. */
@SkipClass
public class TeaVMBuilder {
public static void main(String[] args) throws IOException {
TeaBuildConfiguration teaBuildConfiguration = new TeaBuildConfiguration();
teaBuildConfiguration.assetsPath.add(new AssetFileHandle("../assets"));
teaBuildConfiguration.webappPath = new File("build/dist").getCanonicalPath();
// Register any extra classpath assets here:
// teaBuildConfiguration.additionalAssetsClasspathFiles.add("com/openeggbert/asset.extension");
// Register any classes or packages that require reflection here:
// TeaReflectionSupplier.addReflectionClass("com.openeggbert.reflect");
TeaVMTool tool = TeaBuilder.config(teaBuildConfiguration);
tool.setMainClass(TeaVMLauncher.class.getName());
// For many (or most) applications, using the highest optimization won't add much to build time.
// If your builds take too long, and runtime performance doesn't matter, you can change FULL to SIMPLE .
tool.setOptimizationLevel(TeaVMOptimizationLevel.FULL);
tool.setObfuscated(true);
TeaBuilder.build(tool);
}
}

View File

@ -0,0 +1,28 @@
package com.openeggbert.teavm;
import com.github.xpenatan.gdx.backends.teavm.TeaApplicationConfiguration;
import com.github.xpenatan.gdx.backends.teavm.TeaApplication;
import com.openeggbert.core.main.OpenEggbertApplication;
import com.pixelgamelibrary.api.Pixel;
import com.pixelgamelibrary.backend.libgdx.PixelBackendLibGDX;
import com.pixelgamelibrary.backend.libgdx.game.LibGdxGame;
/**
* Launches the TeaVM/HTML application.
*/
public class TeaVMLauncher {
public static void main(String[] args) {
TeaApplicationConfiguration config = new TeaApplicationConfiguration("canvas");
//// If width and height are each greater than 0, then the app will use a fixed size.
//config.width = 640;
//config.height = 480;
//// If width and height are both 0, then the app will use all available space.
//config.width = 0;
//config.height = 0;
//// If width and height are both -1, then the app will fill the canvas size.
config.width = -1;
config.height = -1;
if(!Pixel.isBackendSet()) {Pixel.initBackend(new PixelBackendLibGDX());}
TeaApplication application = new TeaApplication(new LibGdxGame(new OpenEggbertApplication().createGame()), config);
}
}