📄 prog_statevars.c
字号:
_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 + -