I am porting a C++ Point and Polygons drawing to Android.Initially it looked straight forward to port the code to java style.I could draw Points using below code.
//POINT
public class MyPoint
{
public float x,y,z;
}
//Points in x,y,z format are parsed and stored here
public static ArrayList<MyPoint> m_vPoints;
public static float [] fPointVertices ={};//Float array
public static FloatBuffer mPointVerticesFloatBuffer;//Buffer for rendering
int m_drawCount=0;
//Converting to float array
//AND
//Converting to FloatBuffer
public static void FormatPointDataAsGLBuffer()
{
fPointVertices=new float[m_vPoints.size()*3];
int count=0;
for(int i=0;i<m_vPoints.size();i++)
{
fPointVertices[count]=m_vPoints.get(i).x;
fPointVertices[count+1]=0.0f;
fPointVertices[count+2]=m_vPoints.get(i).y;
count=count+3;
}
m_drawCount=count;
//Convert vertices to OpenGL ES compatible format
mPointVerticesFloatBuffer= ByteBuffer.allocateDirect(fPointVertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
mPointVerticesFloatBuffer.put(fPointVertices).position(0);
}
public void DrawPoints()
{
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, 0, mPointVerticesFloatBuffer);
GLES20.glDrawArrays(GLES20.GL_POINTS, 0, m_drawCount);
GLES20.glDisableVertexAttribArray(mPositionHandle);
}
I am not yet sure how to draw polygons with a single float array.In the C++ version though, used glBufferSubData to create the VBO and used single call to glMultiDrawArrays as described in SE query below. Using VBO to draw line string
The polygon related script looks like below
//POLYGON
public static ArrayList<MyPolygon> m_vPolygons;
public static class MyPolygon
{
public ArrayList<MyPoint> vPointList;
}
public static void FormatPolygonDataAsGLBuffer()
{
for(int i=0;i<vPolygons.size();i++)
{
for(int j=0;j<vPolygons.get(i).vPointList.size();j++)
{
fPointVertices[count]=vPolygons.get(i).vPointList.get(i).x;
fPointVertices[count+1]=0.0f;
fPointVertices[count+2]=-vPolygons.get(i).vPointList.get(i).y;//Negating since y is outwards from the screen and z is upwards
count=count+3;
}
}
}
public void DrawPolygons()
{
//WHAT IS THE RIGHT WAY HERE???
//glBufferSubData
//Draw the lines
//glMultiDrawArrays(GLES20.GL_LINE_LOOP, startIndices,endIndices,nPolygonCount);
}