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

📄 primindexed.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#endif /* NON_OPT_IDX_TRI_LIST */


}
/***********************************************************************************
 Function Name      : IndexedTriangleStrip
************************************************************************************/
IMG_VOID IndexedTriangleStrip(LPD3DM_CONTEXT psContext,
							  IMG_UINT32	 ui32FVFcode, 
							  BYTE			 *pbVBData,
							  IMG_UINT32	 ui32VBByteStride,
							  BYTE			 *pbIBData,
							  IMG_UINT32	 ui32IBByteStride,
							  IMG_UINT32	 ui32PrimCount)
{
	IMG_UINT32			i;
	IMG_INT32			i32NumVerts/*, j*/;
	PVR_NATIVE_VERTEX	asVertex[3], *apsVertex[3], *psVTmp, **ppsVertex;
	IMG_UINT32			ui32ClipCode;
	IMG_BOOL			bNewStrip = IMG_TRUE;
	IMG_UINT32			ui32NumStrips = 0;
	IMG_UINT32			ui32IndexMask;
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	NTV_TYPE			ntvDepthM = D3DM_Zero;

	ui32IndexMask = psContext->ui32IndexMask;

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	
	/* construct native vertices */
	/* Validate index value to prevent access violations */
	if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
	{
		psContext->hrLastError = D3DMERR_INVALIDCALL;
		goto ErrorExit;
	}
	SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
						ui32FVFcode,
						apsVertex[0]);

	/* Advance pointer */
	pbIBData	+= ui32IBByteStride;
	pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

	/* Validate index value to prevent access violations */
	if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
	{
		psContext->hrLastError = D3DMERR_INVALIDCALL;
		goto ErrorExit;
	}
	SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
						ui32FVFcode,
						apsVertex[1]);

	/* Advance pointer */
	pbIBData	+= ui32IBByteStride;
	pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	
	/************************
		first time clip test
	************************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 2);

	for(i=0; i<ui32PrimCount; i++)
	{
		IMG_BOOL bIsCounterClockwise;
		IMG_BOOL bPassCullTest;

		/* construct native vertices */
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}
		SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
							ui32FVFcode,
							apsVertex[2]);

		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[2], 1);

		/**********************
			Depth bias
		**********************/
		if(psContext->sTState.dwRSFlags & TSTATE_RSFLAGS_DEPTHBIAS)
		{
			/* Calculate value of m */
			NTV_TYPE ntvNewDepthM = TriangleMaxDepthSlope(apsVertex[0]);

			/* if m is different from previous m then calculate depth bias offset */
			if(ntvNewDepthM != ntvDepthM)
			{
				CalculateDepthBias(psContext,ntvNewDepthM);

				ntvDepthM = ntvNewDepthM;
			}
		}

		/* any vertices clipped? */
		ui32ClipCode =	 (apsVertex[0]->ui32Flags 
						| apsVertex[1]->ui32Flags 
						| apsVertex[2]->ui32Flags) & D3DM_CLIPFLAG_MASK;
		
		if ((ui32ClipCode & D3DM_CLIPFLAG_NEAR) == 0)
		{
			/* Check cull status */
			bIsCounterClockwise = IsCounterClockWise(&apsVertex[0]);
			switch(psContext->dwTAPrimCtl & MBX1_TAPRIM_CULLMODEMASK)
			{
				case MBX1_TAPRIM_CULLMODENONE:
					bPassCullTest = IMG_TRUE;
					break;
				case MBX1_TAPRIM_CULLMODECW:
				{
					bPassCullTest = (bIsCounterClockwise ^ i) & 1;			
					break;
				}
				case MBX1_TAPRIM_CULLMODECCW:
				{
					bPassCullTest = (!bIsCounterClockwise ^ i) & 1;			
					break;
				}
				default:
					///error
					break;
			}			
		}
		else
		{
			bPassCullTest = IMG_TRUE;
		}

		if(!bPassCullTest)
		{
			bNewStrip = IMG_TRUE;
		}
		else if (ui32ClipCode == 0)	/* no clipping: */
		{
			if(bNewStrip)
			{
				/* Swap vertex order if we're on an odd prim */
				if(i & 1)
				{
					psVTmp = apsVertex[2];
					apsVertex[2] = apsVertex[1];
					apsVertex[1] = psVTmp;
				}

				if(ui32NumStrips)
				{
					TACSWriteEndPrim(psContext);
				}
				else
				{
					TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACESTRIP);
				}

				ui32NumStrips++;

				ValidateVertex(psContext, &apsVertex[0], 3);

				OutputVertices(psContext, &apsVertex[0], 3);

				/* Swap back vertex order if we're on an odd prim */
				if(i & 1)
				{
					psVTmp = apsVertex[2];
					apsVertex[2] = apsVertex[1];
					apsVertex[1] = psVTmp;
				}
				else
				{
					/* Only carry on with strip if we've started on an even prim */
					bNewStrip = IMG_FALSE;
				}
			}
			else
			{
				ValidateVertex(psContext, &apsVertex[2], 1);
				OutputVertices(psContext, &apsVertex[2], 1);
			}
		}
		else if (!(	apsVertex[0]->ui32Flags 
				&	apsVertex[1]->ui32Flags 
				&	apsVertex[2]->ui32Flags & D3DM_CLIPFLAG_MASK))
		{
			ValidateVertex(psContext, &apsVertex[0], 3);

			i32NumVerts = DoPolygonClip(psContext, &apsVertex[0], 3, ui32ClipCode);

			ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;

			if(ui32NumStrips)
			{
				TACSWriteLastPrim(psContext);
			}

			TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
			OutputVertices(psContext, ppsVertex, i32NumVerts);
			TACSWriteLastPrim(psContext);
			ui32NumStrips = 0;
			bNewStrip = IMG_TRUE;
		}
		else
		{
			bNewStrip = IMG_TRUE;			
		}

		/* advance vertices */
		psVTmp = apsVertex[0];
		apsVertex[0] = apsVertex[1];
		apsVertex[1] = apsVertex[2];
		apsVertex[2] = psVTmp;
	}

ErrorExit:
	
	/*
		Finish the primitive block
	*/
	if(ui32NumStrips)
	{
		TACSWriteLastPrim(psContext);
	}
}
/***********************************************************************************
 Function Name      : IndexedTriangleFan
************************************************************************************/
IMG_VOID IndexedTriangleFan(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	IMG_UINT32			i;
	PVR_NATIVE_VERTEX	asVertex[3], *apsVertex[3], *psVTmp, **ppsVertex;
	IMG_UINT32			ui32ClipCode;
	IMG_BOOL			bNewFan = IMG_TRUE;
	IMG_UINT32			ui32NumFans = 0;
	IMG_INT32			i32NumVerts/*, j*/;
	IMG_UINT32			ui32IndexMask;
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	NTV_TYPE			ntvDepthM = D3DM_Zero;

	ui32IndexMask = psContext->ui32IndexMask;

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	
	/* construct native vertices */
	/* Validate index value to prevent access violations */
	if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
	{
		psContext->hrLastError = D3DMERR_INVALIDCALL;
		goto ErrorExit;
	}
	SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
						ui32FVFcode,
						apsVertex[0]);

	/* Advance pointer */
	pbIBData	+= ui32IBByteStride;
	pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

	/* Validate index value to prevent access violations */
	if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
	{
		psContext->hrLastError = D3DMERR_INVALIDCALL;
		goto ErrorExit;
	}	
	SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
						ui32FVFcode,
						apsVertex[1]);

	/* Advance pointer */
	pbIBData	+= ui32IBByteStride;
	pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;
	
	/************************
		first time clip test
	************************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 2);

	for(i=0; i<ui32PrimCount; i++)
	{
		IMG_BOOL bPassCullTest;
		IMG_BOOL bIsCounterClockWise;

		/* construct native vertices */
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}	
		SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
							ui32FVFcode,
							apsVertex[2]);

		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[1]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[1]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[2], 1);

		/**********************
			Depth bias
		**********************/
		if(psContext->sTState.dwRSFlags & TSTATE_RSFLAGS_DEPTHBIAS)
		{
			/* Calculate value of m */
			NTV_TYPE ntvNewDepthM = TriangleMaxDepthSlope(apsVertex[0]);

			/* if m is different from previous m then calculate depth bias offset */
			if(ntvNewDepthM != ntvDepthM)
			{
				CalculateDepthBias(psContext,ntvNewDepthM);

				ntvDepthM = ntvNewDepthM;
			}
		}

		/* any vertices clipped? */
		ui32ClipCode =	 (apsVertex[0]->ui32Flags 
						| apsVertex[1]->ui32Flags 
						| apsVertex[2]->ui32Flags) & D3DM_CLIPFLAG_MASK;
		
		if ((ui32ClipCode & D3DM_CLIPFLAG_NEAR) == 0)
		{
			/* Check cull status */
			bIsCounterClockWise = IsCounterClockWise(&apsVertex[0]);
			switch(psContext->dwTAPrimCtl & MBX1_TAPRIM_CULLMODEMASK)
			{
				case MBX1_TAPRIM_CULLMODENONE:
					bPassCullTest = IMG_TRUE;
					break;
				case MBX1_TAPRIM_CULLMODECW:
					bPassCullTest = bIsCounterClockWise;			
					break;
				case MBX1_TAPRIM_CULLMODECCW:
					bPassCullTest = !bIsCounterClockWise;			
					break;
				default:
					///error
					break;
			}
		}
		else
		{
			bPassCullTest = IMG_TRUE;
		}

		if(!bPassCullTest)
		{	
			bNewFan = IMG_TRUE;
		}
		else if(ui32ClipCode == 0)	/* no clipping: */
		{
			if(bNewFan)
			{
				if(ui32NumFans)
				{
					TACSWriteEndPrim(psContext);
				}
				else
				{
					TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
				}

				ui32NumFans++;

				ValidateVertex(psContext, &apsVertex[0], 3);

				OutputVertices(psContext, &apsVertex[0], 3);

				bNewFan = IMG_FALSE;
			
			}
			else
			{
				ValidateVertex(psContext, &apsVertex[2], 1);
				OutputVertices(psContext, &apsVertex[2], 1);
			}
		}
		else if (!(	apsVertex[0]->ui32Flags 
				&	apsVertex[1]->ui32Flags 
				&	apsVertex[2]->ui32Flags & D3DM_CLIPFLAG_MASK))
		{
			ValidateVertex(psContext, &apsVertex[0], 3);

			i32NumVerts = DoPolygonClip(psContext, &apsVertex[0], 3, ui32ClipCode);

			ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;

			if(ui32NumFans)
			{
				TACSWriteEndPrim(psContext);
			}
			else
			{
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXFACEFAN);
			}
			
			OutputVertices(psContext, ppsVertex, i32NumVerts);

			ui32NumFans++;
			bNewFan = IMG_TRUE;
		}
		else
		{
			bNewFan = IMG_TRUE;			
		}

		/* advance vertices, leaving first one as is */
		psVTmp = apsVertex[1];
		apsVertex[1] = apsVertex[2];
		apsVertex[2] = psVTmp;
	}

ErrorExit:
	
	/*
		Finish the primitive block
	*/
	if(ui32NumFans)
	{
		TACSWriteLastPrim(psContext);
	}
}
/***********************************************************************************
 Function Name      : IndexedPointList
************************************************************************************/
IMG_VOID IndexedPointList(LPD3DM_CONTEXT psContext,
					 IMG_UINT32	ui32FVFcode, 
					 BYTE *pbVBData,
					 IMG_UINT32 ui32VBByteStride,
					 BYTE *pbIBData,
					 IMG_UINT32 ui32IBByteStride,
					 IMG_UINT32 ui32PrimCount)
{
	IMG_UINT32			i;
	PVR_NATIVE_VERTEX	asVertex[1], *apsVertex[1];
	IMG_UINT32			ui32ClipCode;
	IMG_BOOL			bStartPrimitive = IMG_TRUE;
	IMG_UINT32			ui32IndexMask;
	UNALIGNED IMG_UINT32	*pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

	ui32IndexMask = psContext->ui32IndexMask;

	/* adjust for non-point types in point fill mode */
	if(psContext->ePrimFillMode == PRIM_FILLMODE_POINT)
	{
		switch(psContext->eCurrentPrimType)
		{
			case D3DMPT_TRIANGLELIST:
				ui32PrimCount *= 3; 
				break;
			case D3DMPT_TRIANGLESTRIP:
			case D3DMPT_TRIANGLEFAN:
				ui32PrimCount += 2;
				break;
			case D3DMPT_LINELIST:
				ui32PrimCount *= 2;
				break;
			case D3DMPT_LINESTRIP:
				ui32PrimCount += 1;
				break;
			case D3DMPT_POINTLIST:
			default:
				break;
		}
	}

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];

	for(i=0; i<ui32PrimCount; i++)
	{
		/* construct native vertices */
		/* Validate index value to prevent access violations */
		if(!VALIDATE_INDEX(psContext, (*pui32IBData & ui32IndexMask)))
		{
			psContext->hrLastError = D3DMERR_INVALIDCALL;
			goto ErrorExit;
		}	
		SetupNativeVertex(psContext, (IMG_UINT32*)(pbVBData + ((*pui32IBData & ui32IndexMask) * ui32VBByteStride)),
							ui32FVFcode,
							apsVertex[0]);

		/* Advance pointer */
		pbIBData	+= ui32IBByteStride;
		pui32IBData = (UNALIGNED IMG_UINT32*)pbIBData;

		/* Store pointers to colours for flat shading */
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[0], 1);

		/* any vertices clipped? */
		ui32ClipCode =	 apsVertex[0]->ui32Flags & D3DM_CLIPFLAG_MASK;
		
		if (ui32ClipCode == 0)	/* no clipping: */
		{

⌨️ 快捷键说明

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