+ /* generate for each side */
+ for( i=0,idx=0; i<nSides; i++ )
+ for( j=0; j<nRings; j++, idx++ )
+ sideIdx[idx] = j * nSides + i;
+
+ /* draw */
+ fghDrawGeometryWire(vertices,normals,
+ ringIdx,nRings,nSides,GL_LINE_LOOP,
+ sideIdx,nSides,nRings);
+
+ /* cleanup allocated memory */
+ free(sideIdx);
+ free(ringIdx);
+ }
+ else
+ {
+ /* First, generate vertex index arrays for drawing with glDrawElements
+ * All stacks, including top and bottom are covered with a triangle
+ * strip.
+ */
+ GLushort *stripIdx;
+
+ /* Allocate buffers for indices, bail out if memory allocation fails */
+ stripIdx = malloc((nRings+1)*2*nSides*sizeof(GLushort));
+ if (!(stripIdx))
+ {
+ free(stripIdx);
+ fgError("Failed to allocate memory in fghTorus");
+ }
+
+ for( i=0, idx=0; i<nSides; i++ )
+ {
+ int ioff = 1;
+ if (i==nSides-1)
+ ioff = -i;
+
+ for( j=0; j<nRings; j++, idx+=2 )
+ {
+ int offset = j * nSides + i;
+ stripIdx[idx ] = offset;
+ stripIdx[idx+1] = offset + ioff;
+ }
+ /* repeat first to close off shape */
+ stripIdx[idx ] = i;
+ stripIdx[idx+1] = i + ioff;
+ idx +=2;
+ }
+
+ /* draw */
+ fghDrawGeometrySolid(vertices,normals,stripIdx,nVert,nSides,(nRings+1)*2);