159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.scene.mesh; 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.scene.Mesh.Mode; 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.nio.Buffer; 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * IndexBuffer implementation that generates vertex indices sequentially 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * based on a specific Mesh {@link Mode}. 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The generated indices are as if the mesh is in the given mode 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * but contains no index buffer, thus this implementation will 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * return the indices if the index buffer was there and contained sequential 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * triangles. 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Example: 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <ul> 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <li>{@link Mode#Triangles}: 0, 1, 2 | 3, 4, 5 | 6, 7, 8 | ...</li> 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <li>{@link Mode#TriangleStrip}: 0, 1, 2 | 2, 1, 3 | 2, 3, 4 | ...</li> 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * <li>{@link Mode#TriangleFan}: 0, 1, 2 | 0, 2, 3 | 0, 3, 4 | ...</li> 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * </ul> 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Kirill Vainer 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class VirtualIndexBuffer extends IndexBuffer { 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected int numVerts = 0; 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected int numIndices = 0; 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Mode meshMode; 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public VirtualIndexBuffer(int numVerts, Mode meshMode){ 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.numVerts = numVerts; 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.meshMode = meshMode; 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (meshMode) { 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Points: 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = numVerts; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case LineLoop: 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = (numVerts - 1) * 2 + 1; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case LineStrip: 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = (numVerts - 1) * 2; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Lines: 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = numVerts; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TriangleFan: 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = (numVerts - 2) * 3; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case TriangleStrip: 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = (numVerts - 2) * 3; 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Triangles: 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta numIndices = numVerts; 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return; 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case Hybrid: 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int get(int i) { 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (meshMode == Mode.Triangles || meshMode == Mode.Lines || meshMode == Mode.Points){ 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return i; 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (meshMode == Mode.LineStrip){ 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (i + 1) / 2; 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (meshMode == Mode.LineLoop){ 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (i == (numVerts-1)) ? 0 : ((i + 1) / 2); 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (meshMode == Mode.TriangleStrip){ 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int triIndex = i/3; 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int vertIndex = i%3; 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta boolean isBack = (i/3)%2==1; 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!isBack){ 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return triIndex + vertIndex; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta switch (vertIndex){ 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 0: return triIndex + 1; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 1: return triIndex; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta case 2: return triIndex + 2; 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta default: throw new AssertionError(); 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else if (meshMode == Mode.TriangleFan){ 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int vertIndex = i%3; 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (vertIndex == 0) 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return 0; 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta else 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return (i / 3) + vertIndex; 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }else{ 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException(); 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void put(int i, int value) { 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new UnsupportedOperationException("Does not represent index buffer"); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int size() { 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return numIndices; 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta @Override 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public Buffer getBuffer() { 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 107