Add optimal update and fix invalid write bugs

This commit is contained in:
2023-11-17 19:35:20 +01:00
parent 066014cb44
commit 66dba151ed

View File

@@ -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) {