diff options
author | Nikolay Korolev <nickvnuk@gmail.com> | 2021-01-01 11:21:42 +0100 |
---|---|---|
committer | Nikolay Korolev <nickvnuk@gmail.com> | 2021-01-01 11:21:42 +0100 |
commit | 575845772fc3f5385eab56044cf97ef0ce930e17 (patch) | |
tree | 1b51da6e1759bac72bec1392435c453eaee60158 /src/render/Occlusion.cpp | |
parent | lcs car ctrl 2 (diff) | |
parent | Merge branch 'miami' of github.com:GTAmodding/re3 into miami (diff) | |
download | re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar.gz re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar.bz2 re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar.lz re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar.xz re3-575845772fc3f5385eab56044cf97ef0ce930e17.tar.zst re3-575845772fc3f5385eab56044cf97ef0ce930e17.zip |
Diffstat (limited to 'src/render/Occlusion.cpp')
-rw-r--r-- | src/render/Occlusion.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/render/Occlusion.cpp b/src/render/Occlusion.cpp index 79ce0461..2b15e75b 100644 --- a/src/render/Occlusion.cpp +++ b/src/render/Occlusion.cpp @@ -1,6 +1,7 @@ #include "common.h" #include "main.h" +#include "Entity.h" #include "Occlusion.h" #include "Game.h" #include "Camera.h" @@ -292,6 +293,11 @@ COcclusion::ProcessBeforeRendering(void) { NumActiveOccluders = 0; +#ifndef MASTER + if (gbModelViewer) + return; +#endif + if (CGame::currArea != AREA_MAIN_MAP) return; @@ -488,3 +494,36 @@ void COcclusion::Render() { DefinedState(); } #endif + +bool CEntity::IsEntityOccluded(void) { + + CVector coors; + float width, height; + + if (COcclusion::NumActiveOccluders == 0 || !CalcScreenCoors(GetBoundCentre(), &coors, &width, &height)) + return false; + + float area = Max(width, height) * GetBoundRadius() * 0.9f; + + for (int i = 0; i < COcclusion::NumActiveOccluders; i++) { + if (coors.z - (GetBoundRadius() * 0.85f) > COcclusion::aActiveOccluders[i].radius) { + if (COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, area)) { + return true; + } + + if (COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) { + CVector min = m_matrix * CModelInfo::GetModelInfo(GetModelIndex())->GetColModel()->boundingBox.min; + CVector max = m_matrix * CModelInfo::GetModelInfo(GetModelIndex())->GetColModel()->boundingBox.max; + + if (CalcScreenCoors(min, &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue; + if (CalcScreenCoors(CVector(max.x, max.y, min.z), &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue; + if (CalcScreenCoors(CVector(max.x, min.y, max.z), &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue; + if (CalcScreenCoors(CVector(min.x, max.y, max.z), &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue; + + return true; + } + } + } + + return false; +}
\ No newline at end of file |