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

📄 prog_statevars.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
      break;   case STATE_HALF_VECTOR:      append(dst, ".half");      break;   case STATE_POSITION:      append(dst, ".position");      break;   case STATE_ATTENUATION:      append(dst, ".attenuation");      break;   case STATE_SPOT_DIRECTION:      append(dst, ".spot.direction");      break;   case STATE_SPOT_CUTOFF:      append(dst, ".spot.cutoff");      break;   case STATE_TEXGEN_EYE_S:      append(dst, "eye.s");      break;   case STATE_TEXGEN_EYE_T:      append(dst, "eye.t");      break;   case STATE_TEXGEN_EYE_R:      append(dst, "eye.r");      break;   case STATE_TEXGEN_EYE_Q:      append(dst, "eye.q");      break;   case STATE_TEXGEN_OBJECT_S:      append(dst, "object.s");      break;   case STATE_TEXGEN_OBJECT_T:      append(dst, "object.t");      break;   case STATE_TEXGEN_OBJECT_R:      append(dst, "object.r");      break;   case STATE_TEXGEN_OBJECT_Q:      append(dst, "object.q");      break;   case STATE_TEXENV_COLOR:      append(dst, "texenv");      break;   case STATE_DEPTH_RANGE:      append(dst, "depth.range");      break;   case STATE_VERTEX_PROGRAM:   case STATE_FRAGMENT_PROGRAM:      break;   case STATE_ENV:      append(dst, "env");      break;   case STATE_LOCAL:      append(dst, "local");      break;   case STATE_NORMAL_SCALE:      append(dst, "normalScale");      break;   case STATE_INTERNAL:   case STATE_POSITION_NORMALIZED:      append(dst, "(internal)");      break;   case STATE_PT_SCALE:      append(dst, "PTscale");      break;   case STATE_PT_BIAS:      append(dst, "PTbias");      break;   case STATE_PCM_SCALE:      append(dst, "PCMscale");      break;   case STATE_PCM_BIAS:      append(dst, "PCMbias");      break;   case STATE_SHADOW_AMBIENT:      append(dst, "ShadowAmbient");      break;   default:      ;   }}static voidappend_face(char *dst, GLint face){   if (face == 0)      append(dst, "front.");   else      append(dst, "back.");}static voidappend_index(char *dst, GLint index){   char s[20];   _mesa_sprintf(s, "[%d]", index);   append(dst, s);}/** * Make a string from the given state vector. * For example, return "state.matrix.texture[2].inverse". * Use _mesa_free() to deallocate the string. */const char *_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]){   char str[1000] = "";   char tmp[30];   append(str, "state.");   append_token(str, (gl_state_index) state[0]);   switch (state[0]) {   case STATE_MATERIAL:      append_face(str, state[1]);      append_token(str, (gl_state_index) state[2]);      break;   case STATE_LIGHT:      append_index(str, state[1]); /* light number [i]. */      append_token(str, (gl_state_index) state[2]); /* coefficients */      break;   case STATE_LIGHTMODEL_AMBIENT:      append(str, "lightmodel.ambient");      break;   case STATE_LIGHTMODEL_SCENECOLOR:      if (state[1] == 0) {         append(str, "lightmodel.front.scenecolor");      }      else {         append(str, "lightmodel.back.scenecolor");      }      break;   case STATE_LIGHTPROD:      append_index(str, state[1]); /* light number [i]. */      append_face(str, state[2]);      append_token(str, (gl_state_index) state[3]);      break;   case STATE_TEXGEN:      append_index(str, state[1]); /* tex unit [i] */      append_token(str, (gl_state_index) state[2]); /* plane coef */      break;   case STATE_TEXENV_COLOR:      append_index(str, state[1]); /* tex unit [i] */      append(str, "color");      break;   case STATE_CLIPPLANE:      append_index(str, state[1]); /* plane [i] */      append(str, ".plane");      break;   case STATE_MODELVIEW_MATRIX:   case STATE_PROJECTION_MATRIX:   case STATE_MVP_MATRIX:   case STATE_TEXTURE_MATRIX:   case STATE_PROGRAM_MATRIX:   case STATE_COLOR_MATRIX:      {         /* state[0] = modelview, projection, texture, etc. */         /* state[1] = which texture matrix or program matrix */         /* state[2] = first row to fetch */         /* state[3] = last row to fetch */         /* state[4] = transpose, inverse or invtrans */         const gl_state_index mat = (gl_state_index) state[0];         const GLuint index = (GLuint) state[1];         const GLuint firstRow = (GLuint) state[2];         const GLuint lastRow = (GLuint) state[3];         const gl_state_index modifier = (gl_state_index) state[4];         if (index ||             mat == STATE_TEXTURE_MATRIX ||             mat == STATE_PROGRAM_MATRIX)            append_index(str, index);         if (modifier)            append_token(str, modifier);         if (firstRow == lastRow)            _mesa_sprintf(tmp, ".row[%d]", firstRow);         else            _mesa_sprintf(tmp, ".row[%d..%d]", firstRow, lastRow);         append(str, tmp);      }      break;   case STATE_POINT_SIZE:      break;   case STATE_POINT_ATTENUATION:      break;   case STATE_FOG_PARAMS:      break;   case STATE_FOG_COLOR:      break;   case STATE_DEPTH_RANGE:      break;   case STATE_FRAGMENT_PROGRAM:   case STATE_VERTEX_PROGRAM:      /* state[1] = {STATE_ENV, STATE_LOCAL} */      /* state[2] = parameter index          */      append_token(str, (gl_state_index) state[1]);      append_index(str, state[2]);      break;   case STATE_INTERNAL:      break;   default:      _mesa_problem(NULL, "Invalid state in _mesa_program_state_string");      break;   }   return _mesa_strdup(str);}/** * Loop over all the parameters in a parameter list.  If the parameter * is a GL state reference, look up the current value of that state * variable and put it into the parameter's Value[4] array. * This would be called at glBegin time when using a fragment program. */void_mesa_load_state_parameters(GLcontext *ctx,                            struct gl_program_parameter_list *paramList){   GLuint i;   if (!paramList)      return;   /*assert(ctx->Driver.NeedFlush == 0);*/   for (i = 0; i < paramList->NumParameters; i++) {      if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {         _mesa_fetch_state(ctx,			   (gl_state_index *) paramList->Parameters[i].StateIndexes,                           paramList->ParameterValues[i]);      }   }}/** * Copy the 16 elements of a matrix into four consecutive program * registers starting at 'pos'. */static voidload_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16]){   GLuint i;   for (i = 0; i < 4; i++) {      registers[pos + i][0] = mat[0 + i];      registers[pos + i][1] = mat[4 + i];      registers[pos + i][2] = mat[8 + i];      registers[pos + i][3] = mat[12 + i];   }}/** * As above, but transpose the matrix. */static voidload_transpose_matrix(GLfloat registers[][4], GLuint pos,                      const GLfloat mat[16]){   MEMCPY(registers[pos], mat, 16 * sizeof(GLfloat));}/** * Load current vertex program's parameter registers with tracked * matrices (if NV program).  This only needs to be done per * glBegin/glEnd, not per-vertex. */void_mesa_load_tracked_matrices(GLcontext *ctx){   GLuint i;   for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {      /* point 'mat' at source matrix */      GLmatrix *mat;      if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {         mat = ctx->ModelviewMatrixStack.Top;      }      else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {         mat = ctx->ProjectionMatrixStack.Top;      }      else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {         mat = ctx->TextureMatrixStack[ctx->Texture.CurrentUnit].Top;      }      else if (ctx->VertexProgram.TrackMatrix[i] == GL_COLOR) {         mat = ctx->ColorMatrixStack.Top;      }      else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {         /* XXX verify the combined matrix is up to date */         mat = &ctx->_ModelProjectMatrix;      }      else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&               ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {         GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;         ASSERT(n < MAX_PROGRAM_MATRICES);         mat = ctx->ProgramMatrixStack[n].Top;      }      else {         /* no matrix is tracked, but we leave the register values as-is */         assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);         continue;      }      /* load the matrix values into sequential registers */      if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);      }      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {         _math_matrix_analyse(mat); /* update the inverse */         ASSERT(!_math_matrix_is_dirty(mat));         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);      }      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);      }      else {         assert(ctx->VertexProgram.TrackMatrixTransform[i]                == GL_INVERSE_TRANSPOSE_NV);         _math_matrix_analyse(mat); /* update the inverse */         ASSERT(!_math_matrix_is_dirty(mat));         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);      }   }}

⌨️ 快捷键说明

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