From c04a82ac4727f2e4a74f11d1bdc92d2c9ec36f09 Mon Sep 17 00:00:00 2001 From: dcnieho Date: Sun, 29 Apr 2012 04:16:07 +0000 Subject: [PATCH] drawing code for solid and wired now shared for all objects git-svn-id: https://svn.code.sf.net/p/freeglut/code/trunk@1271 7f0cb862-5218-0410-a997-914c9d46530a --- freeglut/freeglut/src/fg_geometry.c | 213 +++++++++++----------------- 1 file changed, 82 insertions(+), 131 deletions(-) diff --git a/freeglut/freeglut/src/fg_geometry.c b/freeglut/freeglut/src/fg_geometry.c index de331a6..3e47e95 100644 --- a/freeglut/freeglut/src/fg_geometry.c +++ b/freeglut/freeglut/src/fg_geometry.c @@ -47,7 +47,10 @@ /* Version for OpenGL (ES) 1.1 */ #ifndef GL_ES_VERSION_2_0 -static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, GLsizei numFaces, GLsizei numEdgePerFace) +static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, + GLushort *vertIdxs, GLsizei numParts, GLsizei numVertPerPart, GLenum vertexMode, + GLushort *vertIdxs2, GLsizei numParts2, GLsizei numVertPerPart2 + ) { int i; @@ -57,9 +60,18 @@ static void fghDrawGeometryWire11(GLfloat *vertices, GLfloat *normals, GLsizei n glVertexPointer(3, GL_FLOAT, 0, vertices); glNormalPointer(GL_FLOAT, 0, normals); - /* Draw per face (TODO: could use glMultiDrawArrays if available) */ - for (i=0; i= 2.0 */ -static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei numFaces, GLsizei numEdgePerFace, - GLint attribute_v_coord, GLint attribute_v_normal) +static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, + 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 = numFaces * numEdgePerFace; + GLuint numVertices = numParts * numVertPerPart; int i; @@ -116,8 +131,8 @@ static void fghDrawGeometryWire20(GLfloat *vertices, GLfloat *normals, GLsizei n } /* Draw per face (TODO: could use glMultiDrawArrays if available) */ - for (i=0; iWindow.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 */ - fghDrawGeometryWire20(vertices, normals, numFaces, numEdgePerFace, - attribute_v_coord, attribute_v_normal); + fghDrawGeometryWire20(vertices, normals, + vertIdxs, numParts, numVertPerPart, vertexMode, + vertIdxs2, numParts2, numVertPerPart2, + attribute_v_coord, attribute_v_normal); #ifndef GL_ES_VERSION_2_0 else - fghDrawGeometryWire11(vertices, normals, numFaces, numEdgePerFace); + fghDrawGeometryWire11(vertices, normals, + vertIdxs, numParts, numVertPerPart, vertexMode, + vertIdxs2, numParts2, numVertPerPart2); #endif } @@ -158,9 +180,11 @@ static void fghDrawGeometryWire(GLfloat *vertices, GLfloat *normals, GLsizei num /* Version for OpenGL (ES) 1.1 */ #ifndef GL_ES_VERSION_2_0 -static void fghDrawGeometrySolid11(GLfloat *vertices, GLfloat *normals, GLubyte *vertIdxs, - GLsizei numVertices, GLsizei numVertIdxs) +static void fghDrawGeometrySolid11(GLfloat *vertices, GLfloat *normals, GLushort *vertIdxs, + GLsizei numVertices, GLsizei numParts, GLsizei numVertIdxsPerPart) { + int i; + glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_NORMAL_ARRAY); @@ -169,7 +193,11 @@ static void fghDrawGeometrySolid11(GLfloat *vertices, GLfloat *normals, GLubyte if (vertIdxs == NULL) glDrawArrays(GL_TRIANGLES, 0, numVertices); else - glDrawElements(GL_TRIANGLES, numVertIdxs, GL_UNSIGNED_BYTE, vertIdxs); + if (numParts>1) + for (i=0; i= 2.0 */ -static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte *vertIdxs, - GLsizei numVertices, GLsizei numVertIdxs, +static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLushort *vertIdxs, + GLsizei numVertices, GLsizei numParts, GLsizei numVertIdxsPerPart, GLint attribute_v_coord, GLint attribute_v_normal) { GLuint vbo_coords = 0, vbo_normals = 0, ibo_elements = 0; @@ -200,7 +228,7 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte if (vertIdxs != NULL) { fghGenBuffers(1, &ibo_elements); fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); - fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxs * sizeof(vertIdxs[0]), + fghBufferData(FGH_ELEMENT_ARRAY_BUFFER, numVertIdxsPerPart * sizeof(vertIdxs[0]), vertIdxs, FGH_STATIC_DRAW); } @@ -234,7 +262,7 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte glDrawArrays(GL_TRIANGLES, 0, numVertices); } else { fghBindBuffer(FGH_ELEMENT_ARRAY_BUFFER, ibo_elements); - glDrawElements(GL_TRIANGLES, numVertIdxs, GL_UNSIGNED_BYTE, 0); + glDrawElements(GL_TRIANGLES, numVertIdxsPerPart, GL_UNSIGNED_SHORT, 0); } /* Clean existing bindings before clean-up */ @@ -255,8 +283,8 @@ static void fghDrawGeometrySolid20(GLfloat *vertices, GLfloat *normals, GLubyte fghDeleteBuffers(1, &ibo_elements); } -static void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLubyte *vertIdxs, - GLsizei numVertices, GLsizei numVertIdxs) +static void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLushort *vertIdxs, + GLsizei numVertices, GLsizei numParts, GLsizei numVertIdxsPerPart) { GLint attribute_v_coord = fgStructure.CurrentWindow->Window.attribute_v_coord; GLint attribute_v_normal = fgStructure.CurrentWindow->Window.attribute_v_normal; @@ -264,12 +292,12 @@ static void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLubyte *v if (fgState.HasOpenGL20 && (attribute_v_coord != -1 || attribute_v_normal != -1)) /* User requested a 2.0 draw */ fghDrawGeometrySolid20(vertices, normals, vertIdxs, - numVertices, numVertIdxs, + numVertices, numParts, numVertIdxsPerPart, attribute_v_coord, attribute_v_normal); #ifndef GL_ES_VERSION_2_0 else fghDrawGeometrySolid11(vertices, normals, vertIdxs, - numVertices, numVertIdxs); + numVertices, numParts, numVertIdxsPerPart); #endif } @@ -283,7 +311,7 @@ static void fghDrawGeometrySolid(GLfloat *vertices, GLfloat *normals, GLubyte *v static GLubyte vert4Decomp[6] = {0,1,2, 0,2,3}; /* quad : 4 input vertices, 6 output (2 triangles) */ static GLubyte vert5Decomp[9] = {0,1,2, 0,2,4, 4,2,3}; /* pentagon: 5 input vertices, 9 output (3 triangles) */ -static void fghGenerateGeometryWithIndexArray(int numFaces, int numEdgePerFace, GLfloat *vertices, GLubyte *vertIndices, GLfloat *normals, GLfloat *vertOut, GLfloat *normOut, GLubyte *vertIdxOut) +static void fghGenerateGeometryWithIndexArray(int numFaces, int numEdgePerFace, GLfloat *vertices, GLubyte *vertIndices, GLfloat *normals, GLfloat *vertOut, GLfloat *normOut, GLushort *vertIdxOut) { int i,j,numEdgeIdxPerFace; GLubyte *vertSamps = NULL; @@ -359,7 +387,7 @@ static void fghGenerateGeometry(int numFaces, int numEdgePerFace, GLfloat *verti static GLboolean name##Cached = FALSE;\ static GLfloat name##_verts[nameCaps##_VERT_ELEM_PER_OBJ];\ static GLfloat name##_norms[nameCaps##_VERT_ELEM_PER_OBJ];\ - static GLubyte name##_vertIdxs[nameCaps##_VERT_PER_OBJ_TRI];\ + static GLushort name##_vertIdxs[nameCaps##_VERT_PER_OBJ_TRI];\ static void fgh##nameICaps##Generate()\ {\ fghGenerateGeometryWithIndexArray(nameCaps##_NUM_FACES, nameCaps##_NUM_EDGE_PER_FACE,\ @@ -1174,12 +1202,13 @@ void fghGenerateTorus( if (useWireMode)\ {\ fghDrawGeometryWire (name##_verts,name##_norms,\ - nameCaps##_NUM_FACES,nameCaps##_NUM_EDGE_PER_FACE);\ + NULL,nameCaps##_NUM_FACES,nameCaps##_NUM_EDGE_PER_FACE,GL_LINE_LOOP,\ + NULL,0,0);\ }\ else\ {\ fghDrawGeometrySolid(name##_verts,name##_norms,vertIdxs,\ - nameCaps##_VERT_PER_OBJ, nameCaps##_VERT_PER_OBJ_TRI); \ + nameCaps##_VERT_PER_OBJ, 1, nameCaps##_VERT_PER_OBJ_TRI); \ }\ } #define DECLARE_INTERNAL_DRAW(name,nameICaps,nameCaps) _DECLARE_INTERNAL_DRAW_DO_DECLARE(name,nameICaps,nameCaps,NULL) @@ -1217,10 +1246,11 @@ static void fghCube( GLfloat dSize, GLboolean useWireMode ) if (useWireMode) fghDrawGeometryWire(vertices, cube_norms, - CUBE_NUM_FACES, CUBE_NUM_EDGE_PER_FACE); + NULL,CUBE_NUM_FACES, CUBE_NUM_EDGE_PER_FACE,GL_LINE_LOOP, + NULL,0,0); else fghDrawGeometrySolid(vertices, cube_norms, cube_vertIdxs, - CUBE_VERT_PER_OBJ, CUBE_VERT_PER_OBJ_TRI); + CUBE_VERT_PER_OBJ, 1, CUBE_VERT_PER_OBJ_TRI); if (dSize!=1.f) /* cleanup allocated memory */ @@ -1259,9 +1289,11 @@ static void fghSierpinskiSponge ( int numLevels, double offset[3], GLfloat scale /* Draw and cleanup */ if (useWireMode) - fghDrawGeometryWire (vertices,normals,numFace,TETRAHEDRON_NUM_EDGE_PER_FACE); + fghDrawGeometryWire (vertices,normals, + NULL,numFace,TETRAHEDRON_NUM_EDGE_PER_FACE,GL_LINE_LOOP, + NULL,0,0); else - fghDrawGeometrySolid(vertices,normals,NULL,numVert,numVert); + fghDrawGeometrySolid(vertices,normals,NULL,numVert,1,0); free(vertices); free(normals ); @@ -1322,21 +1354,10 @@ static void fghSphere( double radius, GLint slices, GLint stacks, GLboolean useW } /* draw */ - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - - glVertexPointer(3, GL_FLOAT, 0, vertices); - glNormalPointer(GL_FLOAT, 0, normals); - /*draw slices*/ - for (i=0; i