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