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

📄 gamma_state.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
	    break;	case GL_DIFFUSE:	    CHECK_DMA_BUFFER(gmesa, 3);	    /* We don't do alpha */	    WRITEF(gmesa->buf, Light0DiffuseIntensityBlue, params[2]);	    WRITEF(gmesa->buf, Light0DiffuseIntensityGreen, params[1]);	    WRITEF(gmesa->buf, Light0DiffuseIntensityRed, params[0]);	    break;	case GL_SPECULAR:	    CHECK_DMA_BUFFER(gmesa, 3);	    /* We don't do alpha */	    WRITEF(gmesa->buf, Light0SpecularIntensityBlue, params[2]);	    WRITEF(gmesa->buf, Light0SpecularIntensityGreen, params[1]);	    WRITEF(gmesa->buf, Light0SpecularIntensityRed, params[0]);	    break;	case GL_POSITION:    	    /* Normalize <x,y,z> */	    x = params[0]; y = params[1]; z = params[2]; w = params[3];	    l = sqrt(x*x + y*y + z*z + w*w);	    w /= l;	    x /= l;	    y /= l;	    z /= l;	    if (params[3] != 0.0) {		gmesa->Light0Mode |= Light0ModeAttenuation;		gmesa->Light0Mode |= Light0ModeLocal;	    } else {		gmesa->Light0Mode &= ~Light0ModeAttenuation;		gmesa->Light0Mode &= ~Light0ModeLocal;	    }	    CHECK_DMA_BUFFER(gmesa, 5);	    WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode);	    WRITEF(gmesa->buf, Light0PositionW, w);	    WRITEF(gmesa->buf, Light0PositionZ, z);	    WRITEF(gmesa->buf, Light0PositionY, y);	    WRITEF(gmesa->buf, Light0PositionX, x);	    break;	case GL_SPOT_DIRECTION:	    CHECK_DMA_BUFFER(gmesa, 3);	    /* WRITEF(gmesa->buf, Light0SpotlightDirectionW, params[3]); */	    WRITEF(gmesa->buf, Light0SpotlightDirectionZ, params[2]);	    WRITEF(gmesa->buf, Light0SpotlightDirectionY, params[1]);	    WRITEF(gmesa->buf, Light0SpotlightDirectionX, params[0]);	    break;	case GL_SPOT_EXPONENT:	    CHECK_DMA_BUFFER(gmesa, 1);	    WRITEF(gmesa->buf, Light0SpotlightExponent, params[0]);	    break;	case GL_SPOT_CUTOFF:	    if (params[0] != 180.0) 		gmesa->Light0Mode |= Light0ModeSpotLight;	    else		gmesa->Light0Mode &= ~Light0ModeSpotLight;	    CHECK_DMA_BUFFER(gmesa, 2);	    WRITE(gmesa->buf, Light0Mode, gmesa->Light0Mode);	    WRITEF(gmesa->buf, Light0CosSpotlightCutoffAngle, cos(params[0]*DEG2RAD));	    break;	case GL_CONSTANT_ATTENUATION:	    CHECK_DMA_BUFFER(gmesa, 1);	    WRITEF(gmesa->buf, Light0ConstantAttenuation, params[0]);	    break;	case GL_LINEAR_ATTENUATION:	    CHECK_DMA_BUFFER(gmesa, 1);	    WRITEF(gmesa->buf, Light0LinearAttenuation, params[0]);	    break;	case GL_QUADRATIC_ATTENUATION:	    CHECK_DMA_BUFFER(gmesa, 1);	    WRITEF(gmesa->buf, Light0QuadraticAttenuation, params[0]);	    break;	}	break;    }}static void gammaDDLightModelfv( GLcontext *ctx, GLenum pname,				const GLfloat *params ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   switch (pname) {   case GL_LIGHT_MODEL_AMBIENT:	CHECK_DMA_BUFFER(gmesa, 3);	/* We don't do alpha */	WRITEF(gmesa->buf, SceneAmbientColorBlue, params[2]);	WRITEF(gmesa->buf, SceneAmbientColorGreen, params[1]);	WRITEF(gmesa->buf, SceneAmbientColorRed, params[0]);	break;    case GL_LIGHT_MODEL_LOCAL_VIEWER:	if (params[0] != 0.0)	    gmesa->LightingMode |= LightingModeLocalViewer;	else	    gmesa->LightingMode &= ~LightingModeLocalViewer;	CHECK_DMA_BUFFER(gmesa, 1);	WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);	break;    case GL_LIGHT_MODEL_TWO_SIDE:	if (params[0] == 1.0f) {	    gmesa->LightingMode |= LightingModeTwoSides;	    gmesa->MaterialMode |= MaterialModeTwoSides;	} else {	    gmesa->LightingMode &= ~LightingModeTwoSides;	    gmesa->MaterialMode &= ~MaterialModeTwoSides;	}	CHECK_DMA_BUFFER(gmesa, 2);	WRITE(gmesa->buf, LightingMode, gmesa->LightingMode);	WRITE(gmesa->buf, MaterialMode, gmesa->MaterialMode);	break;    }}#endifstatic void gammaDDShadeModel( GLcontext *ctx, GLenum mode ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   u_int32_t g = gmesa->GeometryMode;   u_int32_t c = gmesa->ColorDDAMode;   g &= ~GM_ShadingMask;   c &= ~ColorDDAShadingMask;   switch ( mode ) {   case GL_FLAT:      g |= GM_FlatShading;      c |= ColorDDAFlat;      break;   case GL_SMOOTH:      g |= GM_GouraudShading;      c |= ColorDDAGouraud;      break;   default:      return;   }   if ( gmesa->ColorDDAMode != c ) {      FLUSH_BATCH( gmesa );      gmesa->ColorDDAMode = c;      gmesa->dirty |= GAMMA_UPLOAD_SHADE;   }   if ( gmesa->GeometryMode != g ) {      FLUSH_BATCH( gmesa );      gmesa->GeometryMode = g;      gmesa->dirty |= GAMMA_UPLOAD_GEOMETRY;   }}/* ============================================================= * Miscellaneous */static void gammaDDClearColor( GLcontext *ctx, const GLfloat color[4]){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   GLubyte c[4];   UNCLAMPED_FLOAT_TO_UBYTE(c[0], color[0]);   UNCLAMPED_FLOAT_TO_UBYTE(c[1], color[1]);   UNCLAMPED_FLOAT_TO_UBYTE(c[2], color[2]);   UNCLAMPED_FLOAT_TO_UBYTE(c[3], color[3]);   gmesa->ClearColor = gammaPackColor( gmesa->gammaScreen->cpp,                                       c[0], c[1], c[2], c[3] );   if (gmesa->gammaScreen->cpp == 2) gmesa->ClearColor |= gmesa->ClearColor<<16;}static void gammaDDLogicalOpcode( GLcontext *ctx, GLenum opcode ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   FLUSH_BATCH( gmesa );   if ( ctx->Color.ColorLogicOpEnabled ) {      gmesa->LogicalOpMode = opcode << 1 | LogicalOpModeEnable;   } else {      gmesa->LogicalOpMode = LogicalOpModeDisable;   }   gmesa->dirty |= GAMMA_UPLOAD_LOGICOP;}static void gammaDDDrawBuffer( GLcontext *ctx, GLenum mode ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   FLUSH_BATCH( gmesa );   switch ( mode ) {   case GL_FRONT_LEFT:      gmesa->drawOffset = gmesa->readOffset = 0;      break;   case GL_BACK_LEFT:      gmesa->drawOffset = gmesa->readOffset = gmesa->driScreen->fbHeight * gmesa->driScreen->fbWidth * gmesa->gammaScreen->cpp;       break;   }}static void gammaDDReadBuffer( GLcontext *ctx, GLenum mode ){   /* XXX anything? */}/* ============================================================= * Window position and viewport transformation */void gammaUpdateWindow( GLcontext *ctx ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   __DRIdrawablePrivate *dPriv = gmesa->driDrawable;   GLfloat xoffset = (GLfloat)dPriv->x;   GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h;   const GLfloat *v = ctx->Viewport._WindowMap.m;   GLfloat sx = v[MAT_SX];   GLfloat tx = v[MAT_TX] + xoffset;   GLfloat sy = v[MAT_SY];   GLfloat ty = v[MAT_TY] + yoffset;   GLfloat sz = v[MAT_SZ] * gmesa->depth_scale;   GLfloat tz = v[MAT_TZ] * gmesa->depth_scale;   gmesa->dirty |= GAMMA_UPLOAD_VIEWPORT;   gmesa->ViewportScaleX = sx;   gmesa->ViewportScaleY = sy;   gmesa->ViewportScaleZ = sz;   gmesa->ViewportOffsetX = tx;   gmesa->ViewportOffsetY = ty;   gmesa->ViewportOffsetZ = tz;}static void gammaDDViewport( GLcontext *ctx, GLint x, GLint y,			    GLsizei width, GLsizei height ){   gammaUpdateWindow( ctx );}static void gammaDDDepthRange( GLcontext *ctx, GLclampd nearval,			      GLclampd farval ){   gammaUpdateWindow( ctx );}void gammaUpdateViewportOffset( GLcontext *ctx ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   __DRIdrawablePrivate *dPriv = gmesa->driDrawable;   GLfloat xoffset = (GLfloat)dPriv->x;   GLfloat yoffset = gmesa->driScreen->fbHeight - (GLfloat)dPriv->y - dPriv->h;   const GLfloat *v = ctx->Viewport._WindowMap.m;   GLfloat tx = v[MAT_TX] + xoffset;   GLfloat ty = v[MAT_TY] + yoffset;   if ( gmesa->ViewportOffsetX != tx ||        gmesa->ViewportOffsetY != ty )   {      gmesa->ViewportOffsetX = tx;      gmesa->ViewportOffsetY = ty;      gmesa->new_state |= GAMMA_NEW_WINDOW;   }   gmesa->new_state |= GAMMA_NEW_CLIP;}#if 0/*  * Matrix  */static void gammaLoadHWMatrix(GLcontext *ctx){    gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);    const GLfloat *m;    gmesa->TransformMode &= ~XM_XformTexture;    switch (ctx->Transform.MatrixMode) {    case GL_MODELVIEW:	gmesa->TransformMode |= XM_UseModelViewMatrix;        m = ctx->ModelviewMatrixStack.Top->m;	CHECK_DMA_BUFFER(gmesa, 16);	WRITEF(gmesa->buf, ModelViewMatrix0,  m[0]);	WRITEF(gmesa->buf, ModelViewMatrix1,  m[1]);	WRITEF(gmesa->buf, ModelViewMatrix2,  m[2]);	WRITEF(gmesa->buf, ModelViewMatrix3,  m[3]);	WRITEF(gmesa->buf, ModelViewMatrix4,  m[4]);	WRITEF(gmesa->buf, ModelViewMatrix5,  m[5]);	WRITEF(gmesa->buf, ModelViewMatrix6,  m[6]);	WRITEF(gmesa->buf, ModelViewMatrix7,  m[7]);	WRITEF(gmesa->buf, ModelViewMatrix8,  m[8]);	WRITEF(gmesa->buf, ModelViewMatrix9,  m[9]);	WRITEF(gmesa->buf, ModelViewMatrix10, m[10]);	WRITEF(gmesa->buf, ModelViewMatrix11, m[11]);	WRITEF(gmesa->buf, ModelViewMatrix12, m[12]);	WRITEF(gmesa->buf, ModelViewMatrix13, m[13]);	WRITEF(gmesa->buf, ModelViewMatrix14, m[14]);	WRITEF(gmesa->buf, ModelViewMatrix15, m[15]);	break;    case GL_PROJECTION:        m = ctx->ProjectionMatrixStack.Top->m;	CHECK_DMA_BUFFER(gmesa, 16);	WRITEF(gmesa->buf, ModelViewProjectionMatrix0, m[0]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix1, m[1]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix2, m[2]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix3, m[3]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix4, m[4]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix5, m[5]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix6, m[6]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix7, m[7]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix8, m[8]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix9, m[9]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix10, m[10]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix11, m[11]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix12, m[12]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix13, m[13]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix14, m[14]);	WRITEF(gmesa->buf, ModelViewProjectionMatrix15, m[15]);	break;    case GL_TEXTURE:        m = ctx->TextureMatrixStack[0].Top->m;	CHECK_DMA_BUFFER(gmesa, 16);	gmesa->TransformMode |= XM_XformTexture;	WRITEF(gmesa->buf, TextureMatrix0,  m[0]);	WRITEF(gmesa->buf, TextureMatrix1,  m[1]);	WRITEF(gmesa->buf, TextureMatrix2,  m[2]);	WRITEF(gmesa->buf, TextureMatrix3,  m[3]);	WRITEF(gmesa->buf, TextureMatrix4,  m[4]);	WRITEF(gmesa->buf, TextureMatrix5,  m[5]);	WRITEF(gmesa->buf, TextureMatrix6,  m[6]);	WRITEF(gmesa->buf, TextureMatrix7,  m[7]);	WRITEF(gmesa->buf, TextureMatrix8,  m[8]);	WRITEF(gmesa->buf, TextureMatrix9,  m[9]);	WRITEF(gmesa->buf, TextureMatrix10,  m[10]);	WRITEF(gmesa->buf, TextureMatrix11,  m[11]);	WRITEF(gmesa->buf, TextureMatrix12,  m[12]);	WRITEF(gmesa->buf, TextureMatrix13,  m[13]);	WRITEF(gmesa->buf, TextureMatrix14,  m[14]);	WRITEF(gmesa->buf, TextureMatrix15,  m[15]);	break;    default:	/* ERROR!!! -- how did this happen? */	break;    }    gmesa->dirty |= GAMMA_UPLOAD_TRANSFORM;}#endif/* ============================================================= * State enable/disable */static void gammaDDEnable( GLcontext *ctx, GLenum cap, GLboolean state ){   gammaContextPtr gmesa = GAMMA_CONTEXT(ctx);   switch ( cap ) {   case GL_ALPHA_TEST:   case GL_BLEND:      FLUSH_BATCH( gmesa );      gmesa->new_state |= GAMMA_NEW_ALPHA;      break;   case GL_CULL_FACE:      FLUSH_BATCH( gmesa );      gmesa->new_state |= GAMMA_NEW_CULL;      break;   case GL_DEPTH_TEST:      FLUSH_BATCH( gmesa );      gmesa->new_state |= GAMMA_NEW_DEPTH;      break;   case GL_DITHER:      do {	 u_int32_t d = gmesa->DitherMode;	 FLUSH_BATCH( gmesa );	 if ( state ) {	    d |=  DM_DitherEnable;	 } else {	    d &= ~DM_DitherEnable;	 }	 if ( gmesa->DitherMode != d ) {	    gmesa->DitherMode = d;	    gmesa->dirty |= GAMMA_UPLOAD_DITHER;	 }      } while (0);      break;#if 0   case GL_FOG:      FLUSH_BATCH( gmesa );      gmesa->new_state |= GAMMA_NEW_FOG;      break;#endif   case GL_INDEX_LOGIC_OP:   case GL_COLOR_LOGIC_OP:      FLUSH_BATCH( gmesa );      gmesa->new_state |= GAMMA_NEW_LOGICOP;      break;#if ENABLELIGHTING   case GL_LIGHTING:      do {	 u_int32_t l = gmesa->LightingMode;	 FLUSH_BATCH( gmesa );	 if ( state ) {	    l |=  LightingModeEnable;	 } else {	    l &= ~LightingModeEnable;	 }	 if ( gmesa->LightingMode != l ) {	    gmesa->LightingMode = l;	    gmesa->dirty |= GAMMA_UPLOAD_LIGHT;	 }      } while (0);      break;   case GL_COLOR_MATERIAL:

⌨️ 快捷键说明

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