vbo: pass the stream from DrawTransformFeedbackStream to drivers
[mesa.git] / src / mesa / tnl / t_rasterpos.c
index a7e4397b660197da924fe17310f73eef63433c10..4bd9ac8539e520b487aeaeed38188a5001adf8aa 100644 (file)
@@ -1,6 +1,5 @@
 /*
  * Mesa 3-D graphics library
- * Version:  7.1
  *
  * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
  *
  * 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.
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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.
  */
 
 
+#include "c99_math.h"
 #include "main/glheader.h"
-#include "main/colormac.h"
 #include "main/feedback.h"
 #include "main/light.h"
 #include "main/macros.h"
-#include "main/simple_list.h"
+#include "util/simple_list.h"
 #include "main/mtypes.h"
+#include "main/viewport.h"
 
 #include "math/m_matrix.h"
 #include "tnl/tnl.h"
@@ -123,8 +124,6 @@ shade_rastpos(struct gl_context *ctx,
    const struct gl_light *light;
    GLfloat diffuseColor[4], specularColor[4];  /* for RGB mode only */
 
-   _mesa_validate_all_lighting_tables( ctx );
-
    COPY_3V(diffuseColor, base[0]);
    diffuseColor[3] = CLAMP( 
       ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3], 0.0F, 1.0F );
@@ -149,7 +148,7 @@ shade_rastpos(struct gl_context *ctx,
         SUB_3V(VP, light->_Position, vertex);
          /* d = length(VP) */
         d = (GLfloat) LEN_3FV( VP );
-        if (d > 1.0e-6) {
+        if (d > 1.0e-6F) {
             /* normalize VP */
            GLfloat invd = 1.0F / d;
            SELF_SCALE_SCALAR_3V(VP, invd);
@@ -167,16 +166,13 @@ shade_rastpos(struct gl_context *ctx,
               continue;
            }
            else {
-              double x = PV_dot_dir * (EXP_TABLE_SIZE-1);
-              int k = (int) x;
-              GLfloat spot = (GLfloat) (light->_SpotExpTable[k][0]
-                              + (x-k)*light->_SpotExpTable[k][1]);
+               GLfloat spot = powf(PV_dot_dir, light->SpotExponent);
               attenuation *= spot;
            }
         }
       }
 
-      if (attenuation < 1e-3)
+      if (attenuation < 1e-3F)
         continue;
 
       n_dot_VP = DOT3( normal, VP );
@@ -217,10 +213,13 @@ shade_rastpos(struct gl_context *ctx,
         n_dot_h = DOT3(normal, h);
 
         if (n_dot_h > 0.0F) {
+           GLfloat shine;
            GLfloat spec_coef;
-           GET_SHINE_TAB_ENTRY( ctx->_ShineTable[0], n_dot_h, spec_coef );
 
-           if (spec_coef > 1.0e-10) {
+           shine = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SHININESS][0];
+           spec_coef = powf(n_dot_h, shine);
+
+           if (spec_coef > 1.0e-10F) {
                if (ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR) {
                   ACC_SCALE_SCALAR_3V( specularContrib, spec_coef,
                                        light->_MatSpecular[0]);
@@ -273,7 +272,7 @@ compute_texgen(struct gl_context *ctx, const GLfloat vObj[4], const GLfloat vEye
    rz = u[2] - normal[2] * two_nu;
    m = rx * rx + ry * ry + (rz + 1.0F) * (rz + 1.0F);
    if (m > 0.0F)
-      mInv = 0.5F * _mesa_inv_sqrtf(m);
+      mInv = 0.5F * (1.0f / sqrtf(m));
    else
       mInv = 0.0F;
 
@@ -379,6 +378,7 @@ _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
       GLfloat eye[4], clip[4], ndc[3], d;
       GLfloat *norm, eyenorm[3];
       GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
+      float scale[3], translate[3];
 
       /* apply modelview matrix:  eye = MV * obj */
       TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, vObj );
@@ -411,19 +411,16 @@ _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
       ndc[1] = clip[1] * d;
       ndc[2] = clip[2] * d;
       /* wincoord = viewport_mapping(ndc) */
-      ctx->Current.RasterPos[0] = (ndc[0] * ctx->Viewport._WindowMap.m[MAT_SX]
-                                   + ctx->Viewport._WindowMap.m[MAT_TX]);
-      ctx->Current.RasterPos[1] = (ndc[1] * ctx->Viewport._WindowMap.m[MAT_SY]
-                                   + ctx->Viewport._WindowMap.m[MAT_TY]);
-      ctx->Current.RasterPos[2] = (ndc[2] * ctx->Viewport._WindowMap.m[MAT_SZ]
-                                   + ctx->Viewport._WindowMap.m[MAT_TZ])
-                                  / ctx->DrawBuffer->_DepthMaxF;
+      _mesa_get_viewport_xform(ctx, 0, scale, translate);
+      ctx->Current.RasterPos[0] = ndc[0] * scale[0] + translate[0];
+      ctx->Current.RasterPos[1] = ndc[1] * scale[1] + translate[1];
+      ctx->Current.RasterPos[2] = ndc[2] * scale[2] + translate[2];
       ctx->Current.RasterPos[3] = clip[3];
 
       if (ctx->Transform.DepthClamp) {
         ctx->Current.RasterPos[3] = CLAMP(ctx->Current.RasterPos[3],
-                                          ctx->Viewport.Near,
-                                          ctx->Viewport.Far);
+                                          ctx->ViewportArray[0].Near,
+                                          ctx->ViewportArray[0].Far);
       }
 
       /* compute raster distance */
@@ -431,7 +428,7 @@ _tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4])
          ctx->Current.RasterDistance = ctx->Current.Attrib[VERT_ATTRIB_FOG][0];
       else
          ctx->Current.RasterDistance =
-                        SQRTF( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
+                        sqrtf( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
 
       /* compute transformed normal vector (for lighting or texgen) */
       if (ctx->_NeedEyeCoords) {