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

📄 prim.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		psContext->sTState.sSWTNLState.psCurrentFlatShadeDiffuse  = &apsVertex[0]->sDiffuseOut;
		psContext->sTState.sSWTNLState.psCurrentFlatShadeSpecular = &apsVertex[0]->sSpecularOut;

		/**********************
			clip test
		**********************/
		DoClipTestandVPTransform(psContext, &apsVertex[1], 1);
		
		/* any vertices clipped? */
		ui32ClipCode =	 (apsVertex[0]->ui32Flags | apsVertex[1]->ui32Flags) & D3DM_CLIPFLAG_MASK;
		
		if (ui32ClipCode == 0)	/* no clipping: */
		{
			if(bNewStrip)
			{
				if(ui32NumStrips)
				{
					TACSWriteEndPrim(psContext);
				}
				else
				{
					/* Start a new primitive block */
					TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
					TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
					bNewStrip = IMG_FALSE;
				}
				
				ui32NumStrips++;

				ValidateVertex(psContext, &apsVertex[0], 2);
				OutputVertices(psContext, &apsVertex[0], 2);
			}
			else
			{
				ValidateVertex(psContext, &apsVertex[1], 1);
				OutputVertices(psContext, &apsVertex[1], 1);
			}
		}
		else if (!(	apsVertex[0]->ui32Flags 
				&	apsVertex[1]->ui32Flags & D3DM_CLIPFLAG_MASK)) /* clipped line: */
		{
			ValidateVertex(psContext, &apsVertex[0], 2);
			
			ui32NumVerts = DoLineClip(psContext, apsVertex[0], apsVertex[1], ui32ClipCode);

			ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;

			if(ui32NumStrips)
			{
				TACSWriteEndPrim(psContext);
			}
			else
			{
				TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
				TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
			}
			ui32NumStrips++;
			
			OutputVertices(psContext, ppsVertex, ui32NumVerts);

			bNewStrip = IMG_TRUE;
		}
		else /* Clipped Out */
		{
			bNewStrip = IMG_TRUE;			
		}

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

	/*
		End the primitive-block if we've had geometry
	*/
	if(ui32NumStrips)
	{
		TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
		TACSWriteTACtlAnd3DState ( 	psContext,
									MBX1_TASTATEPRES_ISPCTL,
								 	&psContext->sHWState.sTACtl3DState,
								 	TRUE);
#endif				
	}
}
/***********************************************************************************
 Function Name      : TriangleStrip
************************************************************************************/
IMG_VOID TriangleStrip( LPD3DM_CONTEXT	psContext,
						IMG_UINT32		*pui32Data, 
						IMG_UINT32		ui32FVFcode, 
						IMG_UINT32		ui32Stride, 
						IMG_UINT32		ui32PrimCount)
{
	IMG_INT32  /*j, */i32NumVerts;
	PVR_NATIVE_VERTEX asVertex[3], *apsVertex[3], *psVTmp, **ppsVertex;
	IMG_UINT32 ui32ClipCode;
	IMG_BOOL bNewStrip = IMG_TRUE;
	IMG_UINT32 ui32NumStrips = 0, i;
	NTV_TYPE   ntvDepthM = D3DM_Zero;

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	
	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;

	/* construct native vertices */
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
	pui32Data += ui32Stride;
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
	pui32Data += ui32Stride;
	
	/************************
		first time clip test
	************************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 2);

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

		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[2]);
		pui32Data += ui32Stride;

		/* 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;
	}
	
	/*
		Finish the primitive block
	*/
	if(ui32NumStrips)
	{
		TACSWriteLastPrim(psContext);
	}
}
/***********************************************************************************
 Function Name      : TriStripLine
************************************************************************************/
IMG_VOID TriStripLine(	LPD3DM_CONTEXT	psContext,
						IMG_UINT32		*pui32Data, 
						IMG_UINT32		ui32FVFcode, 
						IMG_UINT32		ui32Stride, 
						IMG_UINT32		ui32PrimCount)
{
	IMG_UINT32 i, j;
	PVR_NATIVE_VERTEX asVertex[3], *apsVertex[4], *psVTmp, **ppsVertex;
	IMG_UINT32 ui32ClipCode;
	IMG_BOOL bNewStrip = IMG_TRUE;
	IMG_UINT32 ui32NumStrips = 0;
	IMG_UINT32 ui32NumVerts;
	NTV_TYPE   ntvDepthM = D3DM_Zero;

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	apsVertex[3] = &asVertex[0];/* and wrap to first vertex */
	
	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;

	/* construct native vertices */
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
	pui32Data += ui32Stride;
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
	pui32Data += ui32Stride;
	
	/************************
		first time clip test
	************************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 2);

	for(i=0; i<ui32PrimCount; i++)
	{
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[2]);
		pui32Data += ui32Stride;

		/* 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 == 0)	/* no clipping: */
		{
			if(bNewStrip)
			{
				if(ui32NumStrips)
				{
					TACSWriteEndPrim(psContext);
				}
				else
				{
					TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
					TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
				}
				ui32NumStrips++;

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

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

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

			/* go through segments */
			for (j=0; j<3; j++)
			{
				ui32NumVerts = DoLineClip(psContext, apsVertex[j], apsVertex[j+1], ui32ClipCode);
				if(ui32NumVerts)
				{
					if(ui32NumStrips)
					{
						TACSWriteEndPrim(psContext);
					}
					else
					{
						/* Start a new primitive block */
						TACSWritePrimHdr(psContext, psContext->dwTAPrimCtl, MBX1_TAOBJTYPE_VERTEXLINESTRIP);
						TACSWriteLinePointSize(psContext, 0x3F000000/*0.5*/);
					}
					ui32NumStrips++;

					ppsVertex = psContext->sTState.sSWTNLState.ppsOutputArray;		
					OutputVertices(psContext, ppsVertex, ui32NumVerts);					
				}
			}

			bNewStrip = IMG_TRUE;
		}
		else
		{
			bNewStrip = IMG_TRUE;
		}

		/* advance vertices */
		psVTmp = apsVertex[0];
		apsVertex[0] = apsVertex[1];
		apsVertex[1] = apsVertex[2];
		apsVertex[2] = psVTmp;
		apsVertex[3] = apsVertex[0];
	}
	
	/*
		Finish the primitive block
	*/
	if(ui32NumStrips)
	{
		TACSWriteLastPrim(psContext);
#ifdef FIX_HW_PRN_299
		TACSWriteTACtlAnd3DState ( 	psContext,
									MBX1_TASTATEPRES_ISPCTL,
								 	&psContext->sHWState.sTACtl3DState,
								 	TRUE);
#endif				
	}
}
/***********************************************************************************
 Function Name      : TriFanLine
************************************************************************************/
IMG_VOID TriFanLine(LPD3DM_CONTEXT	psContext,
					IMG_UINT32		*pui32Data, 
					IMG_UINT32		ui32FVFcode, 
					IMG_UINT32		ui32Stride, 
					IMG_UINT32		ui32PrimCount)
{
	IMG_UINT32 i, j;
	PVR_NATIVE_VERTEX asVertex[3], *apsVertex[4], *psVTmp, **ppsVertex;
	IMG_UINT32 ui32ClipCode;
	IMG_BOOL bNewFan = IMG_TRUE;
	IMG_UINT32 ui32NumFans = 0;
	IMG_UINT32 ui32NumVerts;
	NTV_TYPE   ntvDepthM = D3DM_Zero;

	/* initialise the vertex ptr array */
	apsVertex[0] = &asVertex[0];
	apsVertex[1] = &asVertex[1];
	apsVertex[2] = &asVertex[2];
	apsVertex[3] = &asVertex[0];/* and wrap to first vertex */
	
	/* and quarter index stride for dword ptr arithmetic */
	ui32Stride >>= 2;

	/* construct native vertices */
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[0]);
	pui32Data += ui32Stride;
	SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[1]);
	pui32Data += ui32Stride;
	
	/************************
		first time clip test
	************************/
	DoClipTestandVPTransform(psContext, &apsVertex[0], 2);

	for(i=0; i<ui32PrimCount; i++)
	{
		SetupNativeVertex(psContext, pui32Data, ui32FVFcode, apsVertex[2]);
		pui32Data += ui32Stride;

		/* 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);

⌨️ 快捷键说明

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