@@ -1,4 +1,4 @@ | |||
/* $Id: m_norm_tmp.h,v 1.7 2001/03/30 14:44:43 gareth Exp $ */ | |||
/* $Id: m_norm_tmp.h,v 1.8 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -140,13 +140,9 @@ TAG(transform_normalize_normals_no_rot)( const GLmatrix *mat, | |||
} | |||
} | |||
else { | |||
/* scale has been snapped to 1.0 if it is close. | |||
*/ | |||
if (scale != 1.0) { | |||
m0 *= scale; | |||
m5 *= scale; | |||
m10 *= scale; | |||
} | |||
m0 *= scale; | |||
m5 *= scale; | |||
m10 *= scale; | |||
STRIDE_LOOP { | |||
GLfloat tx, ty, tz; |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_context.c,v 1.19 2001/06/04 16:09:28 keithw Exp $ */ | |||
/* $Id: t_context.c,v 1.20 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -104,6 +104,7 @@ _tnl_CreateContext( GLcontext *ctx ) | |||
tnl->NeedProjCoords = GL_TRUE; | |||
tnl->LoopbackDListCassettes = GL_FALSE; | |||
tnl->CalcDListNormalLengths = GL_TRUE; | |||
/* Hook our functions into exec and compile dispatch tables. | |||
*/ | |||
@@ -222,3 +223,12 @@ _tnl_need_dlist_loopback( GLcontext *ctx, GLboolean mode ) | |||
tnl->LoopbackDListCassettes = mode; | |||
} | |||
} | |||
void | |||
_tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean mode ) | |||
{ | |||
TNLcontext *tnl = TNL_CONTEXT(ctx); | |||
if (tnl->CalcDListNormalLengths != mode) { | |||
tnl->CalcDListNormalLengths = mode; | |||
} | |||
} |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_context.h,v 1.28 2001/06/04 16:09:28 keithw Exp $ */ | |||
/* $Id: t_context.h,v 1.29 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -207,6 +207,7 @@ struct immediate | |||
GLfloat Color[IMM_SIZE][4]; | |||
GLfloat Obj[IMM_SIZE][4]; | |||
GLfloat Normal[IMM_SIZE][3]; | |||
GLfloat *NormalLengthPtr; | |||
GLfloat TexCoord0[IMM_SIZE][4]; /* just VERT_TEX0 */ | |||
GLuint Elt[IMM_SIZE]; | |||
GLubyte EdgeFlag[IMM_SIZE]; | |||
@@ -256,6 +257,7 @@ typedef struct vertex_buffer | |||
GLubyte ClipOrMask; /* VERT_CLIP (3) */ | |||
GLubyte *ClipMask; /* VERT_CLIP (4) */ | |||
GLvector3f *NormalPtr; /* VERT_NORM */ | |||
GLfloat *NormalLengthPtr; /* VERT_NORM */ | |||
GLboolean *EdgeFlag; /* VERT_EDGE */ | |||
GLvector4f *TexCoordPtr[MAX_TEXTURE_UNITS]; /* VERT_TEX_0..n */ | |||
GLvector1ui *IndexPtr[2]; /* VERT_INDEX */ | |||
@@ -525,6 +527,7 @@ typedef struct { | |||
*/ | |||
GLboolean NeedProjCoords; | |||
GLboolean LoopbackDListCassettes; | |||
GLboolean CalcDListNormalLengths; | |||
/* Derived state and storage for _tnl_eval_vb: | |||
*/ |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_alloc.c,v 1.8 2001/05/09 13:53:36 keithw Exp $ */ | |||
/* $Id: t_imm_alloc.c,v 1.9 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -57,6 +57,7 @@ static struct immediate *real_alloc_immediate( GLcontext *ctx ) | |||
IM->MaterialMask = 0; | |||
IM->MaxTextureUnits = ctx->Const.MaxTextureUnits; | |||
IM->TexSize = 0; | |||
IM->NormalLengthPtr = 0; | |||
IM->CopyTexSize = 0; | |||
IM->CopyStart = IM->Start; | |||
@@ -96,6 +97,8 @@ static void real_free_immediate( struct immediate *IM ) | |||
for (j = 1; j < IM->MaxTextureUnits; j++) | |||
ALIGN_FREE( IM->TexCoord[j] ); | |||
if (IM->NormalLengthPtr) | |||
ALIGN_FREE( IM->NormalLengthPtr ); | |||
ALIGN_FREE( IM ); | |||
freed++; |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_dlist.c,v 1.20 2001/06/04 16:09:28 keithw Exp $ */ | |||
/* $Id: t_imm_dlist.c,v 1.21 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -66,6 +66,55 @@ static void execute_compiled_cassette( GLcontext *ctx, void *data ); | |||
static void loopback_compiled_cassette( GLcontext *ctx, struct immediate *IM ); | |||
static void build_normal_lengths( struct immediate *IM ) | |||
{ | |||
GLuint i; | |||
GLfloat len; | |||
GLfloat (*data)[3] = IM->Normal + IM->Start; | |||
GLfloat *dest = IM->NormalLengthPtr; | |||
GLuint *flags = IM->Flag + IM->Start; | |||
GLuint count = IM->Count - IM->Start; | |||
if (!dest) { | |||
dest = IM->NormalLengthPtr = ALIGN_MALLOC( IMM_SIZE*sizeof(GLfloat), 32 ); | |||
if (!dest) return; | |||
} | |||
dest += IM->Start; | |||
len = (GLfloat) LEN_3FV( data[0] ); | |||
if (len > 0.0) len = 1.0/len; | |||
for (i = 0 ; i < count ; ) { | |||
dest[i] = len; | |||
if (flags[++i] & VERT_NORM) { | |||
len = (GLfloat) LEN_3FV( data[i] ); | |||
if (len > 0.0) len = 1.0/len; | |||
} | |||
} | |||
} | |||
static void fixup_normal_lengths( struct immediate *IM ) | |||
{ | |||
GLuint i; | |||
GLfloat len; | |||
GLfloat (*data)[3] = IM->Normal; | |||
GLfloat *dest = IM->NormalLengthPtr; | |||
GLuint *flags = IM->Flag; | |||
for (i = IM->CopyStart ; i <= IM->Start ; i++) { | |||
len = (GLfloat) LEN_3FV( data[i] ); | |||
if (len > 0.0) len = 1.0/len; | |||
dest[i] = len; | |||
} | |||
while (!(flags[i] & (VERT_NORM|VERT_END_VB))) { | |||
dest[i] = len; | |||
i++; | |||
} | |||
} | |||
/* Insert the active immediate struct onto the display list currently | |||
* being built. | |||
*/ | |||
@@ -84,14 +133,14 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM ) | |||
_tnl_compute_orflag( IM, IM->Start ); | |||
/* Need to clear this flag, or fixup gets confused. (The elements | |||
* have been translated away by now.) | |||
/* Need to clear this flag, or fixup gets confused. (The | |||
* array-elements have been translated away by now, so it's ok to | |||
* remove it.) | |||
*/ | |||
IM->OrFlag &= ~VERT_ELT; | |||
IM->AndFlag &= ~VERT_ELT; | |||
_tnl_fixup_input( ctx, IM ); | |||
/* _tnl_print_cassette( IM ); */ | |||
node = (TNLvertexcassette *) | |||
_mesa_alloc_instruction(ctx, | |||
@@ -113,6 +162,10 @@ _tnl_compile_cassette( GLcontext *ctx, struct immediate *IM ) | |||
node->LastMaterial = im->LastMaterial; | |||
node->MaterialOrMask = im->MaterialOrMask; | |||
node->MaterialAndMask = im->MaterialAndMask; | |||
if (tnl->CalcDListNormalLengths) { | |||
build_normal_lengths( im ); | |||
} | |||
if (ctx->ExecuteFlag) { | |||
execute_compiled_cassette( ctx, (void *)node ); | |||
@@ -308,6 +361,10 @@ execute_compiled_cassette( GLcontext *ctx, void *data ) | |||
IM->Primitive[IM->LastPrimitive] & PRIM_MODE_MASK; | |||
_tnl_get_exec_copy_verts( ctx, IM ); | |||
if (IM->NormalLengthPtr) | |||
fixup_normal_lengths( IM ); | |||
_tnl_run_cassette( ctx, IM ); | |||
restore_compiled_primitives( ctx, IM ); | |||
@@ -365,6 +422,7 @@ _tnl_BeginCallList( GLcontext *ctx, GLuint list ) | |||
void | |||
_tnl_EndCallList( GLcontext *ctx ) | |||
{ | |||
(void) ctx; | |||
} | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_exec.c,v 1.26 2001/05/16 09:28:32 keithw Exp $ */ | |||
/* $Id: t_imm_exec.c,v 1.27 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -244,6 +244,7 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) | |||
/* TexCoordPtr's are zeroed in loop below. | |||
*/ | |||
VB->NormalPtr = 0; | |||
VB->NormalLengthPtr = 0; | |||
VB->FogCoordPtr = 0; | |||
VB->EdgeFlag = 0; | |||
VB->IndexPtr[0] = 0; | |||
@@ -280,6 +281,8 @@ static void _tnl_vb_bind_immediate( GLcontext *ctx, struct immediate *IM ) | |||
tmp->Normal.start = (GLfloat *)(IM->Normal + start); | |||
tmp->Normal.count = count; | |||
VB->NormalPtr = &tmp->Normal; | |||
if (IM->NormalLengthPtr) | |||
VB->NormalLengthPtr = IM->NormalLengthPtr + start; | |||
} | |||
if (inputs & VERT_INDEX) { |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_imm_fixup.c,v 1.21 2001/06/13 14:57:55 brianp Exp $ */ | |||
/* $Id: t_imm_fixup.c,v 1.22 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -505,7 +505,8 @@ void _tnl_copy_immediate_vertices( GLcontext *ctx, struct immediate *next ) | |||
/* Revive a compiled immediate struct - propogate new 'Current' | |||
* values. Often this is redundant because the current values were | |||
* known and fixed up at compile time. | |||
* known and fixed up at compile time (or in the first execution of | |||
* the cassette). | |||
*/ | |||
void _tnl_fixup_compiled_cassette( GLcontext *ctx, struct immediate *IM ) | |||
{ |
@@ -1,4 +1,4 @@ | |||
/* $Id: t_vb_normals.c,v 1.8 2001/03/30 14:44:44 gareth Exp $ */ | |||
/* $Id: t_vb_normals.c,v 1.9 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -65,10 +65,11 @@ static GLboolean run_normal_stage( GLcontext *ctx, | |||
store->NormalTransform( &ctx->ModelView, | |||
ctx->_ModelViewInvScale, | |||
VB->NormalPtr, | |||
0, | |||
VB->NormalLengthPtr, | |||
&store->normal ); | |||
VB->NormalPtr = &store->normal; | |||
VB->NormalLengthPtr = 0; /* no longer valid */ | |||
return GL_TRUE; | |||
} | |||
@@ -1,4 +1,4 @@ | |||
/* $Id: tnl.h,v 1.7 2001/06/04 16:09:28 keithw Exp $ */ | |||
/* $Id: tnl.h,v 1.8 2001/06/28 17:34:14 keithw Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -61,10 +61,15 @@ _tnl_wakeup_exec( GLcontext *ctx ); | |||
extern void | |||
_tnl_wakeup_save_exec( GLcontext *ctx ); | |||
/* Driver configuration options: | |||
*/ | |||
extern void | |||
_tnl_need_projected_coords( GLcontext *ctx, GLboolean flag ); | |||
extern void | |||
_tnl_need_dlist_loopback( GLcontext *ctx, GLboolean flag ); | |||
extern void | |||
_tnl_need_dlist_norm_lengths( GLcontext *ctx, GLboolean flag ); | |||
#endif |