Skip to content

software skinning shouldn't require vertex normals #2076

Closed
@stephengold

Description

@stephengold

Trying to render a model imported from https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/RecursiveSkeletons/glTF using MonkeyWrench:

Sep 30, 2023 11:58:32 AM com.jme3.app.LegacyApplication handleError
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
java.lang.NullPointerException
	at com.jme3.anim.SkinningControl.resetToBind(SkinningControl.java:332)
	at com.jme3.anim.SkinningControl.controlRenderSoftware(SkinningControl.java:255)
	at com.jme3.anim.SkinningControl.controlRender(SkinningControl.java:304)
	at com.jme3.scene.control.AbstractControl.render(AbstractControl.java:126)
	at com.jme3.scene.Spatial.runControlRender(Spatial.java:763)
	at com.jme3.renderer.RenderManager.renderSubScene(RenderManager.java:796)
	at com.jme3.renderer.RenderManager.renderSubScene(RenderManager.java:806)
	at com.jme3.renderer.RenderManager.renderScene(RenderManager.java:780)
	at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1205)
	at com.jme3.renderer.RenderManager.render(RenderManager.java:1287)
	at com.jme3.app.SimpleApplication.update(SimpleApplication.java:278)
	at com.jme3.system.lwjgl.LwjglWindow.runLoop(LwjglWindow.java:628)
	at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:717)
	at java.base/java.lang.Thread.run(Thread.java:829)

One of the many quirks of the RecursiveSkeletons model is that its mesh doesn't include vertex normals. I believe SkinningControl should be able to handle that, just like it handles meshes without tangents. Looking at the code, it's clear this possibility wasn't considered:

Mesh mesh = geometry.getMesh();
if (mesh != null && mesh.isAnimated()) {
Buffer bwBuff = mesh.getBuffer(Type.BoneWeight).getData();
Buffer biBuff = mesh.getBuffer(Type.BoneIndex).getData();
if (!biBuff.hasArray() || !bwBuff.hasArray()) {
mesh.prepareForAnim(true); // prepare for software animation
}
VertexBuffer bindPos = mesh.getBuffer(Type.BindPosePosition);
VertexBuffer bindNorm = mesh.getBuffer(Type.BindPoseNormal);
VertexBuffer pos = mesh.getBuffer(Type.Position);
VertexBuffer norm = mesh.getBuffer(Type.Normal);
FloatBuffer pb = (FloatBuffer) pos.getData();
FloatBuffer nb = (FloatBuffer) norm.getData();
FloatBuffer bpb = (FloatBuffer) bindPos.getData();
FloatBuffer bnb = (FloatBuffer) bindNorm.getData();

In case you're wondering, the model doesn't include vertex tangents either.

Metadata

Metadata

Assignees

Labels

defectSomething that is supposed to work, but doesn't. Less severe than a "bug"

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions