- slight cell lookup changes

This commit is contained in:
Ilya Shurumov 2022-04-02 21:51:51 +06:00
parent 265a2b3a70
commit 5e975d1854
6 changed files with 35 additions and 62 deletions

View File

@ -286,9 +286,7 @@ int CameraCollisionCheck(void)
if (gCameraDistance > 0)
{
ppco = GetFirstPackedCop(cellx, cellz, &ci, 0, cellLevel);
while (ppco)
for (ppco = GetFirstPackedCop(cellx, cellz, &ci, 0, cellLevel); ppco; ppco = GetNextPackedCop(&ci))
{
int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
@ -349,7 +347,6 @@ int CameraCollisionCheck(void)
}
}
}
ppco = GetNextPackedCop(&ci);
}
}
count++;

View File

@ -7,7 +7,7 @@
int cell_object_index = 0;
CELL_OBJECT cell_object_buffer[1024];
unsigned char cell_object_computed_values[2048];
u_char cell_object_computed_values[2048];
extern u_char NumPlayers;
@ -69,11 +69,11 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
8767,555,445,223 - objects of list 2
0x8000 - end of cell objects
*/
while (cell->num != (level | 0x4000)) // skip until we reach the needed list header
level |= 0x4000;
while (cell->num != level) // skip until we reach the needed list header
{
cell++;
if (cell->num & 0x8000) // end of cell objects?
return NULL;
}
@ -86,8 +86,8 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
pci->pcd = cell;
num = cell->num;
ppco = &cell_objects[num & 0x3fff];
num = cell->num & 16383;
ppco = &cell_objects[num];
if (ppco->value == 0xffff && (ppco->pos.vy & 1))
{
@ -95,9 +95,9 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
}
else if (use_computed)
{
value = 1 << (num & 7) & 0xffff;
value = 1 << (num & 7);
if (cell_object_computed_values[(num & 0x3fff) >> 3] & value) // get cached value
if (cell_object_computed_values[num / 8] & value) // get cached value
{
ppco = GetNextPackedCop(pci);
pci->ppco = ppco;
@ -105,7 +105,7 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
return ppco;
}
cell_object_computed_values[(num & 0x3fff) >> 3] |= value;
cell_object_computed_values[num / 8] |= value;
}
pci->ppco = ppco;
@ -135,20 +135,19 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci)
if (num & 0x4000) // end of list?
return NULL;
ppco = &cell_objects[num & 0x3fff];
num &= 16383;
ppco = &cell_objects[num];
} while (ppco->value == 0xffff && (ppco->pos.vy & 1));
if (!pci->use_computed)
break;
value = 1 << (num & 7) & 0xffff;
if ((cell_object_computed_values[(num & 0x3fff) >> 3] & value) == 0)
value = 1 << (num & 7);
if ((cell_object_computed_values[num / 8] & value) == 0)
{
cell_object_computed_values[(num & 0x3fff) >> 3] |= value;
cell_object_computed_values[num / 8] |= value;
break;
}
} while (true);
pci->pcd = celld;
@ -157,34 +156,20 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci)
return ppco;
}
// [D] [T]
CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near)
{
int newIndex;
CELL_OBJECT* pco;
if (ppco == NULL)
return NULL;
pco = &cell_object_buffer[cell_object_index];
cell_object_index = cell_object_index + 1 & 0x3ff;
pco = &cell_object_buffer[newIndex = cell_object_index];
cell_object_index = newIndex + 1 & 1023;
pco->pos.vx = near->x + (((ppco->pos.vx - near->x) << 0x10) >> 0x10);
pco->pos.vz = near->z + (((ppco->pos.vz - near->z) << 0x10) >> 0x10);
pco->pos.vy = (ppco->pos.vy << 0x10) >> 0x11;
pco->yang = ppco->value & 0x3f;
pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
QuickUnpackCellObject(ppco, near, pco);
return pco;
}
// [D] [T]
void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco)
{
pco->pos.vx = near->x + (((ppco->pos.vx - near->x) << 0x10) >> 0x10);
pco->pos.vz = near->z + (((ppco->pos.vz - near->z) << 0x10) >> 0x10);
pco->pos.vy = (ppco->pos.vy << 0x10) >> 0x11;
pco->yang = ppco->value & 0x3f;
pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
}

View File

@ -9,6 +9,15 @@ extern PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATO
extern PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci); // 0x0003F5F0
extern CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near); // 0x000418E8
extern void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco);
inline void QuickUnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near, CELL_OBJECT* pco)
{
pco->pos.vx = near->x + (short)(ppco->pos.vx - near->x);
pco->pos.vz = near->z + (short)(ppco->pos.vz - near->z);
pco->pos.vy = (short)ppco->pos.vy >> 1;
pco->yang = ppco->value & 63;
pco->type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
}
#endif

View File

@ -1396,10 +1396,8 @@ void DrawMapPSX(int* comp_val)
cellz > -1 && cellz < cells_down &&
PVS_ptr[vis_v * pvs_square + vis_h]) // check PVS table
{
ppco = GetFirstPackedCop(cellx, cellz, &ci, 1, drawData.cellLevel);
// walk each cell object in cell
while (ppco != NULL)
for (ppco = GetFirstPackedCop(cellx, cellz, &ci, 1, drawData.cellLevel); ppco; ppco = GetNextPackedCop(&ci))
{
model = modelpointers[(ppco->value >> 6) | ((ppco->pos).vy & 1) << 10];
@ -1493,8 +1491,6 @@ void DrawMapPSX(int* comp_val)
}
}
}
ppco = GetNextPackedCop(&ci);
}
}
}

View File

@ -1522,9 +1522,7 @@ void UpdateRoadPosition(CAR_DATA* cp, VECTOR* basePos, int intention)
if (RoadMapRegions[cbr] != cbrX + cbrZ * regions_across)
continue;
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1);
while (ppco)
for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1); ppco; ppco = GetNextPackedCop(&ci))
{
int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
model = modelpointers[type];
@ -1666,7 +1664,6 @@ void UpdateRoadPosition(CAR_DATA* cp, VECTOR* basePos, int intention)
collide++;
}
}
ppco = GetNextPackedCop(&ci);
}
}
}

View File

@ -41,9 +41,7 @@ char CellEmpty(VECTOR *pPosition, int radius)
cell_x = (pPosition->vx + units_across_halved) / MAP_CELL_SIZE;
cell_z = (pPosition->vz + units_down_halved) / MAP_CELL_SIZE;
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0);
while(ppco)
for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci))
{
type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
pModel = modelpointers[type];
@ -198,8 +196,6 @@ char CellEmpty(VECTOR *pPosition, int radius)
}
}
}
ppco = GetNextPackedCop(&ci);
}
return 1;
@ -372,9 +368,7 @@ char lineClear(VECTOR *v1, VECTOR *v2)
if ((ocx != cell_x) || (ocz != cell_z))
{
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0);
while (ppco)
for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci))
{
QuickUnpackCellObject(ppco, &ci.nearCell, &tempCO);
pModel = modelpointers[tempCO.type];
@ -503,7 +497,6 @@ char lineClear(VECTOR *v1, VECTOR *v2)
collide++;
}
}
ppco = GetNextPackedCop(&ci);
}
}
@ -555,9 +548,7 @@ void CollisionCopList(XZPAIR* pos, int* count)
// check if we have valid region
if (cbr.x + cbr.z * regions_across == RoadMapRegions[(cbr.x & 1) + (cbr.z & 1) * 2])
{
ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel);
while (ppco)
for (ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel); ppco; ppco = GetNextPackedCop(&ci))
{
type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
@ -576,8 +567,6 @@ void CollisionCopList(XZPAIR* pos, int* count)
pcoplist[cnt] = ppco;
cnt++;
}
ppco = GetNextPackedCop(&ci);
}
}