#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 { /// Dual Marching Cube 1:1 contouring class FlatDualMC: public AbstractFlat { public: FlatDualMC(const std::string&); virtual ~FlatDualMC(); void update(const camera_pos&) override; void onGui() override; std::string getOptions() 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> &); float iso = .1f; bool manifold = true; void render(const surrounding::corners &surrounding, buffer::ShortIndexed::Data& out) const; }; }