From 9b1a6ab1ddec8eb206947d544473dd990f05a9a3 Mon Sep 17 00:00:00 2001 From: beuc Date: Tue, 1 May 2012 21:28:28 +0000 Subject: [PATCH] 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: https://svn.code.sf.net/p/freeglut/code/trunk@1277 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_geometry.c | 101 +++++++++++++++++++++------- 1 file changed, 76 insertions(+), 25 deletions(-) diff --git a/freeglut/freeglut/src/fg_geometry.c b/freeglut/freeglut/src/fg_geometry.c index 3c1ecb9..4811ee5 100644 --- a/freeglut/freeglut/src/fg_geometry.c +++ b/freeglut/freeglut/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