Exemple #1
0
//! \brief Set view frustum from matrix information
//! \param viewProjection view * projection matrix
void Frustum::Set(const Matrix4 & viewProjection)
{
	planeArray.resize(6);
	
#define SETUP_PLANE(plane, x1, x2, x3, x4) \
	planeArray[plane].n.x = -(x1); planeArray[plane].n.y = -(x2); \
	planeArray[plane].n.z = -(x3); planeArray[plane].d = -(x4); \
	planeArray[plane].Normalize();
	
	// left
	SETUP_PLANE(EFP_LEFT,		
					viewProjection._03 + viewProjection._00,
					viewProjection._13 + viewProjection._10,
					viewProjection._23 + viewProjection._20,
					viewProjection._33 + viewProjection._30);
	// right
	SETUP_PLANE(EFP_RIGHT,	
					viewProjection._03 - viewProjection._00,
					viewProjection._13 - viewProjection._10,
					viewProjection._23 - viewProjection._20,
					viewProjection._33 - viewProjection._30);

	// bottom
	SETUP_PLANE(EFP_BOTTOM,	
					viewProjection._03 + viewProjection._01,
					viewProjection._13 + viewProjection._11,
					viewProjection._23 + viewProjection._21,
					viewProjection._33 + viewProjection._31);

	// top
	SETUP_PLANE(EFP_TOP,
					viewProjection._03 - viewProjection._01,
					viewProjection._13 - viewProjection._11,
					viewProjection._23 - viewProjection._21,
					viewProjection._33 - viewProjection._31);

    // DirectX version
    
	// near
	SETUP_PLANE(EFP_NEAR,
					viewProjection._02,
					viewProjection._12,
					viewProjection._22,
					viewProjection._32);
//	SETUP_PLANE(EFP_NEAR,
//                viewProjection._03 + viewProjection._02,
//                viewProjection._13 + viewProjection._12,
//                viewProjection._23 + viewProjection._22,
//                viewProjection._33 + viewProjection._32);

	// far
	SETUP_PLANE(EFP_FAR,	
					viewProjection._03 - viewProjection._02,
					viewProjection._13 - viewProjection._12,
					viewProjection._23 - viewProjection._22,
					viewProjection._33 - viewProjection._32);

	planeCount = 6;

#undef SETUP_PLANE 
}
//! \brief Set view frustum from matrix information
//! \param viewProjection view * projection matrix
void Frustum::Build(const Matrix4 & viewProjection)
{
	planeArray.resize(6);
	
#define SETUP_PLANE(plane, x1, x2, x3, x4) \
	planeArray[plane].n.x = -(x1); planeArray[plane].n.y = -(x2); \
	planeArray[plane].n.z = -(x3); planeArray[plane].d = -(x4); \
	planeArray[plane].Normalize();
	
	// left
	SETUP_PLANE(EFP_LEFT,		
					viewProjection._03 + viewProjection._00,
					viewProjection._13 + viewProjection._10,
					viewProjection._23 + viewProjection._20,
					viewProjection._33 + viewProjection._30);
	// right
	SETUP_PLANE(EFP_RIGHT,	
					viewProjection._03 - viewProjection._00,
					viewProjection._13 - viewProjection._10,
					viewProjection._23 - viewProjection._20,
					viewProjection._33 - viewProjection._30);

	// bottom
	SETUP_PLANE(EFP_BOTTOM,	
					viewProjection._03 + viewProjection._01,
					viewProjection._13 + viewProjection._11,
					viewProjection._23 + viewProjection._21,
					viewProjection._33 + viewProjection._31);

	// top
	SETUP_PLANE(EFP_TOP,
					viewProjection._03 - viewProjection._01,
					viewProjection._13 - viewProjection._11,
					viewProjection._23 - viewProjection._21,
					viewProjection._33 - viewProjection._31);

    // DirectX version
    
#ifdef __DAVAENGINE_DIRECTX9__
	SETUP_PLANE(EFP_NEAR,
					viewProjection._02,
					viewProjection._12,
					viewProjection._22,
					viewProjection._32);
#else //opengl
	SETUP_PLANE(EFP_NEAR,
		            viewProjection._03 + viewProjection._02,
			        viewProjection._13 + viewProjection._12,
				    viewProjection._23 + viewProjection._22,
					viewProjection._33 + viewProjection._32);
#endif //__DAVAENGINE_DIRECTX9__

	// far
	SETUP_PLANE(EFP_FAR,	
					viewProjection._03 - viewProjection._02,
					viewProjection._13 - viewProjection._12,
					viewProjection._23 - viewProjection._22,
					viewProjection._33 - viewProjection._32);

	planeCount = 6;

#undef SETUP_PLANE 
}