framework2
246 строк · 7.3 Кб
1//
2// ofxFBXAnimation.cpp
3// ofxFBX-Example-Importer
4//
5// Created by Nick Hardeman on 10/30/13.
6//
7//
8
9#include "ofxFBXAnimation.h"
10
11//--------------------------------------------------------------
12ofxFBXAnimation::ofxFBXAnimation() {
13bPlaying = true;
14bLoop = true;
15// fbxname = NULL;
16bNewFrame = false;
17_speed = 1.f;
18setFramerate( 30.f );
19bDone = false;
20}
21
22//--------------------------------------------------------------
23ofxFBXAnimation::~ofxFBXAnimation() {
24// if(fbxname != NULL) {
25// delete fbxname;
26// fbxname = NULL;
27// }
28}
29
30//--------------------------------------------------------------
31void ofxFBXAnimation::setup( FbxTime aStartTime, FbxTime aStopTime, FbxTime aFrameTime ) {
32fbxStartTime = aStartTime;
33fbxStopTime = aStopTime;
34fbxFrameTime = aFrameTime;
35
36startTimeMillis = (unsigned int)fbxStartTime.GetMilliSeconds();
37stopTimeMillis = (unsigned int)fbxStopTime.GetMilliSeconds();
38frameTimeMillis = (unsigned int)fbxFrameTime.GetMilliSeconds();
39
40fbxCurrentTime = fbxStartTime;
41
42lastUpdateTimeMillis = -1;
43}
44
45//--------------------------------------------------------------
46void ofxFBXAnimation::update( float aElapsedTimeSeconds ) {
47bNewFrame = false;
48
49// cout << "speed: " << _speed << endl;
50float tspeed = _speed;
51if( tspeed < 0 ) tspeed *= -1.f;
52float clampFrameTime = getFramerate() * tspeed;//ofClamp( getFramerate() * tspeed, 0.0001, 600);
53float tframeTime = (1.f / clampFrameTime) * 1000.f;
54
55if(bPlaying) {
56uint64_t etimeMillis;// = ofGetElapsedTimeMillis();
57if (aElapsedTimeSeconds < 0) {
58etimeMillis = ofGetElapsedTimeMillis();
59}
60else {
61etimeMillis = aElapsedTimeSeconds * 1000.f;
62}
63//int etimeMillis = aElapsedTimeSeconds * 1000;
64//cout << "etimeMillis: " << etimeMillis << " argMillis: " << (aElapsedTimeSeconds * 1000) << " secs: " << aElapsedTimeSeconds << " | " << ofGetFrameNum() << endl;
65
66
67if(etimeMillis - lastUpdateTimeMillis >= tframeTime ) {
68
69//needed for when the animation speed is faster than the app framerate.
70if( fabs(_speed) > 1.0 ){
71fbxCurrentTime += (fbxFrameTime) * tspeed;
72}else{
73if( _speed >= 0 ) {
74fbxCurrentTime += (fbxFrameTime);
75} else {
76fbxCurrentTime -= (fbxFrameTime);
77}
78}
79
80bNewFrame = true;
81lastUpdateTimeMillis = etimeMillis;
82}
83
84// if(etimeMillis - lastUpdateTimeMillis >= tframeTime ) {
85// bNewFrame = true;
86// if( _speed >= 0 ) {
87// fbxCurrentTime += (fbxFrameTime);
88// } else {
89// fbxCurrentTime -= (fbxFrameTime);
90// }
91// lastUpdateTimeMillis = etimeMillis;
92// }
93}
94
95
96if( _speed >= 0 ) {
97if(fbxCurrentTime > fbxStopTime ) {
98bDone = true;
99if(bLoop) fbxCurrentTime = fbxStartTime;
100else fbxCurrentTime = fbxStopTime;
101} else {
102bDone = false;
103}
104} else {
105if(fbxCurrentTime < fbxStartTime ) {
106bDone = true;
107if(bLoop) fbxCurrentTime = fbxStopTime;
108else fbxCurrentTime = fbxStartTime;
109} else {
110bDone = false;
111}
112}
113}
114
115//--------------------------------------------------------------
116bool ofxFBXAnimation::isFrameNew() {
117return bNewFrame;
118}
119
120//--------------------------------------------------------------
121void ofxFBXAnimation::setSpeed( float aSpeed ) {
122_speed = aSpeed;
123}
124
125//--------------------------------------------------------------
126float ofxFBXAnimation::getSpeed() {
127return _speed;
128}
129
130//--------------------------------------------------------------
131void ofxFBXAnimation::play() {
132bPlaying = true;
133if( bDone && !bLoop ) {
134if( _speed >= 0 ) {
135fbxCurrentTime = fbxStartTime;
136} else {
137fbxCurrentTime = fbxStopTime;
138}
139}
140bDone = false;
141}
142
143//--------------------------------------------------------------
144void ofxFBXAnimation::pause() {
145bPlaying = false;
146}
147
148//--------------------------------------------------------------
149void ofxFBXAnimation::stop() {
150bPlaying = false;
151}
152
153//--------------------------------------------------------------
154void ofxFBXAnimation::togglePlayPause() {
155bPlaying = !bPlaying;
156}
157
158//--------------------------------------------------------------
159bool ofxFBXAnimation::isPlaying() {
160return bPlaying;
161}
162
163//--------------------------------------------------------------
164bool ofxFBXAnimation::isPaused() {
165return !bPlaying;
166}
167
168//--------------------------------------------------------------
169bool ofxFBXAnimation::isDone() {
170return bDone;
171}
172
173//--------------------------------------------------------------
174void ofxFBXAnimation::setLoops( bool aB ) {
175bLoop = aB;
176}
177
178//--------------------------------------------------------------
179bool ofxFBXAnimation::getLoops() {
180return bLoop;
181}
182
183//--------------------------------------------------------------
184float ofxFBXAnimation::getPosition() {
185return ofMap( (unsigned int)fbxCurrentTime.GetMilliSeconds(), startTimeMillis, stopTimeMillis, 0, 1, true );
186}
187
188//--------------------------------------------------------------
189float ofxFBXAnimation::getPositionSeconds() {
190return (float)fbxCurrentTime.GetMilliSeconds() / 1000.f;
191}
192
193//--------------------------------------------------------------
194unsigned int ofxFBXAnimation::getPositionMillis() {
195return fbxCurrentTime.GetMilliSeconds();
196}
197
198//--------------------------------------------------------------
199int ofxFBXAnimation::getFrameNum() {
200return round(getPosition() * (float)getTotalNumFrames());
201}
202
203//--------------------------------------------------------------
204FbxTime ofxFBXAnimation::getCurrentFbxTime() {
205return fbxCurrentTime;
206}
207
208//--------------------------------------------------------------
209void ofxFBXAnimation::setFramerate( float aFramerate ) {
210_framerate = aFramerate;
211}
212
213//--------------------------------------------------------------
214float ofxFBXAnimation::getFramerate() {
215return _framerate;
216}
217
218//--------------------------------------------------------------
219void ofxFBXAnimation::setPosition( float aPct ) {
220int ttime = ofMap(aPct, 0.f, 1.f, startTimeMillis, stopTimeMillis, true );
221fbxCurrentTime.SetMilliSeconds(ttime);
222lastUpdateTimeMillis = -1; // force update of new frame //
223}
224
225//--------------------------------------------------------------
226void ofxFBXAnimation::setFrame( int aFrameNum ) {
227float tframe = ofClamp( aFrameNum, 0, getTotalNumFrames() );
228setPosition( tframe / (float)getTotalNumFrames() );
229// fbxCurrentTime = fbxStartTime + fbxFrameTime * tframe;
230// lastUpdateTimeMillis = -1; // force update of new frame //
231}
232
233//--------------------------------------------------------------
234unsigned int ofxFBXAnimation::getDurationMillis() {
235return (stopTimeMillis - startTimeMillis);
236}
237
238//--------------------------------------------------------------
239float ofxFBXAnimation::getDurationSeconds() {
240return (float)getDurationMillis() / 1000.f;
241}
242
243//--------------------------------------------------------------
244int ofxFBXAnimation::getTotalNumFrames() {
245return ceil( getDurationMillis() / frameTimeMillis );
246}
247
248
249
250
251
252
253
254