Can't send Matrix3f array to shader

I’m hitting an endless loop in Uniform.clearData().

I’m currently playing with a variation of Unshaded.j3md which has this:
Matrix3Array voxelBackfaces

It is supposed to be filled via this kind of code:
Matrix3f [] backfaces = new Matrix3f [5];
// Add five Matrix3f values to array
material.setParam(“voxelBackfaces”, VarType.Matrix3Array, backfaces);

Now if I use a Material that does not set voxelBackfaces, Uniform.clearData() loops endlessly here:
while (multiData.remaining() > 0){
ZERO_BUF.limit( Math.min(multiData.remaining(), 16) );
multiData.put(ZERO_BUF);
}

multiData.remaining() seems stuck at 29.
Probably because five Matrix3fs contain 5*9 == 45 floats, and 45-16==29.

I’m not sure what this loop is supposed to do, so I don’t know whether I’m Doing It Wrong™ or if that’s a bug in Uniform.clearData().

Here’s the render thread’s stack dump:
java.lang.Throwable
at com.jme3.shader.Uniform.clearValue(Uniform.java:135)
at com.jme3.material.Material.resetUniformsNotSetByCurrent(Material.java:990)
at com.jme3.material.Material.render(Material.java:1063)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:380)
at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:782)
at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
at org.durchholz.jme3lib.ClientApplication.update(ClientApplication.java:317)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglCanvas.runLoop(LwjglCanvas.java:229)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Thread.java:722)
java.lang.Throwable
at com.jme3.shader.Uniform.clearValue(Uniform.java:135)
at com.jme3.material.Material.resetUniformsNotSetByCurrent(Material.java:990)
at com.jme3.material.Material.render(Material.java:1063)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:380)
at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:782)
at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:719)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:983)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
at org.durchholz.jme3lib.ClientApplication.update(ClientApplication.java:317)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglCanvas.runLoop(LwjglCanvas.java:229)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Thread.java:722)

1 Like

the ZERO_BUF should be cleared at each iteration, otherwise the position stays at the end and no additional value is written to the multidata buffer after the first iteration.
I already had an issue like this where sending a float array of more than 16 elements was causing a endless loop.

Nice catch, I’ll fix it as soon as I can commit to the repo.

Sorry, what I wrote initially was wrong.

So what was the problem?

Nah, I posted something stupid and tried to write something like “please ignore what I wrote here”. Which, on second reading, sounded as if the initial report was wrong, so I rewrote it to something better - now I see it’s still misleading. Ah well.

So the original issue is real right?

Yep.