Fix pow <small> and a very stypid bug with dummy srcs(0 equals to tmp0.x)</small...
[mesa.git] / src / mesa / main / points.c
index f162da4b5bf6f9718b4afcfc239558363f662966..aa36fb62877700d3e49f837fd9da2a28a5d20838 100644 (file)
@@ -1,10 +1,13 @@
-/* $Id: points.c,v 1.34 2002/10/24 23:57:21 brianp Exp $ */
+/**
+ * \file points.c
+ * Point operations.
+ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  6.5
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2005  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"),
 #include "glheader.h"
 #include "context.h"
 #include "macros.h"
-#include "mmath.h"
 #include "points.h"
 #include "texstate.h"
 #include "mtypes.h"
 
 
-
-void
+/**
+ * Set current point size.
+ * \param size  point diameter in pixels
+ * \sa glPointSize().
+ */
+void GLAPIENTRY
 _mesa_PointSize( GLfloat size )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -51,25 +57,18 @@ _mesa_PointSize( GLfloat size )
 
    FLUSH_VERTICES(ctx, _NEW_POINT);
    ctx->Point.Size = size;
-   ctx->Point._Size = CLAMP(size,
-                           ctx->Const.MinPointSize,
-                           ctx->Const.MaxPointSize);
-
-   if (ctx->Point._Size == 1.0F)
-      ctx->_TriangleCaps &= ~DD_POINT_SIZE;
-   else
-      ctx->_TriangleCaps |= DD_POINT_SIZE;
 
    if (ctx->Driver.PointSize)
-      (*ctx->Driver.PointSize)(ctx, size);
+      ctx->Driver.PointSize(ctx, size);
 }
 
 
+#if _HAVE_FULL_GL
 
 /*
  * Added by GL_NV_point_sprite
  */
-void
+void GLAPIENTRY
 _mesa_PointParameteriNV( GLenum pname, GLint param )
 {
    const GLfloat value = (GLfloat) param;
@@ -80,7 +79,7 @@ _mesa_PointParameteriNV( GLenum pname, GLint param )
 /*
  * Added by GL_NV_point_sprite
  */
-void
+void GLAPIENTRY
 _mesa_PointParameterivNV( GLenum pname, const GLint *params )
 {
    const GLfloat value = (GLfloat) params[0];
@@ -92,7 +91,7 @@ _mesa_PointParameterivNV( GLenum pname, const GLint *params )
 /*
  * Same for both GL_EXT_point_parameters and GL_ARB_point_parameters.
  */
-void
+void GLAPIENTRY
 _mesa_PointParameterfEXT( GLenum pname, GLfloat param)
 {
    _mesa_PointParameterfvEXT(pname, &param);
@@ -103,7 +102,7 @@ _mesa_PointParameterfEXT( GLenum pname, GLfloat param)
 /*
  * Same for both GL_EXT_point_parameters and GL_ARB_point_parameters.
  */
-void
+void GLAPIENTRY
 _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -112,25 +111,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
    switch (pname) {
       case GL_DISTANCE_ATTENUATION_EXT:
          if (ctx->Extensions.EXT_point_parameters) {
-            const GLboolean tmp = ctx->Point._Attenuated;
             if (TEST_EQ_3V(ctx->Point.Params, params))
               return;
-
            FLUSH_VERTICES(ctx, _NEW_POINT);
             COPY_3V(ctx->Point.Params, params);
-
-           /* Update several derived values now.  This likely to be
-            * more efficient than trying to catch this statechange in
-            * state.c.
-            */
-            ctx->Point._Attenuated = (params[0] != 1.0 ||
-                                     params[1] != 0.0 ||
-                                     params[2] != 0.0);
-
-            if (tmp != ctx->Point._Attenuated) {
-               ctx->_TriangleCaps ^= DD_POINT_ATTEN;
-              ctx->_NeedEyeCoords ^= NEED_EYE_POINT_ATTEN;
-            }
          }
          else {
             _mesa_error(ctx, GL_INVALID_ENUM,
@@ -193,6 +177,10 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
          }
          break;
       case GL_POINT_SPRITE_R_MODE_NV:
+         /* This is one area where ARB_point_sprite and NV_point_sprite
+         * differ.  In ARB_point_sprite the POINT_SPRITE_R_MODE is
+         * always ZERO.  NV_point_sprite adds the S and R modes.
+         */
          if (ctx->Extensions.NV_point_sprite) {
             GLenum value = (GLenum) params[0];
             if (value != GL_ZERO && value != GL_S && value != GL_R) {
@@ -211,6 +199,25 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
             return;
          }
          break;
+      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;
       default:
          _mesa_error( ctx, GL_INVALID_ENUM,
                       "glPointParameterf[v]{EXT,ARB}(pname)" );
@@ -220,3 +227,68 @@ _mesa_PointParameterfvEXT( GLenum pname, const GLfloat *params)
    if (ctx->Driver.PointParameterfv)
       (*ctx->Driver.PointParameterfv)(ctx, pname, params);
 }
+#endif
+
+
+
+/**
+ * Update derived point-related state.
+ */
+void
+_mesa_update_point(GLcontext *ctx)
+{
+   /* clamp to user-specified limits now, clamp to ctx->Const.Min/Max
+    * limits during rasterization.
+    */
+   ctx->Point._Size = CLAMP(ctx->Point.Size,
+                           ctx->Point.MinSize,
+                           ctx->Point.MaxSize);
+
+   if (ctx->Point._Size == 1.0F)
+      ctx->_TriangleCaps &= ~DD_POINT_SIZE;
+   else
+      ctx->_TriangleCaps |= DD_POINT_SIZE;
+
+   ctx->Point._Attenuated = (ctx->Point.Params[0] != 1.0 ||
+                             ctx->Point.Params[1] != 0.0 ||
+                             ctx->Point.Params[2] != 0.0);
+
+   if (ctx->Point._Attenuated)
+      ctx->_TriangleCaps |= DD_POINT_ATTEN;
+   else
+      ctx->_TriangleCaps &= ~DD_POINT_ATTEN;
+}
+
+
+
+/**
+ * Initialize the context point state.
+ *
+ * \param ctx GL context.
+ *
+ * Initializes __GLcontextRec::Point and point related constants in
+ * __GLcontextRec::Const.
+ */
+void
+_mesa_init_point(GLcontext *ctx)
+{
+   GLuint i;
+
+   ctx->Point.SmoothFlag = GL_FALSE;
+   ctx->Point.Size = 1.0;
+   ctx->Point._Size = 1.0;
+   ctx->Point.Params[0] = 1.0;
+   ctx->Point.Params[1] = 0.0;
+   ctx->Point.Params[2] = 0.0;
+   ctx->Point._Attenuated = GL_FALSE;
+   ctx->Point.MinSize = 0.0;
+   ctx->Point.MaxSize
+      = MAX2(ctx->Const.MaxPointSize, ctx->Const.MaxPointSizeAA);
+   ctx->Point.Threshold = 1.0;
+   ctx->Point.PointSprite = GL_FALSE; /* GL_ARB/NV_point_sprite */
+   ctx->Point.SpriteRMode = GL_ZERO; /* GL_NV_point_sprite (only!) */
+   ctx->Point.SpriteOrigin = GL_UPPER_LEFT; /* GL_ARB_point_sprite */
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+      ctx->Point.CoordReplace[i] = GL_FALSE; /* GL_ARB/NV_point_sprite */
+   }
+}