From a9ea1628da5f17274cd7ee023f438046dc992073 Mon Sep 17 00:00:00 2001 From: Daniel Borca Date: Mon, 13 Sep 2004 08:47:01 +0000 Subject: [PATCH] changes towards GL_ARB_point_sprite (two-zero) --- progs/demos/spriteblast.c | 53 ++++++++++++++++++++++++++++++++--- src/mesa/main/attrib.c | 4 +++ src/mesa/main/get.c | 24 ++++++++++++++++ src/mesa/main/mtypes.h | 1 + src/mesa/main/points.c | 24 ++++++++++++++++ src/mesa/swrast/s_pointtemp.h | 8 +++++- 6 files changed, 109 insertions(+), 5 deletions(-) diff --git a/progs/demos/spriteblast.c b/progs/demos/spriteblast.c index f1eee697242..4e1d86cdd08 100644 --- a/progs/demos/spriteblast.c +++ b/progs/demos/spriteblast.c @@ -56,7 +56,7 @@ 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 int animate = 1, motion = 0, org = 0, sprite = 1, smooth = 1; static GLfloat colorSet[][4] = { /* Shades of red. */ @@ -240,17 +240,19 @@ redraw(void) if (blend) glEnable(GL_BLEND); - glEnable(GL_TEXTURE_2D); + if (sprite) { + glEnable(GL_TEXTURE_2D); #ifdef GL_ARB_point_sprite - glEnable(GL_POINT_SPRITE_ARB); + glEnable(GL_POINT_SPRITE_ARB); #endif + } glColor3f(1,1,1); glBegin(GL_POINTS); for (i=0; iPointSprite); _mesa_PointParameteriNV(GL_POINT_SPRITE_R_MODE_NV, ctx->Point.SpriteRMode); +#if GL_VERSION_2_0 + _mesa_PointParameterfEXT(GL_POINT_SPRITE_COORD_ORIGIN, + (GLfloat)ctx->Point.SpriteOrigin); +#endif } } break; diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c index 38ae4df85be..aaff7176f9f 100644 --- a/src/mesa/main/get.c +++ b/src/mesa/main/get.c @@ -1390,6 +1390,12 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params ) CHECK_EXTENSION_B(NV_point_sprite, pname); *params = ENUM_TO_BOOL(ctx->Point.SpriteRMode); break; +#if GL_VERSION_2_0 + case GL_POINT_SPRITE_COORD_ORIGIN: + CHECK_EXTENSION_B(ARB_point_sprite, pname); + *params = ENUM_TO_BOOL(ctx->Point.SpriteOrigin); + break; +#endif /* GL_SGIS_generate_mipmap */ case GL_GENERATE_MIPMAP_HINT_SGIS: @@ -2942,6 +2948,12 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params ) CHECK_EXTENSION_D(NV_point_sprite, pname); *params = (GLdouble) ctx->Point.SpriteRMode; break; +#if GL_VERSION_2_0 + case GL_POINT_SPRITE_COORD_ORIGIN: + CHECK_EXTENSION_D(ARB_point_sprite, pname); + *params = (GLdouble) ctx->Point.SpriteOrigin; + break; +#endif /* GL_SGIS_generate_mipmap */ case GL_GENERATE_MIPMAP_HINT_SGIS: @@ -4468,6 +4480,12 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params ) CHECK_EXTENSION_F(NV_point_sprite, pname); *params = (GLfloat) ctx->Point.SpriteRMode; break; +#if GL_VERSION_2_0 + case GL_POINT_SPRITE_COORD_ORIGIN: + CHECK_EXTENSION_F(ARB_point_sprite, pname); + *params = (GLfloat) ctx->Point.SpriteOrigin; + break; +#endif /* GL_SGIS_generate_mipmap */ case GL_GENERATE_MIPMAP_HINT_SGIS: @@ -6032,6 +6050,12 @@ _mesa_GetIntegerv( GLenum pname, GLint *params ) CHECK_EXTENSION_I(NV_point_sprite, pname); *params = (GLint) ctx->Point.SpriteRMode; break; +#if GL_VERSION_2_0 + case GL_POINT_SPRITE_COORD_ORIGIN: + CHECK_EXTENSION_I(ARB_point_sprite, pname); + *params = (GLint) ctx->Point.SpriteOrigin; + break; +#endif /* GL_SGIS_generate_mipmap */ case GL_GENERATE_MIPMAP_HINT_SGIS: diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 8fe8831e906..ba32faad703 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -890,6 +890,7 @@ struct gl_point_attrib { GLboolean PointSprite; /**< GL_NV_point_sprite / GL_NV_point_sprite */ GLboolean CoordReplace[MAX_TEXTURE_UNITS]; /**< GL_NV_point_sprite / GL_NV_point_sprite */ GLenum SpriteRMode; /**< GL_NV_point_sprite (only!) */ + GLenum SpriteOrigin; /**< GL_ARB_point_sprite */ }; diff --git a/src/mesa/main/points.c b/src/mesa/main/points.c index cbb91554a1e..5f5e01039c6 100644 --- a/src/mesa/main/points.c +++ b/src/mesa/main/points.c @@ -229,6 +229,27 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params) return; } break; +#if GL_VERSION_2_0 + case GL_POINT_SPRITE_COORD_ORIGIN: + if (ctx->Extensions.ARB_point_sprite) { + GLenum value = (GLenum) params[0]; + if (value != GL_LOWER_LEFT && value != GL_UPPER_LEFT) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glPointParameterf[v]{EXT,ARB}(param)"); + return; + } + if (ctx->Point.SpriteOrigin == value) + return; + FLUSH_VERTICES(ctx, _NEW_POINT); + ctx->Point.SpriteOrigin = value; + } + else { + _mesa_error(ctx, GL_INVALID_ENUM, + "glPointParameterf[v]{EXT,ARB}(pname)"); + return; + } + break; +#endif default: _mesa_error( ctx, GL_INVALID_ENUM, "glPointParameterf[v]{EXT,ARB}(pname)" ); @@ -266,6 +287,9 @@ void _mesa_init_point( GLcontext * ctx ) ctx->Point.Threshold = 1.0; ctx->Point.PointSprite = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */ ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */ +#if GL_VERSION_2_0 + ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */ +#endif for (i = 0; i < MAX_TEXTURE_UNITS; i++) { ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB_point_sprite / GL_NV_point_sprite */ } diff --git a/src/mesa/swrast/s_pointtemp.h b/src/mesa/swrast/s_pointtemp.h index 3686e6a72e8..1cfdf002afd 100644 --- a/src/mesa/swrast/s_pointtemp.h +++ b/src/mesa/swrast/s_pointtemp.h @@ -292,7 +292,13 @@ NAME ( GLcontext *ctx, const SWvertex *vert ) if (ctx->Texture.Unit[u]._ReallyEnabled) { if (ctx->Point.CoordReplace[u]) { GLfloat s = 0.5F + (x + 0.5F - vert->win[0]) / size; - GLfloat t = 0.5F - (y + 0.5F - vert->win[1]) / size; + GLfloat t; +#if GL_VERSION_2_0 + if (ctx->Point.SpriteOrigin == GL_LOWER_LEFT) + t = 0.5F + (y + 0.5F - vert->win[1]) / size; + else /* GL_UPPER_LEFT */ +#endif + t = 0.5F - (y + 0.5F - vert->win[1]) / size; span->array->texcoords[u][count][0] = s; span->array->texcoords[u][count][1] = t; span->array->texcoords[u][count][3] = 1.0F; -- 2.30.2