X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Ffg_geometry.c;h=c74cac4837f66bad264d69ce7ea1ba76935c8bac;hb=ee7bbd68f288bee1bf90734568422cb15cb7723e;hp=4d5d40630887987068eec24484f175656b20e5bb;hpb=759436698a49b7a734325735c57ffcdffa2f4379;p=freeglut diff --git a/src/fg_geometry.c b/src/fg_geometry.c index 4d5d406..c74cac4 100644 --- a/src/fg_geometry.c +++ b/src/fg_geometry.c @@ -29,100 +29,91 @@ #include "fg_internal.h" /* - * TODO BEFORE THE STABLE RELEASE: - * - * See fghTetrahedron - * - * Following functions have been contributed by Andreas Umbach. - * - * glutWireCube() -- looks OK - * glutSolidCube() -- OK - * - * Those functions have been implemented by John Fay. - * - * glutWireTorus() -- looks OK - * glutSolidTorus() -- looks OK - * glutWireDodecahedron() -- looks OK - * glutSolidDodecahedron() -- looks OK - * glutWireOctahedron() -- looks OK - * glutSolidOctahedron() -- looks OK - * glutWireTetrahedron() -- looks OK - * glutSolidTetrahedron() -- looks OK - * glutWireIcosahedron() -- looks OK - * glutSolidIcosahedron() -- looks OK - * - * The Following functions have been updated by Nigel Stewart, based - * on FreeGLUT 2.0.0 implementations: - * - * glutWireSphere() -- looks OK - * glutSolidSphere() -- looks OK - * glutWireCone() -- looks OK - * glutSolidCone() -- looks OK + * Need more types of polyhedra? See CPolyhedron in MRPT */ -/* General function for drawing geometry. As for all geometry we have no - * redundancy (or hardly any in the case of cones and cylinders) in terms - * of the vertex/normal combinations, we just use glDrawArrays. - * useWireMode controls the drawing of solids (false) or wire frame - * versions (TRUE) of the geometry you pass +/* General functions for drawing geometry + * Solids are drawn by glDrawArrays if composed of triangles, or by + * glDrawElements if consisting of squares or pentagons that were + * decomposed into triangles (some vertices are repeated in that case). + * WireFrame drawing will have to be done per face, using GL_LINE_LOOP and + * issuing one draw call per face. Always use glDrawArrays as no triangle + * decomposition needed. We use the "first" parameter in glDrawArrays to go + * from face to face. */ -static void fghDrawGeometry(GLenum vertexMode, GLdouble* vertices, GLdouble* normals, GLsizei numVertices, GLboolean useWireMode) +static void fghDrawGeometryWire(GLdouble *vertices, GLdouble *normals, GLsizei numFaces, GLsizei numEdgePerFace) { - if (useWireMode) - { - glPushAttrib(GL_POLYGON_BIT); - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - } + int i; + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); - if (1) - { - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_DOUBLE, 0, vertices); + glNormalPointer(GL_DOUBLE, 0, normals); + + /* Draw per face (TODO: could use glMultiDrawArrays if available) */ + for (i=0; i 0 ) ? stacks : 1 ); - const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); + const GLdouble zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); + const GLdouble rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); /* Scaling factors for vertex normals */ - const double cosn = ( height / sqrt ( height * height + base * base )); - const double sinn = ( base / sqrt ( height * height + base * base )); + const GLdouble cosn = ( height / sqrt ( height * height + base * base )); + const GLdouble sinn = ( base / sqrt ( height * height + base * base )); /* Pre-computed circle */ - double *sint,*cost; + GLdouble *sint,*cost; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCone" ); - fghCircleTable(&sint,&cost,-slices); + fghCircleTable(&sint,&cost,-slices,FALSE); /* Cover the circular base with a triangle fan... */ @@ -704,24 +985,24 @@ void FGAPIENTRY glutWireCone( GLdouble base, GLdouble height, GLint slices, GLin /* Step in z and radius as stacks are drawn. */ - double z = 0.0; - double r = base; + GLdouble z = 0.0; + GLdouble r = base; - const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); - const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); + const GLdouble zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); + const GLdouble rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); /* Scaling factors for vertex normals */ - const double cosn = ( height / sqrt ( height * height + base * base )); - const double sinn = ( base / sqrt ( height * height + base * base )); + const GLdouble cosn = ( height / sqrt ( height * height + base * base )); + const GLdouble sinn = ( base / sqrt ( height * height + base * base )); /* Pre-computed circle */ - double *sint,*cost; + GLdouble *sint,*cost; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCone" ); - fghCircleTable(&sint,&cost,-slices); + fghCircleTable(&sint,&cost,-slices,FALSE); /* Draw the stacks... */ @@ -772,16 +1053,16 @@ void FGAPIENTRY glutSolidCylinder(GLdouble radius, GLdouble height, GLint slices /* Step in z and radius as stacks are drawn. */ - double z0,z1; - const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); + GLdouble z0,z1; + const GLdouble zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); /* Pre-computed circle */ - double *sint,*cost; + GLdouble *sint,*cost; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutSolidCylinder" ); - fghCircleTable(&sint,&cost,-slices); + fghCircleTable(&sint,&cost,-slices,FALSE); /* Cover the base and top */ @@ -836,16 +1117,16 @@ void FGAPIENTRY glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, /* Step in z and radius as stacks are drawn. */ - double z = 0.0; - const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); + GLdouble z = 0.0; + const GLdouble zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); /* Pre-computed circle */ - double *sint,*cost; + GLdouble *sint,*cost; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireCylinder" ); - fghCircleTable(&sint,&cost,-slices); + fghCircleTable(&sint,&cost,-slices,FALSE); /* Draw the stacks... */ @@ -891,10 +1172,10 @@ void FGAPIENTRY glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, */ void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLint nSides, GLint nRings ) { - double iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi; - double *vertex, *normal; + GLdouble iradius = dInnerRadius, oradius = dOuterRadius, phi, psi, dpsi, dphi; + GLdouble *vertex, *normal; int i, j; - double spsi, cpsi, sphi, cphi ; + GLdouble spsi, cpsi, sphi, cphi ; FREEGLUT_EXIT_IF_NOT_INITIALISED ( "glutWireTorus" ); @@ -902,13 +1183,13 @@ void FGAPIENTRY glutWireTorus( GLdouble dInnerRadius, GLdouble dOuterRadius, GLi if ( nRings < 1 ) nRings = 1; /* Allocate the vertices array */ - vertex = (double *)calloc( sizeof(double), 3 * nSides * nRings ); - normal = (double *)calloc( sizeof(double), 3 * nSides * nRings ); + vertex = (GLdouble *)calloc( sizeof(GLdouble), 3 * nSides * nRings ); + normal = (GLdouble *)calloc( sizeof(GLdouble), 3 * nSides * nRings ); glPushMatrix(); - dpsi = 2.0 * M_PI / (double)nRings ; - dphi = -2.0 * M_PI / (double)nSides ; + dpsi = 2.0 * M_PI / (GLdouble)nRings ; + dphi = -2.0 * M_PI / (GLdouble)nSides ; psi = 0.0; for( j=0; j