X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_geometry.c;h=d50c93cd951ed34390a1175c8eaef7e3a745ad11;hb=a0188f0c9f746bbb5859681f14eae9654be8c04d;hp=312acfc9095050befbcb327f27e5787a16433110;hpb=8ee5d611ce7eb724a108781b67cacbae6715abde;p=freeglut diff --git a/src/fg_geometry.c b/src/fg_geometry.c index 312acfc..d50c93c 100644 --- a/src/fg_geometry.c +++ b/src/fg_geometry.c @@ -68,7 +68,7 @@ static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, GLsizei n /* Version for OpenGL (ES) >= 2.0 */ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei numFaces, GLsizei numEdgePerFace, - GLint attribute_v_coord, GLint attribute_v_normal) + GLint attribute_v_coord, GLint attribute_v_normal) { GLuint vbo_coords, vbo_normals; GLuint numVertices = numFaces * numEdgePerFace; @@ -76,17 +76,17 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei n int i; if (numVertices > 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); + fghGenBuffers(1, &vbo_coords); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); + fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(vertices[0]), + vertices, FGH_STATIC_DRAW); } if (numVertices > 0 && attribute_v_normal != -1) { - fghGenBuffers(1, &vbo_normals); - fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); - fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(normals[0]), - normals, FGH_STATIC_DRAW); + fghGenBuffers(1, &vbo_normals); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); + fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(normals[0]), + normals, FGH_STATIC_DRAW); } if (vbo_coords) { @@ -117,18 +117,18 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei n /* Draw per face (TODO: could use glMultiDrawArrays if available) */ for (i=0; i= 2.0 */ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte *vertIdxs, - GLsizei numVertices, GLsizei numVertIdxs, - GLint attribute_v_coord, GLint attribute_v_normal) + GLsizei numVertices, GLsizei numVertIdxs, + GLint attribute_v_coord, GLint attribute_v_normal) { GLuint vbo_coords, vbo_normals, ibo_elements; if (numVertices > 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); - } + fghGenBuffers(1, &vbo_coords); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); + fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(vertices[0]), + vertices, FGH_STATIC_DRAW); + } if (numVertices > 0 && attribute_v_normal != -1) { - fghGenBuffers(1, &vbo_normals); - fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); - fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(normals[0]), - normals, FGH_STATIC_DRAW); + fghGenBuffers(1, &vbo_normals); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); + fghBufferData(FGH_ARRAY_BUFFER, numVertices * 3 * sizeof(normals[0]), + 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); + fghGenBuffers(1, &ibo_elements); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); + fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxs * sizeof(vertIdxs[0]), + vertIdxs, FGH_STATIC_DRAW); } if (vbo_coords) { - fghEnableVertexAttribArray(attribute_v_coord); - fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); - fghVertexAttribPointer( + fghEnableVertexAttribArray(attribute_v_coord); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_coords); + fghVertexAttribPointer( attribute_v_coord, // attribute 3, // number of elements per vertex, here (x,y,z) GL_FLOAT, // the type of each element @@ -218,9 +218,9 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte }; if (vbo_normals) { - fghEnableVertexAttribArray(attribute_v_normal); - fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); - fghVertexAttribPointer( + fghEnableVertexAttribArray(attribute_v_normal); + fghBindBuffer(FGH_ARRAY_BUFFER, vbo_normals); + fghVertexAttribPointer( attribute_v_normal, // attribute 3, // number of elements per vertex, here (x,y,z) GL_FLOAT, // the type of each element @@ -231,40 +231,40 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte }; if (vertIdxs == NULL) { - glDrawArrays(GL_TRIANGLES, 0, numVertices); + glDrawArrays(GL_TRIANGLES, 0, numVertices); } else { - fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); - glDrawElements(GL_TRIANGLES, numVertIdxs, GL_UNSIGNED_BYTE, 0); + fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); + glDrawElements(GL_TRIANGLES, numVertIdxs, GL_UNSIGNED_BYTE, 0); } if (vbo_coords != 0) - fghDisableVertexAttribArray(attribute_v_coord); + fghDisableVertexAttribArray(attribute_v_coord); if (vbo_normals != 0) - fghDisableVertexAttribArray(attribute_v_normal); + fghDisableVertexAttribArray(attribute_v_normal); if (vbo_coords != 0) - fghDeleteBuffers(1, &vbo_coords); + fghDeleteBuffers(1, &vbo_coords); if (vbo_normals != 0) - fghDeleteBuffers(1, &vbo_normals); + fghDeleteBuffers(1, &vbo_normals); if (ibo_elements != 0) - fghDeleteBuffers(1, &ibo_elements); + fghDeleteBuffers(1, &ibo_elements); } static void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLubyte *vertIdxs, - GLsizei numVertices, GLsizei numVertIdxs) + GLsizei numVertices, GLsizei numVertIdxs) { GLint attribute_v_coord = fgStructure.CurrentWindow->Window.attribute_v_coord; GLint attribute_v_normal = fgStructure.CurrentWindow->Window.attribute_v_normal; if (fgState.HasOpenGL20 && (attribute_v_coord != -1 || attribute_v_normal != -1)) /* User requested a 2.0 draw */ - fghDrawGeometrySolid20(vertices, normals, vertIdxs, - numVertices, numVertIdxs, - attribute_v_coord, attribute_v_normal); + fghDrawGeometrySolid20(vertices, normals, vertIdxs, + numVertices, numVertIdxs, + attribute_v_coord, attribute_v_normal); #ifndef GL_ES_VERSION_2_0 else - fghDrawGeometrySolid11(vertices, normals, vertIdxs, - numVertices, numVertIdxs); + fghDrawGeometrySolid11(vertices, normals, vertIdxs, + numVertices, numVertIdxs); #endif } @@ -796,8 +796,13 @@ static void fghCircleTable(GLfloat **sint, GLfloat **cost, const int n, const GL for (i=1; i 65535) - fgWarning("fghSphere: too many slices or stacks requested, indices will wrap"); + fgWarning("fghSphere: too many slices or stacks requested, indices will wrap"); /* Generate vertices and normals */ fghGenerateSphere((GLfloat)radius,slices,stacks,&vertices,&normals,&nVert); @@ -1069,54 +1074,55 @@ static void fghSphere( double radius, GLint slices, GLint stacks, GLboolean useW } else { - GLushort *topIdx, *bottomIdx, *stripIdx; /* First, generate vertex index arrays for drawing with glDrawElements - * Top and bottom are covered with a triangle fan - * Each other stack with triangle strip. Only need to generate on - * of those as we'll have to draw each stack separately, and can - * just use different offsets in glDrawElements. + * All stacks, including top and bottom are covered with a triangle + * strip. */ + GLushort *stripIdx; + /* Create index vector */ + GLushort offset; /* Allocate buffers for indices, bail out if memory allocation fails */ - topIdx = malloc((slices+2)*sizeof(GLushort)); - bottomIdx = malloc((slices+2)*sizeof(GLushort)); - stripIdx = malloc((slices+1)*2*(stacks-2)*sizeof(GLushort)); - if (!(topIdx) || !(bottomIdx) || !(stripIdx)) + stripIdx = malloc((slices+1)*2*(stacks)*sizeof(GLushort)); + if (!(stripIdx)) { - free(topIdx); - free(bottomIdx); free(stripIdx); fgError("Failed to allocate memory in fghGenerateSphere"); } - /* TODO: Can do top and bottom as Triangle strip as well - (just need to repeat top/btoom vertex a lot). Then we can draw - the whole thing with just one index array and one for-looped call - to glDrawElements.. That'll make it easier to reuse code with other - Circular objects too - */ - topIdx[0]=0; - topIdx[1] = 1; /* repeat first slice's idx for closing off shape */ - for (j=slices, idx=2; j>0; j--, idx++) - topIdx[idx] = j; - - bottomIdx[0]=nVert-1; /* zero based index, last element in array... */ - for (j=0, idx=1; j