/* sphere, Copyright (c) 2002 Paul Bourke <pbourke@swin.edu.au>,
- * Copyright (c) 2010 Jamie Zawinski <jwz@jwz.org>
+ * Copyright (c) 2010-2014 Jamie Zawinski <jwz@jwz.org>
* Utility function to create a unit sphere in GL.
*
* Permission to use, copy, modify, distribute, and sell this software and its
# include "config.h"
#endif
-#ifdef HAVE_COCOA
-# include <OpenGL/gl.h>
-#else
+#ifndef HAVE_COCOA
# include <GL/gl.h>
#endif
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
#include "sphere.h"
typedef struct { GLfloat x, y, z; } XYZ;
-int
-unit_sphere (int stacks, int slices, int wire_p)
+static int
+unit_sphere_1 (int stacks, int slices, int wire_p, int half_p)
{
int polys = 0;
int i,j;
double theta1, theta2, theta3;
XYZ p, n;
- XYZ la = { 0, 0, 0 }, lb = { 0, 0, 0 };
+ XYZ la = { 0, -1, 0 }, lb = { 0, -1, 0 };
XYZ c = {0, 0, 0}; /* center */
double r = 1.0; /* radius */
int stacks2 = stacks * 2;
+ int end = (half_p ? stacks/2 : stacks);
- int mode = (wire_p ? GL_LINE_LOOP : GL_TRIANGLE_STRIP);
+ int mode = (wire_p ? GL_LINE_STRIP : GL_TRIANGLE_STRIP);
int arraysize, out;
struct { XYZ p; XYZ n; GLfloat s, t; } *array;
if (! array) abort();
out = 0;
-
if (slices < 4 || stacks < 2 || r <= 0)
{
mode = GL_POINTS;
goto END;
}
- for (j = 0; j < stacks; j++)
+ for (j = 0; j < end; j++)
{
theta1 = j * (M_PI+M_PI) / stacks2 - M_PI_2;
theta2 = (j + 1) * (M_PI+M_PI) / stacks2 - M_PI_2;
{
theta3 = i * (M_PI+M_PI) / slices;
- if (wire_p && i != 0)
+ if (wire_p)
{
array[out++].p = lb; /* vertex */
array[out++].p = la; /* vertex */
return polys;
}
+
+
+int
+unit_sphere (int stacks, int slices, int wire_p)
+{
+ return unit_sphere_1 (stacks, slices, wire_p, 0);
+}
+
+int
+unit_dome (int stacks, int slices, int wire_p)
+{
+ return unit_sphere_1 (stacks, slices, wire_p, 1);
+}