aboutsummaryrefslogtreecommitdiffstats
path: root/progs/demos/fbo_firecube.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/fbo_firecube.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/fbo_firecube.c')
-rw-r--r--progs/demos/fbo_firecube.c1071
1 files changed, 0 insertions, 1071 deletions
diff --git a/progs/demos/fbo_firecube.c b/progs/demos/fbo_firecube.c
deleted file mode 100644
index 17767a148f9..00000000000
--- a/progs/demos/fbo_firecube.c
+++ /dev/null
@@ -1,1071 +0,0 @@
-/*
- * Draw the "fire" test program on the six faces of a cube using
- * fbo render-to-texture.
- *
- * Much of the code comes from David Bucciarelli's "fire"
- * test program. The rest basically from Brian Paul's "gearbox" and
- * fbotexture programs.
- *
- * By pressing the 'q' key, you can make the driver choose different
- * internal texture RGBA formats by giving it different "format" and "type"
- * arguments to the glTexImage2D function that creates the texture
- * image being rendered to. If the driver doesn't support a texture image
- * format as a render target, it will usually fall back to software when
- * drawing the "fire" image, and frame-rate should drop considerably.
- *
- * Performance:
- * The rendering speed of this program is usually dictated by fill rate
- * and the fact that software fallbacks for glBitMap makes the driver
- * operate synchronously. Low-end UMA hardware will probably see around
- * 35 fps with the help screen disabled and 32bpp window- and user
- * frame-buffers (2008).
- *
- * This program is released under GPL, following the "fire" licensing.
- *
- * Authors:
- * David Bucciarelli ("fire")
- * Brian Paul ("gearbox", "fbotexture")
- * Thomas Hellstrom (Putting it together)
- *
- */
-
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <GL/glew.h>
-#include <GL/glut.h>
-#include "readtex.h"
-
-
-/*
- * Format of texture we render to.
- */
-
-#define TEXINTFORMAT GL_RGBA
-
-static GLuint texTypes[] =
- {GL_UNSIGNED_BYTE,
- GL_UNSIGNED_INT_8_8_8_8_REV,
- GL_UNSIGNED_SHORT_1_5_5_5_REV,
- GL_UNSIGNED_SHORT_4_4_4_4_REV,
- GL_UNSIGNED_INT_8_8_8_8,
- GL_UNSIGNED_SHORT_5_5_5_1,
- GL_UNSIGNED_SHORT_4_4_4_4,
- GL_UNSIGNED_INT_8_8_8_8_REV,
- GL_UNSIGNED_SHORT_1_5_5_5_REV,
- GL_UNSIGNED_SHORT_4_4_4_4_REV,
- GL_UNSIGNED_INT_8_8_8_8,
- GL_UNSIGNED_SHORT_5_5_5_1,
- GL_UNSIGNED_SHORT_4_4_4_4,
- GL_UNSIGNED_SHORT_5_6_5,
- GL_UNSIGNED_SHORT_5_6_5_REV,
- GL_UNSIGNED_SHORT_5_6_5,
- GL_UNSIGNED_SHORT_5_6_5_REV};
-
-static GLuint texFormats[] =
- {GL_RGBA,
- GL_RGBA,
- GL_RGBA,
- GL_RGBA,
- GL_RGBA,
- GL_RGBA,
- GL_RGBA,
- GL_BGRA,
- GL_BGRA,
- GL_BGRA,
- GL_BGRA,
- GL_BGRA,
- GL_BGRA,
- GL_RGB,
- GL_RGB,
- GL_BGR,
- GL_BGR};
-
-static const char *texNames[] =
- {"GL_RGBA GL_UNSIGNED_BYTE",
- "GL_RGBA GL_UNSIGNED_INT_8_8_8_8_REV",
- "GL_RGBA GL_UNSIGNED_SHORT_1_5_5_5_REV",
- "GL_RGBA GL_UNSIGNED_SHORT_4_4_4_4_REV",
- "GL_RGBA GL_UNSIGNED_INT_8_8_8_8",
- "GL_RGBA GL_UNSIGNED_INT_5_5_5_1",
- "GL_RGBA GL_UNSIGNED_INT_4_4_4_4",
- "GL_BGRA GL_UNSIGNED_INT_8_8_8_8_REV",
- "GL_BGRA GL_UNSIGNED_SHORT_1_5_5_5_REV",
- "GL_BGRA GL_UNSIGNED_SHORT_4_4_4_4_REV",
- "GL_BGRA GL_UNSIGNED_INT_8_8_8_8",
- "GL_BGRA GL_UNSIGNED_INT_5_5_5_1",
- "GL_BGRA GL_UNSIGNED_INT_4_4_4_4",
- "GL_RGB GL_UNSIGNED_INT_5_6_5",
- "GL_RGB GL_UNSIGNED_INT_5_6_5_REV",
- "GL_BGR GL_UNSIGNED_INT_5_6_5",
- "GL_BGR GL_UNSIGNED_INT_5_6_5_REV"};
-
-
-
-
-#ifndef M_PI
-#define M_PI 3.1415926535
-#endif
-
-#define vinit(a,i,j,k) { \
- (a)[0]=i; \
- (a)[1]=j; \
- (a)[2]=k; \
- }
-
-#define vinit4(a,i,j,k,w) { \
- (a)[0]=i; \
- (a)[1]=j; \
- (a)[2]=k; \
- (a)[3]=w; \
- }
-
-
-#define vadds(a,dt,b) { \
- (a)[0]+=(dt)*(b)[0]; \
- (a)[1]+=(dt)*(b)[1]; \
- (a)[2]+=(dt)*(b)[2]; \
- }
-
-#define vequ(a,b) { \
- (a)[0]=(b)[0]; \
- (a)[1]=(b)[1]; \
- (a)[2]=(b)[2]; \
- }
-
-#define vinter(a,dt,b,c) { \
- (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0]; \
- (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1]; \
- (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2]; \
- }
-
-#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
-
-#define vclamp(v) { \
- (v)[0]=clamp((v)[0]); \
- (v)[1]=clamp((v)[1]); \
- (v)[2]=clamp((v)[2]); \
- }
-
-static GLint WinWidth = 800, WinHeight = 800;
-static GLint TexWidth, TexHeight;
-static GLuint TexObj;
-static GLuint MyFB;
-static GLuint DepthRB;
-static GLboolean WireFrame = GL_FALSE;
-static GLboolean Anim = GL_TRUE;
-static GLint texType = 0;
-
-static GLint T0 = 0;
-static GLint Frames = 0;
-static GLint Win = 0;
-
-static GLfloat ViewRotX = 20.0, ViewRotY = 30.0, ViewRotZ = 0.0;
-static GLfloat CubeRot = 0.0;
-
-
-static void
-idle(void);
-
-
-static void
-CheckError(int line)
-{
- GLenum err = glGetError();
- if (err) {
- printf("GL Error 0x%x at line %d\n", (int) err, line);
- exit(1);
- }
-}
-
-
-static void
-cleanup(void)
-{
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- glDeleteFramebuffersEXT(1, &MyFB);
- glDeleteRenderbuffersEXT(1, &DepthRB);
- glDeleteTextures(1, &TexObj);
- glutDestroyWindow(Win);
-}
-
-static GLint NiceFog = 1;
-
-#define DIMP 20.0
-#define DIMTP 16.0
-
-#define RIDCOL 0.4
-
-#define NUMTREE 50
-#define TREEINR 2.5
-#define TREEOUTR 8.0
-
-#define AGRAV -9.8
-
-typedef struct
-{
- int age;
- float p[3][3];
- float v[3];
- float c[3][4];
-}
- part;
-
-static float treepos[NUMTREE][3];
-
-static float black[3] = { 0.0, 0.0, 0.0 };
-static float blu[3] = { 1.0, 0.2, 0.0 };
-static float blu2[3] = { 1.0, 1.0, 0.0 };
-
-static float fogcolor[4] = { 1.0, 1.0, 1.0, 1.0 };
-
-static float q[4][3] = {
- {-DIMP, 0.0, -DIMP},
- {DIMP, 0.0, -DIMP},
- {DIMP, 0.0, DIMP},
- {-DIMP, 0.0, DIMP}
-};
-
-static float qt[4][2] = {
- {-DIMTP, -DIMTP},
- {DIMTP, -DIMTP},
- {DIMTP, DIMTP},
- {-DIMTP, DIMTP}
-};
-
-static int np;
-static float eject_r, dt, maxage, eject_vy, eject_vl;
-static short shadows;
-static float ridtri;
-static int fog = 0;
-static int help = 1;
-
-static part *p;
-
-static GLuint groundid;
-static GLuint treeid;
-
-static float obs[3] = { 2.0, 1.0, 0.0 };
-static float dir[3];
-static float v = 0.0;
-static float alpha = -84.0;
-static float beta = 90.0;
-
-static float
-vrnd(void)
-{
- return (((float) rand()) / RAND_MAX);
-}
-
-static void
-setnewpart(part * p)
-{
- float a, v[3], *c;
-
- p->age = 0;
-
- a = vrnd() * 3.14159265359 * 2.0;
-
- vinit(v, sin(a) * eject_r * vrnd(), 0.15, cos(a) * eject_r * vrnd());
- vinit(p->p[0], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
- v[2] + vrnd() * ridtri);
- vinit(p->p[1], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
- v[2] + vrnd() * ridtri);
- vinit(p->p[2], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
- v[2] + vrnd() * ridtri);
-
- vinit(p->v, v[0] * eject_vl / (eject_r / 2),
- vrnd() * eject_vy + eject_vy / 2, v[2] * eject_vl / (eject_r / 2));
-
- c = blu;
-
- vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
- vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
- vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
- c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
-}
-
-static void
-setpart(part * p)
-{
- float fact;
-
- if (p->p[0][1] < 0.1) {
- setnewpart(p);
- return;
- }
-
- p->v[1] += AGRAV * dt;
-
- vadds(p->p[0], dt, p->v);
- vadds(p->p[1], dt, p->v);
- vadds(p->p[2], dt, p->v);
-
- p->age++;
-
- if ((p->age) > maxage) {
- vequ(p->c[0], blu2);
- vequ(p->c[1], blu2);
- vequ(p->c[2], blu2);
- }
- else {
- fact = 1.0 / maxage;
- vadds(p->c[0], fact, blu2);
- vclamp(p->c[0]);
- p->c[0][3] = fact * (maxage - p->age);
-
- vadds(p->c[1], fact, blu2);
- vclamp(p->c[1]);
- p->c[1][3] = fact * (maxage - p->age);
-
- vadds(p->c[2], fact, blu2);
- vclamp(p->c[2]);
- p->c[2][3] = fact * (maxage - p->age);
- }
-}
-
-static void
-drawtree(float x, float y, float z)
-{
- glBegin(GL_QUADS);
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x - 1.5, y + 0.0, z);
-
- glTexCoord2f(1.0, 0.0);
- glVertex3f(x + 1.5, y + 0.0, z);
-
- glTexCoord2f(1.0, 1.0);
- glVertex3f(x + 1.5, y + 3.0, z);
-
- glTexCoord2f(0.0, 1.0);
- glVertex3f(x - 1.5, y + 3.0, z);
-
-
- glTexCoord2f(0.0, 0.0);
- glVertex3f(x, y + 0.0, z - 1.5);
-
- glTexCoord2f(1.0, 0.0);
- glVertex3f(x, y + 0.0, z + 1.5);
-
- glTexCoord2f(1.0, 1.0);
- glVertex3f(x, y + 3.0, z + 1.5);
-
- glTexCoord2f(0.0, 1.0);
- glVertex3f(x, y + 3.0, z - 1.5);
-
- glEnd();
-
-}
-
-static void
-calcposobs(void)
-{
- 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;
-
- obs[0] += v * dir[0];
- obs[1] += v * dir[1];
- obs[2] += v * dir[2];
-}
-
-static void
-printstring(void *font, const char *string)
-{
- int len, i;
-
- len = (int) strlen(string);
- for (i = 0; i < len; i++)
- glutBitmapCharacter(font, string[i]);
-}
-
-
-static void
-printhelp(void)
-{
- glColor4f(0.0, 0.0, 0.0, 0.5);
- glRecti(40, 40, 600, 440);
-
- 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 - Increase particle size");
- glRasterPos2i(60, 330);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "T - Decrease particle size");
-
- glRasterPos2i(60, 300);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "r - Increase emission radius");
- glRasterPos2i(60, 270);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "R - Decrease emission radius");
-
- glRasterPos2i(60, 240);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
- glRasterPos2i(60, 210);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "s - Toggle shadows");
- glRasterPos2i(60, 180);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "q - Toggle texture format & type");
- glRasterPos2i(60, 150);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
- glRasterPos2i(60, 120);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
- glRasterPos2i(60, 90);
- printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
-}
-
-
-static void
-drawfire(void)
-{
- static char frbuf[80] = "";
- int j;
- static double t0 = -1.;
- double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
- if (t0 < 0.0)
- t0 = t;
- dt = (t - t0) * 1.0;
- t0 = t;
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
-
- glDisable(GL_LIGHTING);
-
- glShadeModel(GL_FLAT);
-
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_EXP);
- glFogfv(GL_FOG_COLOR, fogcolor);
- glFogf(GL_FOG_DENSITY, 0.1);
-
-
- glViewport(0, 0, (GLint) TexWidth, (GLint) TexHeight);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(70.0, TexWidth/ (float) TexHeight, 0.1, 30.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- if (NiceFog)
- glHint(GL_FOG_HINT, GL_NICEST);
- else
- glHint(GL_FOG_HINT, GL_DONT_CARE);
-
- glEnable(GL_DEPTH_TEST);
-
- if (fog)
- glEnable(GL_FOG);
- else
- glDisable(GL_FOG);
-
- glDepthMask(GL_TRUE);
- glClearColor(1.0, 1.0, 1.0, 1.0);
- 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);
-
- glColor4f(1.0, 1.0, 1.0, 1.0);
-
- glEnable(GL_TEXTURE_2D);
-
- glBindTexture(GL_TEXTURE_2D, groundid);
- glBegin(GL_QUADS);
- glTexCoord2fv(qt[0]);
- glVertex3fv(q[0]);
- glTexCoord2fv(qt[1]);
- glVertex3fv(q[1]);
- glTexCoord2fv(qt[2]);
- glVertex3fv(q[2]);
- glTexCoord2fv(qt[3]);
- glVertex3fv(q[3]);
- glEnd();
-
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GEQUAL, 0.9);
-
- glBindTexture(GL_TEXTURE_2D, treeid);
- for (j = 0; j < NUMTREE; j++)
- drawtree(treepos[j][0], treepos[j][1], treepos[j][2]);
-
- glDisable(GL_TEXTURE_2D);
- glDepthMask(GL_FALSE);
- glDisable(GL_ALPHA_TEST);
-
- if (shadows) {
- glBegin(GL_TRIANGLES);
- for (j = 0; j < np; j++) {
- glColor4f(black[0], black[1], black[2], p[j].c[0][3]);
- glVertex3f(p[j].p[0][0], 0.1, p[j].p[0][2]);
-
- glColor4f(black[0], black[1], black[2], p[j].c[1][3]);
- glVertex3f(p[j].p[1][0], 0.1, p[j].p[1][2]);
-
- glColor4f(black[0], black[1], black[2], p[j].c[2][3]);
- glVertex3f(p[j].p[2][0], 0.1, p[j].p[2][2]);
- }
- glEnd();
- }
-
- glBegin(GL_TRIANGLES);
- for (j = 0; j < np; j++) {
- glColor4fv(p[j].c[0]);
- glVertex3fv(p[j].p[0]);
-
- glColor4fv(p[j].c[1]);
- glVertex3fv(p[j].p[1]);
-
- glColor4fv(p[j].c[2]);
- glVertex3fv(p[j].p[2]);
-
- setpart(&p[j]);
- }
- glEnd();
-
-
- glDisable(GL_TEXTURE_2D);
- glDisable(GL_ALPHA_TEST);
- glDisable(GL_DEPTH_TEST);
- glDisable(GL_FOG);
-
- 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);
- glColor3f(0.0, 0.0, 1.0);
- glRasterPos2i(10, 450);
- printstring(GLUT_BITMAP_HELVETICA_18, texNames[texType]);
- glColor3f(1.0, 0.0, 0.0);
- glRasterPos2i(10, 470);
- printstring(GLUT_BITMAP_HELVETICA_10,
- "Fire V1.5 Written by David Bucciarelli ([email protected])");
-
- if (help)
- printhelp();
-
- glPopMatrix();
- glDepthMask(GL_TRUE);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
- 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
-regen_texImage(void)
-{
- glBindTexture(GL_TEXTURE_2D, TexObj);
- glTexImage2D(GL_TEXTURE_2D, 0, TEXINTFORMAT, TexWidth, TexHeight, 0,
- texFormats[texType], texTypes[texType], NULL);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, TexObj, 0);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-}
-
-static void
-key(unsigned char key, int x, int y)
-{
- switch (key) {
- case 27:
- cleanup();
- exit(0);
- break;
- case ' ':
- Anim = !Anim;
- glutIdleFunc(Anim ? idle : NULL);
- break;
- case 'a':
- v += 0.0005;
- break;
- case 'z':
- v -= 0.0005;
- break;
- case 'h':
- help = (!help);
- break;
- case 'f':
- fog = (!fog);
- break;
- case 's':
- shadows = !shadows;
- break;
- case 'R':
- eject_r -= 0.03;
- break;
- case 'r':
- eject_r += 0.03;
- break;
- case 't':
- ridtri += 0.005;
- break;
- case 'T':
- ridtri -= 0.005;
- break;
- case 'v':
- ViewRotZ += 5.0;
- break;
- case 'V':
- ViewRotZ -= 5.0;
- break;
- case 'w':
- WireFrame = !WireFrame;
- break;
- case 'q':
- if (++texType > 16)
- texType = 0;
- regen_texImage();
- break;
- case 'n':
- NiceFog = !NiceFog;
- printf("NiceFog %d\n", NiceFog);
- break;
- }
- glutPostRedisplay();
-}
-
-static void
-inittextures(void)
-{
- GLenum gluerr;
- GLubyte tex[128][128][4];
-
- glGenTextures(1, &groundid);
- glBindTexture(GL_TEXTURE_2D, groundid);
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- if (!LoadRGBMipmaps("../images/s128.rgb", GL_RGB)) {
- fprintf(stderr, "Error reading a texture.\n");
- 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_DECAL);
-
- glGenTextures(1, &treeid);
- glBindTexture(GL_TEXTURE_2D, treeid);
-
- if (1)
- {
- int w, h;
- GLenum format;
- int x, y;
- GLubyte *image = LoadRGBImage("../images/tree3.rgb", &w, &h, &format);
-
- if (!image) {
- fprintf(stderr, "Error reading a texture.\n");
- exit(-1);
- }
-
- for (y = 0; y < 128; y++)
- for (x = 0; x < 128; x++) {
- tex[x][y][0] = image[(y + x * 128) * 3];
- tex[x][y][1] = image[(y + x * 128) * 3 + 1];
- tex[x][y][2] = image[(y + x * 128) * 3 + 2];
- if ((tex[x][y][0] == tex[x][y][1]) &&
- (tex[x][y][1] == tex[x][y][2]) && (tex[x][y][2] == 255))
- tex[x][y][3] = 0;
- else
- tex[x][y][3] = 255;
- }
-
- if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 128, 128, GL_RGBA,
- GL_UNSIGNED_BYTE, (GLvoid *) (tex)))) {
- fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
- exit(-1);
- }
- }
- else {
- if (!LoadRGBMipmaps("../images/tree2.rgba", GL_RGBA)) {
- fprintf(stderr, "Error reading a texture.\n");
- 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);
-}
-
-static void
-inittree(void)
-{
- int i;
- float dist;
-
- for (i = 0; i < NUMTREE; i++)
- do {
- treepos[i][0] = vrnd() * TREEOUTR * 2.0 - TREEOUTR;
- treepos[i][1] = 0.0;
- treepos[i][2] = vrnd() * TREEOUTR * 2.0 - TREEOUTR;
- dist =
- sqrt(treepos[i][0] * treepos[i][0] +
- treepos[i][2] * treepos[i][2]);
- } while ((dist < TREEINR) || (dist > TREEOUTR));
-}
-
-static int
-init_fire(int ac, char *av[])
-{
- int i;
-
- np = 800;
- eject_r = -0.65;
- dt = 0.015;
- eject_vy = 4;
- eject_vl = 1;
- shadows = 1;
- ridtri = 0.25;
-
- maxage = 1.0 / dt;
-
- if (ac == 2)
- np = atoi(av[1]);
-
-
- inittextures();
-
- p = (part *) malloc(sizeof(part) * np);
-
- for (i = 0; i < np; i++)
- setnewpart(&p[i]);
-
- inittree();
-
- return (0);
-}
-
-
-
-
-
-
-static void
-DrawCube(void)
-{
- static const GLfloat texcoords[4][2] = {
- { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 }
- };
- static const GLfloat vertices[4][2] = {
- { -1, -1 }, { 1, -1 }, { 1, 1 }, { -1, 1 }
- };
- static const GLfloat xforms[6][4] = {
- { 0, 0, 1, 0 },
- { 90, 0, 1, 0 },
- { 180, 0, 1, 0 },
- { 270, 0, 1, 0 },
- { 90, 1, 0, 0 },
- { -90, 1, 0, 0 }
- };
- static const GLfloat mat[4] = { 1.0, 1.0, 0.5, 1.0 };
- GLint i, j;
-
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat);
- glEnable(GL_TEXTURE_2D);
-
- glPushMatrix();
- glRotatef(ViewRotX, 1.0, 0.0, 0.0);
- glRotatef(15, 1, 0, 0);
- glRotatef(CubeRot, 0, 1, 0);
- glScalef(4, 4, 4);
-
- for (i = 0; i < 6; i++) {
- glPushMatrix();
- glRotatef(xforms[i][0], xforms[i][1], xforms[i][2], xforms[i][3]);
- glTranslatef(0, 0, 1.1);
- glBegin(GL_POLYGON);
- glNormal3f(0, 0, 1);
- for (j = 0; j < 4; j++) {
- glTexCoord2fv(texcoords[j]);
- glVertex2fv(vertices[j]);
- }
- glEnd();
- glPopMatrix();
- }
- glPopMatrix();
-
- glDisable(GL_TEXTURE_2D);
-}
-
-
-static void
-draw(void)
-{
- float ar;
- static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
-
- drawfire();
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,
- GL_SEPARATE_SPECULAR_COLOR);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
- glDisable(GL_BLEND);
- glDisable(GL_FOG);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -40.0);
-
- glClear(GL_DEPTH_BUFFER_BIT);
-
- /* draw textured cube */
-
- glViewport(0, 0, WinWidth, WinHeight);
- glClearColor(0.5, 0.5, 0.8, 0.0);
- glClear(GL_COLOR_BUFFER_BIT);
-
- ar = (float) (WinWidth) / WinHeight;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-ar, ar, -1.0, 1.0, 5.0, 60.0);
- glMatrixMode(GL_MODELVIEW);
- glBindTexture(GL_TEXTURE_2D, TexObj);
-
- DrawCube();
-
- /* finish up */
- glutSwapBuffers();
-}
-
-
-static void
-idle(void)
-{
- static double t0 = -1.;
- double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
- if (t0 < 0.0)
- t0 = t;
- dt = t - t0;
- t0 = t;
-
- CubeRot = fmod(CubeRot + 15.0 * dt, 360.0); /* 15 deg/sec */
-
- glutPostRedisplay();
-}
-
-
-/* change view angle */
-static void
-special(int k, int x, int y)
-{
- (void) x;
- (void) y;
- switch (k) {
- case GLUT_KEY_UP:
- ViewRotX += 5.0;
- break;
- case GLUT_KEY_DOWN:
- ViewRotX -= 5.0;
- break;
- case GLUT_KEY_LEFT:
- ViewRotY += 5.0;
- break;
- case GLUT_KEY_RIGHT:
- ViewRotY -= 5.0;
- break;
- default:
- return;
- }
- glutPostRedisplay();
-}
-
-
-/* new window size or exposure */
-static void
-reshape(int width, int height)
-{
- WinWidth = width;
- WinHeight = height;
-}
-
-
-static void
-init_fbotexture()
-{
- static const GLenum depthFormats[] = {
- GL_DEPTH_COMPONENT,
- GL_DEPTH_COMPONENT16,
- GL_DEPTH_COMPONENT32
- };
- static int numDepthFormats = sizeof(depthFormats) / sizeof(depthFormats[0]);
- GLint i;
- GLenum stat;
-
- /* gen framebuffer id, delete it, do some assertions, just for testing */
- glGenFramebuffersEXT(1, &MyFB);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, MyFB);
- glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &i);
-
- /* Make texture object/image */
- glGenTextures(1, &TexObj);
- glBindTexture(GL_TEXTURE_2D, TexObj);
- /* make one image level. */
- glTexImage2D(GL_TEXTURE_2D, 0, TEXINTFORMAT, TexWidth, TexHeight, 0,
- texFormats[texType], texTypes[texType], NULL);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
-
- CheckError(__LINE__);
-
- /* Render color to texture */
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
- GL_TEXTURE_2D, TexObj, 0);
- CheckError(__LINE__);
-
-
- /* make depth renderbuffer */
- glGenRenderbuffersEXT(1, &DepthRB);
- glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthRB);
- /* we may have to try several formats */
- for (i = 0; i < numDepthFormats; i++) {
- glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depthFormats[i],
- TexWidth, TexHeight);
- CheckError(__LINE__);
-
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, DepthRB);
- CheckError(__LINE__);
- stat = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
- if (stat == GL_FRAMEBUFFER_COMPLETE_EXT) {
- break;
- }
- }
-
- if (stat != GL_FRAMEBUFFER_COMPLETE_EXT) {
- fprintf(stderr, "Error: unable to get usable FBO combination!\n");
- exit(1);
- }
-
- glGetRenderbufferParameterivEXT(GL_RENDERBUFFER_EXT,
- GL_RENDERBUFFER_DEPTH_SIZE_EXT, &i);
- CheckError(__LINE__);
- printf("Depth renderbuffer size = %d bits\n", i);
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-
- /*
- * Check for completeness.
- */
-
-}
-
-
-static void
-init(int argc, char *argv[])
-{
- GLint i;
-
- if (!glutExtensionSupported("GL_EXT_framebuffer_object")) {
- fprintf(stderr, "Sorry, GL_EXT_framebuffer_object is required!\n");
- exit(1);
- }
-
- TexWidth = 512;
- TexHeight = 512;
-
- init_fbotexture();
- init_fire(argc, argv);
-
-
- for ( i=1; i<argc; i++ ) {
- if (strcmp(argv[i], "-info")==0) {
- printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
- printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
- printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
- }
- }
-}
-
-
-static void
-visible(int vis)
-{
- if (vis == GLUT_VISIBLE)
- glutIdleFunc(Anim ? idle : NULL);
- else
- glutIdleFunc(NULL);
-}
-
-
-int
-main(int argc, char *argv[])
-{
- glutInitWindowSize(WinWidth, WinHeight);
- glutInit(&argc, argv);
-
- glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
-
- Win = glutCreateWindow("fbo_firecube");
- glewInit();
- init(argc, argv);
-
- glutDisplayFunc(draw);
- glutReshapeFunc(reshape);
- glutKeyboardFunc(key);
- glutSpecialFunc(special);
- glutVisibilityFunc(visible);
-
- glutMainLoop();
- return 0; /* ANSI C requires main to return int. */
-}