re3/src/core/ZoneCull.cpp

175 lines
4.3 KiB
C++
Raw Normal View History

2019-05-15 14:52:37 +00:00
#include "common.h"
2020-04-17 13:31:11 +00:00
2019-05-15 14:52:37 +00:00
#include "Building.h"
#include "Treadable.h"
2019-06-28 17:23:28 +00:00
#include "Train.h"
2019-05-15 14:52:37 +00:00
#include "Pools.h"
#include "Timer.h"
#include "Camera.h"
#include "World.h"
2019-06-13 10:25:55 +00:00
#include "FileMgr.h"
2019-07-07 11:09:11 +00:00
#include "ZoneCull.h"
2019-11-02 17:15:01 +00:00
#include "Zones.h"
2019-05-15 14:52:37 +00:00
2020-08-21 11:28:33 +00:00
//--MIAMI: done
2020-04-17 05:54:14 +00:00
int32 CCullZones::NumAttributeZones;
CAttributeZone CCullZones::aAttributeZones[NUMATTRIBZONES];
2019-05-15 14:52:37 +00:00
2020-04-17 05:54:14 +00:00
int32 CCullZones::CurrentWantedLevelDrop_Player;
int32 CCullZones::CurrentFlags_Camera;
int32 CCullZones::CurrentFlags_Player;
bool CCullZones::bCurrentSubwayIsInvisible;
2020-08-21 11:28:33 +00:00
bool CCullZones::bAtBeachForAudio;
2019-05-15 14:52:37 +00:00
void
CCullZones::Init(void)
{
NumAttributeZones = 0;
CurrentWantedLevelDrop_Player = 0;
CurrentFlags_Camera = 0;
CurrentFlags_Player = 0;
2020-05-03 15:44:10 +00:00
bCurrentSubwayIsInvisible = false;
2019-11-02 17:15:01 +00:00
}
2019-05-15 14:52:37 +00:00
void
CCullZones::Update(void)
{
bool invisible;
switch(CTimer::GetFrameCounter() & 7){
case 0:
case 4:
2020-08-21 11:28:33 +00:00
UpdateAtBeachForAudio();
2019-05-15 14:52:37 +00:00
break;
case 2:
/* Update camera attributes */
CurrentFlags_Camera = FindAttributesForCoors(TheCamera.GetGameCamPosition(), nil);
invisible = (CurrentFlags_Camera & ATTRZONE_SUBWAYVISIBLE) == 0;
if(invisible != bCurrentSubwayIsInvisible){
MarkSubwayAsInvisible(!invisible);
bCurrentSubwayIsInvisible = invisible;
}
break;
case 6:
/* Update player attributes */
2019-06-29 09:09:33 +00:00
CurrentFlags_Player = FindAttributesForCoors(FindPlayerCoors(),
2019-05-15 14:52:37 +00:00
&CurrentWantedLevelDrop_Player);
break;
}
}
2020-08-21 11:28:33 +00:00
// TODO? put somewhere else?
bool
IsPointWithinArbitraryArea(float px, float py, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4)
{
if((px-x1)*(x2-x1) - (py-y1)*(y2-y1) < 0.0f) return false;
if((px-x2)*(x3-x2) - (py-y2)*(y3-y2) < 0.0f) return false;
if((px-x3)*(x4-x3) - (py-y3)*(y4-y3) < 0.0f) return false;
if((px-x4)*(x1-x4) - (py-y4)*(y1-y4) < 0.0f) return false;
return true;
}
void
CCullZones::UpdateAtBeachForAudio(void)
{
bAtBeachForAudio = IsPointWithinArbitraryArea(TheCamera.GetPosition().x, TheCamera.GetPosition().y,
400.0f, -1644.4f,
751.9f, 1267.8f,
971.9f, 1216.2f,
840.0f, -1744.0f);
}
2019-05-15 14:52:37 +00:00
void
CCullZones::ForceCullZoneCoors(CVector coors)
{
}
int32
CCullZones::FindAttributesForCoors(CVector coors, int32 *wantedLevel)
{
int i;
int32 attribs;
2020-01-01 20:55:01 +00:00
if (wantedLevel)
*wantedLevel = 0;
2019-05-15 14:52:37 +00:00
attribs = 0;
for(i = 0; i < NumAttributeZones; i++)
if(coors.x >= aAttributeZones[i].minx && coors.x <= aAttributeZones[i].maxx &&
coors.y >= aAttributeZones[i].miny && coors.y <= aAttributeZones[i].maxy &&
coors.z >= aAttributeZones[i].minz && coors.z <= aAttributeZones[i].maxz){
attribs |= aAttributeZones[i].attributes;
2020-01-01 20:55:01 +00:00
if(wantedLevel)
2020-04-19 16:34:08 +00:00
*wantedLevel = Max(*wantedLevel, aAttributeZones[i].wantedLevel);
2019-05-15 14:52:37 +00:00
}
return attribs;
}
CAttributeZone*
CCullZones::FindZoneWithStairsAttributeForPlayer(void)
{
int i;
CVector coors;
2019-06-29 09:09:33 +00:00
coors = FindPlayerCoors();
2019-05-15 14:52:37 +00:00
for(i = 0; i < NumAttributeZones; i++)
if(aAttributeZones[i].attributes & ATTRZONE_STAIRS &&
coors.x >= aAttributeZones[i].minx && coors.x <= aAttributeZones[i].maxx &&
coors.y >= aAttributeZones[i].miny && coors.y <= aAttributeZones[i].maxy &&
coors.z >= aAttributeZones[i].minz && coors.z <= aAttributeZones[i].maxz)
return &aAttributeZones[i];
return nil;
}
2019-06-28 17:23:28 +00:00
void
2019-05-15 14:52:37 +00:00
CCullZones::MarkSubwayAsInvisible(bool visible)
2019-06-28 17:23:28 +00:00
{
int i, n;
CEntity *e;
CVehicle *v;
n = CPools::GetBuildingPool()->GetSize()-1;
for(i = n; i >= 0; i--){
2019-06-28 17:23:28 +00:00
e = CPools::GetBuildingPool()->GetSlot(i);
if(e && e->bIsSubway)
e->bIsVisible = visible;
}
n = CPools::GetTreadablePool()->GetSize()-1;
for(i = n; i >= 0; i--){
2019-06-28 17:23:28 +00:00
e = CPools::GetTreadablePool()->GetSlot(i);
if(e && e->bIsSubway)
e->bIsVisible = visible;
}
n = CPools::GetVehiclePool()->GetSize()-1;
for(i = n; i >= 0; i--){
2019-06-28 17:23:28 +00:00
v = CPools::GetVehiclePool()->GetSlot(i);
2019-07-29 17:18:03 +00:00
if(v && v->IsTrain() && ((CTrain*)v)->m_nTrackId != TRACK_ELTRAIN)
2019-06-28 17:23:28 +00:00
v->bIsVisible = visible;
}
2019-05-15 14:52:37 +00:00
}
void
CCullZones::AddCullZone(CVector const &position,
float minx, float maxx,
float miny, float maxy,
float minz, float maxz,
uint16 flag, int16 wantedLevel)
{
CAttributeZone *attrib;
2020-05-06 10:23:57 +00:00
assert(NumAttributeZones < NUMATTRIBZONES);
attrib = &aAttributeZones[NumAttributeZones++];
attrib->minx = minx;
attrib->maxx = maxx;
attrib->miny = miny;
attrib->maxy = maxy;
attrib->minz = minz;
attrib->maxz = maxz;
attrib->attributes = flag;
attrib->wantedLevel = wantedLevel;
2019-11-02 17:15:01 +00:00
}