#pragma once #include #include "../CollabList.hpp" #include #include #include "../DrawData.hpp" class DrawingProgram; class DrawComponent; class DrawingProgramCache { public: typedef CollabList, ServerClientID> CollabListType; DrawingProgramCache(DrawingProgram& initDrawP); void update(); void erase_component(const CollabListType::ObjectInfoPtr& c); void add_component(const CollabListType::ObjectInfoPtr& c); void refresh_all_draw_cache(SkCanvas* canvas, const DrawData& drawData); struct BVHNode { SCollision::AABB bounds; std::vector components; std::vector> children; CoordSpaceHelper coords; Vector2i resolution; struct DrawCacheData { uint64_t lastDrawnComponentPlacement; sk_sp surface; std::chrono::steady_clock::time_point lastRenderTime; }; std::optional drawCache; }; std::unordered_set> nodesWithCachedSurfaces; void traverse_bvh_collision_check(const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam); void traverse_bvh_run_function(const SCollision::AABB& aabb, std::function node, const std::vector& components)> f); void force_rebuild(); // Run before actually updating the component void preupdate_component(const CollabListType::ObjectInfoPtr& c); void invalidate_cache_before_pos(uint64_t placementToInvalidateAt); private: void traverse_bvh_collision_check_recursive(const std::shared_ptr& bvhNode, const SCollision::ColliderCollection& checkAgainstWorld, const SCollision::ColliderCollection& checkAgainstCam); void traverse_bvh_collision_check_recursive_tiny(const std::shared_ptr& bvhNode, bool collided); void build_bvh_node_coords_and_resolution(BVHNode& node); void refresh_draw_cache(const std::shared_ptr& bvhNode, const DrawData& drawData); void build(std::vector components); std::chrono::steady_clock::time_point lastBvhBuildTime; void traverse_bvh_run_function_recursive(const std::shared_ptr& bvhNode, const SCollision::AABB& aabb, std::function& node, const std::vector& components)> f); std::pair, std::vector::iterator> get_bvh_node_fully_containing_recursive(const std::shared_ptr& bvhNode, DrawComponent* c); void build_bvh_node(const std::shared_ptr& bvhNode, std::vector components); std::shared_ptr bvhRoot; std::vector unsortedComponents; DrawingProgram& drawP; };