Add optimal update and fix invalid write bugs
This commit is contained in:
@@ -85,7 +85,7 @@ static void removeCell(BzSpatialGrid *grid, BzSpatialGridID id, i32 x, i32 y) {
|
|||||||
}
|
}
|
||||||
if (i < bzArraySize(*cell)) {
|
if (i < bzArraySize(*cell)) {
|
||||||
BzSpatialGridID lastID = bzArrayPop(*cell);
|
BzSpatialGridID lastID = bzArrayPop(*cell);
|
||||||
(*cell)[id] = lastID;
|
(*cell)[i] = lastID;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,18 +125,40 @@ BzSpatialGridID bzSpatialGridInsert(BzSpatialGrid *grid, void *data, f32 posX, f
|
|||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool indexContains(BzSpatialGridIndex index, i32 x, i32 y) {
|
||||||
|
return x >= index.minX && x <= index.maxX && y >= index.minY && y <= index.maxY;
|
||||||
|
}
|
||||||
|
|
||||||
BzSpatialGridID bzSpatialGridUpdate(BzSpatialGrid *grid, BzSpatialGridID id, f32 posX, f32 posY, f32 sizeX, f32 sizeY) {
|
BzSpatialGridID bzSpatialGridUpdate(BzSpatialGrid *grid, BzSpatialGridID id, f32 posX, f32 posY, f32 sizeX, f32 sizeY) {
|
||||||
BzSpatialGridEntry *entry = bzObjectPoolGetObject(grid->entriesPool, id);
|
BzSpatialGridEntry *entry = bzObjectPoolGetObject(grid->entriesPool, id);
|
||||||
BZ_ASSERT(entry && entry->id == id);
|
BZ_ASSERT(entry && entry->id == id);
|
||||||
|
|
||||||
BzSpatialGridIndex index = calculateGridIndex(grid, posX, posY, sizeX, sizeY);
|
BzSpatialGridIndex oldIndex = entry->index;
|
||||||
if (entry->index.minX == index.minX &&
|
BzSpatialGridIndex newIndex = calculateGridIndex(grid, posX, posY, sizeX, sizeY);
|
||||||
entry->index.minY == index.minY &&
|
if (oldIndex.minX == newIndex.minX &&
|
||||||
entry->index.maxX == index.maxX &&
|
oldIndex.minY == newIndex.minY &&
|
||||||
entry->index.maxY == index.maxY) {
|
oldIndex.maxX == newIndex.maxX &&
|
||||||
|
oldIndex.maxY == newIndex.maxY) {
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i32 y = oldIndex.minY; y <= oldIndex.maxY; y++) {
|
||||||
|
for (i32 x = oldIndex.minX; x <= oldIndex.maxX; x++) {
|
||||||
|
bool inNew = indexContains(newIndex, x, y);
|
||||||
|
if (!inNew) removeCell(grid, id, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i32 y = newIndex.minY; y <= newIndex.maxY; y++) {
|
||||||
|
for (i32 x = newIndex.minX; x <= newIndex.maxX; x++) {
|
||||||
|
bool inOld = indexContains(oldIndex, x, y);
|
||||||
|
if (!inOld) insertCell(grid, id, x, y);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
entry->index = newIndex;
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
void bzSpatialGridRemove(BzSpatialGrid *grid, BzSpatialGridID id) {
|
void bzSpatialGridRemove(BzSpatialGrid *grid, BzSpatialGridID id) {
|
||||||
|
|||||||
Reference in New Issue
Block a user