home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Magazin: Amiga-CD 2000 April & May
/
AMIGA_2000_04.iso
/
patches
/
mesa3.1
/
test
/
triangles.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-07-04
|
6KB
|
217 lines
/*
* triangles.c
*
* Modified 27 Jun 1998
* by Jarno van der Linden
* jarno@kcbbs.gen.nz
*
* Based on triangles.c from CyberGL
* Changes to work with AmigaMesaRTL
*
* Original copyright notice follows:
*/
/*
* $VER: triangles.c 1.0 (20.03.1997)
*
* This is an example program for CyberGL
*
* Written by Frank Gerberding
*
* Copyright © 1996-1997 by phase5 digital products
* All Rights reserved.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//#include <sys/time.h>
#include <intuition/intuition.h>
#include <inline/exec.h>
#include <inline/graphics.h>
#include <inline/intuition.h>
#include <GL/amigamesa.h>
#include <GL/gl.h>
#include <GL/glu.h>
extern struct ExecBase *SysBase;
extern struct DOSBase *DOSBase;
struct Library *IntuitionBase;
struct Screen *screen;
struct Window *window;
amigaMesaContext context;
#define WIDTH 300
#define HEIGHT 200
void handle_window_events(struct Window *window)
{
struct IntuiMessage *msg;
int done = 0;
while (!done) {
Wait(1L << window->UserPort->mp_SigBit);
while ((!done) && (msg = (struct IntuiMessage *)GetMsg(window->UserPort))) {
switch (msg->Class) {
case IDCMP_CLOSEWINDOW:
done = 1;
default:
break;
}
ReplyMsg((struct Message *)msg);
}
}
}
void drawTriangles(amigaMesaContext context, int num)
{
amigaMesaBuffer buffer = NULL;
int count;
struct timeval startTime, stopTime;
double secs;
/* we have changed the context (maybe the buffer too, so
* make it the current again
*/
amigaMesaGetContextTags(context, AMA_Buffer, &buffer, TAG_DONE);
if (buffer)
amigaMesaMakeCurrent(context, buffer);
glEnable(GL_DEPTH_TEST);
glEnable(GL_DITHER);
glShadeModel(GL_SMOOTH);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-400.0, 400.0, -300.0, 300.0, 500.0, -500.0);
srand(42);
gettimeofday(&startTime, NULL);
for (count = 0; count < num; count++) {
glBegin(GL_TRIANGLES);
glColor3ub(rand() % 256, rand() % 256, rand() % 256);
glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
glColor3ub(rand() % 256, rand() % 256, rand() % 256);
glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
glColor3ub(rand() % 256, rand() % 256, rand() % 256);
glVertex3i(rand() % 800 - 400, rand() % 600 - 300, rand() % 1000 - 500);
glEnd();
}
glFlush();
gettimeofday(&stopTime, NULL);
secs = (double)stopTime.tv_micro / 1000000 + stopTime.tv_secs ;
secs -= (double)startTime.tv_micro / 1000000 + startTime.tv_secs;
if (secs == 0.0)
secs = 0.1;
printf("%g triangles/s (%g secs)\n", (double)num / secs, secs);
}
void drawTrianglesIndexModes2(amigaMesaContext context, int num) {
amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_GREY_MATCH, TAG_DONE);
printf(" PaletteMode : grey\n");
drawTriangles(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_MATCH, TAG_DONE);
printf(" PaletteMode : color match\n");
drawTriangles(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_WEIGHTED_MATCH, TAG_DONE);
printf(" PaletteMode : weighted color\n");
drawTriangles(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_HPCR_MATCH, TAG_DONE);
printf(" PaletteMode : hpcr color\n");
drawTriangles(context, num);
}
void drawTrianglesIndexModes1(amigaMesaContext context, int num) {
amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_FALSE, TAG_DONE);
printf(" PaletteCache : off\n");
drawTrianglesIndexModes2(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteCache, GL_TRUE, TAG_DONE);
printf(" PaletteCache : on\n");
drawTrianglesIndexModes2(context, num);
}
void drawTrianglesIndexModes0(amigaMesaContext context, int num) {
amigaMesaChangeContextTags(context, AMA_PaletteMode, AMESA_TRUECOLOR_SHIFT, TAG_DONE);
printf(" PaletteDither : off\n");
printf(" PaletteCache : off\n");
printf(" PaletteMode : color shift\n");
drawTriangles(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_FALSE, TAG_DONE);
printf(" PaletteDither : off\n");
drawTrianglesIndexModes1(context, num);
amigaMesaChangeContextTags(context, AMA_PaletteDither, GL_TRUE, TAG_DONE);
printf(" PaletteDither : on\n");
drawTrianglesIndexModes1(context, num);
}
void drawTrianglesRGBAModes(amigaMesaContext context, int num) {
printf(" PaletteMode : off\n");
drawTriangles(context, num);
}
void exitT(void) {
if (context)
amigaMesaDestroyContext(context);
if (window)
CloseWindow(window);
if (screen)
UnlockPubScreen(NULL, screen);
if (IntuitionBase)
CloseLibrary(IntuitionBase);
}
int main(int argc, char **argv)
{
atexit(exitT);
if ((IntuitionBase = OpenLibrary("intuition.library", 1))) {
if (!(screen = LockPubScreen("Mesa")))
screen = LockPubScreen(NULL);
if ((window = OpenWindowTags(NULL,
WA_InnerWidth, WIDTH,
WA_InnerHeight, HEIGHT,
WA_Title, "Triangles",
WA_PubScreen, screen,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY,
WA_CloseGadget, TRUE,
WA_DepthGadget, TRUE,
WA_DragBar, TRUE,
WA_Activate, TRUE,
TAG_END))) {
if ((context = amigaMesaCreateContextTags(AMA_Window, window,
AMA_RastPort, (unsigned long)window->RPort,
AMA_Screen, (unsigned long)window->WScreen,
AMA_Left, window->BorderLeft,
AMA_Bottom, window->BorderBottom,
AMA_Width, WIDTH,
AMA_Height, HEIGHT,
AMA_RGBMode, GL_TRUE,
TAG_END))) {
if (window->WScreen->RastPort.BitMap->Depth <= 8)
drawTrianglesIndexModes0(context, argc == 2 ? atoi(argv[1]) : 500);
else
drawTrianglesRGBAModes(context, argc == 2 ? atoi(argv[1]) : 500);
handle_window_events(window);
}
}
}
return 0;
}