blocky/playground/input.hh
2022-06-22 11:48:52 +09:00

72 lines
1.3 KiB
C++

#pragma once
#include <string>
#include <string_view>
#include <vector>
#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<Data*> 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<float> 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