Login  Register

what's wrong with this code?

Posted by Ususuus on Oct 27, 2018; 3:49am
URL: https://forum.jogamp.org/what-s-wrong-with-this-code-tp4039269.html

The code is as blow, i created 3 triangles (a list in Class Object), and each has it's own data in Class Part,, my problem is,  all the 3 the triangles were drawn with the last triangle's vertex...

Please help to get me a trick...

public class Object {
        public GL2 gl;
        private ArrayList<JTPart> list = new ArrayList<>();
       
        public Object(GL2 gl) {
                this.gl = gl;
        }

        public boolean goLoad() {
                try {
                        int[]xx= {0,1,2};
                        float[]va= {
                                        3,0,0,
                                        0,3,0,
                                        -3,0,0};
                       
                        float[]vb= {
                                        20,0,10,
                                        0,20,10,
                                        -20,0,10};
                       
                        float[]vc= {
                                        30,0,20,
                                        0,30,20,
                                   -30,0,20};
                       
                        float []colora= {1,0,0,
                                        1,0,0,
                                        1,0,0};
                        float []colorb= {0,1,0,
                                        0,1,0,0,1,0};
                        float []colorc= {0,0,1,0,0,1
                                        ,0,0,1};
                       
                        float[]uv= {0,0,20,
                                        0,0,20,
                                        0,0,20};
                       
                        Part temp1 = new Part(gl);
                        temp1.genBuffers(xx, va, uv, colora);
                        list.add(temp1);
                       
                        JTPart temp2 = new Part(gl);
                        temp2.genBuffers(xx, vb, uv, colorb);
                        list.add(temp2);
                       
                        Part temp3 = new Part(gl);
                        temp3.genBuffers(xx, vc, uv, colorc);
                        list.add(temp3);
                       
                        return true;
                } catch (Exception e) {
                        e.printStackTrace();
                        return false;
                }
        }

        public void Draw() {
                for (int i=0;i<list.size();i++) {
                        list.get(i).Draw(0,x*(i/iMat),x*(i%iMat));
                }
        }
}

public class Part {
        public GL2 gl;
        private IntBuffer ibo, vbo;

        private int count = 0;

        public String partName = "";

        public Part(GL2 gl) {
                this.gl = gl;
        }

        public void genBuffers(int[] indicesArr, float[] verArr, float[] uvArr, float[] colorArr) {
                IntBuffer indicesBuf;
                FloatBuffer uvBuf, colorBuf, verBuf;

                vbo = Buffers.newDirectIntBuffer(3);
                ibo = Buffers.newDirectIntBuffer(1);

                indicesBuf = Buffers.newDirectIntBuffer(indicesArr);
                verBuf = Buffers.newDirectFloatBuffer(verArr);
                uvBuf = Buffers.newDirectFloatBuffer(uvArr);
                colorBuf = Buffers.newDirectFloatBuffer(colorArr);

                count = indicesArr.length * 3;
               
                gl.glGenBuffers(3, vbo);
                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(0));
                gl.glBufferData(GL2.GL_ARRAY_BUFFER, verBuf.capacity() * Buffers.SIZEOF_FLOAT, verBuf, GL2.GL_STATIC_DRAW);
                gl.glVertexPointer(3, GL2.GL_FLOAT, 0, 0);

                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(1));
                gl.glBufferData(GL2.GL_ARRAY_BUFFER, uvBuf.capacity() * Buffers.SIZEOF_FLOAT, uvBuf, GL2.GL_STATIC_DRAW);
                gl.glNormalPointer(GL2.GL_FLOAT, 0, 0);

                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(2));
                gl.glBufferData(GL2.GL_ARRAY_BUFFER, colorBuf.capacity() * Buffers.SIZEOF_FLOAT, colorBuf, GL2.GL_STATIC_DRAW);
                gl.glColorPointer(3, GL2.GL_FLOAT, 0, 0);

                gl.glGenBuffers(1, ibo);
                gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, ibo.get(0));
                gl.glBufferData(GL2.GL_ELEMENT_ARRAY_BUFFER, indicesBuf.capacity() * Buffers.SIZEOF_INT, indicesBuf, GL2.GL_STATIC_DRAW);
               
                verBuf = null;
                uvBuf = null;
                colorBuf = null;
                indicesBuf = null;
        }


        public void Draw(float x, float y, float z) {
                gl.glTranslatef(x, y, z);
                gl.glEnable(GL2.GL_COLOR_MATERIAL);

                gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(0));
                gl.glVertexPointer(0, 3, GL2.GL_FLOAT, 0);

                gl.glEnableClientState(GL2.GL_NORMAL_ARRAY);
                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(1));
                gl.glNormalPointer(GL2.GL_FLOAT, 0, 0);

                gl.glEnableClientState(GL2.GL_COLOR_ARRAY);
                gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo.get(2));
                gl.glColorPointer(3, GL2.GL_FLOAT, 0, 0);

                gl.glEnableClientState(GL2.GL_ELEMENT_ARRAY_BUFFER);
                gl.glBindBuffer(GL2.GL_ELEMENT_ARRAY_BUFFER, ibo.get(0));
                gl.glDrawElements(GL2.GL_TRIANGLES, count, GL2.GL_UNSIGNED_INT, 0);

                gl.glDisable(GL2.GL_COLOR_MATERIAL);
                gl.glTranslatef(-x, -y, -z);
        }

}