#pragma once #include #include #include #include "app.hh" namespace pg { class Input final : App { public: class Data; static Input& instance() noexcept { return instance_; } Input() = default; Input(const Input&) = delete; Input(Input&&) = delete; Input& operator=(const Input&) = delete; Input& operator=(Input&&) = delete; size_t Add(Data*) noexcept; void Update() noexcept override; Data* slots(size_t idx) noexcept { return idx < slots_.size()? slots_[idx]: nullptr; } private: static Input instance_; std::vector slots_; }; class Input::Data { public: struct Frame { public: size_t w, h; const uint8_t* rgba; }; Data() = delete; Data(std::string_view name) noexcept : name_(name) { idx_ = Input::instance().Add(this); } virtual ~Data() = default; Data(const Data&) = delete; Data(Data&&) = delete; Data& operator=(const Data&) = delete; Data& operator=(Data&&) = delete; virtual Frame Fetch(size_t) noexcept = 0; virtual size_t frames() noexcept = 0; size_t index() const noexcept { return idx_; } std::vector FetchSamples( size_t st, size_t dur, float x, float y, size_t offset) noexcept; const std::string& name() const noexcept { return name_; } private: std::string name_; size_t idx_; }; } // namespace pg