Revert "Remove ColStore"

This reverts commit 0163a7bc46.
This commit is contained in:
Sergeanur 2020-05-05 18:14:31 +03:00
parent 0aab36c5a7
commit 7afa4f8316
2 changed files with 274 additions and 0 deletions

231
src/core/ColStore.cpp Normal file
View file

@ -0,0 +1,231 @@
#include "common.h"
#ifdef MIAMI
#include "templates.h"
#include "General.h"
#include "ModelInfo.h"
#include "Streaming.h"
#include "FileLoader.h"
#include "Script.h"
#include "Timer.h"
#include "Camera.h"
#include "Frontend.h"
#include "ColStore.h"
CPool<ColDef,ColDef> *CColStore::ms_pColPool;
void
CColStore::Initialise(void)
{
if(ms_pColPool == nil)
ms_pColPool = new CPool<ColDef,ColDef>(COLSTORESIZE, "CollisionFiles");
AddColSlot("generic"); // slot 0. not streamed
}
void
CColStore::Shutdown(void)
{
int i;
for(i = 0; i < COLSTORESIZE; i++)
RemoveColSlot(i);
if(ms_pColPool)
delete ms_pColPool;
ms_pColPool = nil;
}
int
CColStore::AddColSlot(const char *name)
{
ColDef *def = ms_pColPool->New();
assert(def);
def->isLoaded = false;
def->a = 0;
def->bounds.left = 1000000.0f;
def->bounds.top = 1000000.0f;
def->bounds.right = -1000000.0f;
def->bounds.bottom = -1000000.0f;
def->minIndex = INT16_MAX;
def->maxIndex = INT16_MIN;
strcpy(def->name, name);
return ms_pColPool->GetJustIndex(def);
}
void
CColStore::RemoveColSlot(int slot)
{
if(GetSlot(slot)){
if(GetSlot(slot)->isLoaded)
RemoveCol(slot);
ms_pColPool->Delete(GetSlot(slot));
}
}
int
CColStore::FindColSlot(const char *name)
{
ColDef *def;
int size = ms_pColPool->GetSize();
for(int i = 0; i < size; i++){
def = GetSlot(i);
if(def && !CGeneral::faststricmp(def->name, name))
return i;
}
return -1;
}
char*
CColStore::GetColName(int32 slot)
{
return GetSlot(slot)->name;
}
CRect&
CColStore::GetBoundingBox(int32 slot)
{
return GetSlot(slot)->bounds;
}
void
CColStore::IncludeModelIndex(int32 slot, int32 modelIndex)
{
ColDef *def = GetSlot(slot);
if(modelIndex < def->minIndex)
def->minIndex = modelIndex;
if(modelIndex > def->maxIndex)
def->maxIndex = modelIndex;
}
bool
CColStore::LoadCol(int32 slot, uint8 *buffer, int32 bufsize)
{
bool success;
ColDef *def = GetSlot(slot);
if(def->minIndex > def->maxIndex)
success = CFileLoader::LoadCollisionFileFirstTime(buffer, bufsize, slot);
else
success = CFileLoader::LoadCollisionFile(buffer, bufsize, slot);
if(success)
def->isLoaded = true;
else
debug("Failed to load Collision\n");
return success;
}
void
CColStore::RemoveCol(int32 slot)
{
int id;
GetSlot(slot)->isLoaded = false;
for(id = 0; id < MODELINFOSIZE; id++){
CBaseModelInfo *mi = CModelInfo::GetModelInfo(id);
if(mi){
CColModel *col = mi->GetColModel();
if(col && col->level == slot)
col->RemoveCollisionVolumes();
}
}
}
void
CColStore::LoadAllCollision(void)
{
int i;
for(i = 1; i < COLSTORESIZE; i++)
if(GetSlot(i))
CStreaming::RequestCol(i, 0);
CStreaming::LoadAllRequestedModels(false);
}
void
CColStore::RemoveAllCollision(void)
{
int i;
for(i = 1; i < COLSTORESIZE; i++)
if(GetSlot(i))
if(CStreaming::CanRemoveCol(i))
CStreaming::RemoveCol(i);
}
static bool bLoadAtSecondPosition;
static CVector2D secondPosition;
void
CColStore::AddCollisionNeededAtPosn(const CVector2D &pos)
{
bLoadAtSecondPosition = true;
secondPosition = pos;
}
void
CColStore::LoadCollision(const CVector2D &pos)
{
int i;
if(CStreaming::ms_disableStreaming)
return;
for(i = 1; i < COLSTORESIZE; i++){
if(GetSlot(i) == nil)
continue;
bool wantThisOne = false;
if(GetBoundingBox(i).IsPointInside(pos) ||
bLoadAtSecondPosition && GetBoundingBox(i).IsPointInside(secondPosition, -119.0f) ||
CGeneral::faststrcmp(GetColName(i), "yacht") == 0){
wantThisOne = true;
}else{
// TODO: check mission cleanup list
}
if(wantThisOne)
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
else
CStreaming::RemoveCol(i);
}
bLoadAtSecondPosition = false;
}
void
CColStore::RequestCollision(const CVector2D &pos)
{
int i;
for(i = 1; i < COLSTORESIZE; i++)
if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -115.0f))
CStreaming::RequestCol(i, STREAMFLAGS_PRIORITY);
}
void
CColStore::EnsureCollisionIsInMemory(const CVector2D &pos)
{
int i;
if(CStreaming::ms_disableStreaming)
return;
for(i = 1; i < COLSTORESIZE; i++)
if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -110.0f) &&
!CStreaming::HasColLoaded(i)){
CStreaming::RequestCol(i, 0);
if(TheCamera.GetScreenFadeStatus() == FADE_0)
FrontEndMenuManager.MessageScreen("LOADCOL", false);
CTimer::Suspend();
CStreaming::LoadAllRequestedModels(false);
CTimer::Resume();
}
}
bool
CColStore::HasCollisionLoaded(const CVector2D &pos)
{
int i;
for(i = 1; i < COLSTORESIZE; i++)
if(GetSlot(i) && GetBoundingBox(i).IsPointInside(pos, -110.0f) &&
!GetSlot(i)->isLoaded)
return false;
return true;
}
#endif

43
src/core/ColStore.h Normal file
View file

@ -0,0 +1,43 @@
#pragma once
#include "templates.h"
struct ColDef { // made up name
int32 a;
bool isLoaded;
CRect bounds;
char name[20];
int16 minIndex;
int16 maxIndex;
};
class CColStore
{
static CPool<ColDef,ColDef> *ms_pColPool;
public:
static void Initialise(void);
static void Shutdown(void);
static int AddColSlot(const char *name);
static void RemoveColSlot(int32 slot);
static int FindColSlot(const char *name);
static char *GetColName(int32 slot);
static CRect &GetBoundingBox(int32 slot);
static void IncludeModelIndex(int32 slot, int32 modelIndex);
static bool LoadCol(int32 storeID, uint8 *buffer, int32 bufsize);
static void RemoveCol(int32 slot);
static void AddCollisionNeededAtPosn(const CVector2D &pos);
static void LoadAllCollision(void);
static void RemoveAllCollision(void);
static void LoadCollision(const CVector2D &pos);
static void RequestCollision(const CVector2D &pos);
static void EnsureCollisionIsInMemory(const CVector2D &pos);
static bool HasCollisionLoaded(const CVector2D &pos);
static ColDef *GetSlot(int slot) {
assert(slot >= 0);
assert(ms_pColPool);
assert(slot < ms_pColPool->GetSize());
return ms_pColPool->GetSlot(slot);
}
};