Rendering only valid buffer range

When BitmapText’s text length is shortened, it has larger buffer size than rendered.

But current code renders vertex that should not be rendered.

That’s because the buffer’s limit is cleared when updateBufferData() is called.

How about using limit() instead of capacity().?



[patch]

Index: src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java

===================================================================

— src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java (revision 6535)

+++ src/lwjgl-ogl/com/jme3/renderer/lwjgl/LwjglRenderer.java (working copy)

@@ -1759,7 +1759,7 @@

}



int usage = convertUsage(vb.getUsage());

  •    vb.getData().clear();<br />
    
  •    vb.getData().rewind();<br />
    

if (created || vb.hasDataSizeChanged()) {
// upload data based on format
@@ -2007,7 +2007,7 @@
} else {
if (useInstancing) {
ARBDrawInstanced.glDrawElementsInstancedARB(convertElementMode(mesh.getMode()),
- indexBuf.getData().capacity(),
+ indexBuf.getData().limit(),
convertFormat(indexBuf.getFormat()),
0,
count);
@@ -2015,7 +2015,7 @@
glDrawRangeElements(convertElementMode(mesh.getMode()),
0,
vertCount,
- indexBuf.getData().capacity(),
+ indexBuf.getData().limit(),
convertFormat(indexBuf.getFormat()),
0);
}
Index: src/core/com/jme3/font/BitmapTextPage.java
===================================================================
--- src/core/com/jme3/font/BitmapTextPage.java (revision 6536)
+++ src/core/com/jme3/font/BitmapTextPage.java (working copy)
@@ -51,7 +51,6 @@
private final byte[] color;
private final int page;
private final QuadList quadList = new QuadList();
- private final FontQuad EMPTY_QUAD = new FontQuad();

BitmapTextPage(BitmapFont font, boolean arrayBased, int page) {
super("BitmapFont", new Mesh());
@@ -128,25 +127,28 @@
// increase capacity of buffers as needed
fpb.rewind();
fpb = BufferUtils.ensureLargeEnough(fpb, m.getVertexCount() * 3);
+ fpb.limit(m.getVertexCount() * 3);
pb.updateData(fpb);

ftb.rewind();
ftb = BufferUtils.ensureLargeEnough(ftb, m.getVertexCount() * 2);
+ ftb.limit(m.getVertexCount() * 2);
tb.updateData(ftb);

bcb.rewind();
bcb = BufferUtils.ensureLargeEnough(bcb, m.getVertexCount() * 4);
+ bcb.limit(m.getVertexCount() * 4);
cb.updateData(bcb);

sib.rewind();
sib = BufferUtils.ensureLargeEnough(sib, m.getTriangleCount() * 3);
+ sib.limit(m.getTriangleCount() * 3);
ib.updateData(sib);

- int size = fpb.capacity()/12;
// go for each quad and append it to the buffers
if (pos != null) {
- for (int i = 0; i < size; i++) {
- FontQuad fq = i < quadList.getActualSize()? quadList.getQuad(i): EMPTY_QUAD;
+ for (int i = 0; i < quadList.getActualSize(); i++) {
+ FontQuad fq = quadList.getQuad(i);
fq.storeToArrays(pos, tc, idx, color, i);
fpb.put(pos);
ftb.put(tc);
@@ -154,8 +156,8 @@
bcb.put(color);
}
} else {
- for (int i = 0; i < size; i++) {
- FontQuad fq = i < quadList.getActualSize()? quadList.getQuad(i): EMPTY_QUAD;
+ for (int i = 0; i < quadList.getActualSize(); i++) {
+ FontQuad fq = quadList.getQuad(i);
fq.appendPositions(fpb);
fq.appendTexCoords(ftb);
fq.appendIndices(sib, i);

[/patch]

Sounds good! I wonder if any existing code relied on the previous way of doing it, probably not. It should be okay to commit then! :slight_smile:

committed in svn. rev 6542