Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
0d3be6c
Fix issues in GLES backends
riccardobl Jan 25, 2026
9a63ca1
rewrite lwjgl3 backend to use SDL
riccardobl Mar 20, 2026
5b00164
remove debug libraries
riccardobl Mar 20, 2026
fe52fef
support msaa framebuffer extension in gles
riccardobl Mar 21, 2026
fd4512a
use auxiliary framebuffer for srgb conversion
riccardobl Mar 21, 2026
812eecc
deprecate old opengl versions
riccardobl Mar 21, 2026
76da689
update deps
riccardobl Mar 21, 2026
5876f93
Fix dirty region iteration boundaries and iterator contract
riccardobl May 5, 2026
fc7b938
Harden BufferObject data replacement and cleanup type safety
riccardobl May 5, 2026
a3f7284
Add regression tests for dirty region and setData edge cases
riccardobl May 5, 2026
4b4780d
Fix setData null parameter handling and resource cleanup
riccardobl May 5, 2026
bb76375
make BufferObject's regions getData() return a clean slice
riccardobl May 5, 2026
2d753ca
GLES and Android backend improvements and fixup (#2727)
riccardobl May 5, 2026
05a9d64
Merge remote-tracking branch 'upstream/master' into angle
riccardobl May 5, 2026
89fbfc0
Improve light render parity with blender (#2549)
riccardobl May 6, 2026
044a8ac
ci: bump actions/checkout from 4 to 6 (#2738)
dependabot[bot] May 6, 2026
9e1843d
ci: bump gradle/actions from 6.0.1 to 6.1.0 (#2736)
dependabot[bot] May 6, 2026
ea9671a
ci: bump actions/setup-java from 4 to 5 (#2737)
dependabot[bot] May 6, 2026
aefe1c5
LwjglCanvas backend improvement (LWJGLX + AWT) (#2669)
JNightRider May 6, 2026
0f94445
use lib catalog for angle native
riccardobl May 7, 2026
2b7c025
Merge remote-tracking branch 'upstream/master' into angle
riccardobl May 7, 2026
5706c46
Merge branch 'glespatch' into angle
riccardobl May 7, 2026
a257bed
fix
riccardobl May 7, 2026
182e94f
remove debug override
riccardobl May 7, 2026
b15c60f
update libs
riccardobl May 7, 2026
2927234
add task to run tests in proton
riccardobl May 7, 2026
2ad2de2
increase memory
riccardobl May 7, 2026
eb21c57
Include all runtime dependencies in examples dist (#2744)
riccardobl May 8, 2026
1856c92
Use Luminance instead of R and RG for single and dual channel immages…
riccardobl May 8, 2026
b8178dc
Merge remote-tracking branch 'upstream/master' into angle
riccardobl May 8, 2026
36dbf9f
Implement GPU timer query support across multiple platforms and handl…
riccardobl May 8, 2026
feaf8ea
Revert "Implement GPU timer query support across multiple platforms a…
riccardobl May 8, 2026
25a130f
add packed float toggler to getBestColorTargetFormat and disallow pac…
riccardobl May 8, 2026
919e4b2
fix wayland selection
riccardobl May 8, 2026
4bf14ab
Reapply "Implement GPU timer query support across multiple platforms …
riccardobl May 8, 2026
7eb466f
add packed float toggler to getBestColorTargetFormat and disallow pac…
riccardobl May 8, 2026
9de4e51
use getBestColorTargetFormat for SphericalHarmonics baking
riccardobl May 8, 2026
4a784be
check if alpha is not requested when returning packed float color buf…
riccardobl May 8, 2026
d5847de
Update jme3-core/src/main/java/com/jme3/renderer/Renderer.java
riccardobl May 8, 2026
23fc1d4
fix spherical harmonics baker format fallback and catch NaN early
riccardobl May 8, 2026
ad4dcfd
IBL Math hardening
riccardobl May 8, 2026
ebe10ba
update screenshots
riccardobl May 8, 2026
1c99a99
Revert "Reapply "Implement GPU timer query support across multiple pl…
riccardobl May 8, 2026
a3a408c
fix gpu timer support
riccardobl May 8, 2026
79734e7
fixes
riccardobl May 9, 2026
c3c1fc8
Merge branch 'master' into angle
riccardobl May 9, 2026
31af325
use Blit.j3md for gamma correction
riccardobl May 9, 2026
ccd450f
Revert "fixes"
riccardobl May 9, 2026
2e1d32b
Reapply "fixes"
riccardobl May 9, 2026
9520f5d
add explicit GLSL310 support for Blit material
riccardobl May 9, 2026
11c578f
force GL 3.2 in screenshot tests
riccardobl May 9, 2026
f629be3
Optimize BoundingBox distanceToEdge scalar math (#2749)
8Keep May 9, 2026
1059c81
add renderer selector to settings dialog
riccardobl May 9, 2026
34e595c
catch swapwindow failures
riccardobl May 9, 2026
5784b2b
reset hint on renderer change, fix sRGB for non angle renderer
riccardobl May 9, 2026
a926479
set __GL_THREADED_OPTIMIZATIONS=0 on start to workaround known nvidia…
riccardobl May 9, 2026
da56f14
bypass aux framebuffer if native gl
riccardobl May 9, 2026
5296808
use isGraphicsDebug
riccardobl May 9, 2026
c46a9bb
Run windows examples in linux (#2747)
riccardobl May 9, 2026
4c3ee3c
Merge branch 'master' into angle
riccardobl May 9, 2026
db3d814
use 24 bit buffer in Xvfb
riccardobl May 9, 2026
5c76970
Fix examples launcher and disable AWT dialogs in macos
riccardobl May 9, 2026
a288755
use angle in tests with vulkan software rendering
riccardobl May 9, 2026
748e584
make all extensions optional
riccardobl May 9, 2026
c906673
Revert "use angle in tests with vulkan software rendering"
richardTingle May 9, 2026
c853f3b
Just one test
richardTingle May 9, 2026
5d42e27
Return to default renderer
richardTingle May 9, 2026
69b3c9f
Add some debug into the screenshot test render
richardTingle May 9, 2026
1ab3854
Start, debug, test all in same process
richardTingle May 9, 2026
609aba8
Try an alternative depth notation
richardTingle May 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/format.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ jobs:
if: ${{ false }}
steps:
- name: Checkout
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Prettify code
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/j3o-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v6

- name: Set up Java
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'
Expand Down
58 changes: 30 additions & 28 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,14 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@v6.0.2
- uses: actions/checkout@v6
- name: Setup the java environment
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
uses: gradle/actions/wrapper-validation@v6.1.0
- name: Run Checkstyle
run: |
./gradlew checkstyleMain checkstyleTest --console=plain --stacktrace
Expand All @@ -91,14 +91,14 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@v6.0.2
- uses: actions/checkout@v6
- name: Setup the java environment
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
uses: gradle/actions/wrapper-validation@v6.1.0
- name: Run SpotBugs
run: |
./gradlew -PenableSpotBugs=true spotbugsMain spotbugsTest --console=plain --stacktrace
Expand All @@ -119,25 +119,27 @@ jobs:
permissions:
contents: read
steps:
- uses: actions/checkout@v6.0.2
- name: Start xvfb
- uses: actions/checkout@v6
- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.1.0

- name: Start xvfb, debug, and run tests
run: |
Xvfb :99 -ac -screen 0 1024x768x16 &
Xvfb :99 -ac -screen 0 1024x768x24/4 &
export DISPLAY=:99
echo "DISPLAY=:99" >> $GITHUB_ENV
- name: Report GL/Vulkan
run: |
# Debug GL/Vulkan
set -x
echo "DISPLAY=$DISPLAY"
glxinfo | grep -E "OpenGL version|OpenGL renderer|OpenGL vendor" || true
glxinfo | grep -E "OpenGL version|OpenGL renderer|OpenGL vendor|visual|GLX version" || true
vulkaninfo --summary || true
echo "VK_ICD_FILENAMES=$VK_ICD_FILENAMES"
echo "MESA_LOADER_DRIVER_OVERRIDE=$MESA_LOADER_DRIVER_OVERRIDE"
echo "GALLIUM_DRIVER=$GALLIUM_DRIVER"
- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
- name: Test with Gradle Wrapper
run: |
echo "LIBGL_ALWAYS_SOFTWARE=$LIBGL_ALWAYS_SOFTWARE"

# Run tests
./gradlew :jme3-screenshot-test:screenshotTest
- name: Upload Test Reports
uses: actions/upload-artifact@v7.0.0
Expand All @@ -160,7 +162,7 @@ jobs:
run: echo $JAVA_HOME --- $JAVA_HOME_8_X64 --- $JAVA_HOME_11_X64 --- $JAVA_HOME_17_X64 --- $JAVA_HOME_21_X64 ---

- name: Setup the java environment
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '17'
Expand All @@ -171,12 +173,12 @@ jobs:
xcode-version: '15.1.0'

- name: Clone the repo
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 1

- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
uses: gradle/actions/wrapper-validation@v6.1.0

- name: Build
run: |
Expand All @@ -198,12 +200,12 @@ jobs:

steps:
- name: Clone the repo
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 1

- name: Setup Java 17
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: '17'
Expand All @@ -218,7 +220,7 @@ jobs:
cmake --version

- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
uses: gradle/actions/wrapper-validation@v6.1.0

- name: Build
run: |
Expand Down Expand Up @@ -255,7 +257,7 @@ jobs:

steps:
- name: Clone the repo
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 1

Expand All @@ -272,7 +274,7 @@ jobs:
path: jme3-ios-native/template/META-INF/robovm/ios/libs/jme3-ios-native.xcframework

- name: Validate the Gradle wrapper
uses: gradle/actions/wrapper-validation@v6.0.1
uses: gradle/actions/wrapper-validation@v6.1.0
- name: Build Engine
shell: bash
run: |
Expand Down Expand Up @@ -447,13 +449,13 @@ jobs:

# We need to clone everything again for uploadToMaven.sh ...
- name: Clone the repo
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 1

# Setup jdk 21 used for building Maven-style artifacts
- name: Setup the java environment
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
Expand Down Expand Up @@ -497,13 +499,13 @@ jobs:

# We need to clone everything again for uploadToCentral.sh ...
- name: Clone the repo
uses: actions/checkout@v6.0.2
uses: actions/checkout@v6
with:
fetch-depth: 1

# Setup jdk 21 used for building Sonatype artifacts
- name: Setup the java environment
uses: actions/setup-java@v5.2.0
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: '21'
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ javadoc_deploy.pub
!.vscode/settings.json
!.vscode/JME_style.xml
!.vscode/extensions.json
joysticks-*.txt
joysticks-*.txt
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
"editor.formatOnPaste": false,
"editor.formatOnType": false,
"editor.formatOnSave": false,
"java.jdt.ls.vmargs": "-Xms512M -Xmx2G -XX:+UseG1GC -XX:+UseStringDeduplication -XX:AdaptiveSizePolicyWeight=90"
"java.jdt.ls.vmargs": "-Xms512M -Xmx4G -XX:+UseG1GC -XX:+UseStringDeduplication -XX:AdaptiveSizePolicyWeight=90"
}
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,18 @@ You can optionally use the `-Pexample` property to specify an example to start w
./gradlew runExamples -Pexample=jme3test.light.pbr.TestPBRSimple
```

### Android examples

You can run the Android examples on a local android emulator with:

```bash
./gradlew -PbuildAndroidExamples=true -PbuildNativeProjects=true runAndroidExamples
# or for a specific example:
# ./gradlew -PbuildAndroidExamples=true -PbuildNativeProjects=true runAndroidExamples -Pexample=jme3test.post.TestBloom
```

*Make sure to have the SDK and NDK installed and configured properly, and the emulator running before executing the command.*


## Running Tests

Expand Down
53 changes: 46 additions & 7 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -182,17 +182,56 @@ task configureAndroidNDK {
ndkBuildFile = "ndk-build.cmd"
}

// ndkPath is defined in the root project gradle.properties file
String ndkBuildPath = ndkPath + File.separator + ndkBuildFile
//Use the environment variable for the NDK location if defined
if (System.env.ANDROID_NDK != null) {
ndkBuildPath = System.env.ANDROID_NDK + File.separator + ndkBuildFile
def ndkCandidates = []
if (System.env.ANDROID_NDK) {
ndkCandidates << file(System.env.ANDROID_NDK)
}
if (System.env.ANDROID_NDK_HOME) {
ndkCandidates << file(System.env.ANDROID_NDK_HOME)
}
if (project.hasProperty('ndkPath') && ndkPath) {
ndkCandidates << file(ndkPath)
}

if (new File(ndkBuildPath).exists()) {
def localProperties = file('local.properties')
if (localProperties.isFile()) {
Properties properties = new Properties()
localProperties.withInputStream { properties.load(it) }
if (properties.getProperty('ndk.dir')) {
ndkCandidates << file(properties.getProperty('ndk.dir'))
}
if (properties.getProperty('sdk.dir')) {
ndkCandidates.addAll(findAndroidNdkDirs(file(properties.getProperty('sdk.dir'))))
}
}

if (System.env.ANDROID_HOME) {
ndkCandidates.addAll(findAndroidNdkDirs(file(System.env.ANDROID_HOME)))
}
if (System.env.ANDROID_SDK_ROOT) {
ndkCandidates.addAll(findAndroidNdkDirs(file(System.env.ANDROID_SDK_ROOT)))
}
ndkCandidates.addAll(findAndroidNdkDirs(file("${System.properties['user.home']}/Android/Sdk")))

def ndkBuildPath = ndkCandidates.collect { new File(it, ndkBuildFile) }.find { it.isFile() }
if (ndkBuildPath != null) {
ndkExists = true
ndkCommandPath = ndkBuildPath
ndkCommandPath = ndkBuildPath.absolutePath
}
}

def findAndroidNdkDirs(File sdkDir) {
def ndkDirs = []
def nestedSdkDir = new File(sdkDir, 'Sdk')
if (nestedSdkDir.isDirectory()) {
ndkDirs.addAll(findAndroidNdkDirs(nestedSdkDir))
}
def sideBySideDir = new File(sdkDir, 'ndk')
if (sideBySideDir.isDirectory()) {
ndkDirs.addAll(sideBySideDir.listFiles()?.findAll { it.isDirectory() }?.sort { a, b -> b.name <=> a.name } ?: [])
}
ndkDirs << new File(sdkDir, 'ndk-bundle')
return ndkDirs
}

gradle.rootProject.ext.set("usePrebuildNatives", buildNativeProjects!="true");
Expand Down
2 changes: 1 addition & 1 deletion common-android-app.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ version = jmeFullVersion
repositories {
mavenCentral()
maven {
url "http://nifty-gui.sourceforge.net/nifty-maven-repo"
url "https://nifty-gui.sourceforge.net/nifty-maven-repo"
}
}
6 changes: 6 additions & 0 deletions common.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ repositories {
flatDir {
dirs rootProject.file('lib')
}
maven {
url "https://maven.rblb.it/NostrGameEngine/angle-natives"
}
maven {
url = uri("https://central.sonatype.com/repository/maven-snapshots")
}
}

dependencies {
Expand Down
4 changes: 3 additions & 1 deletion gradle/jacoco.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ reporting {

def jacocoSubprojects = subprojects.findAll { p ->
(p.file("src/main/java").exists() || p.file("src/main/groovy").exists()) &&
(p.file("src/test/java").exists() || p.file("src/test/groovy").exists())
(p.file("src/test/java").exists() || p.file("src/test/groovy").exists()) &&
p.tasks.findByName('test') &&
p.tasks.findByName('jacocoTestReport')
}

dependencies {
Expand Down
18 changes: 17 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,19 @@
checkstyle = "13.3.0"
jacoco = "0.8.12"
lwjgl3 = "3.4.1"
angle = "20260507.46e42d40740c-SNAPSHOT"
saferalloc = "0.0.8"
nifty = "1.4.3"
spotbugs = "4.9.8"

[libraries]

androidx-annotation = "androidx.annotation:annotation:1.7.1"
androidx-fragment = "androidx.fragment:fragment:1.8.9"
androidx-lifecycle-common = "androidx.lifecycle:lifecycle-common:2.7.0"
android-build-gradle = "com.android.tools.build:gradle:9.1.0"
android-support-appcompat = "com.android.support:appcompat-v7:28.0.0"
androidx-test-runner = "androidx.test:runner:1.7.0"
gradle-git = "org.ajoberstar:gradle-git:1.2.0"
groovy-test = "org.apache.groovy:groovy-test:4.0.31"
gson = "com.google.code.gson:gson:2.13.2"
Expand All @@ -23,6 +27,7 @@ jinput = "net.java.jinput:jinput:2.0.9"
jna = "net.java.dev.jna:jna:5.18.1"
jnaerator-runtime = "com.nativelibs4java:jnaerator-runtime:0.12"
junit-bom = "org.junit:junit-bom:5.13.4"
junit4 = "junit:junit:4.13.2"
junit-jupiter = { module = "org.junit.jupiter:junit-jupiter" }
junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher" }
lwjgl2 = "org.jmonkeyengine:lwjgl:2.9.5"
Expand All @@ -33,9 +38,10 @@ lwjgl3-glfw = { module = "org.lwjgl:lwjgl-glfw", version.ref = "lwjgl3"
lwjgl3-jawt = { module = "org.lwjgl:lwjgl-jawt", version.ref = "lwjgl3" }
lwjgl3-jemalloc = { module = "org.lwjgl:lwjgl-jemalloc", version.ref = "lwjgl3" }
lwjgl3-openal = { module = "org.lwjgl:lwjgl-openal", version.ref = "lwjgl3" }
lwjgl3-opencl = { module = "org.lwjgl:lwjgl-opencl", version.ref = "lwjgl3" }
lwjgl3-opengl = { module = "org.lwjgl:lwjgl-opengl", version.ref = "lwjgl3" }
lwjgl3-sdl = { module = "org.lwjgl:lwjgl-sdl", version.ref = "lwjgl3" }
lwjgl3-opengles = { module = "org.lwjgl:lwjgl-opengles", version.ref = "lwjgl3" }
lwjgl3-egl = { module = "org.lwjgl:lwjgl-egl", version.ref = "lwjgl3" }

mokito-core = "org.mockito:mockito-core:5.23.0"
mokito-junit-jupiter = "org.mockito:mockito-junit-jupiter:5.23.0"
Expand All @@ -50,8 +56,18 @@ vecmath = "javax.vecmath:vecmath:1.5.2"

stb-image = "org.ngengine:stb-image:2.30.4"
imagewebp = "org.ngengine:image-webp-decoder:1.3.0"
angle = { module = "org.ngengine:angle-natives", version.ref = "angle" }
saferalloc = { module = "org.ngengine:saferalloc", version.ref = "saferalloc" }
saferalloc-natives-linux-x8664 = { module = "org.ngengine:saferalloc-natives-linux-x86_64", version.ref = "saferalloc" }
saferalloc-natives-linux-aarch64 = { module = "org.ngengine:saferalloc-natives-linux-aarch64", version.ref = "saferalloc" }
saferalloc-natives-windows-x8664 = { module = "org.ngengine:saferalloc-natives-windows-x86_64", version.ref = "saferalloc" }
saferalloc-natives-windows-aarch64 = { module = "org.ngengine:saferalloc-natives-windows-aarch64", version.ref = "saferalloc" }
saferalloc-natives-macos-x8664 = { module = "org.ngengine:saferalloc-natives-macos-x86_64", version.ref = "saferalloc" }
saferalloc-natives-macos-aarch64 = { module = "org.ngengine:saferalloc-natives-macos-aarch64", version.ref = "saferalloc" }
saferalloc-natives-android = { module = "org.ngengine:saferalloc-natives-android", version.ref = "saferalloc" }

[bundles]
saferalloc = ["saferalloc", "saferalloc-natives-linux-x8664", "saferalloc-natives-linux-aarch64", "saferalloc-natives-windows-x8664", "saferalloc-natives-windows-aarch64", "saferalloc-natives-macos-x8664", "saferalloc-natives-macos-aarch64", "saferalloc-natives-android"]

[plugins]
jacoco = { id = "jacoco", version.ref = "jacoco" }
Loading
Loading