From: Sylvain Beucler Date: Tue, 1 May 2012 21:28:28 +0000 (+0000) Subject: fg_geometry: pass number of vertices to fgDrawWire*; start adapting GL2 code to recen... X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=b7d12a8a4de718265b5317aee012cd209353f41c;p=freeglut fg_geometry: pass number of vertices to fgDrawWire*; start adapting GL2 code to recent GL1 changes (GL2 code doesn't produce proper results yet) git-svn-id: svn+ssh://svn.code.sf.net/p/freeglut/code/trunk/freeglut/freeglut@1277 7f0cb862-5218-0410-a997-914c9d46530a --- diff --git a/src/fg_geometry.c b/src/fg_geometry.c index 3c1ecb9..4811ee5 100644 --- a/src/fg_geometry.c +++ b/src/fg_geometry.c @@ -89,15 +89,16 @@ static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, #endif /* Version for OpenGL (ES) >= 2.0 */ -static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, +static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei numVertices, GLushort *vertIdxs, GLsizei numParts, GLsizei numVertPerPart, GLenum vertexMode, GLushort *vertIdxs2, GLsizei numParts2, GLsizei numVertPerPart2, GLint attribute_v_coord, GLint attribute_v_normal ) { - GLuint vbo_coords = 0, vbo_normals = 0; - GLuint numVertices = numParts * numVertPerPart; - + GLuint vbo_coords = 0, vbo_normals = 0, + ibo_elements = 0, ibo_elements2 = 0; + GLsizei numVertIdxs = numParts * numVertPerPart; + GLsizei numVertIdxs2 = numParts2 * numVertPerPart2; int i; if (numVertices > 0 && attribute_v_coord != -1) { @@ -114,6 +115,22 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, normals, FGH_STATIC_DRAW); } + if (vertIdxs != NULL) { + fghGenBuffers(1, &ibo_elements); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); + fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxs * sizeof(vertIdxs[0]), + vertIdxs, FGH_STATIC_DRAW); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, 0); + } + + if (vertIdxs2 != NULL) { + fghGenBuffers(1, &ibo_elements2); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements2); + fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxs2 * sizeof(vertIdxs2[0]), + vertIdxs2, FGH_STATIC_DRAW); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, 0); + } + if (vbo_coords) { fghEnableVertexAttribArray(attribute_v_coord); fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); @@ -125,6 +142,7 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, 0, /* no extra data between each position */ 0 /* offset of first element */ ); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); } if (vbo_normals) { @@ -138,12 +156,30 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, 0, /* no extra data between each position */ 0 /* offset of first element */ ); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); } - /* Draw per face (TODO: could use glMultiDrawArrays if available) */ - for (i=0; i 0 && attribute_v_coord != -1) { fghGenBuffers(1, &vbo_coords); fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(vertices[0]), vertices, FGH_STATIC_DRAW); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); } if (numVertices > 0 && attribute_v_normal != -1) { @@ -233,13 +276,15 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLushort fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(normals[0]), normals, FGH_STATIC_DRAW); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); } if (vertIdxs != NULL) { fghGenBuffers(1, &ibo_elements); fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); - fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxsPerPart * sizeof(vertIdxs[0]), + fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxs * sizeof(vertIdxs[0]), vertIdxs, FGH_STATIC_DRAW); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, 0); } if (vbo_coords) { @@ -253,6 +298,7 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLushort 0, /* no extra data between each position */ 0 /* offset of first element */ ); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); }; if (vbo_normals) { @@ -266,19 +312,24 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLushort 0, /* no extra data between each position */ 0 /* offset of first element */ ); + fghBindBuffer(FGH_ARRAY_BUFFER, 0); }; if (vertIdxs == NULL) { glDrawArrays(GL_TRIANGLES, 0, numVertices); } else { fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); - glDrawElements(GL_TRIANGLES, numVertIdxsPerPart, GL_UNSIGNED_SHORT, 0); + if (numParts>1) { + for (i=0; i