1 #pragma once
2 
3 #ifndef PREVIEWER_INCLUDED
4 #define PREVIEWER_INCLUDED
5 
6 #include <memory>
7 
8 #include "traster.h"
9 #include "tfx.h"
10 
11 #include "trenderer.h"
12 
13 #include <QObject>
14 #include <QTimer>
15 
16 // forward declarations
17 class TRenderSettings;
18 class TXshLevel;
19 class TFrameId;
20 class TFilePath;
21 // class TRenderPort
22 // {
23 //     class RenderData;
24 // };
25 // class TRenderPort::RenderData;
26 
27 //=============================================================================
28 // Previewer
29 //-----------------------------------------------------------------------------
30 
31 class Previewer final : public QObject, public TFxObserver {
32   Q_OBJECT
33 
34   class Imp;
35   std::unique_ptr<Imp> m_imp;
36 
37   Previewer(bool subcamera);
38   ~Previewer();
39 
40   // not implemented
41   Previewer(const Previewer &);
42   void operator=(const Previewer &);
43 
44 public:
45   class Listener {
46   public:
47     QTimer m_refreshTimer;
48 
49     Listener();
~Listener()50     virtual ~Listener() {}
51 
52     void requestTimedRefresh();
53     virtual TRectD getPreviewRect() const = 0;
54 
onRenderStarted(int frame)55     virtual void onRenderStarted(int frame){};
onRenderCompleted(int frame)56     virtual void onRenderCompleted(int frame){};
onRenderFailed(int frame)57     virtual void onRenderFailed(int frame){};
58 
onPreviewUpdate()59     virtual void onPreviewUpdate() {}
60   };
61 
62 public:
63   static Previewer *instance(bool subcameraPreview = false);
64 
65   static void clearAll();
66 
67   static void suspendRendering(bool suspend);
68 
69   void addListener(Listener *);
70   void removeListener(Listener *);
71 
72   TRasterP getRaster(int frame, bool renderIfNeeded = true) const;
73   bool isFrameReady(int frame) const;
74 
75   bool doSaveRenderedFrames(TFilePath fp);
76 
77   bool isActive() const;
78   bool isBusy() const;
79 
80   void onChange(const TFxChange &change) override;
81 
82   void onImageChange(TXshLevel *xl, const TFrameId &fid);
83   void onLevelChange(TXshLevel *xl);
84 
85   void clear(int frame);
86   void clear();
87 
88   std::vector<UCHAR> &getProgressBarStatus() const;
89 
90 private:
91   friend class Imp;
92   void emitStartedFrame(const TRenderPort::RenderData &renderData);
93   void emitRenderedFrame(const TRenderPort::RenderData &renderData);
94   void emitFailedFrame(const TRenderPort::RenderData &renderData);
95 
96 signals:
97 
98   void activedChanged();
99   void startedFrame(TRenderPort::RenderData renderData);
100   void renderedFrame(TRenderPort::RenderData renderData);
101   void failedFrame(TRenderPort::RenderData renderData);
102 
103 public slots:
104 
105   void saveFrame();
106   void saveRenderedFrames();
107 
108   void update();
109   void updateView();
110 
111   void onLevelChanged();
112   void onFxChanged();
113   void onXsheetChanged();
114   void onObjectChanged();
115 
116 protected slots:
117 
118   void onStartedFrame(TRenderPort::RenderData renderData);
119   void onRenderedFrame(TRenderPort::RenderData renderData);
120   void onFailedFrame(TRenderPort::RenderData renderData);
121 };
122 
123 #endif
124