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

View File

@ -7,7 +7,7 @@
int cell_object_index = 0; int cell_object_index = 0;
CELL_OBJECT cell_object_buffer[1024]; CELL_OBJECT cell_object_buffer[1024];
unsigned char cell_object_computed_values[2048]; u_char cell_object_computed_values[2048];
extern u_char NumPlayers; 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 8767,555,445,223 - objects of list 2
0x8000 - end of cell objects 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++; cell++;
if (cell->num & 0x8000) // end of cell objects? if (cell->num & 0x8000) // end of cell objects?
return NULL; return NULL;
} }
@ -86,8 +86,8 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
pci->pcd = cell; pci->pcd = cell;
num = cell->num; num = cell->num & 16383;
ppco = &cell_objects[num & 0x3fff]; ppco = &cell_objects[num];
if (ppco->value == 0xffff && (ppco->pos.vy & 1)) 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) 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); ppco = GetNextPackedCop(pci);
pci->ppco = ppco; pci->ppco = ppco;
@ -105,7 +105,7 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
return ppco; return ppco;
} }
cell_object_computed_values[(num & 0x3fff) >> 3] |= value; cell_object_computed_values[num / 8] |= value;
} }
pci->ppco = ppco; pci->ppco = ppco;
@ -135,20 +135,19 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci)
if (num & 0x4000) // end of list? if (num & 0x4000) // end of list?
return NULL; return NULL;
ppco = &cell_objects[num & 0x3fff]; num &= 16383;
ppco = &cell_objects[num];
} while (ppco->value == 0xffff && (ppco->pos.vy & 1)); } while (ppco->value == 0xffff && (ppco->pos.vy & 1));
if (!pci->use_computed) if (!pci->use_computed)
break; break;
value = 1 << (num & 7) & 0xffff; value = 1 << (num & 7);
if ((cell_object_computed_values[num / 8] & value) == 0)
if ((cell_object_computed_values[(num & 0x3fff) >> 3] & value) == 0)
{ {
cell_object_computed_values[(num & 0x3fff) >> 3] |= value; cell_object_computed_values[num / 8] |= value;
break; break;
} }
} while (true); } while (true);
pci->pcd = celld; pci->pcd = celld;
@ -157,34 +156,20 @@ PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci)
return ppco; return ppco;
} }
// [D] [T] // [D] [T]
CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near) CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near)
{ {
int newIndex;
CELL_OBJECT* pco; CELL_OBJECT* pco;
if (ppco == NULL) if (ppco == NULL)
return NULL; return NULL;
pco = &cell_object_buffer[cell_object_index]; pco = &cell_object_buffer[newIndex = cell_object_index];
cell_object_index = cell_object_index + 1 & 0x3ff; cell_object_index = newIndex + 1 & 1023;
pco->pos.vx = near->x + (((ppco->pos.vx - near->x) << 0x10) >> 0x10); QuickUnpackCellObject(ppco, near, pco);
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);
return 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 PACKED_CELL_OBJECT* GetNextPackedCop(CELL_ITERATOR* pci); // 0x0003F5F0
extern CELL_OBJECT* UnpackCellObject(PACKED_CELL_OBJECT* ppco, XZPAIR* near); // 0x000418E8 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 #endif

View File

@ -1396,10 +1396,8 @@ void DrawMapPSX(int* comp_val)
cellz > -1 && cellz < cells_down && cellz > -1 && cellz < cells_down &&
PVS_ptr[vis_v * pvs_square + vis_h]) // check PVS table 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 // 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]; 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) if (RoadMapRegions[cbr] != cbrX + cbrZ * regions_across)
continue; continue;
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1); for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 1); ppco; ppco = GetNextPackedCop(&ci))
while (ppco)
{ {
int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); int type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
model = modelpointers[type]; model = modelpointers[type];
@ -1666,7 +1664,6 @@ void UpdateRoadPosition(CAR_DATA* cp, VECTOR* basePos, int intention)
collide++; 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_x = (pPosition->vx + units_across_halved) / MAP_CELL_SIZE;
cell_z = (pPosition->vz + units_down_halved) / MAP_CELL_SIZE; cell_z = (pPosition->vz + units_down_halved) / MAP_CELL_SIZE;
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci))
while(ppco)
{ {
type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
pModel = modelpointers[type]; pModel = modelpointers[type];
@ -198,8 +196,6 @@ char CellEmpty(VECTOR *pPosition, int radius)
} }
} }
} }
ppco = GetNextPackedCop(&ci);
} }
return 1; return 1;
@ -372,9 +368,7 @@ char lineClear(VECTOR *v1, VECTOR *v2)
if ((ocx != cell_x) || (ocz != cell_z)) if ((ocx != cell_x) || (ocz != cell_z))
{ {
ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); for (ppco = GetFirstPackedCop(cell_x, cell_z, &ci, 0); ppco; ppco = GetNextPackedCop(&ci))
while (ppco)
{ {
QuickUnpackCellObject(ppco, &ci.nearCell, &tempCO); QuickUnpackCellObject(ppco, &ci.nearCell, &tempCO);
pModel = modelpointers[tempCO.type]; pModel = modelpointers[tempCO.type];
@ -503,7 +497,6 @@ char lineClear(VECTOR *v1, VECTOR *v2)
collide++; collide++;
} }
} }
ppco = GetNextPackedCop(&ci);
} }
} }
@ -555,9 +548,7 @@ void CollisionCopList(XZPAIR* pos, int* count)
// check if we have valid region // check if we have valid region
if (cbr.x + cbr.z * regions_across == RoadMapRegions[(cbr.x & 1) + (cbr.z & 1) * 2]) if (cbr.x + cbr.z * regions_across == RoadMapRegions[(cbr.x & 1) + (cbr.z & 1) * 2])
{ {
ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel); for (ppco = GetFirstPackedCop(cell.x, cell.z, &ci, 1, cellLevel); ppco; ppco = GetNextPackedCop(&ci))
while (ppco)
{ {
type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10); type = (ppco->value >> 6) | ((ppco->pos.vy & 1) << 10);
@ -576,8 +567,6 @@ void CollisionCopList(XZPAIR* pos, int* count)
pcoplist[cnt] = ppco; pcoplist[cnt] = ppco;
cnt++; cnt++;
} }
ppco = GetNextPackedCop(&ci);
} }
} }