mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-26 04:12:34 +01:00
- slight cell lookup changes
This commit is contained in:
parent
265a2b3a70
commit
5e975d1854
@ -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++;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
@ -70,10 +70,10 @@ PACKED_CELL_OBJECT * GetFirstPackedCop(int cellx, int cellz, CELL_ITERATOR *pci,
|
|||||||
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);
|
|
||||||
}
|
|
@ -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
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user