summaryrefslogtreecommitdiffstats
path: root/progs/demos/terrain.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-05-21 09:32:38 -0700
committerEric Anholt <[email protected]>2010-05-21 12:20:39 -0700
commit68fc4b415e322f6744299e39864fbc377c6eff74 (patch)
tree4bafffd8b0105174f3c5c0ae327a005be9145990 /progs/demos/terrain.c
parente4f4489e3fc0b36d72821b55794fb843b2b7fa5f (diff)
Remove demos that have moved to git+ssh://git.freedesktop.org/git/mesa/demos.
The remaining programs are ones I've had difficulty finding a build environment for to make the build system or are unit tests that should probably live next to their code instead. Hopefully people can bring over the build for remaining pieces they care about.
Diffstat (limited to 'progs/demos/terrain.c')
-rw-r--r--progs/demos/terrain.c658
1 files changed, 0 insertions, 658 deletions
diff --git a/progs/demos/terrain.c b/progs/demos/terrain.c
deleted file mode 100644
index a72c8d3caea..00000000000
--- a/progs/demos/terrain.c
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- * This program is under the GNU GPL.
- * Use at your own risk.
- *
- * written by David Bucciarelli ([email protected])
- * Humanware s.r.l.
- *
- * based on a Mikael SkiZoWalker's (MoDEL) / France ([email protected]) demo
- */
-
-#include <assert.h>
-#include <stdio.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#ifdef WIN32
-#include <windows.h>
-#endif
-
-#include <GL/glut.h>
-
-#ifdef XMESA
-#include "GL/xmesa.h"
-static int fullscreen = 1;
-#endif
-
-#ifndef M_PI
-#define M_PI 3.14159265
-#endif
-
-#define heightMnt 450
-#define lenghtXmnt 62
-#define lenghtYmnt 62
-
-#define stepXmnt 96.0
-#define stepYmnt 96.0
-
-#define WIDTH 640
-#define HEIGHT 480
-
-static GLint T0 = 0;
-static GLint Frames = 0;
-
-#define TSCALE 4
-
-#define FOV 85
-
-static GLfloat terrain[256 * 256];
-static GLfloat terraincolor[256 * 256][3];
-
-static int win = 0;
-
-static int fog = 1;
-static int bfcull = 1;
-static int usetex = 1;
-static int poutline = 0;
-static int help = 1;
-static int joyavailable = 0;
-static int joyactive = 0;
-static float ModZMnt;
-static long GlobalMnt = 0;
-
-static int scrwidth = WIDTH;
-static int scrheight = HEIGHT;
-
-#define OBSSTARTX 992.0
-#define OBSSTARTY 103.0
-
-static float obs[3] = { OBSSTARTX, heightMnt * 1.3, OBSSTARTY };
-static float dir[3], v1[2], v2[2];
-static float v = 900.0;
-static float alpha = 75.0;
-static float beta = 90.0;
-
-static void
-calcposobs(void)
-{
- float alpha1, alpha2;
- static double t0 = -1.;
- double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
- if (t0 < 0.0)
- t0 = t;
- dt = t - t0;
- t0 = t;
-
- dir[0] = sin(alpha * M_PI / 180.0);
- dir[2] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
- dir[1] = cos(beta * M_PI / 180.0);
-
- if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
- dir[0] = 0;
- if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
- dir[1] = 0;
- if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
- dir[2] = 0;
-
- alpha1 = alpha + FOV / 2.0;
- v1[0] = sin(alpha1 * M_PI / 180.0);
- v1[1] = cos(alpha1 * M_PI / 180.0);
-
- alpha2 = alpha - FOV / 2.0;
- v2[0] = sin(alpha2 * M_PI / 180.0);
- v2[1] = cos(alpha2 * M_PI / 180.0);
-
- obs[0] += v * dir[0] * dt;
- obs[1] += v * dir[1] * dt;
- obs[2] += v * dir[2] * dt;
-
- if (obs[1] < 0.0)
- obs[1] = 0.0;
-}
-
-static void
-reshape(int width, int height)
-{
- scrwidth = width;
- scrheight = height;
- glViewport(0, 0, (GLint) width, (GLint) height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(50.0, ((GLfloat) width / (GLfloat) height),
- lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-}
-
-static int
-clipstrip(float y, float *start, float *end)
-{
- float x1, x2, t1, t2, tmp;
-
- if (v1[1] == 0.0) {
- t1 = 0.0;
- x1 = -HUGE_VAL;
- }
- else {
- t1 = y / v1[1];
- x1 = t1 * v1[0];
- }
-
- if (v2[1] == 0.0) {
- t2 = 0.0;
- x2 = HUGE_VAL;
- }
- else {
- t2 = y / v2[1];
- x2 = t2 * v2[0];
- }
-
- if (((x1 < -(lenghtXmnt * stepXmnt) / 2) && (t2 <= 0.0)) ||
- ((t1 <= 0.0) && (x2 > (lenghtXmnt * stepXmnt) / 2)) ||
- ((t1 < 0.0) && (t2 < 0.0)))
- return 0;
-
- if ((t1 == 0.0) && (t2 == 0.0)) {
- if ((v1[0] < 0.0) && (v1[1] > 0.0) && (v2[0] < 0.0) && (v2[1] < 0.0)) {
- *start = -(lenghtXmnt * stepXmnt) / 2;
- *end = stepXmnt;
- return 1;
- }
- else {
- if ((v1[0] > 0.0) && (v1[1] < 0.0) && (v2[0] > 0.0) && (v2[1] > 0.0)) {
- *start = -stepXmnt;
- *end = (lenghtXmnt * stepXmnt) / 2;
- return 1;
- }
- else
- return 0;
- }
- }
- else {
- if (t2 < 0.0) {
- if (x1 < 0.0)
- x2 = -(lenghtXmnt * stepXmnt) / 2;
- else
- x2 = (lenghtXmnt * stepXmnt) / 2;
- }
-
- if (t1 < 0.0) {
- if (x2 < 0.0)
- x1 = -(lenghtXmnt * stepXmnt) / 2;
- else
- x1 = (lenghtXmnt * stepXmnt) / 2;
- }
- }
-
- if (x1 > x2) {
- tmp = x1;
- x1 = x2;
- x2 = tmp;
- }
-
- x1 -= stepXmnt;
- if (x1 < -(lenghtXmnt * stepXmnt) / 2)
- x1 = -(lenghtXmnt * stepXmnt) / 2;
-
- x2 += stepXmnt;
- if (x2 > (lenghtXmnt * stepXmnt) / 2)
- x2 = (lenghtXmnt * stepXmnt) / 2;
-
- *start = ((int) (x1 / stepXmnt)) * stepXmnt;
- *end = ((int) (x2 / stepXmnt)) * stepXmnt;
-
- return 1;
-}
-
-static void
-printstring(void *font, char *string)
-{
- int len, i;
-
- len = (int) strlen(string);
- for (i = 0; i < len; i++)
- glutBitmapCharacter(font, string[i]);
-}
-
-static void
-printhelp(void)
-{
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glColor4f(0.0, 0.0, 0.0, 0.5);
- glRecti(40, 40, 600, 440);
- glDisable(GL_BLEND);
-
- glColor3f(1.0, 0.0, 0.0);
- glRasterPos2i(300, 420);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
-
- glRasterPos2i(60, 390);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
- glRasterPos2i(60, 360);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
- glRasterPos2i(60, 330);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
- glRasterPos2i(60, 300);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "p - Wire frame");
- glRasterPos2i(60, 270);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
- glRasterPos2i(60, 240);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
- glRasterPos2i(60, 210);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
- glRasterPos2i(60, 180);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
-
- glRasterPos2i(60, 150);
- if (joyavailable)
- printstring(GLUT_BITMAP_TIMES_ROMAN_24,
- "j - Toggle jostick control (Joystick control available)");
- else
- printstring(GLUT_BITMAP_TIMES_ROMAN_24,
- "(No Joystick control available)");
-}
-
-static void
-drawterrain(void)
-{
- int h, i, idx, ox, oy;
- float j, k, start, end;
-
- ox = (int) (obs[0] / stepXmnt);
- oy = (int) (obs[2] / stepYmnt);
- GlobalMnt = ((ox * TSCALE) & 255) + ((oy * TSCALE) & 255) * 256;
-
- glPushMatrix();
- glTranslatef((float) ox * stepXmnt, 0, (float) oy * stepYmnt);
-
- for (h = 0, k = -(lenghtYmnt * stepYmnt) / 2; h < lenghtYmnt;
- k += stepYmnt, h++) {
- if (!clipstrip(k, &start, &end))
- continue;
-
- glBegin(GL_TRIANGLE_STRIP); /* I hope that the optimizer will be able to improve this code */
- for (i = (int) (lenghtXmnt / 2 + start / stepXmnt), j = start; j <= end;
- j += stepXmnt, i++) {
- idx = (i * TSCALE + h * 256 * TSCALE + GlobalMnt) & 65535;
- glColor3fv(terraincolor[idx]);
- glTexCoord2f((ox + i) / 8.0, (oy + h) / 8.0);
- glVertex3f(j, terrain[idx], k);
-
- idx =
- (i * TSCALE + h * 256 * TSCALE + 256 * TSCALE +
- GlobalMnt) & 65535;
- glColor3fv(terraincolor[idx]);
- glTexCoord2f((ox + i) / 8.0, (oy + h + 1) / 8.0);
- glVertex3f(j, terrain[idx], k + stepYmnt);
- }
- glEnd();
- }
-
- glDisable(GL_CULL_FACE);
- glDisable(GL_TEXTURE_2D);
- glEnable(GL_BLEND);
- glBegin(GL_QUADS);
- glColor4f(0.1, 0.7, 1.0, 0.4);
- glVertex3f(-(lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
- -(lenghtYmnt * stepYmnt) / 2.0);
- glVertex3f(-(lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
- (lenghtYmnt * stepYmnt) / 2.0);
- glVertex3f((lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
- (lenghtYmnt * stepYmnt) / 2.0);
- glVertex3f((lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
- -(lenghtYmnt * stepYmnt) / 2.0);
- glEnd();
- glDisable(GL_BLEND);
- if (bfcull)
- glEnable(GL_CULL_FACE);
- glEnable(GL_TEXTURE_2D);
-
- glPopMatrix();
-
-}
-
-static void
-dojoy(void)
-{
-#ifdef WIN32
- static UINT max[2] = { 0, 0 };
- static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
- MMRESULT res;
- JOYINFO joy;
-
- res = joyGetPos(JOYSTICKID1, &joy);
-
- if (res == JOYERR_NOERROR) {
- joyavailable = 1;
-
- if (max[0] < joy.wXpos)
- max[0] = joy.wXpos;
- if (min[0] > joy.wXpos)
- min[0] = joy.wXpos;
- center[0] = (max[0] + min[0]) / 2;
-
- if (max[1] < joy.wYpos)
- max[1] = joy.wYpos;
- if (min[1] > joy.wYpos)
- min[1] = joy.wYpos;
- center[1] = (max[1] + min[1]) / 2;
-
- if (joyactive) {
- if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
- alpha +=
- 2.5 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
- if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
- beta += 2.5 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
-
- if (joy.wButtons & JOY_BUTTON1)
- v += 0.5;
- if (joy.wButtons & JOY_BUTTON2)
- v -= 0.5;
- }
- }
- else
- joyavailable = 0;
-#endif
-}
-
-static void
-drawscene(void)
-{
- static char frbuf[80] = "";
-
- dojoy();
-
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
-
- if (usetex)
- glEnable(GL_TEXTURE_2D);
- else
- glDisable(GL_TEXTURE_2D);
-
- if (fog)
- glEnable(GL_FOG);
- else
- glDisable(GL_FOG);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- glPushMatrix();
-
- calcposobs();
- gluLookAt(obs[0], obs[1], obs[2],
- obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
- 0.0, 1.0, 0.0);
-
- drawterrain();
- glPopMatrix();
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_FOG);
- glShadeModel(GL_FLAT);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- glColor3f(1.0, 0.0, 0.0);
- glRasterPos2i(10, 10);
- printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
- glRasterPos2i(350, 470);
- printstring(GLUT_BITMAP_HELVETICA_10,
- "Terrain V1.2 Written by David Bucciarelli ([email protected])");
- glRasterPos2i(434, 457);
- printstring(GLUT_BITMAP_HELVETICA_10,
- "Based on a Mickael's demo ([email protected])");
-
- if (help)
- printhelp();
-
- reshape(scrwidth, scrheight);
-
- glutSwapBuffers();
-
- Frames++;
- {
- GLint t = glutGet(GLUT_ELAPSED_TIME);
- if (t - T0 >= 2000) {
- GLfloat seconds = (t - T0) / 1000.0;
- GLfloat fps = Frames / seconds;
- sprintf(frbuf, "Frame rate: %f", fps);
- T0 = t;
- Frames = 0;
- }
- }
-}
-
-static void
-key(unsigned char k, int x, int y)
-{
- switch (k) {
- case 27:
- exit(0);
- break;
- case 'a':
- v += 50.;
- break;
- case 'z':
- v -= 50.;
- break;
- case 'p':
- if (poutline) {
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- poutline = 0;
- }
- else {
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- poutline = 1;
- }
- break;
- case 'j':
- joyactive = (!joyactive);
- break;
- case 'h':
- help = (!help);
- break;
- case 'f':
- fog = (!fog);
- break;
- case 't':
- usetex = (!usetex);
- break;
- case 'b':
- if (bfcull) {
- glDisable(GL_CULL_FACE);
- bfcull = 0;
- }
- else {
- glEnable(GL_CULL_FACE);
- bfcull = 1;
- }
- break;
-#ifdef XMESA
- case ' ':
- XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
- fullscreen = (!fullscreen);
- break;
-#endif
- }
-}
-
-static void
-special(int k, int x, int y)
-{
- switch (k) {
- case GLUT_KEY_LEFT:
- alpha += 2.0;
- break;
- case GLUT_KEY_RIGHT:
- alpha -= 2.0;
- break;
- case GLUT_KEY_DOWN:
- beta -= 2.0;
- break;
- case GLUT_KEY_UP:
- beta += 2.0;
- break;
- }
-}
-
-static void
-calccolor(GLfloat height, GLfloat c[3])
-{
- GLfloat color[4][3] = {
- {1.0, 1.0, 1.0},
- {0.0, 0.8, 0.0},
- {1.0, 1.0, 0.3},
- {0.0, 0.0, 0.8}
- };
- GLfloat fact;
-
- height = height * (1.0 / 255.0);
-
- if (height >= 0.9) {
- c[0] = color[0][0];
- c[1] = color[0][1];
- c[2] = color[0][2];
- return;
- }
-
- if ((height < 0.9) && (height >= 0.7)) {
- fact = (height - 0.7) * 5.0;
- c[0] = fact * color[0][0] + (1.0 - fact) * color[1][0];
- c[1] = fact * color[0][1] + (1.0 - fact) * color[1][1];
- c[2] = fact * color[0][2] + (1.0 - fact) * color[1][2];
- return;
- }
-
- if ((height < 0.7) && (height >= 0.6)) {
- fact = (height - 0.6) * 10.0;
- c[0] = fact * color[1][0] + (1.0 - fact) * color[2][0];
- c[1] = fact * color[1][1] + (1.0 - fact) * color[2][1];
- c[2] = fact * color[1][2] + (1.0 - fact) * color[2][2];
- return;
- }
-
- if ((height < 0.6) && (height >= 0.5)) {
- fact = (height - 0.5) * 10.0;
- c[0] = fact * color[2][0] + (1.0 - fact) * color[3][0];
- c[1] = fact * color[2][1] + (1.0 - fact) * color[3][1];
- c[2] = fact * color[2][2] + (1.0 - fact) * color[3][2];
- return;
- }
-
- c[0] = color[3][0];
- c[1] = color[3][1];
- c[2] = color[3][2];
-}
-
-static void
-loadpic(void)
-{
- GLubyte bufferter[256 * 256], terrainpic[256 * 256];
- FILE *FilePic;
- int i, tmp;
- GLenum gluerr;
- size_t result;
-
- if ((FilePic = fopen("terrain.dat", "r")) == NULL) {
- fprintf(stderr, "Error loading terrain.dat\n");
- exit(-1);
- }
- result = fread(bufferter, 256 * 256, 1, FilePic);
- assert(result == 1);
- fclose(FilePic);
-
- for (i = 0; i < (256 * 256); i++) {
- terrain[i] = (bufferter[i] * (heightMnt / 255.0f));
- calccolor((GLfloat) bufferter[i], terraincolor[i]);
- tmp = (((int) bufferter[i]) + 96);
- terrainpic[i] = (tmp > 255) ? 255 : tmp;
- }
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 256, 256, GL_LUMINANCE,
- GL_UNSIGNED_BYTE,
- (GLvoid *) (&terrainpic[0])))) {
- fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
- exit(-1);
- }
-
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_LINEAR_MIPMAP_LINEAR);
- glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glEnable(GL_TEXTURE_2D);
-}
-
-static void
-init(void)
-{
- float fogcolor[4] = { 0.6, 0.7, 0.7, 1.0 };
-
- glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
- glClearDepth(1.0);
- glDepthFunc(GL_LEQUAL);
- glShadeModel(GL_SMOOTH);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- glDisable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_EXP2);
- glFogfv(GL_FOG_COLOR, fogcolor);
- glFogf(GL_FOG_DENSITY, 0.0007);
-#ifdef FX
- glHint(GL_FOG_HINT, GL_NICEST);
-#endif
-
- reshape(scrwidth, scrheight);
-}
-
-
-int
-main(int ac, char **av)
-{
- glutInitWindowSize(WIDTH, HEIGHT);
- glutInit(&ac, av);
-
- glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
-
- if (!(win = glutCreateWindow("Terrain"))) {
- fprintf(stderr, "Error, couldn't open window\n");
- return -1;
- }
-
- ModZMnt = 0.0f;
- loadpic();
-
- init();
-
-#ifndef FX
- glDisable(GL_TEXTURE_2D);
- usetex = 0;
-#endif
-
- glutReshapeFunc(reshape);
- glutDisplayFunc(drawscene);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutIdleFunc(drawscene);
-
- glutMainLoop();
-
- return 0;
-}