summaryrefslogtreecommitdiffstats
path: root/hacks/glx/glschool_gl.c
diff options
context:
space:
mode:
Diffstat (limited to 'hacks/glx/glschool_gl.c')
-rw-r--r--hacks/glx/glschool_gl.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/hacks/glx/glschool_gl.c b/hacks/glx/glschool_gl.c
new file mode 100644
index 0000000..660580b
--- /dev/null
+++ b/hacks/glx/glschool_gl.c
@@ -0,0 +1,274 @@
+/* glschool_gl.c, Copyright (c) 2005-2012 David C. Lambert <dcl@panix.com>
+ *
+ * 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.
+ */
+
+#include "sphere.h"
+#include "glschool_gl.h"
+#include "sphere.h"
+#include "tube.h"
+
+void
+glschool_drawGoal(double *goal, GLuint goalList)
+{
+ glColor3f(1.0, 0.0, 0.0);
+ glPushMatrix();
+ {
+ glTranslatef(goal[0], goal[1], goal[2]);
+ glColor3f(1.0, 0.0, 0.0);
+ glCallList(goalList);
+ }
+ glPopMatrix();
+}
+
+int
+glschool_drawBoundingBox(BBox *bbox, Bool wire)
+{
+ int polys = 0;
+ double xMin = BBOX_XMIN(bbox);
+ double yMin = BBOX_YMIN(bbox);
+ double zMin = BBOX_ZMIN(bbox);
+
+ double xMax = BBOX_XMAX(bbox);
+ double yMax = BBOX_YMAX(bbox);
+ double zMax = BBOX_ZMAX(bbox);
+
+ glFrontFace(GL_CCW);
+ if (wire) glLineWidth(5.0);
+
+ /* back */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .15);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* left */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMin, yMin, zMin);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMin, yMax, zMax);
+ polys++;
+ glEnd();
+
+ /* right */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .2);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* top */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .1);
+ glVertex3f(xMax, yMax, zMax);
+ glVertex3f(xMin, yMax, zMax);
+ glVertex3f(xMin, yMax, zMin);
+ glVertex3f(xMax, yMax, zMin);
+ polys++;
+ glEnd();
+
+ /* bottom */
+ glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+ glColor3f(0.0, 0.0, .3);
+ glVertex3f(xMin, yMin, zMax);
+ glVertex3f(xMax, yMin, zMax);
+ glVertex3f(xMax, yMin, zMin);
+ glVertex3f(xMin, yMin, zMin);
+ polys++;
+ glEnd();
+
+ if (wire) glLineWidth(1.0);
+
+ return polys;
+}
+
+int
+glschool_createBBoxList(BBox *bbox, GLuint *bboxList, int wire)
+{
+ int polys = 0;
+ *bboxList = glGenLists(1);
+ glNewList(*bboxList, GL_COMPILE);
+ polys = glschool_drawBoundingBox(bbox, wire);
+ glEndList();
+ return polys;
+}
+
+void
+glschool_createDrawLists(BBox *bbox, GLuint *bboxList, GLuint *goalList, GLuint *fishList, int *fish_polys, int *box_polys, int wire)
+{
+
+ int faces = 16;
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *box_polys += glschool_createBBoxList(bbox, bboxList, wire);
+
+ *box_polys = 0;
+ *fish_polys = 0;
+
+ *goalList = glGenLists(1);
+ glNewList(*goalList, GL_COMPILE);
+ glScalef (5, 5, 5);
+ *box_polys += unit_sphere (10, 10, wire);
+ glEndList();
+
+ *fishList = glGenLists(1);
+ glNewList(*fishList, GL_COMPILE);
+ *fish_polys += cone (0, 0, 0,
+ 0, 0, 10,
+ 2, 0,
+ faces, True, (faces <= 3), /* cap */
+ wire);
+ glTranslatef (0, 0, -0.3);
+ glScalef (2, 2, 2);
+ glRotatef (90, 1, 0, 0);
+ if (faces > 3)
+ *fish_polys += unit_sphere (faces, faces, wire);
+ glEndList();
+}
+
+
+void
+glschool_initLights(void)
+{
+ GLfloat amb[4] = {0.1, 0.1, 0.1, 1.0};
+ GLfloat dif[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat pos[4] = {0.0, 50.0, -50.0, 1.0};
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, spc);
+
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+}
+
+void
+glschool_initFog(void)
+{
+ GLfloat fog[4] = {0.0, 0.0, 0.15, 1.0};
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fog);
+ glFogf(GL_FOG_DENSITY, .0025);
+ glFogf(GL_FOG_START, -100);
+}
+
+void
+glschool_initGLEnv(Bool doFog)
+{
+ GLfloat spc[4] = {1.0, 1.0, 1.0, 1.0};
+
+ glClearDepth(1.0);
+ glDepthFunc(GL_LESS);
+
+ glEnable(GL_COLOR_MATERIAL);
+ glMateriali(GL_FRONT, GL_SHININESS, 128);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spc);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, spc);
+
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_CULL_FACE);
+
+ glschool_initLights();
+ if (doFog) glschool_initFog();
+}
+
+void
+glschool_reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) width / (GLfloat) height;
+
+ glViewport (0, 0, (GLint) width, (GLint) height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(60.0, h, 0.1, 451.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+void
+glschool_getColorVect(XColor *colors, int index, double *colorVect)
+{
+ colorVect[0] = colors[index].red / 65535.0;
+ colorVect[1] = colors[index].green / 65535.0;
+ colorVect[2] = colors[index].blue / 65535.0;
+}
+
+void
+glschool_drawSchool(XColor *colors, School *s,
+ GLuint bboxList, GLuint goalList, GLuint fishList,
+ int rotCounter, Bool drawGoal_p, Bool drawBBox_p,
+ int fish_polys, int box_polys, unsigned long *polys)
+{
+ double xVect[3];
+ double colorVect[3];
+ int i = 0;
+ double rotTheta = 0.0;
+ double colTheta = 0.0;
+ Fish *f = (Fish *)0;
+ int nFish = SCHOOL_NFISH(s);
+ Fish *theFishes = SCHOOL_FISHES(s);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ if (drawBBox_p) {
+ glDisable(GL_LIGHTING);
+ glCallList(bboxList);
+ glEnable(GL_LIGHTING);
+ *polys += box_polys;
+ }
+
+ if (drawGoal_p) glschool_drawGoal(SCHOOL_GOAL(s), goalList);
+
+ for(i = 0, f = theFishes; i < nFish; i++, f++) {
+ colTheta = glschool_computeNormalAndThetaToPlusZ(FISH_AVGVEL(f), xVect);
+ rotTheta = glschool_computeNormalAndThetaToPlusZ(FISH_VEL(f), xVect);
+
+ if (FISH_IAVGVEL(f,2) < 0.0) colTheta = 180.0 - colTheta;
+ if (FISH_VZ(f) < 0.0) rotTheta = 180.0 - rotTheta;
+
+ glschool_getColorVect(colors, (int)(colTheta+240)%360, colorVect);
+ glColor3f(colorVect[0], colorVect[1], colorVect[2]);
+
+ glPushMatrix();
+ {
+ glTranslatef(FISH_X(f), FISH_Y(f), FISH_Z(f));
+ glRotatef(180.0+rotTheta, xVect[0], xVect[1], xVect[2]);
+ glCallList(fishList);
+ *polys += fish_polys;
+ }
+ glPopMatrix();
+ }
+
+ glFinish();
+}