275 lines
5.6 KiB
C
275 lines
5.6 KiB
C
|
|
||
|
/* 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;
|
||
|
}
|