summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libre/mesa-demos-libre/LICENSE82
-rw-r--r--libre/mesa-demos-libre/PKGBUILD46
-rwxr-xr-xlibre/mesa-demos-libre/mesa-demos-libre.patch1192
3 files changed, 1320 insertions, 0 deletions
diff --git a/libre/mesa-demos-libre/LICENSE b/libre/mesa-demos-libre/LICENSE
new file mode 100644
index 000000000..ae33d2709
--- /dev/null
+++ b/libre/mesa-demos-libre/LICENSE
@@ -0,0 +1,82 @@
+Disclaimer
+
+Mesa is a 3-D graphics library with an API which is very similar to
+that of OpenGL*
+To the extent that Mesa utilizes the OpenGL command syntax or state
+machine, it is being used with authorization from Silicon Graphics,
+Inc.(SGI). However, the author does not possess an OpenGL license
+from SGI, and makes no claim that Mesa is in any way a compatible
+replacement for OpenGL or associated with SGI. Those who want a
+licensed implementation of OpenGL should contact a licensed
+vendor.
+
+Please do not refer to the library as MesaGL (for legal
+reasons). It's just Mesa or The Mesa 3-D graphics
+library
+
+* OpenGL is a trademark of Silicon Graphics Incorporated.
+
+License / Copyright Information
+
+The Mesa distribution consists of several components. Different copyrights
+and licenses apply to different components. For example, GLUT is copyrighted
+by Mark Kilgard, some demo programs are copyrighted by SGI, some of the Mesa
+device drivers are copyrighted by their authors. See below for a list of
+Mesa's main components and the license for each.
+
+The core Mesa library is licensed according to the terms of the MIT license.
+This allows integration with the XFree86, Xorg and DRI projects.
+
+The default Mesa license is as follows:
+
+Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
+
+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
+BRIAN PAUL 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.
+
+Attention, Contributors
+
+When contributing to the Mesa project you must agree to the licensing terms
+of the component to which you're contributing.
+The following section lists the primary components of the Mesa distribution
+and their respective licenses.
+
+
+Mesa Component Licenses
+
+Component Location Primary Author License
+----------------------------------------------------------------------------
+Main Mesa code src/mesa/ Brian Paul Mesa (MIT)
+
+Device drivers src/mesa/drivers/* See drivers See drivers
+
+Ext headers include/GL/glext.h SGI SGI Free B
+ include/GL/glxext.h
+
+GLUT src/glut/ Mark Kilgard Mark's copyright
+
+Mesa GLU library src/glu/mesa/ Brian Paul GNU-LGPL
+
+SGI GLU library src/glu/sgi/ SGI SGI Free B
+
+demo programs progs/demos/ various see source files
+
+X demos progs/xdemos/ Brian Paul see source files
+
+SGI demos progs/samples/ SGI SGI copyright
+
+RedBook demos progs/redbook/ SGI SGI copyright
diff --git a/libre/mesa-demos-libre/PKGBUILD b/libre/mesa-demos-libre/PKGBUILD
new file mode 100644
index 000000000..46f7a75e8
--- /dev/null
+++ b/libre/mesa-demos-libre/PKGBUILD
@@ -0,0 +1,46 @@
+# $Id$
+# Maintainer: Joseph Yaworski <jy@dervormund.info>
+
+pkgname='mesa-demos-libre'
+pkgver=8.0.1
+pkgrel=1
+arch=(i686 x86_64)
+pkgdesc="Mesa demos and tools, libre"
+url="http://mesa3d.sourceforge.net"
+license=('custom')
+depends=('glew>=1.5.6')
+provides=("mesa-demos=$pkgver")
+replaces=('mesa-demos')
+conflicts=('mesa<7.9', 'mesa-demos')
+source=(http://repo.parabolagnulinux.org/other/$pkgname-$pkgver.tar.bz2
+ mesa-demos-libre.patch
+ LICENSE)
+
+mksource() {
+
+ wget ftp://ftp.freedesktop.org/pub/mesa/demos/${pkgver}/mesa-demos-${pkgver}.tar.bz2 \
+ -O - | tar xvf -
+
+ pushd mesa-demos-$pkgver
+ patch -Np1 -i ../mesa-demos-libre.patch
+ popd
+
+ tar cjf ${pkgname}-${pkgver}.tar.bz2 mesa-demos-${pkgver}/
+
+}
+
+build() {
+ cd "${srcdir}/mesa-demos-${pkgver}"
+ ./configure --prefix=/usr
+ make
+}
+
+package() {
+ cd "${srcdir}/mesa-demos-${pkgver}"
+ make DESTDIR="${pkgdir}" install
+ install -m755 -d "${pkgdir}/usr/share/licenses/mesa-demos"
+ install -m755 "${srcdir}/LICENSE" "${pkgdir}/usr/share/licenses/mesa-demos/"
+}
+md5sums=('665a4ad12bff27ca2b655dd16554d36c'
+ '1858e95d40ac9e5e0b59753ce9e673e3'
+ '5c65a0fe315dd347e09b1f2826a1df5a')
diff --git a/libre/mesa-demos-libre/mesa-demos-libre.patch b/libre/mesa-demos-libre/mesa-demos-libre.patch
new file mode 100755
index 000000000..c5261f8e9
--- /dev/null
+++ b/libre/mesa-demos-libre/mesa-demos-libre.patch
@@ -0,0 +1,1192 @@
+diff -rauNp Desktop/mesa-demos-8.0.1//src/demos/Makefile.am mesa-demos-8.0.1//src/demos/Makefile.am
+--- Desktop/mesa-demos-8.0.1//src/demos/Makefile.am 2010-07-13 14:46:40.000000000 -0400
++++ mesa-demos-8.0.1/src/demos/Makefile.am 2011-06-04 15:34:18.000000000 -0400
+@@ -62,7 +62,6 @@ bin_PROGRAMS = \
+ morph3d \
+ multiarb \
+ paltex \
+- pointblast \
+ projtex \
+ ray \
+ readpix \
+@@ -71,7 +70,6 @@ bin_PROGRAMS = \
+ shadowtex \
+ singlebuffer \
+ spectex \
+- spriteblast \
+ stex3d \
+ teapot \
+ terrain \
+diff -rauNp Desktop/mesa-demos-8.0.1//src/demos/Makefile.in mesa-demos-8.0.1//src/demos/Makefile.in
+--- Desktop/mesa-demos-8.0.1//src/demos/Makefile.in 2010-07-13 14:53:23.000000000 -0400
++++ mesa-demos-8.0.1/src/demos/Makefile.in 2011-06-04 15:35:32.000000000 -0400
+@@ -73,11 +73,10 @@ host_triplet = @host@
+ @HAVE_GLUT_TRUE@ ipers$(EXEEXT) isosurf$(EXEEXT) \
+ @HAVE_GLUT_TRUE@ lodbias$(EXEEXT) morph3d$(EXEEXT) \
+ @HAVE_GLUT_TRUE@ multiarb$(EXEEXT) paltex$(EXEEXT) \
+-@HAVE_GLUT_TRUE@ pointblast$(EXEEXT) projtex$(EXEEXT) \
+-@HAVE_GLUT_TRUE@ ray$(EXEEXT) readpix$(EXEEXT) reflect$(EXEEXT) \
+-@HAVE_GLUT_TRUE@ renormal$(EXEEXT) shadowtex$(EXEEXT) \
+-@HAVE_GLUT_TRUE@ singlebuffer$(EXEEXT) spectex$(EXEEXT) \
+-@HAVE_GLUT_TRUE@ spriteblast$(EXEEXT) stex3d$(EXEEXT) \
++@HAVE_GLUT_TRUE@ projtex$(EXEEXT) ray$(EXEEXT) readpix$(EXEEXT) \
++@HAVE_GLUT_TRUE@ reflect$(EXEEXT) renormal$(EXEEXT) \
++@HAVE_GLUT_TRUE@ shadowtex$(EXEEXT) singlebuffer$(EXEEXT) \
++@HAVE_GLUT_TRUE@ spectex$(EXEEXT) stex3d$(EXEEXT) \
+ @HAVE_GLUT_TRUE@ teapot$(EXEEXT) terrain$(EXEEXT) \
+ @HAVE_GLUT_TRUE@ tessdemo$(EXEEXT) texcyl$(EXEEXT) \
+ @HAVE_GLUT_TRUE@ texenv$(EXEEXT) textures$(EXEEXT) \
+@@ -188,9 +187,6 @@ multiarb_DEPENDENCIES = ../util/libutil.
+ paltex_SOURCES = paltex.c
+ paltex_OBJECTS = paltex.$(OBJEXT)
+ paltex_LDADD = $(LDADD)
+-pointblast_SOURCES = pointblast.c
+-pointblast_OBJECTS = pointblast.$(OBJEXT)
+-pointblast_LDADD = $(LDADD)
+ projtex_SOURCES = projtex.c
+ projtex_OBJECTS = projtex.$(OBJEXT)
+ projtex_DEPENDENCIES = ../util/libutil.la
+@@ -215,9 +211,6 @@ singlebuffer_LDADD = $(LDADD)
+ spectex_SOURCES = spectex.c
+ spectex_OBJECTS = spectex.$(OBJEXT)
+ spectex_LDADD = $(LDADD)
+-spriteblast_SOURCES = spriteblast.c
+-spriteblast_OBJECTS = spriteblast.$(OBJEXT)
+-spriteblast_LDADD = $(LDADD)
+ stex3d_SOURCES = stex3d.c
+ stex3d_OBJECTS = stex3d.$(OBJEXT)
+ stex3d_LDADD = $(LDADD)
+@@ -285,21 +278,20 @@ SOURCES = arbfplight.c arbfslight.c arbo
+ fbo_firecube.c fbotexture.c fire.c fogcoord.c fplight.c \
+ fslight.c gamma.c gearbox.c gears.c geartrain.c glinfo.c \
+ gloss.c gltestperf.c ipers.c isosurf.c lodbias.c morph3d.c \
+- multiarb.c paltex.c pointblast.c projtex.c ray.c readpix.c \
+- reflect.c renormal.c shadowtex.c singlebuffer.c spectex.c \
+- spriteblast.c stex3d.c teapot.c terrain.c tessdemo.c texcyl.c \
+- texenv.c textures.c trispd.c $(tunnel_SOURCES) tunnel2.c \
+- vao_demo.c winpos.c
++ multiarb.c paltex.c projtex.c ray.c readpix.c reflect.c \
++ renormal.c shadowtex.c singlebuffer.c spectex.c stex3d.c \
++ teapot.c terrain.c tessdemo.c texcyl.c texenv.c textures.c \
++ trispd.c $(tunnel_SOURCES) tunnel2.c vao_demo.c winpos.c
+ DIST_SOURCES = arbfplight.c arbfslight.c arbocclude.c bounce.c \
+ clearspd.c copypix.c cubemap.c dinoshade.c dissolve.c \
+ drawpix.c engine.c fbo_firecube.c fbotexture.c fire.c \
+ fogcoord.c fplight.c fslight.c gamma.c gearbox.c gears.c \
+ geartrain.c glinfo.c gloss.c gltestperf.c ipers.c isosurf.c \
+- lodbias.c morph3d.c multiarb.c paltex.c pointblast.c projtex.c \
+- ray.c readpix.c reflect.c renormal.c shadowtex.c \
+- singlebuffer.c spectex.c spriteblast.c stex3d.c teapot.c \
+- terrain.c tessdemo.c texcyl.c texenv.c textures.c trispd.c \
+- $(tunnel_SOURCES) tunnel2.c vao_demo.c winpos.c
++ lodbias.c morph3d.c multiarb.c paltex.c projtex.c ray.c \
++ readpix.c reflect.c renormal.c shadowtex.c singlebuffer.c \
++ spectex.c stex3d.c teapot.c terrain.c tessdemo.c texcyl.c \
++ texenv.c textures.c trispd.c $(tunnel_SOURCES) tunnel2.c \
++ vao_demo.c winpos.c
+ ETAGS = etags
+ CTAGS = ctags
+ DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+@@ -653,9 +645,6 @@ multiarb$(EXEEXT): $(multiarb_OBJECTS) $
+ paltex$(EXEEXT): $(paltex_OBJECTS) $(paltex_DEPENDENCIES)
+ @rm -f paltex$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(paltex_OBJECTS) $(paltex_LDADD) $(LIBS)
+-pointblast$(EXEEXT): $(pointblast_OBJECTS) $(pointblast_DEPENDENCIES)
+- @rm -f pointblast$(EXEEXT)
+- $(AM_V_CCLD)$(LINK) $(pointblast_OBJECTS) $(pointblast_LDADD) $(LIBS)
+ projtex$(EXEEXT): $(projtex_OBJECTS) $(projtex_DEPENDENCIES)
+ @rm -f projtex$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(projtex_OBJECTS) $(projtex_LDADD) $(LIBS)
+@@ -680,9 +669,6 @@ singlebuffer$(EXEEXT): $(singlebuffer_OB
+ spectex$(EXEEXT): $(spectex_OBJECTS) $(spectex_DEPENDENCIES)
+ @rm -f spectex$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(spectex_OBJECTS) $(spectex_LDADD) $(LIBS)
+-spriteblast$(EXEEXT): $(spriteblast_OBJECTS) $(spriteblast_DEPENDENCIES)
+- @rm -f spriteblast$(EXEEXT)
+- $(AM_V_CCLD)$(LINK) $(spriteblast_OBJECTS) $(spriteblast_LDADD) $(LIBS)
+ stex3d$(EXEEXT): $(stex3d_OBJECTS) $(stex3d_DEPENDENCIES)
+ @rm -f stex3d$(EXEEXT)
+ $(AM_V_CCLD)$(LINK) $(stex3d_OBJECTS) $(stex3d_LDADD) $(LIBS)
+@@ -756,7 +742,6 @@ distclean-compile:
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/morph3d.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiarb.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/paltex.Po@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pointblast.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/projtex.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ray.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readpix.Po@am__quote@
+@@ -765,7 +750,6 @@ distclean-compile:
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shadowtex.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/singlebuffer.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spectex.Po@am__quote@
+-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/spriteblast.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stex3d.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/teapot.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/terrain.Po@am__quote@
+diff -rauNp Desktop/mesa-demos-8.0.1//src/demos/pointblast.c mesa-demos-8.0.1//src/demos/pointblast.c
+--- Desktop/mesa-demos-8.0.1//src/demos/pointblast.c 2010-07-07 13:57:15.000000000 -0400
++++ mesa-demos-8.0.1/src/demos/pointblast.c 1969-12-31 19:00:00.000000000 -0500
+@@ -1,504 +0,0 @@
+-
+-/* Copyright (c) Mark J. Kilgard, 1997. */
+-
+-/* This program is freely distributable without licensing fees
+- and is provided without guarantee or warrantee expressed or
+- implied. This program is -not- in the public domain. */
+-
+-/* This example demonstrates how to render particle effects
+- with OpenGL. A cloud of pinkish/orange particles explodes with the
+- particles bouncing off the ground. When the EXT_point_parameters
+- is present , the particle size is attenuated based on eye distance. */
+-
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <math.h> /* for cos(), sin(), and sqrt() */
+-#ifdef _WIN32
+-#include <windows.h>
+-#endif
+-#include <GL/glew.h>
+-#include <GL/glut.h>
+-
+-/* Some <math.h> files do not define M_PI... */
+-#ifndef M_PI
+-#define M_PI 3.14159265
+-#endif
+-
+-#if 0 /* For debugging. */
+-#undef GL_EXT_point_parameters
+-#endif
+-
+-static GLfloat angle = -150; /* in degrees */
+-static int spin = 0;
+-static int moving, begin;
+-static int newModel = 1;
+-static float theTime;
+-static int repeat = 1;
+-static int blend = 1;
+-int useMipmaps = 1;
+-int linearFiltering = 1;
+-
+-static GLfloat constant[3] = { 1/5.0, 0.0, 0.0 };
+-static GLfloat linear[3] = { 0.0, 1/5.0, 0.0 };
+-static GLfloat theQuad[3] = { 0.25, 0.0, 1/60.0 };
+-
+-#define MAX_POINTS 2000
+-
+-static int numPoints = 200;
+-
+-static GLfloat pointList[MAX_POINTS][3];
+-static GLfloat pointTime[MAX_POINTS];
+-static GLfloat pointVelocity[MAX_POINTS][2];
+-static GLfloat pointDirection[MAX_POINTS][2];
+-static int colorList[MAX_POINTS];
+-static int animate = 1, motion = 0;
+-
+-static GLfloat colorSet[][4] = {
+- /* Shades of red. */
+- { 0.7, 0.2, 0.4, 0.5 },
+- { 0.8, 0.0, 0.7, 0.5 },
+- { 1.0, 0.0, 0.0, 0.5 },
+- { 0.9, 0.3, 0.6, 0.5 },
+- { 1.0, 0.4, 0.0, 0.5 },
+- { 1.0, 0.0, 0.5, 0.5 },
+-};
+-
+-#define NUM_COLORS (sizeof(colorSet)/sizeof(colorSet[0]))
+-
+-#define DEAD (NUM_COLORS+1)
+-
+-
+-#if 0 /* drand48 might be better on Unix machines */
+-#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * drand48())
+-#else
+-static float float_rand(void) { return rand() / (float) RAND_MAX; }
+-#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * float_rand())
+-#endif
+-
+-#define MEAN_VELOCITY 3.0
+-#define GRAVITY 2.0
+-
+-/* Modeling units of ground extent in each X and Z direction. */
+-#define EDGE 12
+-
+-static void
+-makePointList(void)
+-{
+- float angle, velocity, direction;
+- int i;
+-
+- motion = 1;
+- for (i=0; i<numPoints; i++) {
+- pointList[i][0] = 0.0;
+- pointList[i][1] = 0.0;
+- pointList[i][2] = 0.0;
+- pointTime[i] = 0.0;
+- angle = (RANDOM_RANGE(60.0, 70.0)) * M_PI/180.0;
+- direction = RANDOM_RANGE(0.0, 360.0) * M_PI/180.0;
+- pointDirection[i][0] = cos(direction);
+- pointDirection[i][1] = sin(direction);
+- velocity = MEAN_VELOCITY + RANDOM_RANGE(-0.8, 1.0);
+- pointVelocity[i][0] = velocity * cos(angle);
+- pointVelocity[i][1] = velocity * sin(angle);
+- colorList[i] = rand() % NUM_COLORS;
+- }
+- theTime = 0.0;
+-}
+-
+-static void
+-updatePointList(void)
+-{
+- float distance;
+- int i;
+-
+- static double t0 = -1.;
+- double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+- if (t0 < 0.0)
+- t0 = t;
+- dt = t - t0;
+- t0 = t;
+-
+- motion = 0;
+- for (i=0; i<numPoints; i++) {
+- distance = pointVelocity[i][0] * theTime;
+-
+- /* X and Z */
+- pointList[i][0] = pointDirection[i][0] * distance;
+- pointList[i][2] = pointDirection[i][1] * distance;
+-
+- /* Z */
+- pointList[i][1] =
+- (pointVelocity[i][1] - 0.5 * GRAVITY * pointTime[i])*pointTime[i];
+-
+- /* If we hit the ground, bounce the point upward again. */
+- if (pointList[i][1] <= 0.0) {
+- if (distance > EDGE) {
+- /* Particle has hit ground past the distance duration of
+- the particles. Mark particle as dead. */
+- colorList[i] = NUM_COLORS; /* Not moving. */
+- continue;
+- }
+-
+- pointVelocity[i][1] *= 0.8; /* 80% of previous up velocity. */
+- pointTime[i] = 0.0; /* Reset the particles sense of up time. */
+- }
+- motion = 1;
+- pointTime[i] += dt;
+- }
+- theTime += dt;
+- if (!motion && !spin) {
+- if (repeat) {
+- makePointList();
+- } else {
+- glutIdleFunc(NULL);
+- }
+- }
+-}
+-
+-static void
+-idle(void)
+-{
+- updatePointList();
+- if (spin) {
+- angle += 0.3;
+- newModel = 1;
+- }
+- glutPostRedisplay();
+-}
+-
+-static void
+-visible(int vis)
+-{
+- if (vis == GLUT_VISIBLE) {
+- if (animate && (motion || spin)) {
+- glutIdleFunc(idle);
+- }
+- } else {
+- glutIdleFunc(NULL);
+- }
+-}
+-
+-static void
+-recalcModelView(void)
+-{
+- glPopMatrix();
+- glPushMatrix();
+- glRotatef(angle, 0.0, 1.0, 0.0);
+- newModel = 0;
+-}
+-
+-static void
+-redraw(void)
+-{
+- int i;
+-
+- glDepthMask(GL_TRUE);
+- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+- if (newModel)
+- recalcModelView();
+-
+-
+- /* Draw the floor. */
+-/* glEnable(GL_TEXTURE_2D);*/
+- glColor3f(0.5, 1.0, 0.5);
+- glBegin(GL_QUADS);
+- glTexCoord2f(0.0, 0.0);
+- glVertex3f(-EDGE, -0.05, -EDGE);
+- glTexCoord2f(20.0, 0.0);
+- glVertex3f(EDGE, -0.05, -EDGE);
+- glTexCoord2f(20.0, 20.0);
+- glVertex3f(EDGE, -0.05, EDGE);
+- glTexCoord2f(0.0, 20.0);
+- glVertex3f(-EDGE, -0.05, EDGE);
+- glEnd();
+-
+- /* Allow particles to blend with each other. */
+- glDepthMask(GL_FALSE);
+-
+- if (blend)
+- glEnable(GL_BLEND);
+-
+- glDisable(GL_TEXTURE_2D);
+- glBegin(GL_POINTS);
+- for (i=0; i<numPoints; i++) {
+- /* Draw alive particles. */
+- if (colorList[i] != DEAD) {
+- glColor4fv(colorSet[colorList[i]]);
+- glVertex3fv(pointList[i]);
+- }
+- }
+- glEnd();
+-
+- glDisable(GL_BLEND);
+-
+- glutSwapBuffers();
+-}
+-
+-/* ARGSUSED2 */
+-static void
+-mouse(int button, int state, int x, int y)
+-{
+- /* Scene can be spun around Y axis using left
+- mouse button movement. */
+- if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+- moving = 1;
+- begin = x;
+- }
+- if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+- moving = 0;
+- }
+-}
+-
+-/* ARGSUSED1 */
+-static void
+-mouseMotion(int x, int y)
+-{
+- if (moving) {
+- angle = angle + (x - begin);
+- begin = x;
+- newModel = 1;
+- glutPostRedisplay();
+- }
+-}
+-
+-static void
+-menu(int option)
+-{
+- switch (option) {
+- case 0:
+- makePointList();
+- break;
+-#ifdef GL_ARB_point_parameters
+- case 1:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, constant);
+- break;
+- case 2:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, linear);
+- break;
+- case 3:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+- break;
+-#endif
+- case 4:
+- blend = 1;
+- break;
+- case 5:
+- blend = 0;
+- break;
+-#ifdef GL_ARB_point_parameters
+- case 6:
+- glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
+- break;
+- case 7:
+- glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 10.0);
+- break;
+-#endif
+- case 8:
+- glEnable(GL_POINT_SMOOTH);
+- break;
+- case 9:
+- glDisable(GL_POINT_SMOOTH);
+- break;
+- case 10:
+- glPointSize(2.0);
+- break;
+- case 11:
+- glPointSize(4.0);
+- break;
+- case 12:
+- glPointSize(8.0);
+- break;
+- case 13:
+- spin = 1 - spin;
+- if (animate && (spin || motion)) {
+- glutIdleFunc(idle);
+- } else {
+- glutIdleFunc(NULL);
+- }
+- break;
+- case 14:
+- numPoints = 200;
+- break;
+- case 15:
+- numPoints = 500;
+- break;
+- case 16:
+- numPoints = 1000;
+- break;
+- case 17:
+- numPoints = 2000;
+- break;
+- case 666:
+- exit(0);
+- }
+- glutPostRedisplay();
+-}
+-
+-/* ARGSUSED1 */
+-static void
+-key(unsigned char c, int x, int y)
+-{
+- switch (c) {
+- case 13:
+- animate = 1 - animate; /* toggle. */
+- if (animate && (motion || spin)) {
+- glutIdleFunc(idle);
+- } else {
+- glutIdleFunc(NULL);
+- }
+- break;
+- case ' ':
+- animate = 1;
+- makePointList();
+- glutIdleFunc(idle);
+- break;
+- case 27:
+- exit(0);
+- }
+-}
+-
+-/* Nice floor texture tiling pattern. */
+-static char *circles[] = {
+- "....xxxx........",
+- "..xxxxxxxx......",
+- ".xxxxxxxxxx.....",
+- ".xxx....xxx.....",
+- "xxx......xxx....",
+- "xxx......xxx....",
+- "xxx......xxx....",
+- "xxx......xxx....",
+- ".xxx....xxx.....",
+- ".xxxxxxxxxx.....",
+- "..xxxxxxxx......",
+- "....xxxx........",
+- "................",
+- "................",
+- "................",
+- "................",
+-};
+-
+-static void
+-makeFloorTexture(void)
+-{
+- GLubyte floorTexture[16][16][3];
+- GLubyte *loc;
+- int s, t;
+-
+- /* Setup RGB image for the texture. */
+- loc = (GLubyte*) floorTexture;
+- for (t = 0; t < 16; t++) {
+- for (s = 0; s < 16; s++) {
+- if (circles[t][s] == 'x') {
+- /* Nice blue. */
+- loc[0] = 0x1f;
+- loc[1] = 0x1f;
+- loc[2] = 0x8f;
+- } else {
+- /* Light gray. */
+- loc[0] = 0xca;
+- loc[1] = 0xca;
+- loc[2] = 0xca;
+- }
+- loc += 3;
+- }
+- }
+-
+- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+-
+- if (useMipmaps) {
+- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+- GL_LINEAR_MIPMAP_LINEAR);
+- gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 16, 16,
+- GL_RGB, GL_UNSIGNED_BYTE, floorTexture);
+- } else {
+- if (linearFiltering) {
+- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+- } else {
+- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+- }
+- glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16, 0,
+- GL_RGB, GL_UNSIGNED_BYTE, floorTexture);
+- }
+-}
+-
+-int
+-main(int argc, char **argv)
+-{
+- int i;
+-
+- glutInitWindowSize(300, 300);
+- glutInit(&argc, argv);
+- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
+-
+- for (i=1; i<argc; i++) {
+- if(!strcmp("-noms", argv[i])) {
+- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+- printf("forcing no multisampling\n");
+- } else if(!strcmp("-nomipmaps", argv[i])) {
+- useMipmaps = 0;
+- } else if(!strcmp("-nearest", argv[i])) {
+- linearFiltering = 0;
+- }
+- }
+-
+- glutCreateWindow("point burst");
+- glewInit();
+- glutDisplayFunc(redraw);
+- glutMouseFunc(mouse);
+- glutMotionFunc(mouseMotion);
+- glutVisibilityFunc(visible);
+- glutKeyboardFunc(key);
+- glutCreateMenu(menu);
+- glutAddMenuEntry("Reset time", 0);
+- glutAddMenuEntry("Constant", 1);
+- glutAddMenuEntry("Linear", 2);
+- glutAddMenuEntry("Quadratic", 3);
+- glutAddMenuEntry("Blend on", 4);
+- glutAddMenuEntry("Blend off", 5);
+- glutAddMenuEntry("Threshold 1", 6);
+- glutAddMenuEntry("Threshold 10", 7);
+- glutAddMenuEntry("Point smooth on", 8);
+- glutAddMenuEntry("Point smooth off", 9);
+- glutAddMenuEntry("Point size 2", 10);
+- glutAddMenuEntry("Point size 4", 11);
+- glutAddMenuEntry("Point size 8", 12);
+- glutAddMenuEntry("Toggle spin", 13);
+- glutAddMenuEntry("200 points ", 14);
+- glutAddMenuEntry("500 points ", 15);
+- glutAddMenuEntry("1000 points ", 16);
+- glutAddMenuEntry("2000 points ", 17);
+- glutAddMenuEntry("Quit", 666);
+- glutAttachMenu(GLUT_RIGHT_BUTTON);
+-
+- if (!glutExtensionSupported("GL_ARB_point_parameters")) {
+- fprintf(stderr, "Sorry, GL_ARB_point_parameters is not supported.\n");
+- return -1;
+- }
+-
+- glShadeModel(GL_FLAT);
+- glEnable(GL_DEPTH_TEST);
+- glEnable(GL_POINT_SMOOTH);
+- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+- glPointSize(8.0);
+-#if GL_ARB_point_parameters
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+-#endif
+- glMatrixMode(GL_PROJECTION);
+- gluPerspective( /* field of view in degree */ 40.0,
+- /* aspect ratio */ 1.0,
+- /* Z near */ 0.5, /* Z far */ 40.0);
+- glMatrixMode(GL_MODELVIEW);
+- gluLookAt(0.0, 1.0, 8.0, /* eye location */
+- 0.0, 1.0, 0.0, /* center is at (0,0,0) */
+- 0.0, 1.0, 0.); /* up is in postivie Y direction */
+- glPushMatrix(); /* dummy push so we can pop on model
+- recalc */
+-
+- makePointList();
+- makeFloorTexture();
+-
+- glutMainLoop();
+- return 0; /* ANSI C requires main to return int. */
+-}
+diff -rauNp Desktop/mesa-demos-8.0.1//src/demos/spriteblast.c mesa-demos-8.0.1//src/demos/spriteblast.c
+--- Desktop/mesa-demos-8.0.1//src/demos/spriteblast.c 2010-07-07 13:57:15.000000000 -0400
++++ mesa-demos-8.0.1/src/demos/spriteblast.c 1969-12-31 19:00:00.000000000 -0500
+@@ -1,555 +0,0 @@
+-
+-/* Copyright (c) Mark J. Kilgard, 1997. */
+-
+-/* This program is freely distributable without licensing fees
+- and is provided without guarantee or warrantee expressed or
+- implied. This program is -not- in the public domain. */
+-
+-/* This example demonstrates how to render particle effects
+- with OpenGL. A cloud of pinkish/orange particles explodes with the
+- particles bouncing off the ground. When the EXT_point_parameters
+- is present , the particle size is attenuated based on eye distance. */
+-
+-
+-/* Modified by Brian Paul to test GL_ARB_point_sprite */
+-
+-
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <math.h> /* for cos(), sin(), and sqrt() */
+-#ifdef _WIN32
+-#include <windows.h>
+-#endif
+-#include <GL/glew.h>
+-#include <GL/glut.h>
+-
+-/* Some <math.h> files do not define M_PI... */
+-#ifndef M_PI
+-#define M_PI 3.14159265
+-#endif
+-
+-#if 0 /* For debugging. */
+-#undef GL_EXT_point_parameters
+-#endif
+-
+-static GLfloat angle = -150; /* in degrees */
+-static int spin = 0;
+-static int moving, begin;
+-static float theTime;
+-static int repeat = 1;
+-static int blend = 1;
+-int useMipmaps = 1;
+-int linearFiltering = 1;
+-
+-static GLfloat constant[3] = { .2, 0.0, 0.0 };
+-static GLfloat linear[3] = { .0, .1, 0.0 };
+-static GLfloat theQuad[3] = { .005, 0.1, 1/600.0 };
+-
+-#define MAX_POINTS 2000
+-
+-static int numPoints = 200;
+-
+-static GLfloat pointList[MAX_POINTS][3];
+-static GLfloat pointTime[MAX_POINTS];
+-static GLfloat pointVelocity[MAX_POINTS][2];
+-static GLfloat pointDirection[MAX_POINTS][2];
+-static int colorList[MAX_POINTS];
+-static int animate = 1, motion = 0, org = 0, sprite = 1, smooth = 1;
+-
+-static GLfloat colorSet[][4] = {
+- /* Shades of red. */
+- { 0.7, 0.2, 0.4, 0.5 },
+- { 0.8, 0.0, 0.7, 0.5 },
+- { 1.0, 0.0, 0.0, 0.5 },
+- { 0.9, 0.3, 0.6, 0.5 },
+- { 1.0, 0.4, 0.0, 0.5 },
+- { 1.0, 0.0, 0.5, 0.5 },
+-};
+-
+-#define NUM_COLORS (sizeof(colorSet)/sizeof(colorSet[0]))
+-
+-#define DEAD (NUM_COLORS+1)
+-
+-
+-/* GL */
+-static GLint spritePattern[16][16] = {
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+- { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
+- { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0 },
+- { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 },
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+- { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+-};
+-
+-
+-
+-
+-#if 0 /* drand48 might be better on Unix machines */
+-#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * drand48())
+-#else
+-static float float_rand(void) { return rand() / (float) RAND_MAX; }
+-#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * float_rand())
+-#endif
+-
+-#define MEAN_VELOCITY 3.0
+-#define GRAVITY 2.0
+-
+-/* Modeling units of ground extent in each X and Z direction. */
+-#define EDGE 12
+-
+-static void
+-makePointList(void)
+-{
+- float angle, velocity, direction;
+- int i;
+-
+- motion = 1;
+- for (i=0; i<numPoints; i++) {
+- pointList[i][0] = 0.0;
+- pointList[i][1] = 0.0;
+- pointList[i][2] = 0.0;
+- pointTime[i] = 0.0;
+- angle = (RANDOM_RANGE(60.0, 70.0)) * M_PI/180.0;
+- direction = RANDOM_RANGE(0.0, 360.0) * M_PI/180.0;
+- pointDirection[i][0] = cos(direction);
+- pointDirection[i][1] = sin(direction);
+- velocity = MEAN_VELOCITY + RANDOM_RANGE(-0.8, 1.0);
+- pointVelocity[i][0] = velocity * cos(angle);
+- pointVelocity[i][1] = velocity * sin(angle);
+- colorList[i] = rand() % NUM_COLORS;
+- }
+- theTime = 0.0;
+-}
+-
+-static void
+-updatePointList(void)
+-{
+- float distance;
+- int i;
+-
+- static double t0 = -1.;
+- double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+- if (t0 < 0.0)
+- t0 = t;
+- dt = t - t0;
+- t0 = t;
+-
+- motion = 0;
+- for (i=0; i<numPoints; i++) {
+- distance = pointVelocity[i][0] * theTime;
+-
+- /* X and Z */
+- pointList[i][0] = pointDirection[i][0] * distance;
+- pointList[i][2] = pointDirection[i][1] * distance;
+-
+- /* Z */
+- pointList[i][1] =
+- (pointVelocity[i][1] - 0.5 * GRAVITY * pointTime[i])*pointTime[i];
+-
+- /* If we hit the ground, bounce the point upward again. */
+- if (pointList[i][1] <= 0.0) {
+- if (distance > EDGE) {
+- /* Particle has hit ground past the distance duration of
+- the particles. Mark particle as dead. */
+- colorList[i] = NUM_COLORS; /* Not moving. */
+- continue;
+- }
+-
+- pointVelocity[i][1] *= 0.8; /* 80% of previous up velocity. */
+- pointTime[i] = 0.0; /* Reset the particles sense of up time. */
+- }
+- motion = 1;
+- pointTime[i] += dt;
+- }
+- theTime += dt;
+- if (!motion && !spin) {
+- if (repeat) {
+- makePointList();
+- } else {
+- glutIdleFunc(NULL);
+- }
+- }
+-}
+-
+-static void
+-idle(void)
+-{
+- updatePointList();
+- if (spin) {
+- angle += 0.3;
+- }
+- glutPostRedisplay();
+-}
+-
+-static void
+-visible(int vis)
+-{
+- if (vis == GLUT_VISIBLE) {
+- if (animate && (motion || spin)) {
+- glutIdleFunc(idle);
+- }
+- } else {
+- glutIdleFunc(NULL);
+- }
+-}
+-
+-static void
+-redraw(void)
+-{
+- int i;
+-
+- glDepthMask(GL_TRUE);
+- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+-
+- glPushMatrix();
+- glRotatef(15.0, 1.0, 0.0, 0.0);
+- glRotatef(angle, 0.0, 1.0, 0.0);
+-
+-
+- /* Draw the floor. */
+-/* glEnable(GL_TEXTURE_2D);*/
+- glColor3f(0.1, 0.5, 1.0);
+- glBegin(GL_QUADS);
+- glTexCoord2f(0.0, 0.0);
+- glVertex3f(-EDGE, -0.05, -EDGE);
+- glTexCoord2f(20.0, 0.0);
+- glVertex3f(EDGE, -0.05, -EDGE);
+- glTexCoord2f(20.0, 20.0);
+- glVertex3f(EDGE, -0.05, EDGE);
+- glTexCoord2f(0.0, 20.0);
+- glVertex3f(-EDGE, -0.05, EDGE);
+- glEnd();
+-
+- /* Allow particles to blend with each other. */
+- glDepthMask(GL_FALSE);
+-
+- if (blend)
+- glEnable(GL_BLEND);
+-
+- if (sprite) {
+- glEnable(GL_TEXTURE_2D);
+-#ifdef GL_ARB_point_sprite
+- glEnable(GL_POINT_SPRITE_ARB);
+-#endif
+- }
+-
+- glColor3f(1,1,1);
+- glBegin(GL_POINTS);
+- for (i=0; i<numPoints; i++) {
+- /* Draw alive particles. */
+- if (colorList[i] != DEAD) {
+- if (!sprite) glColor4fv(colorSet[colorList[i]]);
+- glVertex3fv(pointList[i]);
+- }
+- }
+- glEnd();
+-
+- glDisable(GL_TEXTURE_2D);
+-#ifdef GL_ARB_point_sprite
+- glDisable(GL_POINT_SPRITE_ARB);
+-#endif
+- glDisable(GL_BLEND);
+-
+- glPopMatrix();
+-
+- glutSwapBuffers();
+-}
+-
+-/* ARGSUSED2 */
+-static void
+-mouse(int button, int state, int x, int y)
+-{
+- /* Scene can be spun around Y axis using left
+- mouse button movement. */
+- if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+- moving = 1;
+- begin = x;
+- }
+- if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+- moving = 0;
+- }
+-}
+-
+-/* ARGSUSED1 */
+-static void
+-mouseMotion(int x, int y)
+-{
+- if (moving) {
+- angle = angle + (x - begin);
+- begin = x;
+- glutPostRedisplay();
+- }
+-}
+-
+-static void
+-menu(int option)
+-{
+- switch (option) {
+- case 0:
+- makePointList();
+- break;
+-#ifdef GL_ARB_point_parameters
+- case 1:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, constant);
+- break;
+- case 2:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, linear);
+- break;
+- case 3:
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+- break;
+-#endif
+- case 4:
+- blend = 1;
+- break;
+- case 5:
+- blend = 0;
+- break;
+-#ifdef GL_ARB_point_parameters
+- case 6:
+- glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
+- break;
+- case 7:
+- glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 10.0);
+- break;
+-#endif
+- case 8:
+- glEnable(GL_POINT_SMOOTH);
+- smooth = 1;
+- break;
+- case 9:
+- glDisable(GL_POINT_SMOOTH);
+- smooth = 0;
+- break;
+- case 10:
+- glPointSize(16.0);
+- break;
+- case 11:
+- glPointSize(32.0);
+- break;
+- case 12:
+- glPointSize(64.0);
+- break;
+- case 13:
+- spin = 1 - spin;
+- if (animate && (spin || motion)) {
+- glutIdleFunc(idle);
+- } else {
+- glutIdleFunc(NULL);
+- }
+- break;
+- case 14:
+- numPoints = 200;
+- break;
+- case 15:
+- numPoints = 500;
+- break;
+- case 16:
+- numPoints = 1000;
+- break;
+- case 17:
+- numPoints = 2000;
+- break;
+- case 666:
+- exit(0);
+- }
+- glutPostRedisplay();
+-}
+-
+-/* ARGSUSED1 */
+-static void
+-key(unsigned char c, int x, int y)
+-{
+- switch (c) {
+- case 13:
+- animate = 1 - animate; /* toggle. */
+- if (animate && (motion || spin)) {
+- glutIdleFunc(idle);
+- } else {
+- glutIdleFunc(NULL);
+- }
+- break;
+- case ' ':
+- animate = 1;
+- makePointList();
+- glutIdleFunc(idle);
+- break;
+- case 'o':
+- case 'O':
+- org ^= 1;
+-#ifdef GL_VERSION_2_0
+-#ifdef GL_ARB_point_parameters
+- glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN,
+- org ? GL_LOWER_LEFT : GL_UPPER_LEFT);
+-#endif
+-#endif
+- glutPostRedisplay();
+- break;
+- case 't':
+- case 'T':
+- sprite ^= 1;
+- glutPostRedisplay();
+- break;
+- case 's':
+- case 'S':
+- (smooth ^= 1) ? glEnable(GL_POINT_SMOOTH) : glDisable(GL_POINT_SMOOTH);
+- glutPostRedisplay();
+- break;
+- case '0':
+- glPointSize(1.0);
+- glutPostRedisplay();
+- break;
+- case '1':
+- glPointSize(16.0);
+- glutPostRedisplay();
+- break;
+- case '2':
+- glPointSize(32.0);
+- glutPostRedisplay();
+- break;
+- case '3':
+- glPointSize(64.0);
+- glutPostRedisplay();
+- break;
+- case '4':
+- glPointSize(128.0);
+- glutPostRedisplay();
+- break;
+- case 27:
+- exit(0);
+- }
+-}
+-
+-
+-
+-static void
+-makeSprite(void)
+-{
+- GLubyte texture[16][16][4];
+- int i, j;
+-
+- if (!glutExtensionSupported("GL_ARB_point_sprite")) {
+- printf("Sorry, this demo requires GL_ARB_point_sprite.\n");
+- exit(0);
+- }
+- if (!glutExtensionSupported("GL_ARB_point_parameters")) {
+- printf("Sorry, this demo requires GL_ARB_point_parameters.\n");
+- exit(0);
+- }
+-
+- for (i = 0; i < 16; i++) {
+- for (j = 0; j < 16; j++) {
+- if (spritePattern[i][j]) {
+- texture[i][j][0] = 255;
+- texture[i][j][1] = 255;
+- texture[i][j][2] = 255;
+- texture[i][j][3] = 255;
+- }
+- else {
+- texture[i][j][0] = 255;
+- texture[i][j][1] = 0;
+- texture[i][j][2] = 0;
+- texture[i][j][3] = 0;
+- }
+- }
+- }
+-
+- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+- texture);
+- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+-#ifdef GL_ARB_point_sprite
+- glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
+-#endif
+-}
+-
+-
+-static void
+-reshape(int width, int height)
+-{
+- GLfloat h = (GLfloat) height / (GLfloat) width;
+-
+- glViewport(0, 0, (GLint) width, (GLint) height);
+- glMatrixMode(GL_PROJECTION);
+- glLoadIdentity();
+- glFrustum(-1.0, 1.0, -h, h, 2.0, 30.0);
+- glMatrixMode(GL_MODELVIEW);
+- glLoadIdentity();
+- glTranslatef(0.0, 0.0, -10.0);
+-}
+-
+-int
+-main(int argc, char **argv)
+-{
+- int i;
+-
+- glutInitWindowSize(600,300);
+- glutInit(&argc, argv);
+- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
+-
+- for (i=1; i<argc; i++) {
+- if(!strcmp("-noms", argv[i])) {
+- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+- printf("forcing no multisampling\n");
+- } else if(!strcmp("-nomipmaps", argv[i])) {
+- useMipmaps = 0;
+- } else if(!strcmp("-nearest", argv[i])) {
+- linearFiltering = 0;
+- }
+- }
+- glutCreateWindow("sprite blast");
+- glewInit();
+- glutReshapeFunc(reshape);
+- glutDisplayFunc(redraw);
+- glutMouseFunc(mouse);
+- glutMotionFunc(mouseMotion);
+- glutVisibilityFunc(visible);
+- glutKeyboardFunc(key);
+- glutCreateMenu(menu);
+- glutAddMenuEntry("Reset time", 0);
+- glutAddMenuEntry("Constant", 1);
+- glutAddMenuEntry("Linear", 2);
+- glutAddMenuEntry("Quadratic", 3);
+- glutAddMenuEntry("Blend on", 4);
+- glutAddMenuEntry("Blend off", 5);
+- glutAddMenuEntry("Threshold 1", 6);
+- glutAddMenuEntry("Threshold 10", 7);
+- glutAddMenuEntry("Point smooth on", 8);
+- glutAddMenuEntry("Point smooth off", 9);
+- glutAddMenuEntry("Point size 16", 10);
+- glutAddMenuEntry("Point size 32", 11);
+- glutAddMenuEntry("Point size 64", 12);
+- glutAddMenuEntry("Toggle spin", 13);
+- glutAddMenuEntry("200 points ", 14);
+- glutAddMenuEntry("500 points ", 15);
+- glutAddMenuEntry("1000 points ", 16);
+- glutAddMenuEntry("2000 points ", 17);
+- glutAddMenuEntry("Quit", 666);
+- glutAttachMenu(GLUT_RIGHT_BUTTON);
+-
+- makePointList();
+- makeSprite();
+-
+- glShadeModel(GL_FLAT);
+- glEnable(GL_DEPTH_TEST);
+- glEnable(GL_POINT_SMOOTH);
+- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+- glPointSize(32.0);
+-#ifdef GL_ARB_point_parameters
+- glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+-#endif
+-
+- glutMainLoop();
+- return 0; /* ANSI C requires main to return int. */
+-}