aboutsummaryrefslogtreecommitdiffstats
path: root/progs/windml/uglpoint.c
diff options
context:
space:
mode:
Diffstat (limited to 'progs/windml/uglpoint.c')
-rw-r--r--progs/windml/uglpoint.c277
1 files changed, 277 insertions, 0 deletions
diff --git a/progs/windml/uglpoint.c b/progs/windml/uglpoint.c
new file mode 100644
index 00000000000..49c432c3a41
--- /dev/null
+++ b/progs/windml/uglpoint.c
@@ -0,0 +1,277 @@
+
+/* uglpoint.c - WindML/Mesa example program */
+
+/* Copyright (C) 2001 by Wind River Systems, Inc */
+
+/*
+ * Mesa 3-D graphics library
+ * Version: 3.5
+ *
+ * The MIT License
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Authors:
+ * Stephane Raimbault <[email protected]>
+ */
+
+/*
+DESCRIPTION
+Draw a single point.
+*/
+
+#include <stdio.h>
+#include <math.h>
+
+#include <ugl/ugl.h>
+#include <ugl/uglevent.h>
+#include <ugl/uglinput.h>
+
+#include <GL/uglmesa.h>
+
+#define DOUBLE_BUFFER GL_TRUE
+
+enum {
+ BLACK = 0,
+ RED,
+ GREEN,
+ BLUE,
+ WHITE
+};
+
+UGL_LOCAL GLuint rgb;
+UGL_LOCAL UGL_EVENT_SERVICE_ID eventServiceId;
+UGL_LOCAL UGL_EVENT_Q_ID qId;
+UGL_LOCAL UGL_MESA_CONTEXT umc;
+UGL_LOCAL GLint angleT;
+
+UGL_LOCAL void initGL (void)
+ {
+ /* By passed in RGB mode */
+ uglMesaSetColor(BLACK, 0.0, 0.0, 0.0);
+ uglMesaSetColor(RED, 1.0, 0.0, 0.0);
+ uglMesaSetColor(GREEN, 0.0, 1.0, 0.0);
+ uglMesaSetColor(BLUE, 0.0, 0.0, 1.0);
+ uglMesaSetColor(WHITE, 1.0, 1.0, 1.0);
+
+ glOrtho(0.0, 1.0, 0.0, 1.0, -20.0, 20.0);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(BLACK);
+ }
+
+UGL_LOCAL void drawGL (void)
+ {
+ GLint i;
+ GLfloat x, y;
+
+ /* Avoid blinking in single buffer */
+
+ if (DOUBLE_BUFFER)
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ /* Random points */
+
+ glBegin(GL_POINTS);
+ (rgb) ? glColor3f(1.0, 0.0, 0.0): glIndexi(RED);
+
+ for (i=0; i<150; i++)
+ {
+ x = rand() / (RAND_MAX+1.0);
+ y = rand() / (RAND_MAX+1.0);
+ glVertex2f(x, y);
+ }
+
+ (rgb) ? glColor3f(0.0, 1.0, 0.0): glIndexi(GREEN);
+
+ for (i=0; i<150; i++)
+ {
+ x = (rand() / (RAND_MAX+1.0));
+ y = (rand() / (RAND_MAX+1.0));
+ glVertex2f(x, y);
+ }
+
+ (rgb) ? glColor3f(0.0, 0.0, 1.0): glIndexi(BLUE);
+ glVertex2f(0.5,0.5);
+
+ for (i=0; i<150; i++)
+ {
+ x = rand() / (RAND_MAX+1.0);
+ y = rand() / (RAND_MAX+1.0);
+ glVertex2f(x, y);
+ }
+
+ glEnd();
+
+ /* Smooth triangle */
+
+ glPushMatrix();
+ glTranslatef(0.5, 0.5, 0);
+ glRotatef(angleT, 1.0, -1.0, 0.0);
+ angleT = angleT++ % 360;
+ glBegin(GL_TRIANGLES);
+ (rgb) ? glColor3f(1.0, 0.0, 0.0): glIndexi(RED);
+ glVertex2f(0.75, 0.25);
+ (rgb) ? glColor3f(0.0, 1.0, 0.0): glIndexi(GREEN);
+ glVertex2f(0.75, 0.75);
+ (rgb) ? glColor3f(0.0, 0.0, 1.0): glIndexi(BLUE);
+ glVertex2f(0.25, 0.75);
+ glEnd();
+ glPopMatrix();
+
+ /* Flush and swap */
+
+ glFlush();
+
+ uglMesaSwapBuffers();
+ }
+
+/************************************************************************
+*
+* getEvent
+*
+* RETURNS: true or false
+*
+* NOMANUAL
+*
+*/
+
+UGL_LOCAL int getEvent(void)
+ {
+ UGL_EVENT event;
+ UGL_STATUS status;
+ int retVal = 0;
+
+ status = uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT);
+
+ while (status != UGL_STATUS_Q_EMPTY)
+ {
+ UGL_INPUT_EVENT * pInputEvent = (UGL_INPUT_EVENT *)&event;
+
+ if (pInputEvent->modifiers & UGL_KEYBOARD_KEYDOWN)
+ retVal = 1;
+
+ status = uglEventGet (qId, &event, sizeof (event), UGL_NO_WAIT);
+ }
+
+ return(retVal);
+ }
+
+void windMLPoint (UGL_BOOL windMLMode);
+
+void uglpoint (void)
+ {
+ taskSpawn ("tPoint", 210, VX_FP_TASK, 100000,
+ (FUNCPTR)windMLPoint, UGL_FALSE,1,2,3,4,5,6,7,8,9);
+ }
+
+void windMLPoint (UGL_BOOL windMLMode)
+ {
+ GLubyte pPixels[4];
+ GLsizei width, height;
+ UGL_INPUT_DEVICE_ID keyboardDevId;
+
+ angleT = 0;
+
+ uglInitialize();
+
+ uglDriverFind (UGL_KEYBOARD_TYPE, 0, (UGL_UINT32 *)&keyboardDevId);
+
+ if (uglDriverFind (UGL_EVENT_SERVICE_TYPE, 0,
+ (UGL_UINT32 *)&eventServiceId) == UGL_STATUS_OK)
+ {
+ qId = uglEventQCreate (eventServiceId, 100);
+ }
+ else
+ {
+ eventServiceId = UGL_NULL;
+ }
+
+ if (DOUBLE_BUFFER)
+ {
+ if (windMLMode)
+ umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE
+ | UGL_MESA_WINDML_EXCLUSIVE, NULL);
+ else
+ umc = uglMesaCreateNewContext(UGL_MESA_DOUBLE, NULL);
+ }
+ else
+ {
+ if (windMLMode)
+ umc = uglMesaCreateNewContext(UGL_MESA_SINGLE
+ | UGL_MESA_WINDML_EXCLUSIVE, NULL);
+ else
+ umc = uglMesaCreateNewContext(UGL_MESA_SINGLE, NULL);
+ }
+
+ if (umc == NULL)
+ {
+ uglDeinitialize();
+ return;
+ }
+
+ /* Fullscreen */
+
+ uglMesaMakeCurrentContext(umc, 0, 0, UGL_MESA_FULLSCREEN_WIDTH,
+ UGL_MESA_FULLSCREEN_HEIGHT);
+
+ /* RGB or CI ? */
+
+ uglMesaGetIntegerv(UGL_MESA_RGB, &rgb);
+
+ initGL();
+
+ while (!getEvent())
+ drawGL();
+
+ uglMesaGetIntegerv(UGL_MESA_WIDTH, &width);
+ uglMesaGetIntegerv(UGL_MESA_HEIGHT, &height);
+
+ printf ("glReadPixel return ");
+ if (rgb)
+ {
+ glReadPixels(width/2, height/2,
+ 1, 1, GL_RGB,
+ GL_UNSIGNED_BYTE, pPixels);
+ glFlush();
+ printf ("R:%i G:%i B:%i (RGB)", pPixels[0], pPixels[1], pPixels[2]);
+ }
+ else
+ {
+ glReadPixels(width/2, height/2,
+ 1, 1, GL_COLOR_INDEX,
+ GL_UNSIGNED_BYTE, pPixels);
+ glFlush();
+ if (pPixels[0] == BLUE)
+ printf ("BLUE (CI)");
+ else
+ printf ("%i (CI))", pPixels[0]);
+ }
+
+ printf(" for %ix%i\n", width/2, height/2);
+
+ if (eventServiceId != UGL_NULL)
+ uglEventQDestroy (eventServiceId, qId);
+
+ uglMesaDestroyContext();
+ uglDeinitialize();
+
+ return;
+ }