Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v3.6 crashes attempting to run example apps in fullscreen with LWJGL v2 #1890

Closed
stephengold opened this issue Jan 3, 2023 · 31 comments · Fixed by #1898
Closed

v3.6 crashes attempting to run example apps in fullscreen with LWJGL v2 #1890

stephengold opened this issue Jan 3, 2023 · 31 comments · Fixed by #1898
Labels
bug Something that is supposed to work, but doesn't. More severe than a "defect".
Milestone

Comments

@stephengold
Copy link
Member

Investigating a possible regression in JME v3.6.0-alpha1, I tried to run some of the apps in jme3-examples in fullscreen mode ... for example jme3test.helloworld.HelloJME3 (though I ran into identical behavior with other example apps). Here's what happens:

  • The display settings dialog appears with "Fullscreen" not checked and "Refresh Rate" blank.
  • I check the box for "Fullscreen".
  • The "Screen Resolution" changes to1920x1080 and the "Refresh Rate" changes to 55 Hz. Unfortunately, 55 Hz isn't a valid refresh rate for my display adapter. I believe the valid rates are 24, 30, and 60 Hz.
  • When I try to select a different refresh rate, there are only 6 available options: 50 Hz, 51 Hz, 52 Hz, 53 Hz, 54 Hz, and 55 Hz. None of these are valid rates.
  • After I click the "Continue" button, I get two "Error in Application" dialogs and the app crashes.

The console output is:

Jan 03, 2023 10:59:04 AM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.6.0-alpha1
 * Branch: master
 * Git Hash: 5b9fc87
 * Build Date: 2023-01-03
Jan 03, 2023 10:59:05 AM com.jme3.app.LegacyApplication handleError
SEVERE: Failed to create display
java.lang.RuntimeException: Unable to find fullscreen display mode matching settings
	at com.jme3.system.lwjgl.LwjglDisplay.createContext(LwjglDisplay.java:80)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:120)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:221)
	at java.base/java.lang.Thread.run(Thread.java:833)

Jan 03, 2023 10:59:05 AM com.jme3.app.LegacyApplication handleError
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.lang.IllegalMonitorStateException: current thread is not owner
	at java.base/java.lang.Object.notifyAll(Native Method)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:135)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:221)
	at java.base/java.lang.Thread.run(Thread.java:833)


Exception: java.lang.NullPointerException thrown from the UncaughtExceptionHandler in thread "jME3 Main"

Excerpt from glxinfo (to document my graphics configuration):

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GT 545/PCIe/SSE2
OpenGL core profile version string: 4.6.0 NVIDIA 390.157
OpenGL core profile shading language version string: 4.60 NVIDIA

This was with "jme3-lwjgl" (LWJGL v2, which is currently the default jme3-examples build). Here's what happened when I switched the build to use "jme3-lwjgl3" (LWJGL v3):

  • The display settings dialog appears with "Fullscreen" not checked and "Refresh Rate" blank.
  • I check the box for "Fullscreen".
  • The "Screen Resolution" changes to1920x1080 and the "Refresh Rate" changes to 55 Hz.
  • When I try to select a different refresh rate, there are only 6 available options: 50 Hz, 51 Hz, 52 Hz, 53 Hz, 54 Hz, and 55 Hz.
  • After I click the "Continue" button, the application runs fullscreen.
@Ali-RS
Copy link
Member

Ali-RS commented Jan 3, 2023

Sounds like this is related to #947

Can you please check if this solution works for you: #947 (comment)

Edit:

The "Screen Resolution" changes to1920x1080

Also, can you try different resolutions and see if makes any difference?
In my case, the resolution changes to 1440, 900 when selecting "Fullscreen". And I get the same error when I click the "Continue" button but if I change it to something else (e.g 1024, 768) the error goes away.

@stephengold
Copy link
Member Author

ertugrulcetin's solution doesn't work for me.

1280x960 screen resolution does work for me.

I think we can close this as a duplicate of #947.

@Ali-RS Ali-RS closed this as completed Jan 4, 2023
@Ali-RS
Copy link
Member

Ali-RS commented Jan 4, 2023

@stephengold, by the way, do you have a secondary monitor connected?

In my case, I am using an external monitor connected to my laptop. I noticed if I unplug that and use the laptop's built-in monitor then it works fine.

@Ali-RS Ali-RS reopened this Jan 4, 2023
@Ali-RS Ali-RS closed this as completed Jan 4, 2023
@stephengold
Copy link
Member Author

only one monitor in my setup

@Ali-RS
Copy link
Member

Ali-RS commented Jan 4, 2023

Can you please run this Linux command xrandr -q and post the result?

@stephengold
Copy link
Member Author

sgold:~$ xrandr -q
Screen 0: minimum 8 x 8, current 1920 x 1080, maximum 16384 x 16384
DVI-I-0 disconnected (normal left inverted right x axis y axis)
VGA-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 853mm x 480mm
   1920x1080     60.00*+  59.94    29.97    23.98    60.05    60.00  
   1680x1050     59.95  
   1440x900      59.89  
   1440x480      60.05  
   1280x1024     60.02  
   1280x960      60.00  
   1280x800      74.93    59.81  
   1280x768      59.99  
   1280x720      60.00    59.94  
   1024x768      60.00  
   800x600       60.32    56.25  
   720x480       59.94  
   640x480       59.94    59.93  
sgold:~$ 

@Ali-RS
Copy link
Member

Ali-RS commented Jan 4, 2023

@stephengold can you please test with this lwjgl jar and see if it fixes your issue?
lwjgl.zip

I have forked lwjgl2 and applied this patch provided by @riccardobl

Edit:
In my case the xrandr -q result is

Screen 0: minimum 320 x 200, current 1440 x 900, maximum 8192 x 8192
LVDS-1 connected (normal left inverted right x axis y axis)
   1366x768      60.00 +
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
VGA-1 connected primary 1440x900+0+0 (normal left inverted right x axis y axis) 408mm x 255mm
   1440x900      59.89*+  74.98  
   1280x1024     75.02    60.02  
   1280x960      60.00  
   1152x864      75.00  
   1024x768      75.03    70.07    60.00  
   832x624       74.55  
   800x600       75.00    60.32    56.25  
   640x480       75.00    59.94  
   720x400       70.08  
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)

As you can see the second monitor is my primary monitor but lwjgl2 was wrongly picking the first one.

Edit2:

This is the commit: https://github.com/Ali-RS/lwjgl/commit/fbeac9a69a347bf7d34a01931b8757fac5f8dd41

@stephengold
Copy link
Member Author

stephengold commented Jan 5, 2023

can you please test with this lwjgl jar and see if it fixes your issue?

  1. I unzipped the ZIP you suggested and moved the JAR to "lib/lwjgl.jar" .
  2. I edited jme3-lwjgl/build.gradle to change
api 'org.lwjgl.lwjgl:lwjgl:2.9.3'

to

api 'lwjgl:lwjgl'
  1. When I tried to run HelloJme3, I got:
Jan 05, 2023 9:28:30 AM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.6.0-alpha1
 * Branch: master
 * Git Hash: 5b9fc87
 * Build Date: 2023-01-05
Exception in thread "jME3 Main" java.lang.UnsatisfiedLinkError: The required native library 'openal64' was not found in the classpath via 'native/linux/libopenal64.so'. Error message: no openal64 in java.library.path: /usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib
	at com.jme3.system.NativeLibraryLoader.loadNativeLibrary(NativeLibraryLoader.java:590)
	at com.jme3.system.lwjgl.LwjglContext.loadNatives(LwjglContext.java:229)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:219)
	at java.base/java.lang.Thread.run(Thread.java:833)
  1. I added
runtimeOnly 'org.lwjgl.lwjgl:lwjgl-platform:2.9.3:natives-linux'

(Are those the correct natives to use with your fork?)

  1. When I ran HelloJME3 I still got invalid refresh rates and
Jan 05, 2023 10:05:06 AM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.6.0-alpha1
 * Branch: master
 * Git Hash: 5b9fc87
 * Build Date: 2023-01-05
Jan 05, 2023 10:05:06 AM com.jme3.app.LegacyApplication handleError
SEVERE: Failed to create display
java.lang.RuntimeException: Unable to find fullscreen display mode matching settings
	at com.jme3.system.lwjgl.LwjglDisplay.createContext(LwjglDisplay.java:80)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:120)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:221)
	at java.base/java.lang.Thread.run(Thread.java:833)

Jan 05, 2023 10:05:06 AM com.jme3.app.LegacyApplication handleError
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.lang.IllegalMonitorStateException: current thread is not owner
	at java.base/java.lang.Object.notifyAll(Native Method)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:135)
	at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:221)
	at java.base/java.lang.Thread.run(Thread.java:833)


Exception: java.lang.NullPointerException thrown from the UncaughtExceptionHandler in thread "jME3 Main"

@Ali-RS
Copy link
Member

Ali-RS commented Jan 5, 2023

Thanks so much for trying it.

Are those the correct natives to use with your fork?

Yes

When I ran HelloJME3 I still got invalid refresh rates and

I doubt in your case it might be the AWT that returns the wrong display modes that do not match with the display modes loaded by lwjgl2 (via xrandr).

@stephengold
Copy link
Member Author

Both LWJGLv2 and LWJGLv3 provide methods to enumerate the available display modes. For my Acorus library, I wrote utility methods to dynamically determine which version(s) of LWJGL are available and invoke the appropriate method. It seems to work reliably.

I think we should do something similar for the v3.6 display-settings dialog.

@pspeed42
Copy link
Contributor

pspeed42 commented Jan 5, 2023

Yes, I agree... it seems to be something we've been missing for a long time to be able to generically get a list of "GL library supported modes" without guessing by asking AWT.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 5, 2023

Good idea!

Edit:

Found the utility class you mentioned. Going to take a closer look at it.

https://github.com/stephengold/Acorus/blob/0a8331b07cbecb68fa7ffb12b7a10b6b3794c0ef/AcorusLibrary/src/main/java/jme3utilities/ui/DsUtils.java#L56

@Ali-RS Ali-RS reopened this Jan 5, 2023
@stephengold
Copy link
Member Author

I still think this is a duplicate of #947. Not sure why it got re-opened.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 5, 2023

Well, I believe the causes are different and need different treatments.
One is related to the AWT issue (yours) and one is that lwjgl2 takes the first display in the map as the primary display which is not always true. They both produce the same errors.

The later can simply be fixed by https://github.com/Ali-RS/lwjgl/commit/fbeac9a69a347bf7d34a01931b8757fac5f8dd41.

Please feel free to close this if you think otherwise.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 8, 2023

When I replace these lines

GraphicsDevice device = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
modes = device.getDisplayModes();

with

modes = DsUtils.listDisplayModes().toArray(new DisplayMode[0]);

I get this error at runtime

Exception in thread "AWT-EventQueue-0" java.lang.UnsatisfiedLinkError: no lwjgl64 in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
	at java.lang.Runtime.loadLibrary0(Runtime.java:843)
	at java.lang.System.loadLibrary(System.java:1136)
	at org.lwjgl.Sys$1.run(Sys.java:72)
	at java.security.AccessController.doPrivileged(Native Method)
	at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
	at org.lwjgl.Sys.loadLibrary(Sys.java:87)
	at org.lwjgl.Sys.<clinit>(Sys.java:117)
	at org.lwjgl.opengl.Display.<clinit>(Display.java:135)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at com.jme3.util.DsUtils.<clinit>(DsUtils.java:92)
	at com.jme3.awt.AWTSettingsDialog.<init>(AWTSettingsDialog.java:247)
	at com.jme3.awt.AWTSettingsDialog$1.run(AWTSettingsDialog.java:162)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


@Ali-RS
Copy link
Member

Ali-RS commented Jan 8, 2023

Calling DsUtils.listDisplayModes() after the app start works fine (e.g. inside simpleInitApp()) but if I call it before the app starts it gives the above error.

I guess that is because at that point the natives are not still loaded via NativeLibraryLoader which will happens only when the context is being created. (after calling to the app.start())

@stephengold
Copy link
Member Author

Could you load the natives explicitly, before the app starts?

@Ali-RS
Copy link
Member

Ali-RS commented Jan 8, 2023

I also tested with lwjgl3, and DsUtils.listDisplayModes() returns an empty array with lwjgl3 if called before app start.

Could you load the natives explicitly, before the app starts?

In the case of lwjgl2 if I add NativeLibraryLoader.loadNativeLibrary("lwjgl", false); before the app starts and before calling to DsUtils.listDisplayModes() it works fine and the crash goes away.

But with lwjgl3 if load natives (NativeLibraryLoader.loadNativeLibrary("lwjgl3", false);, NativeLibraryLoader.loadNativeLibrary("glfw-lwjgl3", false);) before app starts and before calling to DsUtils.listDisplayModes() it does not make any difference and still returns an empty array.

I made a test case


import com.jme3.app.SimpleApplication;
import com.jme3.awt.AWTSettingsDialog;
import com.jme3.system.NativeLibraryLoader;
import com.jme3.util.DsUtils;

import java.awt.*;
import java.util.Arrays;

/**
 * @author Ali-RS
 */
public class TestDsUtils extends SimpleApplication {

    public static void main(String[] args) {
        // Load Natives For LWJGL 2
        NativeLibraryLoader.loadNativeLibrary("lwjgl", false);

        // Load Natives For LWJGL 3
        NativeLibraryLoader.loadNativeLibrary("lwjgl3", false);
        NativeLibraryLoader.loadNativeLibrary("glfw-lwjgl3", false);

        System.out.println("Debugging Display Modes Before Start");
        debugDisplayModes(); // Does not work with LWJGL 3

        TestDsUtils app = new TestDsUtils();
        app.setShowSettings(false);
        app.start();

        System.out.println("Debugging Display Modes After Start");
        debugDisplayModes(); // Does not work with LWJGL 3
    }

    private static void debugDisplayModes() {
        DisplayMode[] modes = DsUtils.listDisplayModes().toArray(new DisplayMode[0]);//device.getDisplayModes();
        //Arrays.sort(modes, new AWTSettingsDialog.DisplayModeSorter());

        System.out.println("Num Modes:" + modes.length);
        for (DisplayMode mode : modes) {
            System.out.println("Size=[" + mode.getWidth() + "," + mode.getHeight() + "], refreshRate=" + mode.getRefreshRate() );
        }
    }

    @Override
    public void simpleInitApp() {
        System.out.println("Debugging Display Modes From simpleInitApp");
        debugDisplayModes();
    }
}


@stephengold
Copy link
Member Author

LWJGL v3 loads its natives using a static initializer, so there's no need for us to explicitly load them. I suspect the test app fails with LWJGL v3 because GLFW.glfwInit() isn't invoked prior to DsUtils.listDisplayModes().

@Ali-RS
Copy link
Member

Ali-RS commented Jan 8, 2023

I suspect the test app fails with LWJGL v3 because GLFW.glfwInit() isn't invoked prior to DsUtils.listDisplayModes().

You were right, if I call GLFW.glfwInit(); before DsUtils.listDisplayModes() then it works fine. I doubt that this has a breaking effect. (?)

@stephengold
Copy link
Member Author

The cleanest solution, I think, would be to have 2 different settings dialogs: one for LWJGL v2 and one for LWJGL v3.

The one for LWJGL v2 could use AWT to create the dialog, but it would use org.lwjgl.opengl.Display.getAvailableDisplayModes() to enumerate display modes. That would address this issue.

The one for LWJGL v3 wouldn't use AWT at all.

@stephengold
Copy link
Member Author

I doubt that this has a breaking effect.

There is a small amount of configuration that must occur prior to GLFW.glfwInit(), such as configuring GLFW debugging and "glfw_async". These would have to be configured using config files, environment variables, command-line arguments, etcetera instead of the settings dialog and AppSettings.

Or are you concerned about the possibility that glfwInit() might get invoked twice?

@Ali-RS
Copy link
Member

Ali-RS commented Jan 9, 2023

Or are you concerned about the possibility that glfwInit() might get invoked twice?

Yes, this was one of the concerns. But seems calling it multiple times does not cause an issue, at least in my case.

The next concern is that glfwInit() must be called before doing anything with AWT. (I remember I have seen this mentioned somewhere by @Spasi)

So in the case of the TestChooser app it must be inside the main and in the case of AwtSettingsDialog, it must be before calling to this:

return AWTSettingsDialog.showDialog(settings,loadFromRegistry);

otherwise, it crashes the app in my case with these errors:

X Error of failed request:  RenderBadPicture (invalid Picture parameter)
  Major opcode of failed request:  139 (RENDER)
  Minor opcode of failed request:  7 (RenderFreePicture)
  Picture id in failed request: 0x4000024
  Serial number of failed request:  1452
  Current serial number in output stream:  1458

and

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007fce4acf3fc4, pid=11844, tid=0x00007fce2056c700
#
# JRE version: OpenJDK Runtime Environment (8.0_352-b08) (build 1.8.0_352-b08)
# Java VM: OpenJDK 64-Bit Server VM (25.352-b08 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [libpthread.so.0+0xbfc4]  pthread_mutex_lock+0x4
#

I created DsUtils.initNatives(), if I call it in TestChooser.main() and JmeDialogsFactoryImpl.showSettingsDialog() it works fine and no crash happens.

    /**
     * Call this only when app has not started yet (e.g. when requesting
     * display modes from settings dialog).
     */
    public static void initNatives() {
        if (initializedNatives) {
            return;
        }
        
        if (hasLwjglVersion3()) {
            try {
                Class<?> glfwClass = Class.forName("org.lwjgl.glfw.GLFW");
                Method glfwInit = glfwClass.getDeclaredMethod("glfwInit");
                glfwInit.invoke(null);
            } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException |
                     IllegalAccessException exception) {
                throw new RuntimeException(exception);
            }
        } else if (hasLwjglVersion2()) {
            NativeLibraryLoader.loadNativeLibrary("lwjgl", true);
        }

        initializedNatives = true;
    }

P.S:

off-topic
If I had a mac to test, I would definitely try glfwInit() at the main method at the very beginning and before calling to app.start() to see if it fixes the mac + jme awt settings dialog issue as well.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 9, 2023

The cleanest solution, I think, would be to have 2 different settings dialogs: one for LWJGL v2 and one for LWJGL v3.

Agree with you.
I can copy those 3 classes from jme3-awt-dialogs module (AWTErrorDialog, AWTSettingsDialog, JmeDialogsFactoryImpl) into jme3-lwjgl module and change it to use org.lwjgl.opengl.Display.getAvailableDisplayModes() or do you prefer a separate module jme3-lwjgl-dialogs for that?

By the way, another simple trick also could be to just ignore the passed "refresh rate" in LwjglDisplay.createContext() if it is wrong when running in full-screen and just print a console log instead of throwing an exception. I guess that is why lwjgl3 does not crash in your case even if the refresh rate passed is wrong, probably it just ignores the hint (if wrong?) when in fullscreen.

Edit:
But before proceeding with any of these solutions @stephengold would you please try your test once more with the new lwjgl-2.9.4 available from Sonatype and see if this error still happens?

@Ali-RS
Copy link
Member

Ali-RS commented Jan 9, 2023

Yet another solution is to do something like @riccardobl did with JmeDialogsFactory and JmeDialogsFactoryImpl. We can create an interface DisplayModesLoader and provide the implementation in jme3-lwjgl module. AWTSettingsDialog class then will first need to look on the classpath for a DisplayModesLoaderImpl and if it found one it will use it if no implementation is found then will fall back to using AWT GraphicsEnvironment. Any thought?

@Ali-RS
Copy link
Member

Ali-RS commented Jan 9, 2023

On the other hand, see the java doc for org.lwjgl.opengl.Display.getAvailableDisplayModes()

https://github.com/jMonkeyEngine/lwjgl2/blob/97363d3f49016abde565e767a8bbd685cc920439/src/java/org/lwjgl/opengl/Display.java#L171-L186

any given mode is not guaranteed to be available nor is it guaranteed to be within the
current monitor specs (this is especially a problem with the frequency parameter).
Furthermore, it is not guaranteed that create() will detect an illegal display mode.

this makes me feel that we might get from one hole to another! and cause me to reconsider this solution:

By the way, another simple trick also could be to just ignore the passed "refresh rate" in LwjglDisplay.createContext() if it is wrong when running in full-screen and just print a console log instead of throwing an exception. I guess that is why lwjgl3 does not crash in your case even if the refresh rate passed is wrong, probably it just ignores the hint (if wrong?) when in fullscreen.

@stephengold
Copy link
Member Author

we might get from one hole to another!

Based on my experience, if org.lwjgl.opengl.Display.getAvailableDisplayModes() puts us in a hole, it will be a much shallower hole than the one AWT has put us in.

LWJGL and AWT do not play nicely together.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 9, 2023

I submitted a shallow fix in #1898

It just gets rid of the exception to let the app continue running. For a proper solution, I will let someone else handle that.

@Ali-RS Ali-RS added this to the v3.6.0 milestone Jan 9, 2023
@stephengold
Copy link
Member Author

Yet another solution is to do something like riccardobl did with JmeDialogsFactory and JmeDialogsFactoryImpl.

I would be okay with that.

@Ali-RS
Copy link
Member

Ali-RS commented Jan 10, 2023

I would be okay with that.

Are you willing to prototype the interface in question? so I can provide an implementation based on it.

Edit:
Also, please note that we would still need to load lwjgl2 natives to be able to use org.lwjgl.opengl.Display.

@Ali-RS Ali-RS added the bug Something that is supposed to work, but doesn't. More severe than a "defect". label Jan 10, 2023
@stephengold
Copy link
Member Author

Are you willing to prototype the interface in question?

I'd rather not. Designing Java interfaces is not my strength, and I have many other tasks in my queue.

@Ali-RS Ali-RS closed this as completed in 4e80c9b Jan 11, 2023
bob0bob added a commit to bob0bob/jmonkeyengine that referenced this issue May 31, 2023
* Android: Implemented AndroidNativeBufferAllocator - Deprecated AndroidBufferAllocator (jMonkeyEngine#1821)

* [skip ci] update natives snapshot

* Add GL debug capabilities (jMonkeyEngine#1790)

* Add GL debug capabilities

* Fix: check for null names

* Add java types to VarType and type checks to MatParam (jMonkeyEngine#1797)

* SettingsDialog: Fixed LAF

* SettingsDialog: Updated jme3 copyright

* README.md:  add a link to Chatter Games website

* Update README.md to include Exotic Matter (jMonkeyEngine#1838)

Would be great to have our game Exotic Matter also mentioned as its engine is based on jME. Thanks!

* jme3-examples:  update the fallback URLs for "TerrainGridTestData.zip"

* Improved code readability: ParticlePointMesh and ParticleTriMesh (jMonkeyEngine#1831)

* jme3-core:  add tests for Transform.toString()

* Fix issue  jMonkeyEngine#1839 (Memory Leak in DefaultLightFilter)

Co-authored-by: Lukas Habring <lukas@Lukas-PC>

* Added getter & setter for FilterPostProcessor.depthFormat (jMonkeyEngine#1841)

* Added setter for FilterPostProcessor.depthFormat

* Added getter for FilterPostProcessor.depthFormat

* update the Gradle wrapper to v7.5.1

* main.yml:  GitHub Action's ubuntu-18.04 environment is deprecated

* bugfix:  mergedJavadoc task is incompatible with Gradle v7

* main.yml:  udate "actions/setup-java" to v3

* main.yml:  add JDK 17 tests

* build.gradle: update gradleVersion in case user runs the "wrapper" task

* Fix jMonkeyEngine#1843 (java.util.zip.ZipException in HttpZipLocator) (jMonkeyEngine#1842)

* HttpZipLocator:fix invalid code lengths set & invalid distance too far back ZipExceptions.

* Get file name length and extra field length from local file header to calculate file data offset.

* Make fields `byteBuf`, `charBuf`, `utf8Decoder` non-static because they are not thread-safe.

* Surround streams with try-with-resources block.

* Clean up the display modes parsing

* No need to separately test for the contains

* README.md:  SDK v3.4 has been released

* Some enhancement to new animation system (jMonkeyEngine#1845)

* Some enhancement to new animation system, including:
* Option to enable/disable animation mask propagation to child actions.
* Option to control max transition weight. For example useful for controlling smooth animation transition when an animation is removed from an upper layer.
* Added animation loop support in AnimLayer.
* AnimLayer can now also keep action name, so one can easily lookup currently playing action name in an specific layer.

* Minor Javadoc fix.

* AnimLayer: clear `currentActionName` inside `cloneFields` method.

* Added a Loop tween to Tweens factory class (jMonkeyEngine#1846)

* Added a Loop tween to Tweens factory class. Supports looping by count or duration.

* Redesigned the Loop tween to work similar to Sequence tween. Now fast forwarding the loop will also try to catch up the loops left behind making sure they always see their 'length'.

* Added the missing Override annotation.

* Added Tweens.cycle() and Tweens.invert() methods (jMonkeyEngine#1849)

Cycle is used for running delegate tween back and force and Invert is used to run delegate tween backward.

* BlendAction: resolve slow-motion side effect caused by stretching actions (jMonkeyEngine#1848)

* BlendAction: resolve slow motion side effect caused by stretching any action that doesn't have the same length. It generates speed factor for each child animation that are dynamically interpolated and applied to base speed based on the blend weight taken from blend space.

* Add missing javadoc.

* Add Copyright.

* Renamed calculateSpeedFactors() to applyDefaultSpeedFactors() and made it non static.

* Fix issue jMonkeyEngine#1850 (JmeSystem.writeImageFile() throw java.nio.BufferUnderflowException) (jMonkeyEngine#1851)

* jme3-jogg:  upgrade the j-ogg-all library to v1.0.2

* jMonkeyEngine#1569 Fix license file to be better detected by GitHub (jMonkeyEngine#1855)

* jme3-plugins:  update the "gson" library to v2.9.1

* workflows/main.yml:  update the "checkout" action to v3

* fix: broken link in README.md (jMonkeyEngine#1858)

Signed-off-by: Kasper Aaquist Johansen <kasperaaquist@gmail.com>

Signed-off-by: Kasper Aaquist Johansen <kasperaaquist@gmail.com>

* workflows/main.yml:  update wrapper-validation-action to v1.0.5

* update wrapper-validation-action to v1.0.5 (one more place)

* README.md:  SDK v3.5.2 has now been published

* Quaternion:  javadoc

* Add instance culling function in InstancedGeometry (jMonkeyEngine#1865)

* Added a workaround to prevent shadow disappearing on instanced geometries away from camera by introducing an instance culling function on InstancedGeometry. There also is a default implementation provided.

* Removed the bound-scale hack for shadow disappearing issue from DefaultInstanceCullingFunction. The “right” solution is to have it pay attention to the frustums of whatever shadow-casting lights are around… but anyway developers now can implement their own frustum culling however they like or even "unset" it to disable instance culling which should also resolve the shadow issue.

* Remove unused imports.

* Fix: make the stencil test functions usable. (jMonkeyEngine#1866)

* Fix: make the stencil test functions usable.

* Fix: formatting

* Fix: formatting

* Fix: formatting

* Fix: copyright year

* upgrade to Gradle v7.6 (for its Java 19 support)

* Read shorts properly

* More efficient logging

* Read unsigned byte properly

* Remove unnecessary byte and call the variable c as in the formulas

* move SettingsDialog and ErrorDialog to new jme3-awt-dialogs module (jMonkeyEngine#1876)

* Refactory Settings/Error dialogs in JmeDialogsFactory and jme3-awt-dialogs

* add build.gradle

* Add copyright headers

* Fix formatting and documentation

Co-authored-by: riccardobl <riccardo0blb@gmail.com>

* JmeSurfaceView: Package migration (jMonkeyEngine#1819)

* JmeSurfaceView: migration to new package (com.jme3.view.surfaceview)

* JmeSurfaceView: migration to new package (com.jme3.view.surfaceview)

* upgrade the groovy-test library to v3.0.13

* jme3-core:  correct/clarify javadoc

* Implementation of a glTF extension loader for KHR_texture_transform (jMonkeyEngine#1869)

* Implementation of a glTF extension loader for KHR_texture_transform

* Thread-safe version of the glTF extension loader for KHR_texture_transform

* Updated thread-safe version of the glTF extension loader for KHR_texture_transform

* Fix (switched indices of the translation matrix): thread-safe version of the glTF extension loader for KHR_texture_transform

* Added support for texCoord, fixed matrix comparison

* Simplified matrix comparison, removed trailing whitespaces

* Update to differentiate transformations applied to different UV sets

* Improved memory usage for transformMap

* Specified Map generic types & removed unnecessary cast

Co-authored-by: Manuel <Manuel@DESKTOP-6RJH3UF>

* jme3-core:  test the com.jme3.math.Triangle class

* bugfix:  Mesh.getTriangle() may yield an incorrect centroid

* Fix jMonkeyEngine#1867 (LightFilter gets applied even if not needed) (jMonkeyEngine#1872)

* Add NullLightFilter.java

* Add usage of null light filter when rendering shadowmaps

* Fix formatting

* Make static NullLightFilter final

* Fix formatting and author

* BlendableAction: Fix JavaDoc for setMaxTransitionWeight & replace assert with IllegalArgumentException (jMonkeyEngine#1881)

* Fix jMonkeyEngine#1412 (GltfLoader does not support AO packed in MetallicRoughnessMap) (jMonkeyEngine#1880)

* Fix jMonkeyEngine#1882 (J3MLoader always generates mips ignoring MinFilter) (jMonkeyEngine#1884)

* Get texture mips generation flag from MinFilter specified in j3m file.

* Update copyright date.

* Fix J3MLoaderTest failing.

* Fix TestMaterialWrite failing.

* Update copyright date.

* Use Trilinear if no min filter is specified in j3m file.

* Add copyright note in J3MOutputCapsule.

* Fix J3MLoaderTest failing.

* Made extension loaders non-static to avoid concurrency issues (jMonkeyEngine#1886)

Now each GltfLoader instantiated via ThreadLocal will have its own instances of extension loaders.

* Fix jMonkeyEngine#1883 (Image class wrongly setting GL mips flags inside the constructor) (jMonkeyEngine#1885)

* AreaUtils: Migrated package to `com.jme3.util` (jMonkeyEngine#1826)

* AreaUtils: Migrated package to `com.jme3.util`

* com.jme3.uitl.AreaUtils: removed code duplicates - added `final` class specifier

* com.jme3.util.AreaUtils: fixed duplication build error

* utils/AreaUtils.java: full migration to the utility package

* scene/control/AreaUtils.java: removed utility methods - delegated functionality to `jme3.utils.AreaUtils`

* scene/AreaUtils: fixed `jme3.util` package linking typo

* Renderer:  javadoc correction

* update the groovy-test library to v3.0.14

* LICENSE.md:  add 2023 to copyright years

* Fix jMonkeyEngine#1892 (TestChooser does not show classes list when run with java 8) (jMonkeyEngine#1893)

* TestChooser:fix class list not showing when run with java 8.

* Update copyright date.

* main.yml: use "temurin" openjdk. Fix jMonkeyEngine#1896 (jMonkeyEngine#1897)

* README.md:  add Demon Lord to the list of published games

* Fix jMonkeyEngine#1773 (Wrong particle position when `worldSpace` flag equals to true) (jMonkeyEngine#1889)

* Add test case for issue jMonkeyEngine#1773.

* Fix wrong particle position when using 'EmitterMeshVertexShape' or 'EmitterMeshFaceShape' and worldSpace flag equal to true. The old code was interpolating particles position toward emitter world position and this was only working fine for EmitterPointShape and in the other shapes this was causing particles not keep the shape because they were being dragged toward emitter position. The new code calculates the distance vector from emitter last location to the current emitter location and subtracts it from particles position to generate a hypothetical position that is used for interpolation.

* Add javadoc to TestIssue1773.

* Minor javadoc fix.

* jme3-niftygui: solve issue jMonkeyEngine#1891 (incorrect fullscreen layout)  (jMonkeyEngine#1895)

* jme3-lwjgl:updated to lwjgl v2.9.4 hosted by org.jmonkeyengine. Fix jMonkeyEngine#1247, jMonkeyEngine#1215, jMonkeyEngine#947 (jMonkeyEngine#1902)

* Fix jMonkeyEngine#1890 (crashes attempting to run example apps in fullscreen with LWJGL v2) (jMonkeyEngine#1898)

* jme3-lwjgl:fallback to standard 60Hz fullscreen display mode if the specified frequency in the AppSettings is not available and log a warning.

* Fallback to whatever bps or frequency is available. Added a wild-card value to let selecting any bps or frequency available by passing -1.

* Support AWT display frequency model. Looks like AWT uses mathematics round to convert float frequency values to int while lwjgl 2 uses mathematics floor. For example if frequency is 59.83, AWT will return 60 but lwjgl 2 will return 59.

* Remove redundant check.

* Added documentation for getFullscreenDisplayMode method.

* When in VR attach the debug scene to the two eye's scenes. Fix#1795  (jMonkeyEngine#1888)

* jMonkeyEngine#1795 When in VR attach the debug scene to the two eye's scenes

This ensures they show up correctly

* jMonkeyEngine#1795 Whitespace corrections

* jMonkeyEngine#1795 Further whitespace corrections

* jMonkeyEngine#1795 Yet more whitespace corrections

* jMonkeyEngine#1795 Add explanatory comment as to why VR and non-VR have totally different approaches

* Refactored PBR Terrain to use new for-loops. Fix jMonkeyEngine#1785 (jMonkeyEngine#1901)

Drastically reduced code by utilizing JME's new potential for define-compatible for-loops in shaders. Also cleaned up some other little things like indentations, comments, and code placement so that the code is much more organized and easier to understand.

* add the Spatial.addControlAt() method (jMonkeyEngine#1899)

* JmeContext:  add a getSystemListener() method (jMonkeyEngine#1894)

* jme3-examples:  add tests for issue jMonkeyEngine#1903

* Refactored Advanced PBR Terrain to use new for-loops (jMonkeyEngine#1904)

* Refactored Advanced PBR Terrain to use new for-loops

Similar to my recent pull request doing the same for the base PbrTerrain shader (jMonkeyEngine#1901) this PR also adds for-loop support to the advanced version of the pbr shader that uses texture arrays

* Update PBRTerrain.frag

* Update AdvancedPBRTerrain.frag

* Update AfflictionLib.glsllib (jMonkeyEngine#1905)

This PR goes along with my last PR cleaning up the AdvancedPBRTerrain.j3md shader. The method getTriPlanarBlendFromTexArray() was put into this glsllib that contains all of the other commonly used functions for the pbr terrain shaders.

* common.gradle: set class files compatible with Java 8 using "release" option (jMonkeyEngine#1907)

* common.gradle: set class files compatible with Java 8. This will keep java 8 compatibility when it is compiled with newer java versions.

* Merge with existing block.

* Reformat code.

* common.gradle: add "Created-By" jar manifest to show Java version and vendor name (jMonkeyEngine#1913)

* common.gradle: add Created-By in jar manifest to show java version used to create the jar.

* Also add vendor name.

* ParticleEmitter: improve code readability. Apply the DRY principle (jMonkeyEngine#1912)

* add 4 getters to JmeContext for screen position and frame-buffer size (jMonkeyEngine#1911)

* test and fix for jMonkeyEngine#1909 (NPE while generating tangents) (jMonkeyEngine#1910)

* add a JUnit test for issue 1909 (NPE while generating tangents)

* solve issue jMonkeyEngine#1909 (NPE while generating tangents)

* jme3-lwjgl: bump to lwjgl 2.9.5 (jMonkeyEngine#1914)

* Fix jMonkeyEngine#1917 (RendererException in ScreenshotAppState: Attempting to upload empty buffer) (jMonkeyEngine#1918)

* PBRLighting: fix comment describing packed MetallicRoughnessMap (jMonkeyEngine#1921)

Updated a comment about the MetallicRoughness map that previously said the Red channel is unused - changed to instead say that the red channel of MR map stores the AO value if AoPackedInMRMap is true.

* solve issue jMonkeyEngine#1919 (underflow while generating tangents) (jMonkeyEngine#1920)

* jme-core:  add a test for issue jMonkeyEngine#1919 (underflow generating tangents)

* MikktspaceTangentGenerator: solve jMonkeyEngine#1919 (underflow generating tangents)

* main.yml: deploy with jdk17 (jMonkeyEngine#1922)

* Fix jMonkeyEngine#1923 (OSSRH artifacts are build with different java version) (jMonkeyEngine#1924)

* main.yml: build on pushes to the new v3.6 branch

* gradle.properties: next release from "master" branch should be v3.7.0

* resolve issue jMonkeyEngine#1926 (unnecessary dependencies) (jMonkeyEngine#1927)

* buildscript: move def of "niftyVersion" to "common.gradle" (shared between projects)

* jme3-testdata:  rm dependency on "nifty-style-black" (redundant with "jme3-niftygui")

* buildscript: mv "nifty-examples" dependency from "jme3-testdata" to "jme3-examples"

* solve issue jMonkeyEngine#1928 (OutOfMemoryError in FBX importer) (jMonkeyEngine#1929)

* solve issue jMonkeyEngine#1928 (OutOfMemoryError in FBX importer)

* tweak the new javadoc

* solve issue jMonkeyEngine#1930 (NPE in FbxLayerElement) (jMonkeyEngine#1931)

* solve issue jMonkeyEngine#1932 (class cast exceptions in FBX importer) (jMonkeyEngine#1934)

* solve issue jMonkeyEngine#1933 (unsupported operation in FbxNode) (jMonkeyEngine#1936)

* solve issue jMonkeyEngine#1937 (NPE in FbxObject) (jMonkeyEngine#1938)

* solve issue jMonkeyEngine#1939 [NPE in FbxMesh.applyCluster()] (jMonkeyEngine#1940)

* FBXCluster:  create empty arrays if the cluster contains no keyframes

* FbxLoader:  don't construct an animation if there are no keyframes

* update Groovy to v3.0.15

* Update Application.start javadoc. (jMonkeyEngine#1947)

* Update RenderState.setLineWidth javadoc. (jMonkeyEngine#1948)

* Fix jMonkeyEngine#1945 (IllegalStateException when running TestAWTPanels with LWJGL 3) (jMonkeyEngine#1949)

* solve issue jMonkeyEngine#1879 (compile-time error in Skinning.glsllib) (jMonkeyEngine#1942)

* Fix issue jMonkeyEngine#1558 (TestAWTPanels crashes with LWJGL v3 on Linux) (jMonkeyEngine#1944)

* TestAwtPanels: apply swing system LAF. This is needed to prevent JVM crash on Linux and LWJGL 3. (See issue jMonkeyEngine#1558)

* Use single class imports.

* solve issue jMonkeyEngine#1806 (global FrameInterpolator violates threading model) (jMonkeyEngine#1943)

* solve issue jMonkeyEngine#1806 (global FrameInterpolator violates threading model)

* FrameInterpolator:  deprecate the global instance

* Fix a typo in LwjglWindow (jMonkeyEngine#1953)

* Add WaterFilter.getReflectionView method (jMonkeyEngine#1951)

* Added WaterFilter.getReflectionView method.

* Update javadoc.

* README.md:  delete a dead link (Maker's Tale)

* README.md:  add a link to Wild Magic

* resolve issue jMonkeyEngine#1955 (Can not play vorbis audio on Android API 31+) (jMonkeyEngine#1956)

* android-native-vorbis: fix double asset file descriptor closure

* NativeVorbis: better names and javadocs

* NativeVorbisFile#readIntoBuffer: specifies the start and the end of the read

* NativeVorbisFile: better explanation for the output buffer on read functions

* com_jme3_audio_plugins_NativeVorbisFile.c: refactored logs

* NativeVorbisFile: some docs enhances

* NativeVorbisLoader: added updated jme3-copyright

* [skip ci] update natives snapshot

* jme3-jogg: remove dependency on Java Media Framework (jMonkeyEngine#1962)

* solve issue jMonkeyEngine#1960 (use jme3-jogg for loading ogg files on android) (jMonkeyEngine#1961)

* solve issue jMonkeyEngine#1963 (TestMusicPlayer fails to load AL library on lwjgl2) (jMonkeyEngine#1964)

* TestMusicPlayer: fix UnsatisfiedLinkError when using lwjgl2. Solves issue jMonkeyEngine#1963

* Add missing load function for "openal" natives.

* Removed the unnecessary check for lwjgl 2 in classpath.

* Fix comment

* Replace Exception with warning in TerrainPatch (jMonkeyEngine#1966)

* Replace Excpetion with warning in TerrainPatch

PR following up on the discussion in this thread: 
https://hub.jmonkeyengine.org/t/terrain-collision-exception/46491/6

* Update TerrainPatch.java

* Update TerrainPatch.java

* Update TerrainPatch.java

* Update TerrainPatch.java

* Update TerrainPatch.java

* Update TerrainPatch.java

* Update TerrainPatch.java

* Cleanup NativeLibraryLoader & fix wrong library path  (jMonkeyEngine#1967)

* Cleanup NativeLibraryLoader

* Fix wrong library path

* solve issue jMonkeyEngine#1969:  missing check in GLRenderer.clearVertexAttribs() (jMonkeyEngine#1970)

* solve issue jMonkeyEngine#1975:  TestAttachDriver doesn't reset properly (jMonkeyEngine#1976)

* Improve NativeLibraryLoader (jMonkeyEngine#1973)

* Improve NativeLibraryLoader.

* Add javadoc.

* Moved library extraction requirement check into a separate method.

* Fix javadoc.

* Refactor library extraction check method.

* Extract natives to system temp directory retrieved by System.getProperty("java.io.tmpdir") instead of working directory.

* Renamed enum "Openal" to "OpenAL" and added javadoc on NativeLibraries.

* Update comments.

* Deploy master branch commits as snapshot (jMonkeyEngine#1983)

* Deploy main branch commits as snapshot

* Snapshot builds don't have a Release artifact

* restrict snapshot to actual commits on master branch

* Deploy steps don't actually use test-run maven artifacts

* Partial Revert. We need that artifact

* Fix sonatype snapshots repo url

as mentioned in https://central.sonatype.org/publish/publish-guide/

* Allow use of Emissive color as a multiplier with EmissiveMap in PBRLighting (jMonkeyEngine#1979)

* Add support for NormalScale in PBRLighting & GltfLoader (jMonkeyEngine#1980)

* Added NormalScale factor in PBRLighting. The scalar parameter applied to each normal vector of the normal map. This value scales the normal vector in X and Y directions using the formula: `scaledNormal =  normalize((<sampled normal texture value> * 2.0 - 1.0) * vec3(<normal scale>, <normal scale>, 1.0))`.

* Add support for reading NormalScale in GltfLoader.

* Add support for AoStrength in PBRLighting & GltfLoader (jMonkeyEngine#1981)

* Added AoStrength factor in PBRLighting. A scalar multiplier controlling the amount of occlusion applied.

* Add support for reading AoStrength in GltfLoader.

* Fix ao calculation to follow gltf specs.

* Update comment on AoStrength mentioning the min and max values.

* Clamp ao to 0 for negative values that might cause by applying AoStrength > 1.

* Use glsl clamp instead of max.

* update Groovy to v3.0.16

* Some javadoc cleanup (jMonkeyEngine#1986)

* Fix some invalid HTML tags

* Correct deprecation annotations

* Doc-comments cleanup

- Corrected some typos, grammar, etc.
- reflowed egregiously long comment lines to comply with column limits

* README.md: latest stable version of Engine

* LwjglContext: re-initialize renderer on context restart (lwjgl 2) (jMonkeyEngine#1988)

* LwjglContext: initialize renderer on context restart (lwjgl 2).

* Reset GL objects in renderer when context restart.

* README.md:  add Mravelous Marbles to the list of JME-powered games

* update the LWJGL3 libraries from v3.3.1 to v3.3.2

* update Groovy to v3.0.17

* correctly handle negative IDs in getUniqueId() methods (jMonkeyEngine#1991)

* NativeLibraryLoader:  more detailed exception in computeNativesHash() (jMonkeyEngine#2001)

* README.md:  add "Boxer" to the project list

* solve issue jMonkeyEngine#2003 (ParticleDepositionHeightMap.load return value) (jMonkeyEngine#2005)

* solve issue jMonkeyEngine#2002 (TerrainGridTileLoaderTest fails to load tiles) (jMonkeyEngine#2006)

* solve issue jMonkeyEngine#2002 (TerrainGridTileLoaderTest fails to load tiles)

* TerrainGridTileLoaderTest:  add a clarifying comment

* solve issue jMonkeyEngine#2011 (app crashes when using OpenGL version 3.0 and 3.1 with LWJGL 3) (jMonkeyEngine#2009)

* fix system crush issue when set desktop AppSetting.setRenderer below 3.2

* Revert "fix system crush issue when set desktop AppSetting.setRenderer below 3.2"

This reverts commit 11b7c9e.

* fix system crush issue when set desktop AppSetting.setRenderer below 3.2. This fix is reedited by instruction of ali_rs

---------

Co-authored-by: ray <raymond.yang@cottonwoodanalytics.com>

* solve issue jMonkeyEngine#2007 (instanced objects are culled when using WaterFilter) (jMonkeyEngine#2008)

* Fix issue with InstancedGeometry that uses the wrong camera for "instance culling" check.

* Minor javadoc update.

* Variables should start with lower-case. (jMonkeyEngine#2013)

New PullRequest as suggested in jMonkeyEngine#2012

Co-authored-by: Starcommander <starcommander@gmx.at>

* solve issue jMonkeyEngine#1992: better messages in spatial assertions (jMonkeyEngine#1993)

* jMonkeyEngine#1992 Improve the messages being reported from spatial assertions

* jMonkeyEngine#1992 Make clear what name is in the assertion messages

* jMonkeyEngine#1992 Whitespace correction

* solve issue jMonkeyEngine#2015 (Picture class lacks 2 getters)

* CloneableSmartAsset:  clarify the setKey() javadoc (jMonkeyEngine#2018)

* update Gradle to v7.6.1

---------

Signed-off-by: Kasper Aaquist Johansen <kasperaaquist@gmail.com>
Co-authored-by: Scrappers Team <60224159+Scrappers-glitch@users.noreply.github.com>
Co-authored-by: Github Actions <actions@users.noreply.github.com>
Co-authored-by: Riccardo Balbo <riccardo0blb@gmail.com>
Co-authored-by: Scrappers <scrappers.tm@gmail.com>
Co-authored-by: Stephen Gold <sgold@sonic.net>
Co-authored-by: Florian Frankenberger <f.frankenberger@mobiuscode.de>
Co-authored-by: Wyatt Gillette <jefferydeaver2010@gmail.com>
Co-authored-by: Lukas-Habring <102620478+Lukas-Habring@users.noreply.github.com>
Co-authored-by: Lukas Habring <lukas@Lukas-PC>
Co-authored-by: JosiahGoeman <31492985+JosiahGoeman@users.noreply.github.com>
Co-authored-by: Paul Speed <pspeed42@users.noreply.github.com>
Co-authored-by: Ali-RS <ali_codmw@yahoo.com>
Co-authored-by: Toni Helenius <helenius.toni@gmail.com>
Co-authored-by: Jan Schäfer <j@nschaefer.net>
Co-authored-by: Kasper Aaquist Johansen <kasperaaquist@gmail.com>
Co-authored-by: Michael Zuegg <zzuegg@users.noreply.github.com>
Co-authored-by: manuelrmo <118840772+manuelrmo@users.noreply.github.com>
Co-authored-by: Manuel <Manuel@DESKTOP-6RJH3UF>
Co-authored-by: Noeri Huisman <8823461+mrxz@users.noreply.github.com>
Co-authored-by: richardTingle <6330028+richardTingle@users.noreply.github.com>
Co-authored-by: Ryan McDonough <peanut64646@gmail.com>
Co-authored-by: Sailsman63 <lukejsails@gmail.com>
Co-authored-by: Raymond Young <gongxi83@163.com>
Co-authored-by: ray <raymond.yang@cottonwoodanalytics.com>
Co-authored-by: Paul Kashofer <soundmodul@gmx.at>
Co-authored-by: Starcommander <starcommander@gmx.at>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something that is supposed to work, but doesn't. More severe than a "defect".
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants