Files
Client/Engine/Zalla3D Scene Class/ViewFrustum.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

158 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"
#include "GMMemory.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;
}