2025-07-19 15:57:09 +03:00
|
|
|
#pragma once
|
2025-07-24 16:35:48 +03:00
|
|
|
#include <chrono>
|
2025-07-19 15:57:09 +03:00
|
|
|
#include <vector>
|
2025-07-19 19:41:25 +03:00
|
|
|
#include <include/core/SkSurface.h>
|
2025-07-20 15:24:44 +03:00
|
|
|
#include <unordered_set>
|
2025-07-21 11:59:19 +03:00
|
|
|
#include "../DrawData.hpp"
|
2025-12-14 18:57:40 +03:00
|
|
|
#include "../CanvasComponents/CanvasComponentContainer.hpp"
|
2025-07-20 15:24:44 +03:00
|
|
|
|
|
|
|
|
class DrawingProgram;
|
2025-07-24 16:35:48 +03:00
|
|
|
class DrawingProgramCache;
|
2025-07-19 15:57:09 +03:00
|
|
|
|
2025-07-24 16:35:48 +03:00
|
|
|
class DrawingProgramCacheBVHNode {
|
|
|
|
|
public:
|
|
|
|
|
SCollision::AABB<WorldScalar> bounds;
|
2025-12-14 18:57:40 +03:00
|
|
|
std::vector<CanvasComponentContainer::ObjInfoSharedPtr> components;
|
2025-07-24 16:35:48 +03:00
|
|
|
std::vector<std::shared_ptr<DrawingProgramCacheBVHNode>> children;
|
|
|
|
|
|
|
|
|
|
CoordSpaceHelper coords;
|
|
|
|
|
Vector2i resolution;
|
|
|
|
|
struct DrawCacheData {
|
2025-12-14 18:57:40 +03:00
|
|
|
uint32_t lastDrawnComponentPlacement;
|
2025-08-03 12:31:30 +03:00
|
|
|
sk_sp<SkSurface> surface;
|
2025-07-24 16:35:48 +03:00
|
|
|
std::chrono::steady_clock::time_point lastRenderTime;
|
|
|
|
|
DrawingProgramCache* attachedCache;
|
2025-08-08 09:56:50 +03:00
|
|
|
std::optional<SCollision::AABB<WorldScalar>> invalidBounds;
|
|
|
|
|
bool isInvalid = false;
|
2025-07-24 16:35:48 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
std::optional<DrawCacheData> drawCache;
|
|
|
|
|
};
|
2025-07-21 11:59:19 +03:00
|
|
|
|
2025-07-19 15:57:09 +03:00
|
|
|
class DrawingProgramCache {
|
|
|
|
|
public:
|
2025-07-20 15:24:44 +03:00
|
|
|
DrawingProgramCache(DrawingProgram& initDrawP);
|
2025-07-24 16:35:48 +03:00
|
|
|
~DrawingProgramCache();
|
|
|
|
|
|
2025-07-26 21:20:14 +03:00
|
|
|
static constexpr size_t MINIMUM_COMPONENTS_TO_START_REBUILD = 1000;
|
2025-08-26 12:03:09 +03:00
|
|
|
static constexpr size_t MAXIMUM_COMPONENTS_IN_SINGLE_NODE = 50;
|
2025-07-26 21:20:14 +03:00
|
|
|
|
|
|
|
|
bool check_if_rebuild_should_occur();
|
2025-12-14 18:57:40 +03:00
|
|
|
void test_rebuild(const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& comps, bool force = false);
|
|
|
|
|
void test_rebuild_dont_include_set(const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& comps, const std::unordered_set<CanvasComponentContainer::ObjInfoSharedPtr>& objsToNotInclude, bool force = false);
|
|
|
|
|
void test_rebuild_dont_include_set_dont_include_nodes(const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& comps, const std::unordered_set<CanvasComponentContainer::ObjInfoSharedPtr>& objsToNotInclude, const std::unordered_set<std::shared_ptr<DrawingProgramCacheBVHNode>>& nodesToNotInclude, bool force = false);
|
2025-07-26 21:20:14 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
static void move_components_from_bvh_nodes_to_set(std::unordered_set<CanvasComponentContainer::ObjInfoSharedPtr>& s, const std::unordered_set<std::shared_ptr<DrawingProgramCacheBVHNode>>& bvhNodes);
|
|
|
|
|
static void move_components_from_bvh_node_to_set(std::unordered_set<CanvasComponentContainer::ObjInfoSharedPtr>& s, const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode);
|
2025-07-26 21:20:14 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
void erase_component(const CanvasComponentContainer::ObjInfoSharedPtr& c);
|
|
|
|
|
void add_component(const CanvasComponentContainer::ObjInfoSharedPtr& c);
|
2025-07-24 16:35:48 +03:00
|
|
|
void refresh_all_draw_cache(const DrawData& drawData);
|
2025-12-14 18:57:40 +03:00
|
|
|
void traverse_bvh_run_function(const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& components)> f);
|
|
|
|
|
void traverse_bvh_erase_function(const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& components)> f);
|
2025-07-19 15:57:09 +03:00
|
|
|
// Run before actually updating the component
|
2025-12-14 18:57:40 +03:00
|
|
|
void preupdate_component(const CanvasComponentContainer::ObjInfoSharedPtr& c);
|
|
|
|
|
void invalidate_cache_before_pos(uint32_t placementToInvalidateAt);
|
|
|
|
|
void invalidate_cache_at_aabb_before_pos(const SCollision::AABB<WorldScalar>& aabb, uint32_t placementToInvalidateAt);
|
2025-07-24 16:35:48 +03:00
|
|
|
void clear();
|
2025-08-07 21:30:40 +03:00
|
|
|
|
|
|
|
|
struct DrawComponentsToCanvasOptionalData {
|
2025-12-14 18:57:40 +03:00
|
|
|
uint32_t* lastDrawnComponentPlacement = nullptr;
|
2025-08-07 21:30:40 +03:00
|
|
|
std::optional<SCollision::AABB<WorldScalar>> drawBounds;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void draw_components_to_canvas(SkCanvas* canvas, const DrawData& drawData, DrawComponentsToCanvasOptionalData optData);
|
2025-12-14 18:57:40 +03:00
|
|
|
const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& get_unsorted_component_list() const;
|
2025-07-24 16:35:48 +03:00
|
|
|
const std::chrono::steady_clock::time_point& get_last_bvh_build_time() const;
|
2025-07-22 12:22:08 +03:00
|
|
|
void clear_own_cached_surfaces();
|
2025-08-13 15:46:41 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
CanvasComponentContainer::ObjInfoSharedPtr get_front_object_colliding_with(const SCollision::ColliderCollection<float>& cC);
|
2025-09-29 15:44:01 +03:00
|
|
|
|
|
|
|
|
private:
|
2025-08-13 15:46:41 +03:00
|
|
|
static std::unordered_set<std::shared_ptr<DrawingProgramCacheBVHNode>> nodesWithCachedSurfaces;
|
|
|
|
|
|
2025-08-08 09:56:50 +03:00
|
|
|
void draw_cache_image_to_canvas(SkCanvas* canvas, const DrawData& drawData, const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode);
|
2025-07-31 17:55:14 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
void force_rebuild_dont_include_objs(std::vector<CanvasComponentContainer::ObjInfoSharedPtr> componentsToBuild, const std::unordered_set<CanvasComponentContainer::ObjInfoSharedPtr>& objsToNotInclude);
|
|
|
|
|
void force_rebuild(const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& componentsToBuild);
|
2025-07-26 21:20:14 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
bool traverse_bvh_erase_function_recursive(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& components)> f);
|
2025-07-24 16:35:48 +03:00
|
|
|
void build_bvh_node_coords_and_resolution(DrawingProgramCacheBVHNode& node);
|
|
|
|
|
void refresh_draw_cache(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const DrawData& drawData);
|
2025-12-14 18:57:40 +03:00
|
|
|
void build(std::vector<CanvasComponentContainer::ObjInfoSharedPtr> components);
|
|
|
|
|
void traverse_bvh_run_function_recursive(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const SCollision::AABB<WorldScalar>& aabb, std::function<bool(const std::shared_ptr<DrawingProgramCacheBVHNode>& node, const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& components)> f);
|
2025-07-27 11:56:34 +03:00
|
|
|
|
2025-12-14 18:57:40 +03:00
|
|
|
void build_bvh_node(const std::shared_ptr<DrawingProgramCacheBVHNode>& bvhNode, const std::vector<CanvasComponentContainer::ObjInfoSharedPtr>& components);
|
2025-07-19 15:57:09 +03:00
|
|
|
|
2025-07-21 11:59:19 +03:00
|
|
|
std::chrono::steady_clock::time_point lastBvhBuildTime;
|
2025-07-24 16:35:48 +03:00
|
|
|
std::shared_ptr<DrawingProgramCacheBVHNode> bvhRoot;
|
2025-12-14 18:57:40 +03:00
|
|
|
std::vector<CanvasComponentContainer::ObjInfoSharedPtr> unsortedComponents;
|
2025-07-20 15:24:44 +03:00
|
|
|
DrawingProgram& drawP;
|
2025-07-19 15:57:09 +03:00
|
|
|
};
|