DynamicGraphic.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00031 #ifndef _GG_DynamicGraphic_h_
00032 #define _GG_DynamicGraphic_h_
00033
00034 #include <GG/Control.h>
00035 #include <GG/StaticGraphic.h>
00036
00037
00038 namespace GG {
00039 class Texture;
00040
00068 class GG_API DynamicGraphic : public Control
00069 {
00070 public:
00072
00077 typedef boost::signal<void (std::size_t)> StoppedSignalType;
00078
00084 typedef boost::signal<void (std::size_t)> EndFrameSignalType;
00086
00088
00095 DynamicGraphic(X x, Y y, X w, Y h, bool loop, X frame_width, Y frame_height, unsigned int margin,
00096 const std::vector<boost::shared_ptr<Texture> >& textures,
00097 Flags<GraphicStyle> style = GRAPHIC_NONE, std::size_t frames = ALL_FRAMES,
00098 Flags<WndFlag> flags = Flags<WndFlag>());
00100
00102 std::size_t Frames() const;
00103 bool Playing() const;
00104 bool Looping() const;
00105 double FPS() const;
00106 std::size_t FrameIndex() const;
00107 unsigned int TimeIndex() const;
00108
00111 std::size_t StartFrame() const;
00112
00115 std::size_t EndFrame() const;
00116
00117 unsigned int Margin() const;
00118 X FrameWidth() const;
00119 Y FrameHeight() const;
00120
00122 Flags<GraphicStyle> Style() const;
00123
00124 mutable StoppedSignalType StoppedSignal;
00125 mutable EndFrameSignalType EndFrameSignal;
00126
00127
00129 virtual void Render();
00130
00138 void AddFrames(const Texture* texture, std::size_t frames = ALL_FRAMES);
00139
00145 void AddFrames(const boost::shared_ptr<Texture>& texture, std::size_t frames = ALL_FRAMES);
00146
00154 void AddFrames(const std::vector<boost::shared_ptr<Texture> >& textures, std::size_t frames = ALL_FRAMES);
00155
00156 void Play();
00157 void Pause();
00158 void NextFrame();
00159 void PrevFrame();
00160 void Stop();
00161 void Loop(bool b = true);
00162
00166 void SetFPS(double fps);
00167
00168 void SetFrameIndex(std::size_t idx);
00169
00176 void SetTimeIndex(unsigned int time);
00177
00181 void SetStartFrame(std::size_t idx);
00182
00186 void SetEndFrame(std::size_t idx);
00187
00190 void SetStyle(Flags<GraphicStyle> style);
00191
00192 virtual void DefineAttributes(WndEditor* editor);
00194
00196
00197 GG_ABSTRACT_EXCEPTION(Exception);
00198
00201 GG_CONCRETE_EXCEPTION(CannotAddFrame, GG::DynamicGraphic, Exception);
00203
00204 static const std::size_t ALL_FRAMES;
00205 static const std::size_t INVALID_INDEX;
00206 static const unsigned int INVALID_TIME;
00207
00208 protected:
00209 struct FrameSet
00210 {
00211 boost::shared_ptr<const Texture> texture;
00212 std::size_t frames;
00213
00214 private:
00215 friend class boost::serialization::access;
00216 template <class Archive>
00217 void serialize(Archive& ar, const unsigned int version);
00218 };
00219
00221 DynamicGraphic();
00222
00223
00225 std::size_t FramesInTexture(const Texture* t) const;
00226 const std::vector<FrameSet>& Textures() const;
00227
00228 std::size_t CurrentTexture() const;
00229 std::size_t CurrentSubTexture() const;
00230 unsigned int FirstFrameTime() const;
00231 unsigned int LastFrameTime() const;
00232
00233
00234 const unsigned int m_margin;
00235 const X m_frame_width;
00236 const Y m_frame_height;
00237
00238 private:
00239 void ValidateStyle();
00240
00241 std::vector<FrameSet> m_textures;
00242
00243 double m_FPS;
00244 bool m_playing;
00245 bool m_looping;
00246 std::size_t m_curr_texture;
00247 std::size_t m_curr_subtexture;
00248 std::size_t m_frames;
00249 std::size_t m_curr_frame;
00250 unsigned int m_first_frame_time;
00251 unsigned int m_last_frame_time;
00252 std::size_t m_first_frame_idx;
00253 std::size_t m_last_frame_idx;
00254
00255 Flags<GraphicStyle> m_style;
00256
00257 friend class boost::serialization::access;
00258 template <class Archive>
00259 void serialize(Archive& ar, const unsigned int version);
00260 };
00261
00262 }
00263
00264
00265 template <class Archive>
00266 void GG::DynamicGraphic::FrameSet::serialize(Archive& ar, const unsigned int version)
00267 {
00268 boost::shared_ptr<Texture> non_const_texture;
00269 if (Archive::is_saving::value)
00270 non_const_texture = boost::const_pointer_cast<Texture>(texture);
00271
00272 ar & boost::serialization::make_nvp("texture", non_const_texture)
00273 & BOOST_SERIALIZATION_NVP(frames);
00274
00275 if (Archive::is_loading::value)
00276 texture = boost::const_pointer_cast<const Texture>(non_const_texture);
00277 }
00278
00279 template <class Archive>
00280 void GG::DynamicGraphic::serialize(Archive& ar, const unsigned int version)
00281 {
00282 ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Control)
00283 & boost::serialization::make_nvp("m_margin", const_cast<unsigned int&>(m_margin))
00284 & boost::serialization::make_nvp("m_frame_width", const_cast<X&>(m_frame_width))
00285 & boost::serialization::make_nvp("m_frame_height", const_cast<Y&>(m_frame_height))
00286 & BOOST_SERIALIZATION_NVP(m_textures)
00287 & BOOST_SERIALIZATION_NVP(m_FPS)
00288 & BOOST_SERIALIZATION_NVP(m_playing)
00289 & BOOST_SERIALIZATION_NVP(m_looping)
00290 & BOOST_SERIALIZATION_NVP(m_curr_texture)
00291 & BOOST_SERIALIZATION_NVP(m_curr_subtexture)
00292 & BOOST_SERIALIZATION_NVP(m_frames)
00293 & BOOST_SERIALIZATION_NVP(m_curr_frame)
00294 & BOOST_SERIALIZATION_NVP(m_first_frame_time)
00295 & BOOST_SERIALIZATION_NVP(m_last_frame_time)
00296 & BOOST_SERIALIZATION_NVP(m_first_frame_idx)
00297 & BOOST_SERIALIZATION_NVP(m_last_frame_idx)
00298 & BOOST_SERIALIZATION_NVP(m_style);
00299
00300 if (Archive::is_loading::value)
00301 ValidateStyle();
00302 }
00303
00304 #endif // _GG_DynamicGraphic_h_