From fe33bec508b03450ed817fa31a1b1fdaf0af9e10 Mon Sep 17 00:00:00 2001 From: stephengold Date: Mon, 13 Apr 2026 15:04:25 -0700 Subject: [PATCH 1/2] SkinningControl: add null checks for issue #2707 (SW skin w/o normals) --- .../java/com/jme3/anim/SkinningControl.java | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java index 9ceb4b3638..5e3777546b 100644 --- a/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java +++ b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009-2025 jMonkeyEngine + * Copyright (c) 2009-2026 jMonkeyEngine * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -522,8 +522,10 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) { fvb.rewind(); VertexBuffer nb = mesh.getBuffer(Type.Normal); - FloatBuffer fnb = (FloatBuffer) nb.getData(); - fnb.rewind(); + FloatBuffer fnb = (nb == null) ? null : (FloatBuffer) nb.getData(); + if (fnb != null) { + fnb.rewind(); + } // get boneIndexes and weights for mesh IndexBuffer ib = IndexBuffer.wrapIndexBuffer(mesh.getBuffer(Type.BoneIndex).getData()); @@ -545,7 +547,9 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) { // read next set of positions and normals from native buffer bufLength = Math.min(posBuf.length, fvb.remaining()); fvb.get(posBuf, 0, bufLength); - fnb.get(normBuf, 0, bufLength); + if (fnb != null) { + fnb.get(normBuf, 0, bufLength); + } int verts = bufLength / 3; int idxPositions = 0; @@ -593,14 +597,18 @@ private void applySkinning(Mesh mesh, Matrix4f[] offsetMatrices) { fvb.position(fvb.position() - bufLength); fvb.put(posBuf, 0, bufLength); - fnb.position(fnb.position() - bufLength); - fnb.put(normBuf, 0, bufLength); + if (fnb != null) { + fnb.position(fnb.position() - bufLength); + fnb.put(normBuf, 0, bufLength); + } } vars.release(); vb.updateData(fvb); - nb.updateData(fnb); + if (nb != null) { + nb.updateData(fnb); + } } /** From 4e39dc1d6d3a9b45a6fdada8dd32d0f4f22c9c5d Mon Sep 17 00:00:00 2001 From: stephengold Date: Mon, 13 Apr 2026 17:27:09 -0700 Subject: [PATCH 2/2] SkinningControl: correctly handle hypothetical nb!=null && fnb==null --- jme3-core/src/main/java/com/jme3/anim/SkinningControl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java index 5e3777546b..76ad5e8eff 100644 --- a/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java +++ b/jme3-core/src/main/java/com/jme3/anim/SkinningControl.java @@ -753,7 +753,7 @@ private void applySkinningTangents(Mesh mesh, Matrix4f[] offsetMatrices, VertexB vars.release(); vb.updateData(fvb); - if (nb != null) { + if (fnb != null) { nb.updateData(fnb); } tb.updateData(ftb);