framework2
635 строк · 16.5 Кб
1#include "ofEvents.h"
2#include "ofAppRunner.h"
3#include "ofAppBaseWindow.h"
4#include "ofLog.h"
5
6static ofEventArgs voidEventArgs;
7
8
9//--------------------------------------
10void ofSetFrameRate(int targetRate){
11auto window = ofGetMainLoop()->getCurrentWindow();
12if(window){
13window->events().setFrameRate(targetRate);
14}else{
15ofLogWarning("ofEvents") << "Trying to set framerate before mainloop is ready";
16}
17}
18
19//--------------------------------------
20float ofGetFrameRate(){
21auto window = ofGetMainLoop()->getCurrentWindow();
22if(window){
23return window->events().getFrameRate();
24}else{
25return 0.f;
26}
27}
28
29//--------------------------------------
30float ofGetTargetFrameRate(){
31auto window = ofGetMainLoop()->getCurrentWindow();
32if(window){
33return window->events().getTargetFrameRate();
34}else{
35return 0.f;
36}
37}
38
39//--------------------------------------
40double ofGetLastFrameTime(){
41auto window = ofGetMainLoop()->getCurrentWindow();
42if(window){
43return window->events().getLastFrameTime();
44}else{
45return 0.f;
46}
47}
48
49//--------------------------------------
50uint64_t ofGetFrameNum(){
51auto window = ofGetMainLoop()->getCurrentWindow();
52if(window){
53return window->events().getFrameNum();
54}else{
55return 0;
56}
57}
58
59//--------------------------------------
60bool ofGetMousePressed(int button){ //by default any button
61auto window = ofGetMainLoop()->getCurrentWindow();
62if(window){
63return window->events().getMousePressed(button);
64}else{
65return false;
66}
67}
68
69//--------------------------------------
70bool ofGetKeyPressed(int key){
71auto window = ofGetMainLoop()->getCurrentWindow();
72if(window){
73return window->events().getKeyPressed(key);
74}else{
75return false;
76}
77}
78
79//--------------------------------------
80int ofGetMouseX(){
81auto window = ofGetMainLoop()->getCurrentWindow();
82if(window){
83return window->events().getMouseX();
84}else{
85return 0;
86}
87}
88
89//--------------------------------------
90int ofGetMouseY(){
91auto window = ofGetMainLoop()->getCurrentWindow();
92if(window){
93return window->events().getMouseY();
94}else{
95return 0;
96}
97}
98
99//--------------------------------------
100int ofGetPreviousMouseX(){
101auto window = ofGetMainLoop()->getCurrentWindow();
102if(window){
103return window->events().getPreviousMouseX();
104}else{
105return 0;
106}
107}
108
109//--------------------------------------
110int ofGetPreviousMouseY(){
111auto window = ofGetMainLoop()->getCurrentWindow();
112if(window){
113return window->events().getPreviousMouseY();
114}else{
115return 0;
116}
117}
118
119ofCoreEvents::ofCoreEvents()
120:targetRate(0)
121,bFrameRateSet(false)
122,fps(60)
123,currentMouseX(0)
124,currentMouseY(0)
125,previousMouseX(0)
126,previousMouseY(0)
127,bPreMouseNotSet(false){
128
129}
130
131//------------------------------------------
132void ofCoreEvents::disable(){
133setup.disable();
134draw.disable();
135update.disable();
136exit.disable();
137keyPressed.disable();
138keyReleased.disable();
139mouseDragged.disable();
140mouseReleased.disable();
141mousePressed.disable();
142mouseMoved.disable();
143mouseScrolled.disable();
144mouseEntered.disable();
145mouseExited.disable();
146touchDown.disable();
147touchUp.disable();
148touchMoved.disable();
149touchDoubleTap.disable();
150touchCancelled.disable();
151messageEvent.disable();
152fileDragEvent.disable();
153}
154
155//------------------------------------------
156void ofCoreEvents::enable(){
157setup.enable();
158draw.enable();
159update.enable();
160exit.enable();
161keyPressed.enable();
162keyReleased.enable();
163mouseDragged.enable();
164mouseReleased.enable();
165mousePressed.enable();
166mouseMoved.enable();
167mouseScrolled.enable();
168mouseEntered.enable();
169mouseExited.enable();
170touchDown.enable();
171touchUp.enable();
172touchMoved.enable();
173touchDoubleTap.enable();
174touchCancelled.enable();
175messageEvent.enable();
176fileDragEvent.enable();
177}
178
179void ofCoreEvents::setTimeModeSystem(){
180timeMode = System;
181}
182
183void ofCoreEvents::setTimeModeFixedRate(uint64_t nanosecsPerFrame){
184timeMode = FixedRate;
185fixedRateTimeNanos = std::chrono::nanoseconds(nanosecsPerFrame);
186}
187
188void ofCoreEvents::setTimeModeFiltered(float alpha){
189timeMode = Filtered;
190fps.setFilterAlpha(alpha);
191}
192
193//--------------------------------------
194void ofCoreEvents::setFrameRate(int _targetRate){
195// given this FPS, what is the amount of millis per frame
196// that should elapse?
197
198// --- > f / s
199
200if (_targetRate <= 0){
201bFrameRateSet = false;
202}else{
203bFrameRateSet = true;
204targetRate = _targetRate;
205uint64_t nanosPerFrame = 1000000000.0 / (double)targetRate;
206timer.setPeriodicEvent(nanosPerFrame);
207}
208}
209
210//--------------------------------------
211float ofCoreEvents::getFrameRate() const{
212return fps.getFps();
213}
214
215//--------------------------------------
216float ofCoreEvents::getTargetFrameRate() const{
217return targetRate;
218}
219
220//--------------------------------------
221double ofCoreEvents::getLastFrameTime() const{
222switch(timeMode){
223case Filtered:
224return fps.getLastFrameFilteredSecs();
225case FixedRate:
226return std::chrono::duration<double>(fixedRateTimeNanos).count();
227case System:
228default:
229return fps.getLastFrameSecs();
230}
231
232}
233
234//--------------------------------------
235uint64_t ofCoreEvents::getFrameNum() const{
236return fps.getNumFrames();
237}
238
239//--------------------------------------
240bool ofCoreEvents::getMousePressed(int button) const{ //by default any button
241if(button==-1) return pressedMouseButtons.size();
242return pressedMouseButtons.find(button)!=pressedMouseButtons.end();
243}
244
245//--------------------------------------
246bool ofCoreEvents::getKeyPressed(int key) const{
247if(key==-1) return pressedKeys.size();
248return pressedKeys.find(key)!=pressedKeys.end();
249}
250
251//--------------------------------------
252int ofCoreEvents::getMouseX() const{
253return currentMouseX;
254}
255
256//--------------------------------------
257int ofCoreEvents::getMouseY() const{
258return currentMouseY;
259}
260
261//--------------------------------------
262int ofCoreEvents::getPreviousMouseX() const{
263return previousMouseX;
264}
265
266//--------------------------------------
267int ofCoreEvents::getPreviousMouseY() const{
268return previousMouseY;
269}
270
271//--------------------------------------
272int ofCoreEvents::getModifiers() const{
273return modifiers;
274}
275
276//------------------------------------------
277bool ofCoreEvents::notifySetup(){
278return ofNotifyEvent( setup, voidEventArgs );
279}
280
281#include "ofGraphics.h"
282//------------------------------------------
283bool ofCoreEvents::notifyUpdate(){
284return ofNotifyEvent( update, voidEventArgs );
285}
286
287//------------------------------------------
288bool ofCoreEvents::notifyDraw(){
289auto attended = ofNotifyEvent( draw, voidEventArgs );
290
291if (bFrameRateSet){
292timer.waitNext();
293}
294
295if(fps.getNumFrames()==0){
296if(bFrameRateSet) fps = ofFpsCounter(targetRate);
297}else{
298/*if(ofIsVerticalSyncEnabled()){
299float rate = ofGetRefreshRate();
300int intervals = round(lastFrameTime*rate/1000000.);//+vsyncedIntervalsRemainder;
301//vsyncedIntervalsRemainder = lastFrameTime*rate/1000000.+vsyncedIntervalsRemainder - intervals;
302lastFrameTime = intervals*1000000/rate;
303}*/
304}
305fps.newFrame();
306return attended;
307}
308
309//------------------------------------------
310bool ofCoreEvents::notifyKeyPressed(int key, int keycode, int scancode, uint32_t codepoint){
311ofKeyEventArgs keyEventArgs(ofKeyEventArgs::Pressed,key,keycode,scancode,codepoint,0);
312return notifyKeyEvent(keyEventArgs);
313}
314
315//------------------------------------------
316bool ofCoreEvents::notifyKeyReleased(int key, int keycode, int scancode, uint32_t codepoint){
317ofKeyEventArgs keyEventArgs(ofKeyEventArgs::Released,key,keycode,scancode,codepoint,0);
318return notifyKeyEvent(keyEventArgs);
319}
320
321
322//------------------------------------------
323bool ofCoreEvents::notifyKeyEvent(ofKeyEventArgs & e){
324bool attended = false;
325modifiers = e.modifiers;
326switch(e.type){
327case ofKeyEventArgs::Pressed:
328// FIXME: modifiers are being reported twice, for generic and for left/right
329// add operators to the arguments class so it can be checked for both
330if(e.key == OF_KEY_RIGHT_CONTROL || e.key == OF_KEY_LEFT_CONTROL){
331pressedKeys.insert(OF_KEY_CONTROL);
332ofKeyEventArgs keyEventArgs = e;
333keyEventArgs.key = OF_KEY_CONTROL;
334attended = ofNotifyEvent( keyPressed, keyEventArgs );
335}
336else if(e.key == OF_KEY_RIGHT_SHIFT || e.key == OF_KEY_LEFT_SHIFT){
337pressedKeys.insert(OF_KEY_SHIFT);
338ofKeyEventArgs keyEventArgs = e;
339keyEventArgs.key = OF_KEY_SHIFT;
340attended = ofNotifyEvent( keyPressed, keyEventArgs );
341}
342else if(e.key == OF_KEY_LEFT_ALT || e.key == OF_KEY_RIGHT_ALT){
343pressedKeys.insert(OF_KEY_ALT);
344ofKeyEventArgs keyEventArgs = e;
345keyEventArgs.key = OF_KEY_ALT;
346attended = ofNotifyEvent( keyPressed, keyEventArgs );
347}
348else if(e.key == OF_KEY_LEFT_SUPER || e.key == OF_KEY_RIGHT_SUPER){
349pressedKeys.insert(OF_KEY_SUPER);
350ofKeyEventArgs keyEventArgs = e;
351keyEventArgs.key = OF_KEY_SUPER;
352attended = ofNotifyEvent( keyPressed, keyEventArgs );
353}
354
355pressedKeys.insert(e.key);
356if(!attended){
357return ofNotifyEvent( keyPressed, e );
358}else{
359return attended;
360}
361case ofKeyEventArgs::Released:
362// FIXME: modifiers are being reported twice, for generic and for left/right
363// add operators to the arguments class so it can be checked for both
364if(e.key == OF_KEY_RIGHT_CONTROL || e.key == OF_KEY_LEFT_CONTROL){
365pressedKeys.erase(OF_KEY_CONTROL);
366ofKeyEventArgs keyEventArgs = e;
367keyEventArgs.key = OF_KEY_CONTROL;
368attended = ofNotifyEvent( keyReleased, keyEventArgs );
369}
370else if(e.key == OF_KEY_RIGHT_SHIFT || e.key == OF_KEY_LEFT_SHIFT){
371pressedKeys.erase(OF_KEY_SHIFT);
372ofKeyEventArgs keyEventArgs = e;
373keyEventArgs.key = OF_KEY_SHIFT;
374attended = ofNotifyEvent( keyReleased, keyEventArgs );
375}
376else if(e.key == OF_KEY_LEFT_ALT || e.key == OF_KEY_RIGHT_ALT){
377pressedKeys.erase(OF_KEY_ALT);
378ofKeyEventArgs keyEventArgs = e;
379keyEventArgs.key = OF_KEY_ALT;
380attended = ofNotifyEvent( keyReleased, keyEventArgs );
381}
382else if(e.key == OF_KEY_LEFT_SUPER || e.key == OF_KEY_RIGHT_SUPER){
383pressedKeys.erase(OF_KEY_SUPER);
384ofKeyEventArgs keyEventArgs = e;
385keyEventArgs.key = OF_KEY_SUPER;
386attended = ofNotifyEvent( keyReleased, keyEventArgs );
387}
388
389pressedKeys.erase(e.key);
390if(!attended){
391return ofNotifyEvent( keyReleased, e );
392}else{
393return attended;
394}
395}
396return false;
397}
398
399//------------------------------------------
400void ofCoreEvents::notifyTouchDown(int x, int y, int touchID){
401ofTouchEventArgs touchArgs;
402touchArgs.id = touchID;
403touchArgs.x = x;
404touchArgs.y = y;
405touchArgs.type = ofTouchEventArgs::down;
406notifyTouchEvent(touchArgs);
407}
408
409//------------------------------------------
410void ofCoreEvents::notifyTouchUp(int x, int y, int touchID){
411ofTouchEventArgs touchArgs;
412touchArgs.id = touchID;
413touchArgs.x = x;
414touchArgs.y = y;
415touchArgs.type = ofTouchEventArgs::up;
416notifyTouchEvent(touchArgs);
417}
418
419//------------------------------------------
420void ofCoreEvents::notifyTouchMoved(int x, int y, int touchID){
421ofTouchEventArgs touchArgs;
422touchArgs.id = touchID;
423touchArgs.x = x;
424touchArgs.y = y;
425touchArgs.type = ofTouchEventArgs::move;
426notifyTouchEvent(touchArgs);
427}
428
429//------------------------------------------
430void ofCoreEvents::notifyTouchCancelled(int x, int y, int touchID){
431ofTouchEventArgs touchArgs;
432touchArgs.id = touchID;
433touchArgs.x = x;
434touchArgs.y = y;
435touchArgs.type = ofTouchEventArgs::cancel;
436notifyTouchEvent(touchArgs);
437}
438
439
440//------------------------------------------
441void ofCoreEvents::notifyTouchDoubleTap(int x, int y, int touchID){
442ofTouchEventArgs touchArgs;
443touchArgs.id = touchID;
444touchArgs.x = x;
445touchArgs.y = y;
446touchArgs.type = ofTouchEventArgs::doubleTap;
447notifyTouchEvent(touchArgs);
448}
449
450
451//------------------------------------------
452void ofCoreEvents::notifyTouchEvent(ofTouchEventArgs & touchArgs){
453switch(touchArgs.type){
454case ofTouchEventArgs::move:
455ofNotifyEvent( touchMoved, touchArgs );
456break;
457case ofTouchEventArgs::down:
458ofNotifyEvent( touchDown, touchArgs );
459break;
460case ofTouchEventArgs::up:
461ofNotifyEvent( touchUp, touchArgs );
462break;
463case ofTouchEventArgs::cancel:
464ofNotifyEvent( touchCancelled, touchArgs );
465break;
466case ofTouchEventArgs::doubleTap:
467ofNotifyEvent( touchDoubleTap, touchArgs );
468break;
469}
470}
471
472
473//------------------------------------------
474bool ofCoreEvents::notifyMouseEvent(ofMouseEventArgs & e){
475modifiers = e.modifiers;
476switch(e.type){
477case ofMouseEventArgs::Moved:
478if( bPreMouseNotSet ){
479previousMouseX = e.x;
480previousMouseY = e.y;
481bPreMouseNotSet = false;
482}else{
483previousMouseX = currentMouseX;
484previousMouseY = currentMouseY;
485}
486
487currentMouseX = e.x;
488currentMouseY = e.y;
489
490return ofNotifyEvent( mouseMoved, e );
491case ofMouseEventArgs::Dragged:
492if( bPreMouseNotSet ){
493previousMouseX = e.x;
494previousMouseY = e.y;
495bPreMouseNotSet = false;
496}else{
497previousMouseX = currentMouseX;
498previousMouseY = currentMouseY;
499}
500
501currentMouseX = e.x;
502currentMouseY = e.y;
503
504return ofNotifyEvent( mouseDragged, e );
505case ofMouseEventArgs::Pressed:{
506if( bPreMouseNotSet ){
507previousMouseX = e.x;
508previousMouseY = e.y;
509bPreMouseNotSet = false;
510}else{
511previousMouseX = currentMouseX;
512previousMouseY = currentMouseY;
513}
514
515currentMouseX = e.x;
516currentMouseY = e.y;
517pressedMouseButtons.insert(e.button);
518
519
520return ofNotifyEvent( mousePressed, e );
521}
522case ofMouseEventArgs::Released:
523if( bPreMouseNotSet ){
524previousMouseX = e.x;
525previousMouseY = e.y;
526bPreMouseNotSet = false;
527}else{
528previousMouseX = currentMouseX;
529previousMouseY = currentMouseY;
530}
531
532currentMouseX = e.x;
533currentMouseY = e.y;
534pressedMouseButtons.erase(e.button);
535
536return ofNotifyEvent( mouseReleased, e );
537case ofMouseEventArgs::Scrolled:
538return ofNotifyEvent( mouseScrolled, e );
539case ofMouseEventArgs::Entered:
540return ofNotifyEvent( mouseEntered, e );
541case ofMouseEventArgs::Exited:
542return ofNotifyEvent( mouseExited, e );
543}
544return false;
545}
546
547//------------------------------------------
548bool ofCoreEvents::notifyMousePressed(int x, int y, int button){
549ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Pressed,x,y,button);
550return notifyMouseEvent(mouseEventArgs);
551}
552
553//------------------------------------------
554bool ofCoreEvents::notifyMouseReleased(int x, int y, int button){
555ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Released,x,y,button);
556return notifyMouseEvent(mouseEventArgs);
557}
558
559//------------------------------------------
560bool ofCoreEvents::notifyMouseDragged(int x, int y, int button){
561ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Dragged,x,y,button);
562return notifyMouseEvent(mouseEventArgs);
563}
564
565//------------------------------------------
566bool ofCoreEvents::notifyMouseMoved(int x, int y){
567ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Moved,x,y,0);
568return notifyMouseEvent(mouseEventArgs);
569}
570
571//------------------------------------------
572bool ofCoreEvents::notifyMouseScrolled(int x, int y, float scrollX, float scrollY){
573ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Scrolled,x,y);
574mouseEventArgs.scrollX = scrollX;
575mouseEventArgs.scrollY = scrollY;
576return notifyMouseEvent(mouseEventArgs);
577}
578
579//------------------------------------------
580bool ofCoreEvents::notifyMouseEntered(int x, int y){
581ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Entered,x,y);
582return notifyMouseEvent(mouseEventArgs);
583}
584
585//------------------------------------------
586bool ofCoreEvents::notifyMouseExited(int x, int y){
587ofMouseEventArgs mouseEventArgs(ofMouseEventArgs::Exited,x,y);
588return notifyMouseEvent(mouseEventArgs);
589}
590
591//------------------------------------------
592bool ofCoreEvents::notifyExit(){
593return ofNotifyEvent( exit, voidEventArgs );
594}
595
596//------------------------------------------
597bool ofCoreEvents::notifyWindowResized(int width, int height){
598ofResizeEventArgs resizeEventArgs(width,height);
599return ofNotifyEvent( windowResized, resizeEventArgs );
600}
601
602//------------------------------------------
603bool ofCoreEvents::notifyWindowMoved(int x, int y){
604ofWindowPosEventArgs windowPosEventArgs(x,y);
605return ofNotifyEvent( windowMoved, windowPosEventArgs );
606}
607
608//------------------------------------------
609bool ofCoreEvents::notifyDragEvent(ofDragInfo info){
610return ofNotifyEvent(fileDragEvent, info);
611}
612
613//------------------------------------------
614bool ofSendMessage(ofMessage msg){
615return ofNotifyEvent(ofEvents().messageEvent, msg);
616}
617
618//------------------------------------------
619bool ofSendMessage(std::string messageString){
620ofMessage msg(messageString);
621return ofSendMessage(msg);
622}
623
624//------------------------------------------
625namespace of{
626namespace priv{
627std::atomic<uint_fast64_t> StdFunctionId::nextId;
628
629AbstractEventToken::~AbstractEventToken(){}
630
631BaseFunctionId::~BaseFunctionId(){}
632
633StdFunctionId::~StdFunctionId(){}
634}
635}
636