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

📄 arbprogparse.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
      assert(**inst == 0); /* integer string should end with 0 */      (*inst)++; /* skip over terminating 0 */      Program->Position = parse_position(inst); /* skip position (from integer) */   }   if (scale)      *scale = oscale;   return value;}/**  Parse an unsigned floating-point number from this stream of tokenized  characters.  Example floating-point formats supported:     12.34     12     0.34     .34     12.34e-4 */static GLfloatparse_float (const GLubyte ** inst, struct arb_program *Program){   GLint exponent;   GLdouble whole, fraction, fracScale = 1.0;   whole = parse_float_string(inst, Program, 0);   fraction = parse_float_string(inst, Program, &fracScale);      /* Parse signed exponent */   exponent = parse_integer(inst, Program);   /* This is the exponent */   /* Assemble parts of floating-point number: */   return (GLfloat) ((whole + fraction / fracScale) *                     _mesa_pow(10.0, (GLfloat) exponent));}/** */static GLfloatparse_signed_float (const GLubyte ** inst, struct arb_program *Program){   GLint sign = parse_sign (inst);   GLfloat value = parse_float (inst, Program);   return value * sign;}/** * This picks out a constant value from the parsed array. The constant vector is r * returned in the *values array, which should be of length 4. * * \param values - The 4 component vector with the constant value in it */static GLvoidparse_constant (const GLubyte ** inst, GLfloat *values, struct arb_program *Program,                GLboolean use){   GLuint components, i;   switch (*(*inst)++) {      case CONSTANT_SCALAR:         if (use == GL_TRUE) {            values[0] =               values[1] =               values[2] = values[3] = parse_float (inst, Program);         }         else {            values[0] =               values[1] =               values[2] = values[3] = parse_signed_float (inst, Program);         }         break;      case CONSTANT_VECTOR:         values[0] = values[1] = values[2] = 0;         values[3] = 1;         components = *(*inst)++;         for (i = 0; i < components; i++) {            values[i] = parse_signed_float (inst, Program);         }         break;   }}/** * \param offset The offset from the address register that we should *                address * * \return 0 on sucess, 1 on error */static GLuintparse_relative_offset(GLcontext *ctx, const GLubyte **inst,                      struct arb_program *Program, GLint *offset){   (void) ctx;   *offset = parse_integer(inst, Program);   return 0;}/** * \param  color 0 if color type is primary, 1 if color type is secondary * \return 0 on sucess, 1 on error */static GLuintparse_color_type (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program,                  GLint * color){   (void) ctx; (void) Program;   *color = *(*inst)++ != COLOR_PRIMARY;   return 0;}/** * Get an integer corresponding to a generic vertex attribute. * * \return 0 on sucess, 1 on error */static GLuintparse_generic_attrib_num(GLcontext *ctx, const GLubyte ** inst,                       struct arb_program *Program, GLuint *attrib){   GLint i = parse_integer(inst, Program);   if ((i < 0) || (i >= MAX_VERTEX_PROGRAM_ATTRIBS))   {      program_error(ctx, Program->Position,                    "Invalid generic vertex attribute index");      return 1;   }   *attrib = (GLuint) i;   return 0;}/** * \param color The index of the color buffer to write into * \return 0 on sucess, 1 on error */static GLuintparse_output_color_num (GLcontext * ctx, const GLubyte ** inst,                    struct arb_program *Program, GLuint * color){   GLint i = parse_integer (inst, Program);   if ((i < 0) || (i >= (int)ctx->Const.MaxDrawBuffers)) {      program_error(ctx, Program->Position, "Invalid draw buffer index");      return 1;   }   *color = (GLuint) i;   return 0;}/** * \param coord The texture unit index * \return 0 on sucess, 1 on error */static GLuintparse_texcoord_num (GLcontext * ctx, const GLubyte ** inst,                    struct arb_program *Program, GLuint * coord){   GLint i = parse_integer (inst, Program);   if ((i < 0) || (i >= (int)ctx->Const.MaxTextureUnits)) {      program_error(ctx, Program->Position, "Invalid texture unit index");      return 1;   }   *coord = (GLuint) i;   return 0;}/** * \param coord The weight index * \return 0 on sucess, 1 on error */static GLuintparse_weight_num (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program,                  GLint * coord){   *coord = parse_integer (inst, Program);   if ((*coord < 0) || (*coord >= 1)) {      program_error(ctx, Program->Position, "Invalid weight index");      return 1;   }   return 0;}/** * \param coord The clip plane index * \return 0 on sucess, 1 on error */static GLuintparse_clipplane_num (GLcontext * ctx, const GLubyte ** inst,                     struct arb_program *Program, GLint * coord){   *coord = parse_integer (inst, Program);   if ((*coord < 0) || (*coord >= (GLint) ctx->Const.MaxClipPlanes)) {      program_error(ctx, Program->Position, "Invalid clip plane index");      return 1;   }   return 0;}/** * \return 0 on front face, 1 on back face */static GLuintparse_face_type (const GLubyte ** inst){   switch (*(*inst)++) {      case FACE_FRONT:         return 0;      case FACE_BACK:         return 1;   }   return 0;}/** * Given a matrix and a modifier token on the binary array, return tokens * that _mesa_fetch_state() [program.c] can understand. * * \param matrix - the matrix we are talking about * \param matrix_idx - the index of the matrix we have (for texture & program matricies) * \param matrix_modifier - the matrix modifier (trans, inv, etc) * \return 0 on sucess, 1 on failure */static GLuintparse_matrix (GLcontext * ctx, const GLubyte ** inst, struct arb_program *Program,              GLint * matrix, GLint * matrix_idx, GLint * matrix_modifier){   GLubyte mat = *(*inst)++;   *matrix_idx = 0;   switch (mat) {      case MATRIX_MODELVIEW:         *matrix = STATE_MODELVIEW_MATRIX;         *matrix_idx = parse_integer (inst, Program);         if (*matrix_idx > 0) {            program_error(ctx, Program->Position,                          "ARB_vertex_blend not supported");            return 1;         }         break;      case MATRIX_PROJECTION:         *matrix = STATE_PROJECTION_MATRIX;         break;      case MATRIX_MVP:         *matrix = STATE_MVP_MATRIX;         break;      case MATRIX_TEXTURE:         *matrix = STATE_TEXTURE_MATRIX;         *matrix_idx = parse_integer (inst, Program);         if (*matrix_idx >= (GLint) ctx->Const.MaxTextureUnits) {            program_error(ctx, Program->Position, "Invalid Texture Unit");            /* bad *matrix_id */            return 1;         }         break;         /* This is not currently supported (ARB_matrix_palette) */      case MATRIX_PALETTE:         *matrix_idx = parse_integer (inst, Program);         program_error(ctx, Program->Position,                       "ARB_matrix_palette not supported");         return 1;         break;      case MATRIX_PROGRAM:         *matrix = STATE_PROGRAM_MATRIX;         *matrix_idx = parse_integer (inst, Program);         if (*matrix_idx >= (GLint) ctx->Const.MaxProgramMatrices) {            program_error(ctx, Program->Position, "Invalid Program Matrix");            /* bad *matrix_idx */            return 1;         }         break;   }   switch (*(*inst)++) {      case MATRIX_MODIFIER_IDENTITY:         *matrix_modifier = 0;         break;      case MATRIX_MODIFIER_INVERSE:         *matrix_modifier = STATE_MATRIX_INVERSE;         break;      case MATRIX_MODIFIER_TRANSPOSE:         *matrix_modifier = STATE_MATRIX_TRANSPOSE;         break;      case MATRIX_MODIFIER_INVTRANS:         *matrix_modifier = STATE_MATRIX_INVTRANS;         break;   }   return 0;}/** * This parses a state string (rather, the binary version of it) into * a 6-token sequence as described in _mesa_fetch_state() [program.c] * * \param inst         - the start in the binary arry to start working from * \param state_tokens - the storage for the 6-token state description * \return             - 0 on sucess, 1 on error */static GLuintparse_state_single_item (GLcontext * ctx, const GLubyte ** inst,                         struct arb_program *Program,                         gl_state_index state_tokens[STATE_LENGTH]){   GLubyte token = *(*inst)++;   switch (token) {      case STATE_MATERIAL_PARSER:         state_tokens[0] = STATE_MATERIAL;         state_tokens[1] = parse_face_type (inst);         switch (*(*inst)++) {            case MATERIAL_AMBIENT:               state_tokens[2] = STATE_AMBIENT;               break;            case MATERIAL_DIFFUSE:               state_tokens[2] = STATE_DIFFUSE;               break;            case MATERIAL_SPECULAR:               state_tokens[2] = STATE_SPECULAR;               break;            case MATERIAL_EMISSION:               state_tokens[2] = STATE_EMISSION;	       break;            case MATERIAL_SHININESS:               state_tokens[2] = STATE_SHININESS;               break;         }         break;      case STATE_LIGHT_PARSER:         state_tokens[0] = STATE_LIGHT;         state_tokens[1] = parse_integer (inst, Program);         /* Check the value of state_tokens[1] against the # of lights */         if (state_tokens[1] >= (GLint) ctx->Const.MaxLights) {            program_error(ctx, Program->Position, "Invalid Light Number");            /* bad state_tokens[1] */            return 1;         }         switch (*(*inst)++) {            case LIGHT_AMBIENT:               state_tokens[2] = STATE_AMBIENT;               break;            case LIGHT_DIFFUSE:               state_tokens[2] = STATE_DIFFUSE;               break;            case LIGHT_SPECULAR:               state_tokens[2] = STATE_SPECULAR;               break;            case LIGHT_POSITION:               state_tokens[2] = STATE_POSITION;               break;            case LIGHT_ATTENUATION:               state_tokens[2] = STATE_ATTENUATION;               break;            case LIGHT_HALF:               state_tokens[2] = STATE_HALF_VECTOR;               break;            case LIGHT_SPOT_DIRECTION:               state_tokens[2] = STATE_SPOT_DIRECTION;               break;         }         break;      case STATE_LIGHT_MODEL:         switch (*(*inst)++) {            case LIGHT_MODEL_AMBIENT:               state_tokens[0] = STATE_LIGHTMODEL_AMBIENT;               break;            case LIGHT_MODEL_SCENECOLOR:               state_tokens[0] = STATE_LIGHTMODEL_SCENECOLOR;               state_tokens[1] = parse_face_type (inst);               break;         }         break;      case STATE_LIGHT_PROD:         state_tokens[0] = STATE_LIGHTPROD;         state_tokens[1] = parse_integer (inst, Program);         /* Check the value of state_tokens[1] against the # of lights */

⌨️ 快捷键说明

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