ftp://ftp.uni-heidelberg.de/pub/X11/contrib/applications/xscreensaver-2.07.tar.gz
[xscreensaver] / hacks / glx / buildlwo.c
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
new file mode 100644 (file)
index 0000000..f405730
--- /dev/null
@@ -0,0 +1,101 @@
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)buildlwo.c   4.02 97/04/20 xlockmore";
+
+#endif
+
+/*-
+ * buildlwo.c: Lightwave Object Display List Builder for OpenGL
+ *
+ * This module can be called by any GL mode wishing to use
+ * objects created in NewTek's Lightwave 3D.  The objects must
+ * first be converted to C source with my converter "lw2ogl".
+ * If other people are interested in this, I will put up a
+ * web page for it at http://www.early.com/~emackey/lw2ogl/
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "buildlwo.h"
+
+GLuint
+BuildLWO(int wireframe, struct lwo *object)
+{
+       GLuint      dl_num;
+       GLfloat    *pnts, *normals, three[3], *grab;
+       unsigned short int *pols;
+       int         p, num_pnts = 0;
+
+       dl_num = glGenLists(1);
+       if (!dl_num)
+               return (0);
+
+       pnts = object->pnts;
+       normals = object->normals;
+       pols = object->pols;
+
+       glNewList(dl_num, GL_COMPILE);
+
+       if (!pols) {
+               num_pnts = object->num_pnts;
+               glBegin(GL_POINTS);
+               for (p = 0; p < num_pnts; ++p) {
+                       three[0] = *(pnts++);
+                       three[1] = *(pnts++);
+                       three[2] = *(pnts++);
+                       glVertex3fv(three);
+               }
+               glEnd();
+       } else
+               for (;;) {
+                       if (num_pnts <= 0) {
+                               num_pnts = *pols + 2;
+                               if (num_pnts < 3)
+                                       break;
+                               if (num_pnts == 3) {
+                                       glBegin(GL_POINTS);
+                               } else if (num_pnts == 4) {
+                                       glBegin(GL_LINES);
+                               } else {
+                                       three[0] = *(normals++);
+                                       three[1] = *(normals++);
+                                       three[2] = *(normals++);
+                                       glNormal3fv(three);
+                                       if (wireframe)
+                                               glBegin(GL_LINE_LOOP);
+                                       else
+                                               glBegin(GL_POLYGON);
+                               }
+                       } else if (num_pnts == 1) {
+                               glEnd();
+                       } else {
+                               grab = pnts + ((int) (*pols) * 3);
+                               three[0] = *(grab++);
+                               three[1] = *(grab++);
+                               three[2] = *(grab++);
+                               glVertex3fv(three);
+                       }
+                       --num_pnts;
+                       ++pols;
+               }
+
+       glEndList();
+
+       return (dl_num);
+}
+
+#endif /* USE_GL */
+
+/* End of buildlwo.c */