#pragma once #include "AbstractFlat.hpp" #include "surrounding.hpp" #include "../data/safe_queue.hpp" #include "../data/safe_priority_queue.hpp" #include "../data/circular_buffer.hpp" #include "../render/buffer/ShortIndexed.hpp" #include #define REPORT_BUFFER_SIZE 128 using namespace data; namespace contouring { /// Stupid cubes 1:1 contouring class FlatSurroundingBox: public AbstractFlat { public: FlatSurroundingBox(const std::string&); virtual ~FlatSurroundingBox(); void update(const camera_pos&) override; void onGui() override; /// Chunk data change void onUpdate(const chunk_pos &, const robin_hood::unordered_map> &, geometry::Faces) override; /// Chunk existante ping /// @note notify for chunks entering view while moving void onNotify(const chunk_pos &, const robin_hood::unordered_map> &) override; protected: safe_priority_queue_map loadQueue; safe_queue> loadedQueue; struct report { circular_buffer count = circular_buffer(REPORT_BUFFER_SIZE, 0); // MAYBE: store int circular_buffer load = circular_buffer(REPORT_BUFFER_SIZE, 0); circular_buffer loaded = circular_buffer(REPORT_BUFFER_SIZE, 0); } reports; bool running = true; std::vector workers; void enqueue(const chunk_pos &, const robin_hood::unordered_map> &); private: static inline bool isTransparent(const surrounding::faces &surrounding, const std::pair &idx); static void render(const surrounding::faces &surrounding, std::vector &vertices); }; } // namespace contouring