Let’s discuss jMonkeyEngine 3.4

Yes, that one.

what are the new features & issues at all that is introduced to jme3.4.0-alpha

Good question. Here are the new features I’m aware of:

  • jme3-lwjgl3: add native libraries for Linux_ARM and 32-bit Windows
  • added BaseAppState.getState(id…) based methods for looking up specific app states by ID from a base app state subclass.
  • added desaturation functionality to Unshaded.j3md
  • allow use of a GlowColor with GlowMap
  • packing AO in the metallic roughness map
  • framebuffer: a unified way to set render targets
  • depth-only copy with Renderer.copyFrameBuffer
  • GltfLoader: decode URI for files
  • ability to remove morph targets from a mesh
  • additional getters/setters in AnimComposer
  • OBJLoader enhancement: named groups support

You can generate a list of v3.4 issues and PRs. Many of these are still open!

Be aware that between v3.3.2 and v3.4.0-alpha1, five packages were removed:

  • jme3-blender
  • jme3-bullet
  • jme3-bullet-native
  • jme3-bullet-native-android
  • jme3-jogl

Also be aware of the following changes between v3.4 and prior releases:

  • AppSettings: changed the “VSync” default from false to true
  • AppSettings: changed the gamma-correction default from false to true

I was also wanting to get a gamepad remapper overhaul in for this, but no one has really commented on my post, so I’ve held off on a PR for now. Of course, I probably should also add those fixes for #1466

1 Like

I tried to build v3.4.0-alpha2, but “apt-get update” failed for reasons I don’t fully understand: (logfile)

Reading package lists...
E: The repository 'https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_18.04  Release' no longer has a Release file.
Error: Process completed with exit code 100.

Perhaps it was a transient issue. I’ll try again later.

Edit: v3.4.0-alpha3 has been released. It’s available from GitHub, Bintray/JCenter, and MavenCentral. So far, the only issue I’ve noticed is that the BinTray version is missing one checksum file (out of 68). Since alpha3 is probably JME’s last release to Bintray/JCenter, I’m not motivated to solve this issue.

I’m pleased to note that the MavenCentral version includes jme3-testdata, which was never made available from JCenter. Having all 17 libraries available from one Maven repo should prove very convenient.


I just donwloaded jme3.4-alpha3 and I realized that there’s jme3-lwjgl3 (and its dependencies) missing in the package although the sources are included. I don’t know if it’s the intended behaviour or it’s just missing by mistake

1 Like

If it’s missing, that’s an issue. It’s available from Maven.org and Bintray.com. Where did you download from?


I’ve plugged 3.4.0-alpha3 into both my games. No issues so far but I’ll continue to run with this version and see if anything comes up. Qualitatively the performance felt the same.

Areas my games covers:

  • Gradle Build
  • Desktop (jme3-desktop)
  • SimpleWaterProcessor
  • WaterFilter (Obviously different game from SimpleWaterProcessor)
  • Custom Meshes
  • Shaders (as in written by me, not just the built ins)
  • JavaFx integration (used for menus etc)
  • Picking
  • jme3-lwjgl3 (I didn’t seem to have the problems joliver82 experienced)
  • ParticleEmitter
  • ogg sound files (jme3-jogg)
  • wav sound files

from github releases → https://github.com/jMonkeyEngine/jmonkeyengine/releases/download/v3.4.0-alpha3/jME3.4.0-alpha3.zip

1 Like

The zipfile contains an executable version of the JME test chooser. The executable shouldn’t contain both the jme3-lwjgl library and the jme3-lwjgl3 library because they contain conflicting classes (in the same way the jme3-bullet and jme3-jbullet contain conflicting classes).

Bottom line: intended behaviour

OK, got it. I didn’t know it came with the executable. Related to this… I thought jme3-lwjgl3 was to be set as default instead of jme3-lwjgl

1 Like

Last time this came up (August 2019) my “read” of the consensus was to keep jme3-lwjgl (LWJGL v2) as the default.

1 Like

Perhaps @RiccardoBlb can comment on the status of #1406. After it is merged I think it would be safe to make jme-lwjgl3 the default.


I read that thread some time ago but I didn’t follow it till the end so I just assumed that having passed so much time everything would have been fixed and default changed to lwjgl3

Thanks for the answers :wink:

1 Like

Hello everyone,
would it be possible to add the getter and setter methods for the fieldOfView parameter of the Camera.java class to make it easier to read and write?

  • public void setFieldOfView(float fov) {}
  • public float getFieldOfView() {}

something like that so you don’t have to use a wrapper class like in the example?

public class MainCamera {
    private Camera cam;
    private float fieldOfView;
    private float near;
    private float far;
     * Creates a camera state that will initialize the application camera to a
     * 45 degree fov, 0.1 near plane, and 1000 far plane.
     * @param cam
    public MainCamera(Camera cam) {
        this(cam, 45, 0.1f, 1000); // 45 is the default JME fov

     * Creates a camera state that will initialize the specified camera to the
     * specified parameters. If the specified camera is null then the
     * application's main camera will be used.
     * @param cam
     * @param fov
     * @param near
     * @param far
    public MainCamera(Camera cam, float fov, float near, float far) {
        this.cam = cam;
        this.fieldOfView = fov;
        this.near = near;
        this.far = far;
    public void setFieldOfView(float f) {
        if (this.fieldOfView == f) {
        this.fieldOfView = f;

    public float getFieldOfView() {
        return fieldOfView;

    public void setNear(float f) {
        if (this.near == f) {
        this.near = f;

    public float getNear() {
        return near;

    public void setFar(float f) {
        if (this.far == f) {
        this.far = f;

    public float getFar() {
        return far;
    private void resetCamera() {
        float aspect = (float) cam.getWidth() / (float) cam.getHeight();
        cam.setFrustumPerspective(fieldOfView, aspect, near, far);

A minor report.
Error writing initTogleRotateInput method name, missing a g

1 Like

Thanks for the feedback.

To keep this topic focused on the upcoming release, suggestions like these should go elsewhere: either as new issues/PRs at GitHub (best for long-term tracking) or as new topics here at the JME Forum (best for discussion).

No need to track or discuss renaming initTogleRotateInput(). I’ll take care of it.

v3.4.0-alpha4 has been released. It’s available from MavenCentral but not from Bintray/JCenter.

Engine v3.4 remains open for new features, but may close without warning. Feature freeze has been delayed in hope of accommodating 3 enhancement PRs:

Meanwhile, “spring cleaning” is underway in the master branch:

  • modernizing Java sourcecode
  • resolving javadoc warnings and errors
  • deleting unused code
  • adding missing licenses

I noticed there are some leftovers in these commits after removing unused fields.

For example this line

1 Like

I didn’t know whether is() has side-effects or not.

I have to say @sgold, you are doing great coordinating 3.4.0. I am very excited for this release as there will be a lot of great additions and fixes.

Thank you for all your hard work.


Thanks for your support.

I think v3.4 will go faster and smoother with more people helping:

  • file, investigate, and discuss issues
  • create and review pull requests
  • test features and fixes (on multiple platforms!)
  • add and update documentation

A pull request of jmeSurfaceView :

this targets those problems :

i will also invest some extra time in fixing AndroidHarness rather than deprecating.

this is my first time to do a pull request to jme ,so if i had made something wrong , or non-acceptable , please let me know , i will happily undo the change.