X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgame%2Fcomponent.h;h=44927ffd2e73c640f9d8a609f4e4b66984633572;hb=a99b57a74252fd3de649d544d070b747f91fcf4d;hp=6b49dd19e8c6e3f64da05ceb550616d1e2c31624;hpb=e3b8bcdcb5abfdc4cfaf0af0f9633ac15d1f3b69;p=libs%2Fgame.git diff --git a/source/game/component.h b/source/game/component.h index 6b49dd1..44927ff 100644 --- a/source/game/component.h +++ b/source/game/component.h @@ -20,6 +20,39 @@ public: 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; + + 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