Fixed bug with cache not updating

This commit is contained in:
Yousef Khadadeh 2026-02-07 18:57:32 +03:00
parent 89925763cd
commit f2f215fa91
2 changed files with 18 additions and 15 deletions

View file

@ -28,7 +28,7 @@ namespace SCollision {
T width() const { return max.x() - min.x(); }
T height() const { return max.y() - min.y(); }
// Do not try to get intersection between AABBs unless you know they collide
AABB<T> get_intersection_between_aabbs(const AABB<T>& other) {
AABB<T> get_intersection_between_aabbs(const AABB<T>& other) const {
return {
cwise_vec_max(other.min, min),
cwise_vec_min(other.max, max)

View file

@ -356,24 +356,27 @@ void DrawingProgramCache::allocate_window_cache_area() {
}
void DrawingProgramCache::update_window_cache_invalid_bounds(const DrawData& drawData) {
auto iBounds = windowCache.invalidBounds.value();
auto invalidBound = windowCache.invalidBounds.value();
if(SCollision::collide(invalidBound, drawData.cam.viewingAreaGenerousCollider)) {
auto iBounds = drawData.cam.viewingAreaGenerousCollider.get_intersection_between_aabbs(invalidBound);
SCollision::AABB<float> cameraSpaceInvalidAABB = drawData.cam.c.world_collider_to_coords<SCollision::AABB<float>>(iBounds);
SCollision::AABB<float> clipRectBoundAABB{cameraSpaceInvalidAABB.min - Vector2f{4, 4}, cameraSpaceInvalidAABB.max + Vector2f{4, 4}};
SCollision::AABB<float> cameraSpaceInvalidAABB = drawData.cam.c.world_collider_to_coords<SCollision::AABB<float>>(iBounds);
SCollision::AABB<float> clipRectBoundAABB{cameraSpaceInvalidAABB.min - Vector2f{4, 4}, cameraSpaceInvalidAABB.max + Vector2f{4, 4}};
SkIRect clipRect = SkIRect::MakeLTRB(clipRectBoundAABB.min.x(),
clipRectBoundAABB.min.y(),
clipRectBoundAABB.max.x(),
clipRectBoundAABB.max.y());
SkIRect clipRect = SkIRect::MakeLTRB(clipRectBoundAABB.min.x(),
clipRectBoundAABB.min.y(),
clipRectBoundAABB.max.x(),
clipRectBoundAABB.max.y());
SCollision::AABB<WorldScalar> clipRectBoundAABBWorld = drawData.cam.c.collider_to_world<SCollision::AABB<WorldScalar>>(clipRectBoundAABB);
SCollision::AABB<WorldScalar> clipRectBoundAABBWorld = drawData.cam.c.collider_to_world<SCollision::AABB<WorldScalar>>(clipRectBoundAABB);
SkCanvas* cacheCanvas = windowCache.surface->getCanvas();
cacheCanvas->save();
cacheCanvas->clipIRect(clipRect);
cacheCanvas->clear(SkColor4f{0, 0, 0, 0});
draw_components_to_canvas(cacheCanvas, drawData, clipRectBoundAABBWorld);
cacheCanvas->restore();
SkCanvas* cacheCanvas = windowCache.surface->getCanvas();
cacheCanvas->save();
cacheCanvas->clipIRect(clipRect);
cacheCanvas->clear(SkColor4f{0, 0, 0, 0});
draw_components_to_canvas(cacheCanvas, drawData, clipRectBoundAABBWorld);
cacheCanvas->restore();
}
windowCache.invalidBounds = std::nullopt;
}