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

📄 vertex.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
GLAPI void APIENTRY glSecondaryColorPointer(GLint size, GLenum type, GLsizei stride,
											const GLvoid *pointer)
   {
   HUINT32 ui32ImpliedStride;

   __GL_GET_CONTEXT();
   HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);

   if (stride < 0 || size != 4)
      {
      SetError(gc, GL_INVALID_VALUE);
      return;
      }

   switch(type)
      {
      case GL_UNSIGNED_BYTE:
         ui32ImpliedStride = 4;
         break;

      case GL_FIXED:
         ui32ImpliedStride = 16;
         break;

#if defined(PROFILE_COMMON)
      case GL_FLOAT:
         ui32ImpliedStride = 16;
         break;
#endif

      default:
         SetError(gc, GL_INVALID_ENUM);
         return;
      }

   if(stride == 0)
      {
      stride = ui32ImpliedStride;
      }

   gc->sVertexArray.sSCPState.ctlFormat   = CTLAFORMAT_NONE;
   gc->sVertexArray.sSCPState.pui8Pointer = (IMG_UINT8 *)pointer;
   gc->sVertexArray.sSCPState.ui32Stride  = stride;
   gc->sVertexArray.sSCPState.ui32Size    = size;

   HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);

   }  /* glSecondaryColorPointer */


/***********************************************************************************
 Function Name      : glNormalPointer
 Inputs             : type, stride, pointer
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Sets array pointer/type  for normal data
************************************************************************************/
GLAPI void APIENTRY glNormalPointer(GLenum type, GLsizei stride, const GLvoid *pointer)
   {
   CTL_ARRAY_FORMAT ctlFmt = CTLAFORMAT_NONE;
   IMG_UINT32 ui32ImpliedStride;

   __GL_GET_CONTEXT();
   HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);

   if (stride < 0)
      {
      SetError(gc, GL_INVALID_VALUE);
      return;
      }

   switch(type)
      {
      case GL_BYTE:
         ctlFmt = CTLAFORMAT_INT8;
         ui32ImpliedStride = 3;
         break;

      case GL_SHORT:
         ctlFmt = CTLAFORMAT_INT16;
         ui32ImpliedStride = 6;
         break;

      case GL_FIXED:
         ctlFmt = CTLAFORMAT_FIXED;
         ui32ImpliedStride = 12;
         break;

#if defined(PROFILE_COMMON)
      case GL_FLOAT:
         ctlFmt = CTLAFORMAT_FLOAT;
         ui32ImpliedStride = 12;
         break;
#endif

      default:
         SetError(gc, GL_INVALID_ENUM);
         return;
      }

   if(stride == 0)
      {
      stride = ui32ImpliedStride;
      }

   gc->sVertexArray.sNPState.ctlFormat   = ctlFmt;
   gc->sVertexArray.sNPState.pui8Pointer = (IMG_UINT8 *)pointer;
   gc->sVertexArray.sNPState.ui32Stride  = stride;
   gc->sVertexArray.sNPState.ui32Size    = 3;

   HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);

   }  /* glNormalPointer */


/***********************************************************************************
 Function Name      : glTexCoordPointer
 Inputs             : size, type, stride, pointer
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Sets array pointer/size/type  for texcoord data.
					  Applies to active texture coordinate array unit.
************************************************************************************/
GLAPI void APIENTRY glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)
   {
   CTL_ARRAY_FORMAT ctlFmt = CTLAFORMAT_NONE;
   IMG_UINT32 ui32ImpliedStride;
   IMG_UINT32 ui32Unit = 0;

   __GL_GET_CONTEXT();
   HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);

   ui32Unit = gc->ui32ClientActiveTexture;

   if (stride < 0 || size < 2 || size > 4)
      {
      SetError(gc, GL_INVALID_VALUE);
      return;
      }

   switch(type)
      {
      case GL_BYTE:
         ctlFmt = CTLAFORMAT_INT8;
         ui32ImpliedStride = size;
         break;

      case GL_SHORT:
         ctlFmt = CTLAFORMAT_INT16;
         ui32ImpliedStride = 2 * size;
         break;

      case GL_FIXED:
         ctlFmt = CTLAFORMAT_FIXED;
         ui32ImpliedStride = 4 * size;
         break;

#if defined(PROFILE_COMMON)
      case GL_FLOAT:
         ctlFmt = CTLAFORMAT_FLOAT;
         ui32ImpliedStride = 4 * size;
         break;
#endif

      default:
         SetError(gc, GL_INVALID_ENUM);
         return;
      }

   if(stride == 0)
      {
      stride = ui32ImpliedStride;
      }

   gc->sVertexArray.asTPState[ui32Unit].ctlFormat   = ctlFmt;
   gc->sVertexArray.asTPState[ui32Unit].pui8Pointer = (IMG_UINT8 *)pointer;
   gc->sVertexArray.asTPState[ui32Unit].ui32Stride  = stride;
   gc->sVertexArray.asTPState[ui32Unit].ui32Size    = size;

   HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);

   }  /* glTexCoordPointer */


/***********************************************************************************
 Function Name      : glVertexPointer
 Inputs             : size, type, stride, pointer
 Outputs            : -
 Returns            : -
 Description        : ENTRYPOINT: Sets array pointer/size/type  for vertex data
************************************************************************************/
GLAPI void APIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride,
									const GLvoid *pointer)
   {
   CTL_ARRAY_FORMAT ctlFmt = CTLAFORMAT_NONE;
   IMG_UINT32 ui32ImpliedStride;

   __GL_GET_CONTEXT();
   HXF_PROFILER_START(HXFPROFILE_STATE_VERTEX);

   if (stride < 0 || size < 2 || size > 4)
      {
      SetError(gc, GL_INVALID_VALUE);
      return;
      }

   switch(type)
      {
      case GL_BYTE:
         ctlFmt = CTLAFORMAT_INT8;
         ui32ImpliedStride = size;
         break;

      case GL_SHORT:
         ctlFmt = CTLAFORMAT_INT16;
         ui32ImpliedStride = 2 * size;
         break;

      case GL_FIXED:
         ctlFmt = CTLAFORMAT_FIXED;
         ui32ImpliedStride = 4 *size;
         break;

#if defined(PROFILE_COMMON)
      case GL_FLOAT:
         ctlFmt = CTLAFORMAT_FLOAT;
         ui32ImpliedStride = 4 * size;
         break;
#endif

      default:
         SetError(gc, GL_INVALID_ENUM);
         return;
      }

   if(stride == 0)
      {
      stride = ui32ImpliedStride;
      }

   gc->sVertexArray.sVPState.ctlFormat   = ctlFmt;
   gc->sVertexArray.sVPState.pui8Pointer = (IMG_UINT8 *)pointer;
   gc->sVertexArray.sVPState.ui32Stride  = stride;
   gc->sVertexArray.sVPState.ui32Size    = size;

   HXF_PROFILER_STOP(HXFPROFILE_STATE_VERTEX);
   
   }  /* glVertexPointer */


/***********************************************************************************
 Function Name      : SetupPrimitiveType
 Inputs             :
 Outputs            : -
 Returns            : -
 Description        :
************************************************************************************/
static HBOOL SetupPrimitiveType( GLESContext* gc, GLenum mode, GLint NumIndices, 
      CTL_PRIMITIVE_TYPE* pPT, CTLU32* pu32NumPrimitives )
   {
   gc->sHWContext.ui32PrimitiveHeader &= MBX1_TAOBJTYPE_TYPECLRMASK;

   *pPT = CTLPRIMITIVE_POINTS;
   *pu32NumPrimitives = 0;

   switch(mode)
      {
      case GL_POINTS:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_POINTS | gc->sHWContext.ui32PrimitiveHeader;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_POINTSIZE, 
            *((CTLU32*)gc->sState.sPoint.pfPointSize) );
         *pu32NumPrimitives = NumIndices;
         *pPT = CTLPRIMITIVE_POINTS;
         break;  // GL_POINTS

      case GL_LINES:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXLINESTRIP | gc->sHWContext.ui32PrimitiveHeader;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_LINEWIDTH,
            *((CTLU32*)gc->sState.sLine.pfLineWidth) );
         *pu32NumPrimitives = NumIndices >> 1;
         *pPT = CTLPRIMITIVE_LINELIST;
         break;  // GL_LINES

      case GL_LINE_LOOP:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXLINESTRIP | gc->sHWContext.ui32PrimitiveHeader;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_LINEWIDTH,
            *((CTLU32*)gc->sState.sLine.pfLineWidth) );
         *pu32NumPrimitives = NumIndices - 1;
         *pPT = CTLPRIMITIVE_LINELOOP;
         break;  // GL_LINE_LOOP

      case GL_LINE_STRIP:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXLINESTRIP | gc->sHWContext.ui32PrimitiveHeader;
         CTL_SetStateVariable( gc->sTransform.ctl, CTLSTATE_LINEWIDTH,
            *((CTLU32*)gc->sState.sLine.pfLineWidth) );
         *pu32NumPrimitives = NumIndices - 1;
         *pPT = CTLPRIMITIVE_LINESTRIP;
         break;  // GL_LINE_STRIP

      case GL_TRIANGLES:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXFACELIST | gc->sHWContext.ui32PrimitiveHeader;
         *pu32NumPrimitives = NumIndices / 3;
         *pPT = CTLPRIMITIVE_TRILIST;
         break;  // GL_TRIANGLES

      case GL_TRIANGLE_STRIP:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXFACESTRIP | gc->sHWContext.ui32PrimitiveHeader;
         *pu32NumPrimitives = NumIndices - 2;
         *pPT = CTLPRIMITIVE_TRISTRIP;
         break;  // GL_TRIANGLE_STRIP

      case GL_TRIANGLE_FAN:
         gc->sHWContext.ui32PrimitiveHeader = MBX1_TAOBJTYPE_VERTEXFACEFAN | gc->sHWContext.ui32PrimitiveHeader;
         *pu32NumPrimitives = NumIndices - 2;
         *pPT = CTLPRIMITIVE_TRIFAN;
         break;  // GL_TRIANGLE_FAN

      default:
         SetError(gc, GL_INVALID_ENUM);
         return HFALSE;
      }  // switch

   return HTRUE;

   }  /* SetupPrimitiveType */


/***********************************************************************************
 Function Name      : SetupPrimitiveType
 Inputs             :
 Outputs            : -
 Returns            : -
 Description        :
************************************************************************************/
static void DoDrawPrimitive(GLESContext* gc,
								GLenum mode, GLint FirstVtx,
								GLint VtxCount,
								GLint NumIndices,
								IMG_UINT16* pIndices)
   {
   CTL_PRIMITIVE_TYPE ctlPT = CTLPRIMITIVE_POINTS;
   CTLU32 u32NumPrimitives = 0;

   if(!SetupPrimitiveType(gc, mode, NumIndices, &ctlPT, &u32NumPrimitives ))

⌨️ 快捷键说明

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