source: GTP/trunk/App/Demos/Illum/Ogre/src/Common/include/FrameCapture.h @ 1879

Revision 1879, 4.1 KB checked in by szirmay, 18 years ago (diff)
Line 
1#ifndef FRAMECAPTURE_H
2#define FRAMECAPTURE_H
3
4#include "Ogre.h"
5
6using namespace Ogre;
7
8class FrameCapture: public FrameListener
9{
10        class SceneNodeTransformKey
11        {
12        public:
13                Vector3 translate;
14                Quaternion rotation;
15                SceneNode* node;
16
17                SceneNodeTransformKey(SceneNode* node)
18                {
19                        this->node = node;
20                        translate = node->getPosition();
21                        rotation = node->getOrientation();
22                }
23
24                void applyKey()
25                {
26                        node->setPosition(translate);
27                        node->setOrientation(rotation);
28                }
29        };
30
31        class SceneNodeTransformAnimation
32        {
33        protected:
34
35         std::vector<SceneNodeTransformKey*> keys;
36                 SceneNode* node;
37                 std::vector<SceneNodeTransformKey*>::iterator iter;
38                 std::vector<SceneNodeTransformKey*>::iterator iterEnd;
39         
40        public:
41
42                SceneNodeTransformAnimation(SceneNode* node)
43                {
44                        this->node = node;
45                }
46                void addKey()
47                {
48                        keys.push_back(new SceneNodeTransformKey(node));
49                }
50                void startPlay()
51                {
52                        iter = keys.begin();
53                        iterEnd = keys.end();
54                }
55                bool stepFrame()
56                {
57                        if(iter == iterEnd)
58                                return false;
59                       
60                        (*iter)->applyKey();
61                        iter++;
62                        return true;
63                }
64                void reset()
65                {
66                        keys.clear();
67                }
68        };
69
70protected:
71        std::vector< SceneNodeTransformAnimation*> animables;
72
73public:
74       
75    FrameCapture(RenderTarget* rendertarget)
76        {
77         target = rendertarget;
78     isPlaying = false;
79         isRecording = false;
80         isSaving = false;
81         framerate = 15;
82         frameTime = 1000 / framerate;
83         lastTime = 0;
84        }
85        void addAnimableNode(SceneNode* node)
86        {
87                SceneNodeTransformAnimation* newTrack = new SceneNodeTransformAnimation(node);
88                animables.push_back(newTrack);
89        }
90        void recordEvent()
91        {
92                if(!isRecording && !isPlaying)
93                        startRecording();
94                else if(isRecording) stopRecording();
95        }
96        void playEvent()
97        {
98                if(!isRecording && !isPlaying)
99                        startPlaying();
100                else if(isPlaying) stopPlaying();
101        }
102        void setSaving(){isSaving = true;}
103        void setFrameRate(int fr)
104        {
105                framerate = fr;
106                frameTime = 1000 / framerate;
107        }
108       
109protected:
110        bool isPlaying;
111        bool isRecording;
112        bool isSaving;
113        int framerate;
114        unsigned long currentFrame;
115        unsigned long frameTime;
116        unsigned long lastTime;
117        RenderTarget* target;
118
119        void startPlaying()
120        {
121                isPlaying = true;
122                std::vector< SceneNodeTransformAnimation*>::iterator iter = animables.begin();
123                std::vector< SceneNodeTransformAnimation*>::iterator iterEnd = animables.end();
124                while(iter != iterEnd)
125                {
126                        (*iter)->startPlay();
127                        iter++;
128                }
129                currentFrame = 0;
130        }
131        void stopPlaying()
132        {
133                isPlaying = false;
134        }
135        void startRecording()
136        {
137      isRecording = true;
138          std::vector< SceneNodeTransformAnimation*>::iterator iter = animables.begin();
139          std::vector< SceneNodeTransformAnimation*>::iterator iterEnd = animables.end();
140          while(iter != iterEnd)
141          {
142                  (*iter)->reset();     
143                  iter++;
144          }
145        }
146        void stopRecording()
147        {
148                isRecording = false;
149        }
150        void play()
151        {
152                std::vector< SceneNodeTransformAnimation*>::iterator iter = animables.begin();
153                std::vector< SceneNodeTransformAnimation*>::iterator iterEnd = animables.end();
154                while(iter != iterEnd)
155                {
156                        if(!(*iter)->stepFrame())
157                        {
158                                isPlaying = false;
159                                isSaving = false;
160                                return;
161                        }
162                        iter++;
163                }       
164                currentFrame++;
165        }
166        void record()
167        {
168          unsigned long thisTime = Root::getSingleton().getTimer()->getMilliseconds();
169      unsigned long timeElapsed = thisTime - lastTime;
170               
171          if(timeElapsed < frameTime)
172            return;
173       
174          lastTime = thisTime;
175         
176      std::vector< SceneNodeTransformAnimation*>::iterator iter = animables.begin();
177          std::vector< SceneNodeTransformAnimation*>::iterator iterEnd = animables.end();
178          while(iter != iterEnd)
179          {
180                  (*iter)->addKey();
181                  iter++;
182          }
183        }
184
185        bool frameStarted(const FrameEvent& evt)
186    {   
187                if(isPlaying)
188                        play();
189                if(isRecording)
190                        record();
191                return true;     
192    }
193        bool frameEnded(const FrameEvent& evt)
194    {   
195                if(isSaving)
196                {
197                        String filename = "capture" + StringConverter::toString(currentFrame) + ".tga";
198                        target->writeContentsToFile(filename);
199                }
200
201                return true;     
202    }
203};
204
205#endif
Note: See TracBrowser for help on using the repository browser.