2025-07-19 15:57:09 +03:00
|
|
|
#pragma once
|
2025-12-14 18:57:40 +03:00
|
|
|
#include "../CanvasComponents/CanvasComponentContainer.hpp"
|
2025-12-28 17:34:33 +03:00
|
|
|
#include <unordered_map>
|
2025-07-21 11:59:19 +03:00
|
|
|
|
2025-12-29 15:04:32 +03:00
|
|
|
struct DrawingProgramCacheBVHNode {
|
|
|
|
|
public:
|
|
|
|
|
SCollision::AABB<WorldScalar> bounds;
|
|
|
|
|
CoordSpaceHelper coords;
|
|
|
|
|
Vector2i resolution;
|
|
|
|
|
private:
|
2025-12-30 19:46:08 +03:00
|
|
|
std::vector<CanvasComponentContainer::ObjInfo*> components;
|
2025-12-29 15:04:32 +03:00
|
|
|
std::vector<std::shared_ptr<DrawingProgramCacheBVHNode>> children;
|
|
|
|
|
friend class DrawingProgramCache;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-19 15:57:09 +03:00
|
|
|
class DrawingProgramCache {
|
|
|
|
|
public:
|
2026-01-24 12:31:55 +03:00
|
|
|
static size_t MINIMUM_COMPONENTS_TO_START_REBUILD;
|
|
|
|
|
static size_t MAXIMUM_COMPONENTS_IN_SINGLE_NODE;
|
|
|
|
|
static size_t MAXIMUM_DRAW_CACHE_SURFACES;
|
|
|
|
|
static size_t CACHE_NODE_RESOLUTION;
|
2026-01-27 12:40:39 +03:00
|
|
|
static size_t MILLISECOND_FRAME_TIME_TO_FORCE_CACHE_REFRESH;
|
|
|
|
|
static size_t MILLISECOND_MINIMUM_TIME_TO_CHECK_FORCE_REFRESH;
|
2025-12-28 17:34:33 +03:00
|
|
|
|
|
|
|
|
DrawingProgramCache(DrawingProgram& initDrawP);
|
2025-12-30 19:46:08 +03:00
|
|
|
void add_component(CanvasComponentContainer::ObjInfo* c);
|
|
|
|
|
void erase_component(CanvasComponentContainer::ObjInfo* c);
|
2025-07-22 12:22:08 +03:00
|
|
|
void clear_own_cached_surfaces();
|
2025-12-30 19:46:08 +03:00
|
|
|
void preupdate_component(CanvasComponentContainer::ObjInfo* c);
|
|
|
|
|
void build(const std::unordered_set<CanvasComponentContainer::ObjInfo*>& objsToExclude);
|
2025-12-29 15:04:32 +03:00
|
|
|
void traverse_bvh_run_function(const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node)> f);
|
|
|
|
|
void traverse_bvh_run_function_starting_at_node(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node)> f);
|
|
|
|
|
void traverse_bvh_run_function_starting_at_node_no_collision_check(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node)> f);
|
2025-12-30 19:46:08 +03:00
|
|
|
void node_loop_erase_if_components(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, std::function<bool(CanvasComponentContainer::ObjInfo* comp)> f);
|
|
|
|
|
void node_loop_components(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, std::function<void(CanvasComponentContainer::ObjInfo* comp)> f);
|
2025-12-28 17:34:33 +03:00
|
|
|
bool should_rebuild() const;
|
2026-01-27 12:40:39 +03:00
|
|
|
bool check_rebuild_needed_from_framerate();
|
2026-01-21 13:11:01 +03:00
|
|
|
void update_and_draw_cached_canvas(SkCanvas* canvas, const DrawData& drawData);
|
2025-12-28 17:34:33 +03:00
|
|
|
void draw_components_to_canvas(SkCanvas* canvas, const DrawData& drawData, const std::optional<SCollision::AABB<WorldScalar>>& drawBounds);
|
|
|
|
|
void invalidate_cache_at_aabb(const SCollision::AABB<WorldScalar>& aabb);
|
2026-02-04 19:19:29 +03:00
|
|
|
static void delete_all_draw_cache();
|
2026-01-21 13:11:01 +03:00
|
|
|
|
2025-12-30 19:46:08 +03:00
|
|
|
CanvasComponentContainer::ObjInfo* get_front_object_colliding_with_in_editing_layer(const SCollision::ColliderCollection<float>& cC);
|
2025-12-29 15:04:32 +03:00
|
|
|
~DrawingProgramCache();
|
2025-09-29 15:44:01 +03:00
|
|
|
private:
|
2025-12-28 17:34:33 +03:00
|
|
|
struct NodeCache {
|
|
|
|
|
sk_sp<SkSurface> surface;
|
|
|
|
|
std::chrono::steady_clock::time_point lastRenderTime;
|
|
|
|
|
DrawingProgramCache* attachedDrawingProgramCache;
|
|
|
|
|
std::optional<SCollision::AABB<WorldScalar>> invalidBounds;
|
|
|
|
|
};
|
2025-12-29 15:04:32 +03:00
|
|
|
static std::unordered_map<std::shared_ptr<DrawingProgramCacheBVHNode>, NodeCache> nodeCacheMap;
|
2025-12-28 17:34:33 +03:00
|
|
|
|
2026-01-21 13:11:01 +03:00
|
|
|
struct WindowCache {
|
|
|
|
|
sk_sp<SkSurface> surface;
|
|
|
|
|
DrawingProgramCache* attachedDrawingProgramCache = nullptr;
|
|
|
|
|
std::optional<SCollision::AABB<WorldScalar>> invalidBounds;
|
|
|
|
|
Vector2i size = {0, 0};
|
|
|
|
|
CoordSpaceHelper coords;
|
|
|
|
|
};
|
|
|
|
|
static WindowCache windowCache;
|
|
|
|
|
|
|
|
|
|
void refresh_all_draw_cache(const DrawData& drawData);
|
|
|
|
|
void update_window_cache_invalid_bounds(const DrawData& drawData);
|
|
|
|
|
void window_cache_complete_refresh(const DrawData& drawData);
|
|
|
|
|
void allocate_window_cache_area();
|
2025-12-30 19:46:08 +03:00
|
|
|
void internal_build(std::vector<CanvasComponentContainer::ObjInfo*> componentsToBuild, const std::unordered_set<CanvasComponentContainer::ObjInfo*>& objsToNotInclude);
|
|
|
|
|
void build_bvh_node(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const std::vector<CanvasComponentContainer::ObjInfo*>& components);
|
2025-12-29 15:04:32 +03:00
|
|
|
void build_bvh_node_coords_and_resolution(DrawingProgramCacheBVHNode& node);
|
|
|
|
|
void refresh_draw_cache(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const DrawData& drawData);
|
|
|
|
|
void draw_cache_image_to_canvas(SkCanvas* canvas, const DrawData& drawData, const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode);
|
|
|
|
|
void recursive_draw_layer_item_to_canvas(const DrawingProgramLayerListItem& layerListItem, SkCanvas* canvas, const DrawData& drawData, const std::optional<SCollision::AABB<WorldScalar>>& drawBounds, const std::vector<std::shared_ptr<DrawingProgramCacheBVHNode>>& nodesToDraw);
|
2025-12-28 17:34:33 +03:00
|
|
|
|
2026-01-27 12:40:39 +03:00
|
|
|
std::optional<std::chrono::steady_clock::time_point> badFrametimeTimePoint;
|
|
|
|
|
std::optional<std::chrono::steady_clock::time_point> unorderedObjectsExistTimePoint;
|
|
|
|
|
|
2025-12-29 15:04:32 +03:00
|
|
|
std::shared_ptr<DrawingProgramCacheBVHNode> bvhRoot;
|
2025-12-30 19:46:08 +03:00
|
|
|
std::vector<CanvasComponentContainer::ObjInfo*> unsortedComponents;
|
2025-07-20 15:24:44 +03:00
|
|
|
DrawingProgram& drawP;
|
2025-07-19 15:57:09 +03:00
|
|
|
};
|