summaryrefslogtreecommitdiffstats
path: root/progs/windml/uglline.c
diff options
context:
space:
mode:
Diffstat (limited to 'progs/windml/uglline.c')
-rw-r--r--progs/windml/uglline.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/progs/windml/uglline.c b/progs/windml/uglline.c
new file mode 100644
index 00000000000..e58f071ea4b
--- /dev/null
+++ b/progs/windml/uglline.c
@@ -0,0 +1,274 @@
+
+/* uglline.c - WindML/Mesa example program */
+
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+modification history
+--------------------
+01a,jun01,sra Ported to UGL/Mesa and modifications
+*/
+
+/*
+DESCRIPTION
+Draw circular lines
+*/
+
+#include <stdio.h>
+#include <math.h>
+
+#include <ugl/ugl.h>
+#include <ugl/uglucode.h>
+#include <ugl/uglevent.h>
+#include <ugl/uglinput.h>
+
+#include <GL/uglmesa.h>
+#include <GL/glu.h>
+
+#define BLACK (0)
+#define YELLOW (1)
+#define GREEN (2)
+#define BLUE (3)
+#define CI_OFFSET 4
+
+UGL_LOCAL GLuint rgb;
+UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId;
+UGL_LOCAL UGL_EVENT_Q_ID qId;
+UGL_LOCAL volatile UGL_BOOL stopWex;
+UGL_LOCAL UGL_MESA_CONTEXT umc;
+
+UGL_LOCAL GLboolean mode1, mode2;
+UGL_LOCAL GLint size;
+
+UGL_LOCAL GLfloat pntA[3] = {
+ -10.0, 0.0, 0.0
+};
+UGL_LOCAL GLfloat pntB[3] = {
+ -5.0, 0.0, 0.0
+};
+
+UGL_LOCAL GLint angleA;
+
+UGL_LOCAL void initGL (void)
+ {
+ GLint i;
+
+ uglMesaSetColor(BLACK, 0.0, 0.0, 0.0);
+ uglMesaSetColor(YELLOW, 1.0, 1.0, 0.0);
+ uglMesaSetColor(GREEN, 0.0, 1.0, 0.0);
+ uglMesaSetColor(BLUE, 0.0, 0.0, 1.0);
+
+ for (i = 0; i < 16; i++)
+ {
+ uglMesaSetColor(CI_OFFSET+i, i/15.0, i/15.0, 0.0);
+ }
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(BLACK);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-10, 10, -10, 10, -10.0, 10.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glLineStipple(1, 0xF0E0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+
+ mode1 = GL_FALSE;
+ mode2 = GL_FALSE;
+ size = 1;
+ }
+
+UGL_LOCAL void drawGL (void)
+ {
+
+ GLint ci, i;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glLineWidth(size);
+
+ if (mode1) {
+ glEnable(GL_LINE_STIPPLE);
+ } else {
+ glDisable(GL_LINE_STIPPLE);
+ }
+
+ if (mode2) {
+ ci = CI_OFFSET;
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ } else {
+ ci = YELLOW;
+ glDisable(GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
+ }
+
+ glPushMatrix();
+
+ glRotatef(angleA, 1, 0, 1);
+ angleA = angleA++ % 360;
+
+ for (i = 0; i < 360; i += 5) {
+ glRotatef(5.0, 0, 0, 1);
+
+ glColor3f(1.0, 1.0, 0.0);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(pntA);
+ glVertex3fv(pntB);
+ glEnd();
+
+ glPointSize(1);
+
+ glColor3f(0.0, 1.0, 0.0);
+ glBegin(GL_POINTS);
+ glVertex3fv(pntA);
+ glVertex3fv(pntB);
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ glFlush();
+
+ uglMesaSwapBuffers();
+
+ }
+
+UGL_LOCAL void echoUse(void)
+ {
+ printf("tLine keys:\n");
+ printf(" b Blending/antialiasing\n");
+ printf(" n Line stipple\n");
+ printf(" Up/Down Pixel size\n");
+ printf(" ESC Exit\n");
+ }
+
+UGL_LOCAL void readKey (UGL_WCHAR key)
+ {
+ switch(key)
+ {
+ case 'n':
+ mode1 = (mode1) ? GL_FALSE: GL_TRUE;
+ break;
+ case 'b':
+ mode2 = (mode2) ? GL_FALSE: GL_TRUE;
+ break;
+ case UGL_UNI_DOWN_ARROW:
+ if(size>0)
+ size--;
+ break;
+ case UGL_UNI_UP_ARROW:
+ size++;
+ break;
+ case UGL_UNI_ESCAPE:
+ stopWex = UGL_TRUE;
+ break;
+ }
+ }
+
+UGL_LOCAL void loopEvent(void)
+ {
+ UGL_EVENT event;
+ UGL_INPUT_EVENT * pInputEvent;
+
+ UGL_FOREVER
+ {
+ if (uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT)
+ != UGL_STATUS_Q_EMPTY)
+ {
+ pInputEvent = (UGL_INPUT_EVENT *)&event;
+
+ if (pInputEvent->header.type == UGL_EVENT_TYPE_KEYBOARD &&
+ pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
+ readKey(pInputEvent->type.keyboard.key);
+ }
+
+ drawGL();
+ if (stopWex)
+ break;
+ }
+ }
+
+void windMLLine (UGL_BOOL windMLMode);
+
+void uglline (void)
+ {
+ taskSpawn("tLine", 210, VX_FP_TASK, 100000, (FUNCPTR)windMLLine,
+ UGL_FALSE,1,2,3,4,5,6,7,8,9);
+ }
+
+
+void windMLLine(UGL_BOOL windMLMode)
+ {
+
+ UGL_INPUT_DEVICE_ID keyboardDevId;
+
+ angleA = 0;
+
+ uglInitialize();
+
+ uglDriverFind (UGL_KEYBOARD_TYPE, 0, (UGL_UINT32 *)&keyboardDevId);
+
+ uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0, (UGL_UINT32 *)&eventServiceId);
+
+ qId = uglEventQCreate (eventServiceId, 100);
+
+ /* Double buffer */
+
+ if (windMLMode)
+ umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE
+ | UGL_MESA_WINDML_EXCLUSIVE, NULL);
+ else
+ umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL);
+
+ if (umc == NULL)
+ {
+ uglDeinitialize();
+ return;
+ }
+
+ /* Fullscreen */
+
+ uglMesaMakeCurrentContext(umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
+ UGL_MESA_FULLSCREEN_HEIGHT);
+
+ uglMesaGetIntegerv(UGL_MESA_RGB, &rgb);
+
+ initGL();
+
+ echoUse();
+
+ stopWex = UGL_FALSE;
+ loopEvent();
+
+ uglEventQDestroy(eventServiceId, qId);
+
+ uglMesaDestroyContext();
+ uglDeinitialize();
+
+ return;
+ }