//! \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 }