blob: 056a1cd039b3a8a7b52ff9fc06b72c155fafa70a [file] [log] [blame]
package com.jme3.scene.mesh;
import com.jme3.scene.Mesh;
import com.jme3.scene.Mesh.Mode;
import com.jme3.scene.VertexBuffer.Type;
import java.nio.Buffer;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
/**
* <code>WrappedIndexBuffer</code> converts vertex indices from a non list based
* mesh mode such as {@link Mode#TriangleStrip} or {@link Mode#LineLoop}
* into a list based mode such as {@link Mode#Triangles} or {@link Mode#Lines}.
* As it is often more convenient to read vertex data in list format
* than in a non-list format, using this class is recommended to avoid
* convoluting classes used to process mesh data from an external source.
*
* @author Kirill Vainer
*/
public class WrappedIndexBuffer extends VirtualIndexBuffer {
private final IndexBuffer ib;
public WrappedIndexBuffer(Mesh mesh){
super(mesh.getVertexCount(), mesh.getMode());
this.ib = mesh.getIndexBuffer();
switch (meshMode){
case Points:
numIndices = mesh.getTriangleCount();
break;
case Lines:
case LineLoop:
case LineStrip:
numIndices = mesh.getTriangleCount() * 2;
break;
case Triangles:
case TriangleStrip:
case TriangleFan:
numIndices = mesh.getTriangleCount() * 3;
break;
default:
throw new UnsupportedOperationException();
}
}
@Override
public int get(int i) {
int superIdx = super.get(i);
return ib.get(superIdx);
}
@Override
public Buffer getBuffer() {
return ib.getBuffer();
}
public static void convertToList(Mesh mesh){
IndexBuffer inBuf = mesh.getIndicesAsList();
IndexBuffer outBuf = IndexBuffer.createIndexBuffer(mesh.getVertexCount(),
inBuf.size());
for (int i = 0; i < inBuf.size(); i++){
outBuf.put(i, inBuf.get(i));
}
mesh.clearBuffer(Type.Index);
switch (mesh.getMode()){
case LineLoop:
case LineStrip:
mesh.setMode(Mode.Lines);
break;
case TriangleStrip:
case TriangleFan:
mesh.setMode(Mode.Triangles);
break;
default:
break;
}
if (outBuf instanceof IndexIntBuffer){
mesh.setBuffer(Type.Index, 3, (IntBuffer)outBuf.getBuffer());
}else{
mesh.setBuffer(Type.Index, 3, (ShortBuffer)outBuf.getBuffer());
}
}
}