mirror of
https://github.com/GTAmodding/re3.git
synced 2024-12-28 22:25:42 +00:00
137 lines
4.4 KiB
C++
137 lines
4.4 KiB
C++
class CEntity;
|
|
|
|
class CCullZone
|
|
{
|
|
public:
|
|
CVector position;
|
|
float minx;
|
|
float maxx;
|
|
float miny;
|
|
float maxy;
|
|
float minz;
|
|
float maxz;
|
|
|
|
int32 m_indexStart;
|
|
int16 m_groupIndexCount[3]; // only useful during resolution stage
|
|
int16 m_numBuildings;
|
|
int16 m_numTreadablesPlus10m;
|
|
int16 m_numTreadables;
|
|
|
|
void DoStuffLeavingZone(void);
|
|
static void DoStuffLeavingZone_OneBuilding(uint16 i);
|
|
static void DoStuffLeavingZone_OneTreadableBoth(uint16 i);
|
|
void DoStuffEnteringZone(void);
|
|
static void DoStuffEnteringZone_OneBuilding(uint16 i);
|
|
static void DoStuffEnteringZone_OneTreadablePlus10m(uint16 i);
|
|
static void DoStuffEnteringZone_OneTreadable(uint16 i);
|
|
|
|
|
|
static bool TestLine(CVector vec1, CVector vec2);
|
|
static bool DoThoroughLineTest(CVector vec1, CVector vec2, CEntity *testEntity);
|
|
float CalcDistToCullZoneSquared(float x, float y);
|
|
float CalcDistToCullZone(float x, float y) { return Sqrt(CalcDistToCullZoneSquared(x, y)); };
|
|
bool IsEntityCloseEnoughToZone(CEntity* entity, bool checkLevel);
|
|
bool PointFallsWithinZone(CVector pos, float radius);
|
|
bool TestEntityVisibilityFromCullZone(CEntity *entity, float extraDist, CEntity *LODentity);
|
|
void FindTestPoints();
|
|
|
|
void GetGroupStartAndSize(int32 groupid, int32 &start, int32 &size) {
|
|
switch (groupid) {
|
|
case 0:
|
|
default:
|
|
// buildings
|
|
start = m_indexStart;
|
|
size = m_groupIndexCount[0];
|
|
break;
|
|
case 1:
|
|
// treadables + 10m
|
|
start = m_groupIndexCount[0] + m_indexStart;
|
|
size = m_groupIndexCount[1];
|
|
break;
|
|
case 2:
|
|
// treadables
|
|
start = m_groupIndexCount[0] + m_groupIndexCount[1] + m_indexStart;
|
|
size = m_groupIndexCount[2];
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
enum eZoneAttribs
|
|
{
|
|
ATTRZONE_CAMCLOSEIN = 1,
|
|
ATTRZONE_STAIRS = 2,
|
|
ATTRZONE_1STPERSON = 4,
|
|
ATTRZONE_NORAIN = 8,
|
|
ATTRZONE_NOPOLICE = 0x10,
|
|
ATTRZONE_NOTCULLZONE = 0x20,
|
|
ATTRZONE_DOINEEDCOLLISION = 0x40,
|
|
ATTRZONE_SUBWAYVISIBLE = 0x80,
|
|
};
|
|
|
|
struct CAttributeZone
|
|
{
|
|
float minx;
|
|
float maxx;
|
|
float miny;
|
|
float maxy;
|
|
float minz;
|
|
float maxz;
|
|
int16 attributes;
|
|
int16 wantedLevel;
|
|
};
|
|
|
|
class CCullZones
|
|
{
|
|
public:
|
|
static int32 NumCullZones;
|
|
static CCullZone aZones[NUMCULLZONES];
|
|
static int32 NumAttributeZones;
|
|
static CAttributeZone aAttributeZones[NUMATTRIBZONES];
|
|
static uint16 aIndices[NUMZONEINDICES];
|
|
static int16 aPointersToBigBuildingsForBuildings[NUMBUILDINGS];
|
|
static int16 aPointersToBigBuildingsForTreadables[NUMTREADABLES];
|
|
|
|
static int32 CurrentWantedLevelDrop_Player;
|
|
static int32 CurrentFlags_Camera;
|
|
static int32 CurrentFlags_Player;
|
|
static int32 OldCullZone;
|
|
static int32 EntityIndicesUsed;
|
|
static bool bCurrentSubwayIsInvisible;
|
|
static bool bCullZonesDisabled;
|
|
|
|
static void Init(void);
|
|
static void ResolveVisibilities(void);
|
|
static void Update(void);
|
|
static void ForceCullZoneCoors(CVector coors);
|
|
static int32 FindCullZoneForCoors(CVector coors);
|
|
static int32 FindAttributesForCoors(CVector coors, int32 *wantedLevel);
|
|
static CAttributeZone *FindZoneWithStairsAttributeForPlayer(void);
|
|
static void MarkSubwayAsInvisible(bool visible);
|
|
static void AddCullZone(CVector const &position,
|
|
float minx, float maxx,
|
|
float miny, float maxy,
|
|
float minz, float maxz,
|
|
uint16 flag, int16 wantedLevel);
|
|
static bool CamCloseInForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_CAMCLOSEIN) != 0; }
|
|
static bool CamStairsForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_STAIRS) != 0; }
|
|
static bool Cam1stPersonForPlayer(void) { return (CurrentFlags_Player & ATTRZONE_1STPERSON) != 0; }
|
|
static bool NoPolice(void) { return (CurrentFlags_Player & ATTRZONE_NOPOLICE) != 0; }
|
|
static bool DoINeedToLoadCollision(void) { return (CurrentFlags_Player & ATTRZONE_DOINEEDCOLLISION) != 0; }
|
|
static bool PlayerNoRain(void) { return (CurrentFlags_Player & ATTRZONE_NORAIN) != 0; }
|
|
static bool CamNoRain(void) { return (CurrentFlags_Camera & ATTRZONE_NORAIN) != 0; }
|
|
static int32 GetWantedLevelDrop(void) { return CurrentWantedLevelDrop_Player; }
|
|
|
|
static void BuildListForBigBuildings();
|
|
static void DoVisibilityTestCullZone(int zoneId, bool doIt);
|
|
static bool DoWeHaveMoreThanXOccurencesOfSet(int32 count, uint16 *set);
|
|
|
|
static void CompressIndicesArray();
|
|
static bool PickRandomSetForGroup(int32 zone, int32 group, uint16 *set);
|
|
static void ReplaceSetForAllGroups(uint16 *set, uint16 setid);
|
|
static void TidyUpAndMergeLists(uint16 *extraIndices, int32 numExtraIndices);
|
|
|
|
// debug
|
|
static bool LoadTempFile(void);
|
|
static void SaveTempFile(void);
|
|
};
|