⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_lighting.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
      break;   case GL_POSITION: {      /* positions picked up in update_light, but can do flag here */	      GLuint flag = (p&1)? RADEON_LIGHT_1_IS_LOCAL : RADEON_LIGHT_0_IS_LOCAL;      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;      RADEON_STATECHANGE(rmesa, tcl);      if (l->EyePosition[3] != 0.0F)	 rmesa->hw.tcl.cmd[idx] |= flag;      else	 rmesa->hw.tcl.cmd[idx] &= ~flag;      break;   }   case GL_SPOT_EXPONENT:      RADEON_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_SPOT_EXPONENT] = params[0];      break;   case GL_SPOT_CUTOFF: {      GLuint flag = (p&1) ? RADEON_LIGHT_1_IS_SPOT : RADEON_LIGHT_0_IS_SPOT;      GLuint idx = TCL_PER_LIGHT_CTL_0 + p/2;      RADEON_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_SPOT_CUTOFF] = l->_CosCutoff;      RADEON_STATECHANGE(rmesa, tcl);      if (l->SpotCutoff != 180.0F)	 rmesa->hw.tcl.cmd[idx] |= flag;      else	 rmesa->hw.tcl.cmd[idx] &= ~flag;      break;   }   case GL_CONSTANT_ATTENUATION:      RADEON_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_CONST] = params[0];      break;   case GL_LINEAR_ATTENUATION:      RADEON_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_LINEAR] = params[0];      break;   case GL_QUADRATIC_ATTENUATION:      RADEON_STATECHANGE(rmesa, lit[p]);      fcmd[LIT_ATTEN_QUADRATIC] = params[0];      break;   default:      return;   }}		  void radeonLightModelfv( GLcontext *ctx, GLenum pname,			 const GLfloat *param ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   switch (pname) {      case GL_LIGHT_MODEL_AMBIENT: 	 update_global_ambient( ctx );	 break;      case GL_LIGHT_MODEL_LOCAL_VIEWER:	 RADEON_STATECHANGE( rmesa, tcl );	 if (ctx->Light.Model.LocalViewer)	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LOCAL_VIEWER;	 else	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LOCAL_VIEWER;         break;      case GL_LIGHT_MODEL_TWO_SIDE:	 RADEON_STATECHANGE( rmesa, tcl );	 if (ctx->Light.Model.TwoSide)	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_LIGHT_TWOSIDE;	 else	    rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_LIGHT_TWOSIDE;	 check_twoside_fallback( ctx );#if _HAVE_SWTNL	 if (rmesa->TclFallback) {	    radeonChooseRenderState( ctx );	    radeonChooseVertexState( ctx );	 }#endif         break;      case GL_LIGHT_MODEL_COLOR_CONTROL:	 radeonUpdateSpecular(ctx);	 RADEON_STATECHANGE( rmesa, tcl );	 if (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) 	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= 	       ~RADEON_DIFFUSE_SPECULAR_COMBINE;	 else	    rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= 	       RADEON_DIFFUSE_SPECULAR_COMBINE;         break;      default:         break;   }}/* ============================================================= * Fog */static void radeonFogfv( GLcontext *ctx, GLenum pname, const GLfloat *param ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   union { int i; float f; } c, d;   GLchan col[4];   c.i = rmesa->hw.fog.cmd[FOG_C];   d.i = rmesa->hw.fog.cmd[FOG_D];   switch (pname) {   case GL_FOG_MODE:      if (!ctx->Fog.Enabled)	 return;      RADEON_STATECHANGE(rmesa, tcl);      rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] &= ~RADEON_TCL_FOG_MASK;      switch (ctx->Fog.Mode) {      case GL_LINEAR:	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_LINEAR;	 if (ctx->Fog.Start == ctx->Fog.End) {	    c.f = 1.0F;	    d.f = 1.0F;	 }	 else {	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);	 }	 break;      case GL_EXP:	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP;	 c.f = 0.0;	 d.f = ctx->Fog.Density;	 break;      case GL_EXP2:	 rmesa->hw.tcl.cmd[TCL_UCP_VERT_BLEND_CTL] |= RADEON_TCL_FOG_EXP2;	 c.f = 0.0;	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);	 break;      default:	 return;      }      break;   case GL_FOG_DENSITY:      switch (ctx->Fog.Mode) {      case GL_EXP:	 c.f = 0.0;	 d.f = ctx->Fog.Density;	 break;      case GL_EXP2:	 c.f = 0.0;	 d.f = -(ctx->Fog.Density * ctx->Fog.Density);	 break;      default:	 break;      }      break;   case GL_FOG_START:   case GL_FOG_END:      if (ctx->Fog.Mode == GL_LINEAR) {	 if (ctx->Fog.Start == ctx->Fog.End) {	    c.f = 1.0F;	    d.f = 1.0F;	 } else {	    c.f = ctx->Fog.End/(ctx->Fog.End-ctx->Fog.Start);	    d.f = 1.0/(ctx->Fog.End-ctx->Fog.Start);	 }      }      break;   case GL_FOG_COLOR:       RADEON_STATECHANGE( rmesa, ctx );      UNCLAMPED_FLOAT_TO_RGB_CHAN( col, ctx->Fog.Color );      rmesa->hw.ctx.cmd[CTX_PP_FOG_COLOR] =	 radeonPackColor( 4, col[0], col[1], col[2], 0 );      break;   case GL_FOG_COORDINATE_SOURCE_EXT:       /* What to do?       */      break;   default:      return;   }   if (c.i != rmesa->hw.fog.cmd[FOG_C] || d.i != rmesa->hw.fog.cmd[FOG_D]) {      RADEON_STATECHANGE( rmesa, fog );      rmesa->hw.fog.cmd[FOG_C] = c.i;      rmesa->hw.fog.cmd[FOG_D] = d.i;   }}/* Examine lighting and texture state to determine if separate specular * should be enabled. */void radeonUpdateSpecular( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   GLuint p = rmesa->hw.ctx.cmd[CTX_PP_CNTL];   if (NEED_SECONDARY_COLOR(ctx)) {      p |=  RADEON_SPECULAR_ENABLE;   } else {      p &= ~RADEON_SPECULAR_ENABLE;   }   if ( rmesa->hw.ctx.cmd[CTX_PP_CNTL] != p ) {      RADEON_STATECHANGE( rmesa, ctx );      rmesa->hw.ctx.cmd[CTX_PP_CNTL] = p;   }   /* Bizzare: have to leave lighting enabled to get fog.    */   RADEON_STATECHANGE( rmesa, tcl );   if ((ctx->Light.Enabled &&	ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) {      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;   }   else if (ctx->Fog.Enabled) {      if (ctx->Light.Enabled) {	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;      } else {	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_SPECULAR;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;	 rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;	 rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;      }   }   else if (ctx->Light.Enabled) {      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] |= RADEON_TCL_COMPUTE_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |= RADEON_LIGHTING_ENABLE;   } else if (ctx->Fog.ColorSumEnabled ) {      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_SPEC;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;   } else {      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_SPECULAR;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXSEL] &= ~RADEON_TCL_COMPUTE_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] &= ~RADEON_TCL_VTX_PK_SPEC;      rmesa->hw.tcl.cmd[TCL_OUTPUT_VTXFMT] |= RADEON_TCL_VTX_PK_DIFFUSE;      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_LIGHTING_ENABLE;   }#if _HAVE_SWTNL   /* Update vertex/render formats    */   if (rmesa->TclFallback) {       radeonChooseRenderState( ctx );      radeonChooseVertexState( ctx );   }#endif}static void radeonLightingSpaceChange( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   GLboolean tmp;   RADEON_STATECHANGE( rmesa, tcl );   if (RADEON_DEBUG & DEBUG_STATE)      fprintf(stderr, "%s %d\n", __FUNCTION__, ctx->_NeedEyeCoords);   if (ctx->_NeedEyeCoords)      tmp = ctx->Transform.RescaleNormals;   else      tmp = !ctx->Transform.RescaleNormals;   if ( tmp ) {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] |=  RADEON_RESCALE_NORMALS;   } else {      rmesa->hw.tcl.cmd[TCL_LIGHT_MODEL_CTL] &= ~RADEON_RESCALE_NORMALS;   }}void radeonInitLightStateFuncs( GLcontext *ctx ){   radeonContextPtr rmesa = RADEON_CONTEXT(ctx);   int i;   ctx->Driver.LightModelfv		= radeonLightModelfv;    ctx->Driver.Lightfv			= radeonLightfv;    ctx->Driver.Fogfv			= radeonFogfv;   ctx->Driver.LightingSpaceChange      = radeonLightingSpaceChange;   for (i = 0 ; i < 8; i++) {      struct gl_light *l = &ctx->Light.Light[i];      GLenum p = GL_LIGHT0 + i;      *(float *)&(rmesa->hw.lit[i].cmd[LIT_RANGE_CUTOFF]) = FLT_MAX;      ctx->Driver.Lightfv( ctx, p, GL_AMBIENT, l->Ambient );      ctx->Driver.Lightfv( ctx, p, GL_DIFFUSE, l->Diffuse );      ctx->Driver.Lightfv( ctx, p, GL_SPECULAR, l->Specular );      ctx->Driver.Lightfv( ctx, p, GL_POSITION, 0 );      ctx->Driver.Lightfv( ctx, p, GL_SPOT_DIRECTION, 0 );      ctx->Driver.Lightfv( ctx, p, GL_SPOT_EXPONENT, &l->SpotExponent );      ctx->Driver.Lightfv( ctx, p, GL_SPOT_CUTOFF, &l->SpotCutoff );      ctx->Driver.Lightfv( ctx, p, GL_CONSTANT_ATTENUATION,			   &l->ConstantAttenuation );      ctx->Driver.Lightfv( ctx, p, GL_LINEAR_ATTENUATION, 			   &l->LinearAttenuation );      ctx->Driver.Lightfv( ctx, p, GL_QUADRATIC_ATTENUATION, 		     &l->QuadraticAttenuation );   }   ctx->Driver.LightModelfv( ctx, GL_LIGHT_MODEL_AMBIENT, 			     ctx->Light.Model.Ambient );   ctx->Driver.Fogfv( ctx, GL_FOG_MODE, 0 );   ctx->Driver.Fogfv( ctx, GL_FOG_DENSITY, &ctx->Fog.Density );   ctx->Driver.Fogfv( ctx, GL_FOG_START, &ctx->Fog.Start );   ctx->Driver.Fogfv( ctx, GL_FOG_END, &ctx->Fog.End );   ctx->Driver.Fogfv( ctx, GL_FOG_COLOR, ctx->Fog.Color );   ctx->Driver.Fogfv( ctx, GL_FOG_COORDINATE_SOURCE_EXT, 0 );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -