X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Fcomponent.h;h=44927ffd2e73c640f9d8a609f4e4b66984633572;hb=a99b57a74252fd3de649d544d070b747f91fcf4d;hp=6914c15282383a004b09117875e191dd56f6a6cd;hpb=248d62f7240d342982ade65a510be912b867fe49;p=libs%2Fgame.git diff --git a/source/game/component.h b/source/game/component.h index 6914c15..44927ff 100644 --- a/source/game/component.h +++ b/source/game/component.h @@ -18,12 +18,41 @@ public: virtual ~Component() = default; Handle get_entity() const { return entity; } +}; + +template +class BufferedComponent: public Component +{ +public: + using Data = T; + +protected: + T data[2]; + uint8_t read_index = 0; + uint8_t write_index = 0; + bool written = false; - virtual void pre_tick() { } - virtual void tick(Time::TimeDelta) { } - virtual void post_tick() { } + BufferedComponent(Handle e): Component(e) { } + + const T &read() const { return data[read_index]; } + T &write(); + +public: + virtual void prepare_tick() { write_index = 1-read_index; written = false; } + virtual void commit_tick() { if(written) read_index = write_index; } }; +template +T &BufferedComponent::write() +{ + if(!written && write_index!=read_index) + { + data[write_index] = data[read_index]; + written = true; + } + return data[write_index]; +} + } // namespace Msp::Game #endif