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

📄 prog_statevars.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	    _math_matrix_analyse( (GLmatrix*) matrix );            m = matrix->inv;         }         else {            m = matrix->m;         }         if (modifier == STATE_MATRIX_TRANSPOSE ||             modifier == STATE_MATRIX_INVTRANS) {            for (i = 0, row = firstRow; row <= lastRow; row++) {               value[i++] = m[row * 4 + 0];               value[i++] = m[row * 4 + 1];               value[i++] = m[row * 4 + 2];               value[i++] = m[row * 4 + 3];            }         }         else {            for (i = 0, row = firstRow; row <= lastRow; row++) {               value[i++] = m[row + 0];               value[i++] = m[row + 4];               value[i++] = m[row + 8];               value[i++] = m[row + 12];            }         }      }      return;   case STATE_DEPTH_RANGE:      value[0] = ctx->Viewport.Near;                     /* near       */      value[1] = ctx->Viewport.Far;                      /* far        */      value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */      value[3] = 1.0;      return;   case STATE_FRAGMENT_PROGRAM:      {         /* state[1] = {STATE_ENV, STATE_LOCAL} */         /* state[2] = parameter index          */         const int idx = (int) state[2];         switch (state[1]) {            case STATE_ENV:               COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);               break;            case STATE_LOCAL:               COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]);               break;            default:               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");               return;         }      }      return;   case STATE_VERTEX_PROGRAM:      {         /* state[1] = {STATE_ENV, STATE_LOCAL} */         /* state[2] = parameter index          */         const int idx = (int) state[2];         switch (state[1]) {            case STATE_ENV:               COPY_4V(value, ctx->VertexProgram.Parameters[idx]);               break;            case STATE_LOCAL:               COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]);               break;            default:               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");               return;         }      }      return;   case STATE_NORMAL_SCALE:      ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);      return;   case STATE_INTERNAL:      switch (state[1]) {      case STATE_NORMAL_SCALE:         ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);         return;      case STATE_TEXRECT_SCALE:         {            const int unit = (int) state[2];            const struct gl_texture_object *texObj               = ctx->Texture.Unit[unit]._Current;            if (texObj) {               struct gl_texture_image *texImage = texObj->Image[0][0];               ASSIGN_4V(value, (GLfloat) (1.0 / texImage->Width),                         (GLfloat)(1.0 / texImage->Height),                         0.0f, 1.0f);            }         }         return;      case STATE_FOG_PARAMS_OPTIMIZED:         /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog)          * might be more expensive than EX2 on some hw, plus it needs          * another constant (e) anyway. Linear fog can now be done with a          * single MAD.          * linear: fogcoord * -1/(end-start) + end/(end-start)          * exp: 2^-(density/ln(2) * fogcoord)          * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2)          */         value[0] = (ctx->Fog.End == ctx->Fog.Start)            ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start));         value[1] = ctx->Fog.End * -value[0];         value[2] = ctx->Fog.Density * ONE_DIV_LN2;         value[3] = ctx->Fog.Density * ONE_DIV_SQRT_LN2;         return;      case STATE_SPOT_DIR_NORMALIZED: {         /* here, state[2] is the light number */         /* pre-normalize spot dir */         const GLuint ln = (GLuint) state[2];         COPY_3V(value, ctx->Light.Light[ln].EyeDirection);         NORMALIZE_3FV(value);         value[3] = ctx->Light.Light[ln]._CosCutoff;         return;      }      case STATE_PT_SCALE:         value[0] = ctx->Pixel.RedScale;         value[1] = ctx->Pixel.GreenScale;         value[2] = ctx->Pixel.BlueScale;         value[3] = ctx->Pixel.AlphaScale;         break;      case STATE_PT_BIAS:         value[0] = ctx->Pixel.RedBias;         value[1] = ctx->Pixel.GreenBias;         value[2] = ctx->Pixel.BlueBias;         value[3] = ctx->Pixel.AlphaBias;         break;      case STATE_PCM_SCALE:         COPY_4V(value, ctx->Pixel.PostColorMatrixScale);         break;      case STATE_PCM_BIAS:         COPY_4V(value, ctx->Pixel.PostColorMatrixBias);         break;      case STATE_SHADOW_AMBIENT:         {            const int unit = (int) state[2];            const struct gl_texture_object *texObj               = ctx->Texture.Unit[unit]._Current;            if (texObj) {               value[0] = texObj->ShadowAmbient;               value[1] = texObj->ShadowAmbient;               value[2] = texObj->ShadowAmbient;               value[3] = texObj->ShadowAmbient;            }         }         return;      default:         /* unknown state indexes are silently ignored          *  should be handled by the driver.          */         return;      }      return;   default:      _mesa_problem(ctx, "Invalid state in _mesa_fetch_state");      return;   }}/** * Return a bitmask of the Mesa state flags (_NEW_* values) which would * indicate that the given context state may have changed. * The bitmask is used during validation to determine if we need to update * vertex/fragment program parameters (like "state.material.color") when * some GL state has changed. */GLbitfield_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]){   switch (state[0]) {   case STATE_MATERIAL:   case STATE_LIGHT:   case STATE_LIGHTMODEL_AMBIENT:   case STATE_LIGHTMODEL_SCENECOLOR:   case STATE_LIGHTPROD:      return _NEW_LIGHT;   case STATE_TEXGEN:   case STATE_TEXENV_COLOR:      return _NEW_TEXTURE;   case STATE_FOG_COLOR:   case STATE_FOG_PARAMS:      return _NEW_FOG;   case STATE_CLIPPLANE:      return _NEW_TRANSFORM;   case STATE_POINT_SIZE:   case STATE_POINT_ATTENUATION:      return _NEW_POINT;   case STATE_MODELVIEW_MATRIX:      return _NEW_MODELVIEW;   case STATE_PROJECTION_MATRIX:      return _NEW_PROJECTION;   case STATE_MVP_MATRIX:      return _NEW_MODELVIEW | _NEW_PROJECTION;   case STATE_TEXTURE_MATRIX:      return _NEW_TEXTURE_MATRIX;   case STATE_PROGRAM_MATRIX:      return _NEW_TRACK_MATRIX;   case STATE_COLOR_MATRIX:      return _NEW_COLOR_MATRIX;   case STATE_DEPTH_RANGE:      return _NEW_VIEWPORT;   case STATE_FRAGMENT_PROGRAM:   case STATE_VERTEX_PROGRAM:      return _NEW_PROGRAM;   case STATE_NORMAL_SCALE:      return _NEW_MODELVIEW;   case STATE_INTERNAL:      switch (state[1]) {      case STATE_TEXRECT_SCALE:      case STATE_SHADOW_AMBIENT:	 return _NEW_TEXTURE;      case STATE_FOG_PARAMS_OPTIMIZED:	 return _NEW_FOG;      default:         /* unknown state indexes are silently ignored and         *  no flag set, since it is handled by the driver.         */	 return 0;      }   default:      _mesa_problem(NULL, "unexpected state[0] in make_state_flags()");      return 0;   }}static voidappend(char *dst, const char *src){   while (*dst)      dst++;   while (*src)     *dst++ = *src++;   *dst = 0;}static voidappend_token(char *dst, gl_state_index k){   switch (k) {   case STATE_MATERIAL:      append(dst, "material");      break;   case STATE_LIGHT:      append(dst, "light");      break;   case STATE_LIGHTMODEL_AMBIENT:      append(dst, "lightmodel.ambient");      break;   case STATE_LIGHTMODEL_SCENECOLOR:      break;   case STATE_LIGHTPROD:      append(dst, "lightprod");      break;   case STATE_TEXGEN:      append(dst, "texgen");      break;   case STATE_FOG_COLOR:      append(dst, "fog.color");      break;   case STATE_FOG_PARAMS:      append(dst, "fog.params");      break;   case STATE_CLIPPLANE:      append(dst, "clip");      break;   case STATE_POINT_SIZE:      append(dst, "point.size");      break;   case STATE_POINT_ATTENUATION:      append(dst, "point.attenuation");      break;   case STATE_MODELVIEW_MATRIX:      append(dst, "matrix.modelview");      break;   case STATE_PROJECTION_MATRIX:      append(dst, "matrix.projection");      break;   case STATE_MVP_MATRIX:      append(dst, "matrix.mvp");      break;   case STATE_TEXTURE_MATRIX:      append(dst, "matrix.texture");      break;   case STATE_PROGRAM_MATRIX:      append(dst, "matrix.program");      break;   case STATE_COLOR_MATRIX:      append(dst, "matrix.color");      break;   case STATE_MATRIX_INVERSE:      append(dst, ".inverse");      break;   case STATE_MATRIX_TRANSPOSE:      append(dst, ".transpose");      break;   case STATE_MATRIX_INVTRANS:      append(dst, ".invtrans");      break;   case STATE_AMBIENT:      append(dst, ".ambient");      break;   case STATE_DIFFUSE:      append(dst, ".diffuse");      break;   case STATE_SPECULAR:      append(dst, ".specular");      break;   case STATE_EMISSION:      append(dst, ".emission");      break;   case STATE_SHININESS:      append(dst, "lshininess");

⌨️ 快捷键说明

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