X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_geometry.c;h=0ab14ac040f987b4fd97eb333ed9fa7116c57577;hb=18530d133238f83763d65e8384111eafe21fd382;hp=3c1ecb91a5845a46838610024ce92cc454f2b374;hpb=1feb202b2d028db371116442bae561580d245f52;p=freeglut diff --git a/src/fg_geometry.c b/src/fg_geometry.c index 3c1ecb9..0ab14ac 100644 --- a/src/fg_geometry.c +++ b/src/fg_geometry.c @@ -55,6 +55,8 @@ * from face to face. */ +/** See comment for fghDrawGeometryWire **/ + /* Version for OpenGL (ES) 1.1 */ #ifndef GL_ES_VERSION_2_0 static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, @@ -89,15 +91,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 +117,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 +144,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 +158,32 @@ 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 +285,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 +307,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 +321,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