summaryrefslogtreecommitdiffstats
path: root/hacks/glx/tangram_shapes.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/tangram_shapes.c')
-rw-r--r--hacks/glx/tangram_shapes.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/hacks/glx/tangram_shapes.c b/hacks/glx/tangram_shapes.c
new file mode 100644
index 0000000..267b187
--- /dev/null
+++ b/hacks/glx/tangram_shapes.c
@@ -0,0 +1,240 @@
+/* tangram, Copyright (c) 2005 Jeremy English <jhe@jeremyenglish.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef HAVE_JWXYZ
+# include <GL/gl.h>
+#endif
+
+#ifdef HAVE_ANDROID
+#include <GLES/gl.h>
+#endif
+
+#ifdef HAVE_JWZGLES
+# include "jwzgles.h"
+#endif /* HAVE_JWZGLES */
+
+#include "tangram_shapes.h"
+
+#define small_scale ( 1 )
+#define large_scale ( 2 )
+#define medium_scale ( 1.414213562 )
+
+#define alpha (0.05)
+
+static void
+tri_45_90(int wire)
+{
+ GLfloat vertices[][3] = {
+ {0, alpha, 0},
+ {0, alpha, 1},
+ {1, alpha, 0},
+ {0, -alpha, 0},
+ {0, -alpha, 1},
+ {1, -alpha, 0}
+ };
+
+ glBegin((wire) ? GL_LINE_LOOP : GL_TRIANGLES);
+
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[0]);
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[2]);
+ glNormal3f(0, 1, 0);
+ glVertex3fv(vertices[1]);
+
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[3]);
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[4]);
+ glNormal3f(0, -1, 0);
+ glVertex3fv(vertices[5]);
+ glEnd();
+
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[2]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[5]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[4]);
+ glNormal3f(1, 0, 1);
+ glVertex3fv(vertices[1]);
+
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[0]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[1]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[4]);
+ glNormal3f(-1, 0, 0);
+ glVertex3fv(vertices[3]);
+
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[0]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[3]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[5]);
+ glNormal3f(0, 0, -1);
+ glVertex3fv(vertices[2]);
+ glEnd();
+}
+
+static void
+unit_cube(int wire)
+{
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+
+
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+
+ glNormal3f(0.0f, 0.0f, -1.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+
+ glNormal3f(1.0f, 0.0f, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 0.0f);
+ glVertex3f(1.0f, alpha, 1.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+
+ glNormal3f(-1.0f, 0.0f, 0.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 1.0f);
+ glVertex3f(0.0f, alpha, 0.0f);
+
+ glNormal3f(0.0f, -1.0f, 0.0f);
+ glVertex3f(0.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 0.0f);
+ glVertex3f(1.0f, -alpha, 1.0f);
+ glVertex3f(0.0f, -alpha, 1.0f);
+
+ glEnd();
+}
+
+static void
+unit_rhomboid(int wire)
+{
+ glBegin((wire) ? GL_LINE_LOOP : GL_QUADS);
+
+ glNormal3f(0.0f, 1.0f, 0.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(1, alpha, 1);
+ glVertex3f(1, alpha, 2);
+ glVertex3f(0, alpha, 1);
+
+ glNormal3f(0.0f, -1.0f, 0.0f);
+ glVertex3f(0, -alpha, 0);
+ glVertex3f(0, -alpha, 1);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(1, -alpha, 1);
+
+ glNormal3f(-1.0f, 0.0f, 0.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(0, alpha, 1);
+ glVertex3f(0, -alpha, 1);
+ glVertex3f(0, -alpha, 0);
+
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0, alpha, 1);
+ glVertex3f(1, alpha, 2);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(0, -alpha, 1);
+
+ glNormal3f(1.0f, 0.0f, 0.0f);
+ glVertex3f(1, alpha, 1);
+ glVertex3f(1, -alpha, 1);
+ glVertex3f(1, -alpha, 2);
+ glVertex3f(1, alpha, 2);
+
+ glNormal3f(0.0f, 0.0f, 1.0f);
+ glVertex3f(0, alpha, 0);
+ glVertex3f(0, -alpha, 0);
+ glVertex3f(1, -alpha, 1);
+ glVertex3f(1, alpha, 1);
+
+ glEnd();
+}
+
+/* All of the pieces have the same thickness so all of the Y values are the same */
+
+GLuint
+tangram_get_sm_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_lg_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(large_scale, small_scale, large_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_md_tri_dl(int wire)
+{
+ GLuint triangle = glGenLists(1);
+ glNewList(triangle, GL_COMPILE);
+ glScalef(medium_scale, small_scale, medium_scale);
+ tri_45_90(wire);
+ glEndList();
+ return triangle;
+}
+
+GLuint
+tangram_get_square_dl(int wire)
+{
+ GLuint square = glGenLists(1);
+ glNewList(square, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ unit_cube(wire);
+ glEndList();
+ return square;
+}
+
+GLuint
+tangram_get_rhomboid_dl(int wire)
+{
+ GLuint rhomboid = glGenLists(1);
+ glNewList(rhomboid, GL_COMPILE);
+ glScalef(small_scale, small_scale, small_scale);
+ unit_rhomboid(wire);
+ glEndList();
+ return rhomboid;
+}