-/* $Id: light.c,v 1.46 2001/09/18 16:16:21 kschultz Exp $ */
+/* $Id: light.c,v 1.53 2002/10/24 23:57:21 brianp Exp $ */
/*
* Mesa 3-D graphics library
- * Version: 3.5
+ * Version: 4.1
*
- * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2002 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"),
*/
-#ifdef PC_HEADER
-#include "all.h"
-#else
#include "glheader.h"
+#include "imports.h"
#include "colormac.h"
#include "context.h"
#include "enums.h"
#include "light.h"
#include "macros.h"
-#include "mem.h"
#include "mmath.h"
#include "simple_list.h"
#include "mtypes.h"
-
#include "math/m_xform.h"
#include "math/m_matrix.h"
-#endif
/* XXX this is a bit of a hack needed for compilation within XFree86 */
ASSERT_OUTSIDE_BEGIN_END(ctx);
if (MESA_VERBOSE & VERBOSE_API)
- fprintf(stderr, "glShadeModel %s\n", _mesa_lookup_enum_by_nr(mode));
+ _mesa_debug(ctx, "glShadeModel %s\n", _mesa_lookup_enum_by_nr(mode));
if (mode != GL_FLAT && mode != GL_SMOOTH) {
_mesa_error( ctx, GL_INVALID_ENUM, "glShadeModel" );
struct gl_light *l = &ctx->Light.Light[i];
if (i < 0 || i >= (GLint) ctx->Const.MaxLights) {
- _mesa_error( ctx, GL_INVALID_ENUM, "glLight" );
+ _mesa_error( ctx, GL_INVALID_ENUM, "glLight(light=0x%x)", light );
return;
}
case GL_POSITION: {
GLfloat tmp[4];
/* transform position by ModelView matrix */
- TRANSFORM_POINT( tmp, ctx->ModelView.m, params );
+ TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->m, params );
if (TEST_EQ_4V(l->EyePosition, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
case GL_SPOT_DIRECTION: {
GLfloat tmp[4];
/* transform direction by inverse modelview */
- if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
- _math_matrix_analyse( &ctx->ModelView );
+ if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+ _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
}
- TRANSFORM_NORMAL( tmp, params, ctx->ModelView.inv );
+ TRANSFORM_NORMAL( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
if (TEST_EQ_3V(l->EyeDirection, tmp))
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
l->QuadraticAttenuation = params[0];
break;
default:
- _mesa_error( ctx, GL_INVALID_ENUM, "glLight" );
+ _mesa_error( ctx, GL_INVALID_ENUM, "glLight(pname=0x%x)", pname );
return;
}
return;
FLUSH_VERTICES(ctx, _NEW_LIGHT);
ctx->Light.Model.TwoSide = newbool;
+
+ if (ctx->Light.Enabled && ctx->Light.Model.TwoSide)
+ ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
+ else
+ ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
break;
case GL_LIGHT_MODEL_COLOR_CONTROL:
if (params[0] == (GLfloat) GL_SINGLE_COLOR)
else if (params[0] == (GLfloat) GL_SEPARATE_SPECULAR_COLOR)
newenum = GL_SEPARATE_SPECULAR_COLOR;
else {
- _mesa_error( ctx, GL_INVALID_ENUM, "glLightModel(param)" );
+ _mesa_error( ctx, GL_INVALID_ENUM, "glLightModel(param=0x0%x)",
+ (GLint) params[0] );
return;
}
if (ctx->Light.Model.ColorControl == newenum)
break;
default:
- _mesa_error( ctx, GL_INVALID_ENUM, "glLightModel" );
+ _mesa_error( ctx, GL_INVALID_ENUM, "glLightModel(pname=0x%x)", pname );
break;
}
bitmask &= ~ctx->Light.ColorMaterialBitmask;
if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
- fprintf(stderr, "_mesa_update_material, mask 0x%x\n", bitmask);
+ _mesa_debug(ctx, "_mesa_update_material, mask 0x%x\n", bitmask);
if (!bitmask)
return;
ctx->Light.Material[1].SpecularIndex = src[1].SpecularIndex;
}
- if (0)
- {
+ if (0) {
struct gl_material *mat = &ctx->Light.Material[0];
- fprintf(stderr, "update_mat emission : %f %f %f\n",
- mat->Emission[0],
- mat->Emission[1],
- mat->Emission[2]);
- fprintf(stderr, "update_mat specular : %f %f %f\n",
- mat->Specular[0],
- mat->Specular[1],
- mat->Specular[2]);
- fprintf(stderr, "update_mat diffuse : %f %f %f\n",
- mat->Diffuse[0],
- mat->Diffuse[1],
- mat->Diffuse[2]);
- fprintf(stderr, "update_mat ambient : %f %f %f\n",
- mat->Ambient[0],
- mat->Ambient[1],
- mat->Ambient[2]);
+ _mesa_debug(ctx, "update_mat emission : %f %f %f\n",
+ mat->Emission[0], mat->Emission[1], mat->Emission[2]);
+ _mesa_debug(ctx, "update_mat specular : %f %f %f\n",
+ mat->Specular[0], mat->Specular[1], mat->Specular[2]);
+ _mesa_debug(ctx, "update_mat diffuse : %f %f %f\n",
+ mat->Diffuse[0], mat->Diffuse[1], mat->Diffuse[2]);
+ _mesa_debug(ctx, "update_mat ambient : %f %f %f\n",
+ mat->Ambient[0], mat->Ambient[1], mat->Ambient[2]);
}
}
GLuint bitmask = ctx->Light.ColorMaterialBitmask;
if (MESA_VERBOSE&VERBOSE_IMMEDIATE)
- fprintf(stderr, "_mesa_update_color_material, mask 0x%x\n", bitmask);
+ _mesa_debug(ctx, "_mesa_update_color_material, mask 0x%x\n", bitmask);
/* update emissive colors */
if (bitmask & FRONT_EMISSION_BIT) {
}
}
- if (0)
- {
+ if (0) {
struct gl_material *mat = &ctx->Light.Material[0];
- fprintf(stderr, "update_color_mat emission : %f %f %f\n",
- mat->Emission[0],
- mat->Emission[1],
- mat->Emission[2]);
- fprintf(stderr, "update_color_mat specular : %f %f %f\n",
- mat->Specular[0],
- mat->Specular[1],
- mat->Specular[2]);
- fprintf(stderr, "update_color_mat diffuse : %f %f %f\n",
- mat->Diffuse[0],
- mat->Diffuse[1],
- mat->Diffuse[2]);
- fprintf(stderr, "update_color_mat ambient : %f %f %f\n",
- mat->Ambient[0],
- mat->Ambient[1],
- mat->Ambient[2]);
+ _mesa_debug(ctx, "update_color_mat emission : %f %f %f\n",
+ mat->Emission[0], mat->Emission[1], mat->Emission[2]);
+ _mesa_debug(ctx, "update_color_mat specular : %f %f %f\n",
+ mat->Specular[0], mat->Specular[1], mat->Specular[2]);
+ _mesa_debug(ctx, "update_color_mat diffuse : %f %f %f\n",
+ mat->Diffuse[0], mat->Diffuse[1], mat->Diffuse[2]);
+ _mesa_debug(ctx, "update_color_mat ambient : %f %f %f\n",
+ mat->Ambient[0], mat->Ambient[1], mat->Ambient[2]);
}
}
ASSERT_OUTSIDE_BEGIN_END(ctx);
if (MESA_VERBOSE&VERBOSE_API)
- fprintf(stderr, "glColorMaterial %s %s\n",
- _mesa_lookup_enum_by_nr(face),
- _mesa_lookup_enum_by_nr(mode));
+ _mesa_debug(ctx, "glColorMaterial %s %s\n",
+ _mesa_lookup_enum_by_nr(face),
+ _mesa_lookup_enum_by_nr(mode));
bitmask = _mesa_material_bitmask(ctx, face, mode, legal, "glColorMaterial");
if (ctx->Light.ColorMaterialEnabled) {
FLUSH_CURRENT( ctx, 0 );
- _mesa_update_color_material( ctx, ctx->Current.Color );
+ _mesa_update_color_material(ctx,ctx->Current.Attrib[VERT_ATTRIB_COLOR0]);
}
+
+ if (ctx->Driver.ColorMaterial)
+ (*ctx->Driver.ColorMaterial)( ctx, face, mode );
}
_mesa_update_lighting( GLcontext *ctx )
{
struct gl_light *light;
- ctx->_TriangleCaps &= ~DD_TRI_LIGHT_TWOSIDE;
ctx->_NeedEyeCoords &= ~NEED_EYE_LIGHT;
ctx->_NeedNormals &= ~NEED_NORMALS_LIGHT;
ctx->Light._Flags = 0;
ctx->_NeedNormals |= NEED_NORMALS_LIGHT;
- if (ctx->Light.Model.TwoSide)
- ctx->_TriangleCaps |= DD_TRI_LIGHT_TWOSIDE;
-
foreach(light, &ctx->Light.EnabledList) {
ctx->Light._Flags |= light->_Flags;
}
COPY_3V( ctx->_EyeZDir, eye_z );
}
else {
- TRANSFORM_NORMAL( ctx->_EyeZDir, eye_z, ctx->ModelView.m );
+ TRANSFORM_NORMAL( ctx->_EyeZDir, eye_z, ctx->ModelviewMatrixStack.Top->m );
}
foreach (light, &ctx->Light.EnabledList) {
COPY_4FV( light->_Position, light->EyePosition );
}
else {
- TRANSFORM_POINT( light->_Position, ctx->ModelView.inv,
+ TRANSFORM_POINT( light->_Position, ctx->ModelviewMatrixStack.Top->inv,
light->EyePosition );
}
else {
TRANSFORM_NORMAL( light->_NormDirection,
light->EyeDirection,
- ctx->ModelView.m);
+ ctx->ModelviewMatrixStack.Top->m);
}
NORMALIZE_3FV( light->_NormDirection );