For history, see the related issue #2076
I discovered another place in SkinningControl where it assumes every animated mesh contains a normal buffer. See line 525:
|
VertexBuffer nb = mesh.getBuffer(Type.Normal); |
|
FloatBuffer fnb = (FloatBuffer) nb.getData(); |
|
fnb.rewind(); |
I wrote a small test app that loads the RecursiveSkeletons model from the glTF-Sample-Models repo and enables software skinning:
import com.jme3.anim.SkinningControl;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.FileLocator;
import com.jme3.scene.Spatial;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main extends SimpleApplication {
public static void main(String[] args) {
new Main().start();
}
@Override
public void simpleInitApp() {
Logger.getLogger("").setLevel(Level.SEVERE);
String glbFile = "glTF-Sample-Models/2.0/"
+ "RecursiveSkeletons/glTF-Binary/RecursiveSkeletons.glb";
assetManager.registerLocator(
"/home/sgold/NetBeansProjects/ext", FileLocator.class);
Spatial model = assetManager.loadModel(glbFile);
rootNode.attachChild(model);
SkinningControl sc = model.getControl(SkinningControl.class);
sc.setHardwareSkinningPreferred(false);
}
}
When run, this app crashes with an NPE:
Apr 13, 2026 2:39:58 PM com.jme3.app.SimpleApplication start
INFO: AppSettings not set, creating default settings.
Apr 13, 2026 2:39:58 PM com.jme3.system.JmeSystemDelegate lambda$new$1
WARNING: JmeDialogsFactory implementation not found.
Apr 13, 2026 2:39:58 PM com.jme3.system.JmeDesktopSystem initialize
INFO: Running on jMonkeyEngine 3.10.0-alpha3
* Branch: HEAD
* Git Hash: 251db01
* Build Date: 2026-03-25
Apr 13, 2026 2:39:58 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
INFO: LWJGL 3.4.1+2 context running on thread jME3 Main
* Graphics Adapter: GLFW 3.5.0 Wayland X11 GLX Null EGL OSMesa monotonic shared
Apr 13, 2026 2:39:58 PM com.jme3.renderer.opengl.GLRenderer loadCapabilitiesCommon
INFO: OpenGL Renderer Information
* Vendor: NVIDIA Corporation
* Renderer: NVIDIA GeForce RTX 2070/PCIe/SSE2
* OpenGL Version: 3.2.0 NVIDIA 580.126.09
* GLSL Version: 1.50 NVIDIA via Cg compiler
* Profile: Core
Apr 13, 2026 2:39:58 PM com.jme3.audio.openal.ALAudioRenderer printAudioRendererInfo
INFO: Audio Renderer Information
* Device: OpenAL Soft
* Vendor: OpenAL Community
* Renderer: OpenAL Soft
* Version: 1.1 ALSOFT 1.25.1
* Supported channels: 64
* ALC extensions: ALC_ENUMERATE_ALL_EXT ALC_ENUMERATION_EXT ALC_EXT_CAPTURE ALC_EXT_debug ALC_EXT_DEDICATED ALC_EXT_direct_context ALC_EXT_disconnect ALC_EXT_EFX ALC_EXT_thread_local_context ALC_SOFT_device_clock ALC_SOFT_HRTF ALC_SOFT_loopback ALC_SOFT_loopback_bformat ALC_SOFT_output_limiter ALC_SOFT_output_mode ALC_SOFT_pause_device ALC_SOFT_reopen_device ALC_SOFT_system_events
* AL extensions: AL_EXT_ALAW AL_EXT_BFORMAT AL_EXT_debug AL_EXT_direct_context AL_EXT_DOUBLE AL_EXT_EXPONENT_DISTANCE AL_EXT_FLOAT32 AL_EXT_IMA4 AL_EXT_LINEAR_DISTANCE AL_EXT_MCFORMATS AL_EXT_MULAW AL_EXT_MULAW_BFORMAT AL_EXT_MULAW_MCFORMATS AL_EXT_OFFSET AL_EXT_source_distance_model AL_EXT_SOURCE_RADIUS AL_EXT_STATIC_BUFFER AL_EXT_STEREO_ANGLES AL_LOKI_quadriphonic AL_SOFT_bformat_ex AL_SOFT_bformat_hoa AL_SOFT_block_alignment AL_SOFT_buffer_length_query AL_SOFT_callback_buffer AL_SOFTX_convolution_effect AL_SOFT_deferred_updates AL_SOFT_direct_channels AL_SOFT_direct_channels_remix AL_SOFT_effect_target AL_SOFT_events AL_SOFT_gain_clamp_ex AL_SOFTX_hold_on_disconnect AL_SOFT_loop_points AL_SOFTX_map_buffer AL_SOFT_MSADPCM AL_SOFT_source_latency AL_SOFT_source_length AL_SOFTX_source_panning AL_SOFT_source_resampler AL_SOFT_source_spatialize AL_SOFT_source_start_delay AL_SOFT_UHJ AL_SOFT_UHJ_ex
Apr 13, 2026 2:39:58 PM com.jme3.audio.openal.ALAudioRenderer initEfx
INFO: Audio effect extension version: 1.0
Apr 13, 2026 2:39:58 PM com.jme3.audio.openal.ALAudioRenderer initEfx
INFO: Audio max auxiliary sends: 2
Apr 13, 2026 2:39:59 PM com.jme3.app.LegacyApplication handleError
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.lang.NullPointerException: Cannot invoke "com.jme3.scene.VertexBuffer.getData()" because "nb" is null
at com.jme3.anim.SkinningControl.applySkinning(SkinningControl.java:525)
at com.jme3.anim.SkinningControl.applySoftwareSkinning(SkinningControl.java:496)
at com.jme3.anim.SkinningControl.controlRenderSoftware(SkinningControl.java:299)
at com.jme3.anim.SkinningControl.controlRender(SkinningControl.java:344)
at com.jme3.scene.control.AbstractControl.render(AbstractControl.java:126)
at com.jme3.scene.Spatial.runControlRender(Spatial.java:794)
at com.jme3.renderer.RenderManager.renderSubScene(RenderManager.java:988)
at com.jme3.renderer.RenderManager.renderSubScene(RenderManager.java:998)
at com.jme3.renderer.RenderManager.renderScene(RenderManager.java:974)
at com.jme3.renderer.pipeline.ForwardPipeline.pipelineRender(ForwardPipeline.java:100)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1406)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1448)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:354)
at com.jme3.system.lwjgl.LwjglWindow.runLoop(LwjglWindow.java:729)
at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:819)
at java.base/java.lang.Thread.run(Thread.java:840)
Uncaught exception thrown in Thread[jME3 Main,5,main]
NullPointerException: Cannot invoke "com.jme3.scene.VertexBuffer.getData()" because "nb" is null
For history, see the related issue #2076
I discovered another place in
SkinningControlwhere it assumes every animated mesh contains a normal buffer. See line 525:jmonkeyengine/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java
Lines 524 to 526 in 6388607
I wrote a small test app that loads the RecursiveSkeletons model from the glTF-Sample-Models repo and enables software skinning:
When run, this app crashes with an NPE: