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

📄 frustum.cpp

📁 国外网游源码....除工具源码缺少之外,其余程序都全...至于,什么游戏,因为国内还没有,所以找不到测试
💻 CPP
字号:
// Frustum.cpp: implementation of the CFrustum class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFrustum::CFrustum()
{
	ZeroMemory( m_vtx, sizeof( m_vtx[0] ) * 8 );
	ZeroMemory( m_plane, sizeof( m_plane[0] ) * 6 );

	ZeroMemory( m_vFireVertex, sizeof( m_vFireVertex[0] ) * 8 );
	ZeroMemory( m_planeFire, sizeof( m_planeFire[0] ) * 6 );
	ZeroMemory( m_vCamVertex, sizeof( m_vCamVertex[0] ) * 8 );
	ZeroMemory( m_planeCam, sizeof( m_planeCam[0] ) * 6 );

	D3DXMatrixPerspectiveFovLH( &m_mFireProj, D3DX_PI/18, 0.5f, 1.0f, 1000.0f );		//  埃拜阑 20档风 技泼..
	D3DXMatrixPerspectiveFovLH( &m_mCamProj, D3DX_PI/18, 1.0f, -5.0f, 2.f );		//  埃拜阑 20档风 技泼..
}

CFrustum::~CFrustum()
{

}

D3DXVECTOR3 CFrustum::CreateFrustum( D3DXVECTOR3 * pVtx, D3DXPLANE * pPlane, D3DXMATRIXA16* pmatViewProj )
{
	int				i;
	D3DXMATRIXA16	matInv;
	D3DXVECTOR3		vPos;
	pVtx[0].x = -1.0f;	pVtx[0].y = -1.0f;	pVtx[0].z = 0.0f;
	pVtx[1].x =  1.0f;	pVtx[1].y = -1.0f;	pVtx[1].z = 0.0f;
	pVtx[2].x =  1.0f;	pVtx[2].y = -1.0f;	pVtx[2].z = 1.0f;
	pVtx[3].x = -1.0f;	pVtx[3].y = -1.0f;	pVtx[3].z = 1.0f;
	pVtx[4].x = -1.0f;	pVtx[4].y =  1.0f;	pVtx[4].z = 0.0f;
	pVtx[5].x =  1.0f;	pVtx[5].y =  1.0f;	pVtx[5].z = 0.0f;
	pVtx[6].x =  1.0f;	pVtx[6].y =  1.0f;	pVtx[6].z = 1.0f;
	pVtx[7].x = -1.0f;	pVtx[7].y =  1.0f;	pVtx[7].z = 1.0f;

	D3DXMatrixInverse(&matInv, NULL, pmatViewProj );

	for( i = 0; i < 8; i++ )
		D3DXVec3TransformCoord( &pVtx[i], &pVtx[i], &matInv );

	vPos = ( pVtx[0] + pVtx[5] ) / 2.0f;
	
	D3DXPlaneFromPoints(&pPlane[0], pVtx+4, pVtx+7, pVtx+6);	// 惑 乞搁(top)
	D3DXPlaneFromPoints(&pPlane[1], pVtx  , pVtx+1, pVtx+2);	// 窍 乞搁(bottom)
	D3DXPlaneFromPoints(&pPlane[2], pVtx  , pVtx+4, pVtx+5);	// 辟 乞搁(near)
	D3DXPlaneFromPoints(&pPlane[3], pVtx+2, pVtx+6, pVtx+7);	// 盔 乞搁(far)
	D3DXPlaneFromPoints(&pPlane[4], pVtx  , pVtx+3, pVtx+7);	// 谅 乞搁(left)
	D3DXPlaneFromPoints(&pPlane[5], pVtx+1, pVtx+5, pVtx+6);	// 快 乞搁(right)

	return vPos;
}

BOOL CFrustum::Make( D3DXMATRIXA16* pmatViewProj )
{
	m_vPos = CreateFrustum( m_vtx, m_plane, pmatViewProj );		// 扁夯 轰 橇矾胶乓..
/**/
	D3DXMATRIX mView = g_pCamera->GetViewMatrix();
	D3DXMATRIXA16 mFrustum = mView * m_mFireProj;
	m_vFirePos = CreateFrustum( m_vFireVertex, m_planeFire, &mFrustum );		// 荤拜侩 橇矾胶乓..

	D3DXMATRIXA16 mFrustumCam = mView * m_mCamProj;
	m_vCamPos = CreateFrustum( m_vCamVertex, m_planeCam, &mFrustumCam );		// 扁夯 轰 橇矾胶乓..
/**/

	return TRUE;
}

BOOL CFrustum::IsIn( D3DXVECTOR3* pv )
{
	float		fDist;
	for(int i = 0 ; i < 6 ; i++ )
	{
		fDist = D3DXPlaneDotCoord( &m_plane[i], pv );
		if( fDist > PLANE_EPSILON ) return FALSE;		// plane狼 normal氦磐啊 far肺 氢窍绊 乐栏骨肺 剧荐捞搁 橇矾胶乓狼 官冰率
	}

	return TRUE;
}

BOOL CFrustum::IsInSphere( D3DXVECTOR3* pv, float radius )
{
	float		fDist;
	int i;
	for( i = 0 ; i < 6 ; i++ )
	{
		fDist = D3DXPlaneDotCoord( &m_plane[i], pv );
		if( fDist > (radius+PLANE_EPSILON) ) return FALSE;	// 乞搁苞 吝缴痢狼 芭府啊 馆瘤抚焊促 农搁 橇矾胶乓俊 绝澜
	}
	return TRUE;
}

int __fastcall CFrustum::IsInEx( D3DXVECTOR3 pv, int nValue )
{
	float		fDist;
	int 		nRet = nValue;
	int			i = 0;
	if((nValue & CULL_VIEW))
	{
		for(i = 0 ; i < 6 ; i++ )
		{
			if(i <= 2)
				continue;
			fDist = D3DXPlaneDotCoord( &m_plane[i], &pv );
			if( fDist > PLANE_EPSILON )
			{
				//nRet |= CULL_VIEW;
				nRet ^= CULL_VIEW;
				if((nRet & CULL_FIRE))
					nRet ^= CULL_FIRE;
				break;
			}
		}
		
		if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
		{
			for( i = 0 ; i < 6 ; i++ )
			{
				if(i <= 2)
					continue;
				fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
				if( fDist > PLANE_EPSILON )
				{
					//nRet |= CULL_FIRE;
					nRet ^= CULL_FIRE;
					break;
				}
			}
		}
	}
	
	if((nValue & CULL_CAM))
	{
		for( i = 0 ; i < 6 ; i++ )
		{
			if(i <= 2)
				continue;
			fDist = D3DXPlaneDotCoord( &m_planeCam[i], &pv );
			if( fDist > PLANE_EPSILON )
			{
				//nRet |= CULL_CAM;
				nRet ^= CULL_CAM;
				break;
			}
		}
	}

	return nRet;
}

int __fastcall CFrustum::IsInSphereEx( D3DXVECTOR3 pv, float radius, int nValue )
{
	float		fDist;
	int 		nRet = nValue;
	int			i = 0;
	if((nValue & CULL_VIEW))
	{
		for(int i = 0 ; i < 6 ; i++ )
		{
			if(i <= 2)
				continue;
			fDist = D3DXPlaneDotCoord( &m_plane[i], &pv );
			if( fDist > (radius+PLANE_EPSILON) )
			{
				nRet ^= CULL_VIEW;
				if((nRet & CULL_FIRE))
					nRet ^= CULL_FIRE;
				break;
			}
		}
//		return nRet;
		if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
		{
			for( i = 0 ; i < 6 ; i++ )
			{
				if(i <= 2)
					continue;
				fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
				if( fDist > (radius+PLANE_EPSILON) ) 
				{
					//nRet |= CULL_FIRE;
					nRet ^= CULL_FIRE;
					break;
				}
			}
		}
	}
	
	if((nValue & CULL_CAM))
	{
		for( i = 0 ; i < 6 ; i++ )
		{
			if(i <= 2)
				continue;
			fDist = D3DXPlaneDotCoord( &m_planeCam[i], &pv );
			if( fDist > (radius+PLANE_EPSILON) ) 
			{
				nRet ^= CULL_CAM;
				break;
			}
		}
	}
	if(nRet)
		int cde =0;
	return nRet;
}

int __fastcall CFrustum::IsInEx2( D3DXVECTOR3 pv, int nValue )
{
	float		fDist[3] = {0};
	int 		nRet = nValue;
	int			i = 0;
	if((nValue & CULL_VIEW))
	{
		fDist[0] = D3DXPlaneDotCoord( &m_plane[3], &pv );
//		fDist[1] = D3DXPlaneDotCoord( &m_plane[4], &pv );
//		fDist[2] = D3DXPlaneDotCoord( &m_plane[5], &pv );

//		for( i=0;i<3;i++)
		{

			if( fDist[0] > PLANE_EPSILON )
			{
				nRet ^= CULL_VIEW;
				if((nRet & CULL_FIRE))
					nRet ^= CULL_FIRE;
//				break;
			}
		}
		
		if((nRet & CULL_VIEW) && (nValue & CULL_FIRE))
		{
			fDist[0] = D3DXPlaneDotCoord( &m_planeFire[3], &pv );
//			fDist[1] = D3DXPlaneDotCoord( &m_planeFire[4], &pv );
//			fDist[2] = D3DXPlaneDotCoord( &m_planeFire[5], &pv );
			fDist[2] = D3DXPlaneDotCoord( &m_planeFire[2], &pv );

//			for( i=0;i<3;i++)
			{
				if( fDist[0] > PLANE_EPSILON )
				{
					nRet ^= CULL_FIRE;
				//	break;
				}
				if( fDist[2] > 0 )
				{
					nRet ^= CULL_FIRE;
				//	break;
				}
			}
		}
	}

	nRet ^= CULL_CAM;
	return nRet;
}

BOOL __fastcall CFrustum::IsFireInEx( D3DXVECTOR3 pv )
{
	float		fDist;
	for( int i=0; i < 6; i++ )
	{
		if(i <= 2)
			continue;
		fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
		if( fDist > PLANE_EPSILON ) return FALSE;
	}
	return TRUE;
}

int __fastcall CFrustum::IsInFireSphereEx( D3DXVECTOR3 pv, float radius )
{
	float		fDist;
	for( int i=0; i < 6; i++ )
	{
		if(i <= 2)
			continue;
		fDist = D3DXPlaneDotCoord( &m_planeFire[i], &pv );
		if( fDist > (radius+PLANE_EPSILON) ) return FALSE;	// 乞搁苞 吝缴痢狼 芭府啊 馆瘤抚焊促 农搁 橇矾胶乓俊 绝澜
	}
	return TRUE;
}

⌨️ 快捷键说明

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