jme-core: IndexBuffer fixes & API improvements (#1136)

* jme-core: IndexBuffer fixes & API improvements

As discussed in:
https://hub.jmonkeyengine.org/t/indexbuffer-suggestions-improvements-consistency/42022/4

* [Fix] createIndexBuffer(int, int): return IndexByteBuffer as well for
	vertexCount < 128
* [Enhancement] Make put(int i, int value) fluid interface
* [Enhancement] Add relative put(int i) to allow easier chaining (parity
	with other buffer implementations)
* [Enhancement] Add getFormat() to allow setting an IndexBuffer to a
	Mesh directly without type inspection.
* [Fix] Fix WrappedIndexBuffer
	API changes make it possible that IndexByteBuffer is now a valid  type
for outBuf, leverage the new getFormat() method to set the buffer to the
mesh regardless of its type.

* Update VirtualIndexBuffer to @72f8019566fa4d1379caa820c0c9dc000f489444
accellbaker
Sebastian Teumert 5 years ago committed by Stephen Gold
parent 827d4ebd52
commit 0ffc612bfb
  1. 63
      jme3-core/src/main/java/com/jme3/scene/mesh/IndexBuffer.java
  2. 16
      jme3-core/src/main/java/com/jme3/scene/mesh/IndexByteBuffer.java
  3. 16
      jme3-core/src/main/java/com/jme3/scene/mesh/IndexIntBuffer.java
  4. 16
      jme3-core/src/main/java/com/jme3/scene/mesh/IndexShortBuffer.java
  5. 15
      jme3-core/src/main/java/com/jme3/scene/mesh/VirtualIndexBuffer.java
  6. 6
      jme3-core/src/main/java/com/jme3/scene/mesh/WrappedIndexBuffer.java

@ -31,12 +31,14 @@
*/ */
package com.jme3.scene.mesh; package com.jme3.scene.mesh;
import com.jme3.util.BufferUtils;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import com.jme3.scene.VertexBuffer.Format;
import com.jme3.util.BufferUtils;
/** /**
* <code>IndexBuffer</code> is an abstraction for integer index buffers, * <code>IndexBuffer</code> is an abstraction for integer index buffers,
* it is used to retrieve indices without knowing in which format they * it is used to retrieve indices without knowing in which format they
@ -59,21 +61,22 @@ public abstract class IndexBuffer {
} }
/** /**
* Creates an index buffer that can contain the given amount * Creates an index buffer that can contain the given amount of vertices.
* of vertices. * <br/>
* Returns {@link IndexShortBuffer} * Returns either {@link IndexByteBuffer}, {@link IndexShortBuffer} or
* {@link IndexIntBuffer}
* *
* @param vertexCount The amount of vertices to contain * @param vertexCount The amount of vertices to contain
* @param indexCount The amount of indices * @param indexCount The amount of indices to contain
* to contain. * @return A new, apropriately sized index buffer
* @return A new index buffer
*/ */
public static IndexBuffer createIndexBuffer(int vertexCount, int indexCount){ public static IndexBuffer createIndexBuffer(int vertexCount, int indexCount){
if (vertexCount > 65535){ if (vertexCount < 128)
return new IndexIntBuffer(BufferUtils.createIntBuffer(indexCount)); return new IndexByteBuffer(BufferUtils.createByteBuffer (indexCount));
}else{ else if (vertexCount < 65536)
return new IndexShortBuffer(BufferUtils.createShortBuffer(indexCount)); return new IndexShortBuffer(BufferUtils.createShortBuffer(indexCount));
} else
return new IndexIntBuffer(BufferUtils.createIntBuffer(indexCount));
} }
/** /**
@ -107,12 +110,31 @@ public abstract class IndexBuffer {
public abstract int get(int i); public abstract int get(int i);
/** /**
* Puts the vertex index at the index buffer's index. * Absolute put method.
*
* <p>Puts the vertex index at the index buffer's index.
* Implementations may throw an {@link UnsupportedOperationException} * Implementations may throw an {@link UnsupportedOperationException}
* if modifying the IndexBuffer is not supported (e.g. virtual index * if modifying the IndexBuffer is not supported (e.g. virtual index
* buffers). * buffers).</p>
*
* @param i The buffer index
* @param value The vertex index
* @return This buffer
*/ */
public abstract void put(int i, int value); public abstract IndexBuffer put(int i, int value);
/**
* Relative put method.
*
* <p>Puts the vertex index at the current position, then increments the
* position. Implementations may throw an
* {@link UnsupportedOperationException} if modifying the IndexBuffer is not
* supported (e.g. virtual index buffers).</p>
*
* @param value The vertex index
* @return This buffer
*/
public abstract IndexBuffer put(int value);
/** /**
* Returns the size of the index buffer. * Returns the size of the index buffer.
@ -129,4 +151,17 @@ public abstract class IndexBuffer {
* @return the underlying {@link Buffer}. * @return the underlying {@link Buffer}.
*/ */
public abstract Buffer getBuffer(); public abstract Buffer getBuffer();
/**
* Returns the format of the data stored in this buffer.
*
* <p>This method can be used to set an {@link IndexBuffer} to a
* {@link com.jme3.scene.Mesh Mesh}:</p>
* <pre>
* mesh.setBuffer(Type.Index, 3,
* indexBuffer.getFormat(), indexBuffer);
* </pre>
* @return
*/
public abstract Format getFormat();
} }

@ -34,6 +34,8 @@ package com.jme3.scene.mesh;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import com.jme3.scene.VertexBuffer.Format;
/** /**
* IndexBuffer implementation for {@link ByteBuffer}s. * IndexBuffer implementation for {@link ByteBuffer}s.
* *
@ -59,8 +61,15 @@ public class IndexByteBuffer extends IndexBuffer {
} }
@Override @Override
public void put(int i, int value) { public IndexByteBuffer put(int i, int value) {
buf.put(i, (byte) value); buf.put(i, (byte) value);
return this;
}
@Override
public IndexByteBuffer put(int value) {
buf.put((byte) value);
return this;
} }
@Override @Override
@ -72,5 +81,10 @@ public class IndexByteBuffer extends IndexBuffer {
public Buffer getBuffer() { public Buffer getBuffer() {
return buf; return buf;
} }
@Override
public Format getFormat () {
return Format.UnsignedByte;
}
} }

@ -34,6 +34,8 @@ package com.jme3.scene.mesh;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.IntBuffer; import java.nio.IntBuffer;
import com.jme3.scene.VertexBuffer.Format;
/** /**
* IndexBuffer implementation for {@link IntBuffer}s. * IndexBuffer implementation for {@link IntBuffer}s.
* *
@ -58,8 +60,15 @@ public class IndexIntBuffer extends IndexBuffer {
} }
@Override @Override
public void put(int i, int value) { public IndexIntBuffer put(int i, int value) {
buf.put(i, value); buf.put(i, value);
return this;
}
@Override
public IndexIntBuffer put(int value) {
buf.put(value);
return this;
} }
@Override @Override
@ -71,4 +80,9 @@ public class IndexIntBuffer extends IndexBuffer {
public Buffer getBuffer() { public Buffer getBuffer() {
return buf; return buf;
} }
@Override
public Format getFormat () {
return Format.UnsignedInt;
}
} }

@ -34,6 +34,8 @@ package com.jme3.scene.mesh;
import java.nio.Buffer; import java.nio.Buffer;
import java.nio.ShortBuffer; import java.nio.ShortBuffer;
import com.jme3.scene.VertexBuffer.Format;
/** /**
* IndexBuffer implementation for {@link ShortBuffer}s. * IndexBuffer implementation for {@link ShortBuffer}s.
* *
@ -58,8 +60,15 @@ public class IndexShortBuffer extends IndexBuffer {
} }
@Override @Override
public void put(int i, int value) { public IndexShortBuffer put(int i, int value) {
buf.put(i, (short) value); buf.put(i, (short) value);
return this;
}
@Override
public IndexShortBuffer put(int value) {
buf.put((short) value);
return this;
} }
@Override @Override
@ -71,4 +80,9 @@ public class IndexShortBuffer extends IndexBuffer {
public Buffer getBuffer() { public Buffer getBuffer() {
return buf; return buf;
} }
@Override
public Format getFormat () {
return Format.UnsignedShort;
}
} }

@ -32,6 +32,8 @@
package com.jme3.scene.mesh; package com.jme3.scene.mesh;
import com.jme3.scene.Mesh.Mode; import com.jme3.scene.Mesh.Mode;
import com.jme3.scene.VertexBuffer.Format;
import java.nio.Buffer; import java.nio.Buffer;
/** /**
@ -138,7 +140,7 @@ public class VirtualIndexBuffer extends IndexBuffer {
} }
@Override @Override
public void put(int i, int value) { public IndexBuffer put(int i, int value) {
throw new UnsupportedOperationException("Does not represent index buffer"); throw new UnsupportedOperationException("Does not represent index buffer");
} }
@ -152,4 +154,15 @@ public class VirtualIndexBuffer extends IndexBuffer {
return null; return null;
} }
@Override
public IndexBuffer put (int value) {
throw new UnsupportedOperationException("Does not represent index buffer");
}
@Override
public Format getFormat () {
// return largest size
return Format.UnsignedInt;
}
} }

@ -107,11 +107,7 @@ public class WrappedIndexBuffer extends VirtualIndexBuffer {
default: default:
break; break;
} }
if (outBuf instanceof IndexIntBuffer){ mesh.setBuffer(Type.Index, 3, outBuf.getFormat(), outBuf.getBuffer());
mesh.setBuffer(Type.Index, 3, (IntBuffer)outBuf.getBuffer());
}else{
mesh.setBuffer(Type.Index, 3, (ShortBuffer)outBuf.getBuffer());
}
} }
} }

Loading…
Cancel
Save