Files
Client/GameTools/Zallad3D SceneClass/ViewFrustum.cpp
LGram16 dd97ddec92 Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code:
- Client: Game client source (moved to Client/Client/)
- Server: Game server source
- GameTools: Development tools
- CryptoSource: Encryption utilities
- database: Database scripts
- Script: Game scripts
- rylCoder_16.02.2008_src: Legacy coder tools
- GMFont, Game: Additional resources

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 20:17:20 +09:00

157 lines
5.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ViewFrustum.cpp: implementation of the CViewFrustum class.
//
//////////////////////////////////////////////////////////////////////
#include "ViewFrustum.h"
#include "SceneManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CViewFrustum::CViewFrustum()
{
}
CViewFrustum::~CViewFrustum()
{
}
void CViewFrustum::Update() {
LPDIRECT3DDEVICE8 device;
D3DXMATRIX view;
D3DXMATRIX project;
D3DXMATRIX clip;
device = CSceneManager::GetDevice();
device->GetTransform(D3DTS_VIEW,&view);
device->GetTransform(D3DTS_PROJECTION,&project);
D3DXMatrixMultiply(&clip,&view,&project);
//left plane
m_Frustum[LEFT_P].a = clip._14 + clip._11;
m_Frustum[LEFT_P].b = clip._24 + clip._21;
m_Frustum[LEFT_P].c = clip._34 + clip._31;
m_Frustum[LEFT_P].d = clip._44 + clip._41;
//right plane
m_Frustum[RIGHT_P].a = clip._14 - clip._11;
m_Frustum[RIGHT_P].b = clip._24 - clip._21;
m_Frustum[RIGHT_P].c = clip._34 - clip._31;
m_Frustum[RIGHT_P].d = clip._44 - clip._41;
//top plane
m_Frustum[TOP_P].a = clip._14 - clip._12;
m_Frustum[TOP_P].b = clip._24 - clip._22;
m_Frustum[TOP_P].c = clip._34 - clip._32;
m_Frustum[TOP_P].d = clip._44 - clip._42;
//bottom plane
m_Frustum[BOTTOM_P].a = clip._14 + clip._12;
m_Frustum[BOTTOM_P].b = clip._24 + clip._22;
m_Frustum[BOTTOM_P].c = clip._34 + clip._32;
m_Frustum[BOTTOM_P].d = clip._44 + clip._42;
//near plane
m_Frustum[NEAR_P].a = clip._13;
m_Frustum[NEAR_P].b = clip._23;
m_Frustum[NEAR_P].c = clip._33;
m_Frustum[NEAR_P].d = clip._43;
//far plane
m_Frustum[FAR_P].a = clip._14 - clip._13;
m_Frustum[FAR_P].b = clip._24 - clip._23;
m_Frustum[FAR_P].c = clip._34 - clip._33;
m_Frustum[FAR_P].d = clip._44 - clip._43;
//normalize plane
for(int i=0;i<6;i++)
D3DXPlaneNormalize(&(m_Frustum[i]),&(m_Frustum[i]));
}
bool CViewFrustum::PointInFrustum(float x,float y,float z) {
for(int i=0;i<6;i++) {
float fvalue = m_Frustum[i].a * x + m_Frustum[i].b * y + m_Frustum[i].c * z + m_Frustum[i].d;
if(fvalue <= 0)
return false; //point not in frustum
}
// point in frustum
return true;
}
bool CViewFrustum::SphereInFrustum(float x,float y,float z,float rad){
for(int i=0;i<6;i++) {
float fvalue = m_Frustum[i].a * x + m_Frustum[i].b * y + m_Frustum[i].c * z + m_Frustum[i].d;
if(fvalue <= -rad)
return false; //Sphere not in frustum
}
// Sphere in frustum
return true;
}
bool CViewFrustum::BoxInFrustum(int *vecMin,int *vecMax) {
for(int i = 0; i < 6; i++ )
{
if(m_Frustum[i].a * vecMin[0] + m_Frustum[i].b * vecMin[1] + m_Frustum[i].c * vecMin[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax[0] + m_Frustum[i].b * vecMin[1] + m_Frustum[i].c * vecMin[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin[0] + m_Frustum[i].b * vecMax[1] + m_Frustum[i].c * vecMin[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax[0] + m_Frustum[i].b * vecMax[1] + m_Frustum[i].c * vecMin[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin[0] + m_Frustum[i].b * vecMin[1] + m_Frustum[i].c * vecMax[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax[0] + m_Frustum[i].b * vecMin[1] + m_Frustum[i].c * vecMax[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin[0] + m_Frustum[i].b * vecMax[1] + m_Frustum[i].c * vecMax[2] + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax[0] + m_Frustum[i].b * vecMax[1] + m_Frustum[i].c * vecMax[2] + m_Frustum[i].d > 0) continue;
// If we get here, it isn't in the frustum
return false;
}
// Return a true for the box being inside of the frustum
return true;
}
bool CViewFrustum::BoxInFrustum(D3DXVECTOR3 vecMin,D3DXVECTOR3 vecMax) {
for(int i = 0; i < 6; i++ )
{
if(m_Frustum[i].a * vecMin.x + m_Frustum[i].b * vecMin.y + m_Frustum[i].c * vecMin.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax.x + m_Frustum[i].b * vecMin.y + m_Frustum[i].c * vecMin.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin.x + m_Frustum[i].b * vecMax.y + m_Frustum[i].c * vecMin.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax.x + m_Frustum[i].b * vecMax.y + m_Frustum[i].c * vecMin.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin.x + m_Frustum[i].b * vecMin.y + m_Frustum[i].c * vecMax.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax.x + m_Frustum[i].b * vecMin.y + m_Frustum[i].c * vecMax.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMin.x + m_Frustum[i].b * vecMax.y + m_Frustum[i].c * vecMax.z + m_Frustum[i].d > 0) continue;
if(m_Frustum[i].a * vecMax.x + m_Frustum[i].b * vecMax.y + m_Frustum[i].c * vecMax.z + m_Frustum[i].d > 0) continue;
// If we get here, it isn't in the frustum
return false;
}
// Return a true for the box being inside of the frustum
return true;
}
bool CViewFrustum::BoxInFrustum(RCullingBox *BoundB) {
BYTE bOutside[8];
ZeroMemory( &bOutside, sizeof(bOutside) );
//bound box check in frustum
for( int iPoint = 0; iPoint < 8; iPoint++) {
for( int iPlane = 0; iPlane < 6; iPlane++) {
// bound box <20><><EFBFBD><EFBFBD> frustum plane <20>ܺο<DCBA> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((m_Frustum[iPlane].a * (BoundB->m_WorldBound[iPoint].x) +
m_Frustum[iPlane].b * (BoundB->m_WorldBound[iPoint].y) +
m_Frustum[iPlane].c * (BoundB->m_WorldBound[iPoint].z) +
m_Frustum[iPlane].d) < 0) {
//<2F>ܺο<DCBA> <20><><EFBFBD><EFBFBD> <20>Ҷ<EFBFBD> 1 bit setting
bOutside[iPoint] |= (1 << iPlane);
}
}
// bound box inside frustum.
if( bOutside[iPoint] == 0 )
return true;
}
return false;
}