void Java_cc_openframeworks_OFAndroid_onTouchMoved(JNIEnv* env, jclass thiz, jint id,jfloat x,jfloat y,jfloat pressure,jfloat majoraxis,jfloat minoraxis,jfloat angle) { ofTouchEventArgs touch; touch.id = id; touch.x = x; touch.y = y; touch.pressure = pressure; touch.majoraxis = majoraxis; touch.minoraxis = minoraxis; touch.angle = angle; touch.type = ofTouchEventArgs::move; if(threadedTouchEvents) { window->events().notifyMouseMoved(x,y); window->events().notifyMouseDragged(x,y,0); ofNotifyEvent(window->events().touchMoved,touch); } else { mutex.lock(); if(accumulateTouchEvents && !touchEventArgsQueue.empty() && touchEventArgsQueue.back().type==ofTouchEventArgs::move) { touchEventArgsQueue.back() = touch; } else { touchEventArgsQueue.push(touch); } mutex.unlock(); } }
//-------------------------------------------------------------- void ofApp::draw(){ glfwMakeContextCurrent(window); // lock share resource to prevent twinkle between two window mutex.lock(); image.draw(0, 0); mutex.unlock(); }
//-------------------------------------------------------------- void ofApp::renderNextWindow(){ ofClear(0); // lock share resource to prevent twinkle between two window mutex.lock(); image.draw(0, 0); mutex.unlock(); }
void Java_cc_openframeworks_OFAndroid_onTouchCancelled(JNIEnv* env, jclass thiz, jint id,jfloat x,jfloat y){ ofTouchEventArgs touch; touch.id = id; touch.x = x; touch.y = y; touch.pressure = 0; touch.type = ofTouchEventArgs::cancel; if(threadedTouchEvents){ ofNotifyEvent(ofEvents().touchCancelled,touch); }else{ mutex.lock(); touchEventArgsQueue.push(touch); mutex.unlock(); } }
void Java_cc_openframeworks_OFAndroid_onTouchDoubleTap(JNIEnv* env, jclass thiz, jint id,jfloat x,jfloat y,jfloat pressure){ ofTouchEventArgs touch; touch.id = id; touch.x = x; touch.y = y; touch.pressure = pressure; touch.type = ofTouchEventArgs::doubleTap; if(threadedTouchEvents){ ofNotifyMousePressed(x,y,0); ofNotifyEvent(ofEvents().touchDoubleTap,touch); }else{ mutex.lock(); touchEventArgsQueue.push(touch); mutex.unlock(); } }
/* Call to render the next GL frame */ void Java_cc_openframeworks_OFAndroid_render( JNIEnv* env, jclass thiz ) { if(paused || surfaceDestroyed) return; if(!threadedTouchEvents) { mutex.lock(); queue<ofTouchEventArgs> events = touchEventArgsQueue; while(!touchEventArgsQueue.empty()) touchEventArgsQueue.pop(); mutex.unlock(); while(!events.empty()) { switch(events.front().type) { case ofTouchEventArgs::down: window->events().notifyMousePressed(events.front().x,events.front().y,0); ofNotifyEvent(window->events().touchDown,events.front()); break; case ofTouchEventArgs::up: window->events().notifyMouseReleased(events.front().x,events.front().y,0); ofNotifyEvent(window->events().touchUp,events.front()); break; case ofTouchEventArgs::move: window->events().notifyMouseMoved(events.front().x,events.front().y); window->events().notifyMouseDragged(events.front().x,events.front().y,0); ofNotifyEvent(window->events().touchMoved,events.front()); break; case ofTouchEventArgs::doubleTap: ofNotifyEvent(window->events().touchDoubleTap,events.front()); break; case ofTouchEventArgs::cancel: ofNotifyEvent(window->events().touchCancelled,events.front()); break; } events.pop(); } } window->events().notifyUpdate(); window->renderer()->startRender(); if(bSetupScreen) window->renderer()->setupScreen(); window->events().notifyDraw(); window->renderer()->finishRender(); }
void Java_cc_openframeworks_OFAndroid_onTouchUp(JNIEnv* env, jclass thiz, jint id,jfloat x,jfloat y,jfloat pressure,jfloat majoraxis,jfloat minoraxis,jfloat angle) { ofTouchEventArgs touch; touch.id = id; touch.x = x; touch.y = y; touch.pressure = pressure; touch.majoraxis = majoraxis; touch.minoraxis = minoraxis; touch.angle = angle; touch.type = ofTouchEventArgs::up; if(threadedTouchEvents) { window->events().notifyMouseReleased(x,y,0); ofNotifyEvent(window->events().touchUp,touch); } else { mutex.lock(); touchEventArgsQueue.push(touch); mutex.unlock(); } }
//---------- void MovingHead::update() { if (this->powerStateSignal != this->power) { if (this->power) { //global store of power circuit control static map<string, float> lastPowerUpPerCircuit; static ofMutex lastPowerUpPerCircuitMutex; //lock to make sure nobody else is doing the same thing right now lastPowerUpPerCircuitMutex.lock(); { //try and find this power circuit auto findCircuit = lastPowerUpPerCircuit.find(this->powerCircuit.get()); if (findCircuit == lastPowerUpPerCircuit.end()) { //register this circuit, say the last spark on it was really long ago lastPowerUpPerCircuit.insert(pair<string, float>(this->powerCircuit.get(), std::numeric_limits<float>::min())); } //check if we've had a power on event too recently auto now = ofGetElapsedTimef(); auto & lastPowerUpOnThisCircuit = lastPowerUpPerCircuit[this->powerCircuit.get()]; if (now - this->pauseBetweenPowerUps.get() > lastPowerUpOnThisCircuit) { //ok it's time, let's boot this->powerStateSignal = true; lastPowerUpOnThisCircuit = now; cout << "Powering up " << this->getName() << " at " << now << "s" << endl; } else { //no let's wait and have another see next frame float x = 0.0f; //in case we want to put a break point here } } lastPowerUpPerCircuitMutex.unlock(); } else { this->powerStateSignal = false; } } }
//-------------------------------------------------------------- void ofxThreadedVideo::threadedFunction(){ while (isThreadRunning()){ if(lock()){ // if there's a movie to load... if(loadPath != ""){ loadVideoID = getNextLoadID(); paths[loadVideoID] = loadPath; loadPath = ""; #ifdef TARGET_OSX vector<string> pathParts = ofSplitString(paths[loadVideoID], "/"); #else vector<string> pathParts = ofSplitString(paths[loadVideoID], "\\"); #endif names[loadVideoID] = pathParts[pathParts.size() - 1]; // using a static mutex blocks all threads (including the main app) until we've loaded ofxThreadedVideoMutex.lock(); // load that movie! if(videos[loadVideoID].loadMovie(paths[loadVideoID])){ ofLogVerbose() << "Loaded" << names[loadVideoID] << " " << loadVideoID; // start rolling if AutoPlay is true if (bUseAutoPlay) videos[loadVideoID].play(); // set pixel refs pixels[loadVideoID] = &videos[loadVideoID].getPixelsRef(); }else{ ofLogVerbose() << "Could not load video"; loadVideoID = VIDEO_NONE; // send event notification ofxThreadedVideoEvent videoEvent = ofxThreadedVideoEvent(paths[loadVideoID], VIDEO_EVENT_LOAD_FAIL, this); ofNotifyEvent(threadedVideoEvent, videoEvent, this); } ofxThreadedVideoMutex.unlock(); } // do threaded update of videos updateVideo(currentVideoID); updateVideo(loadVideoID); unlock(); // sleep a bit so we don't thrash the cores!! ofSleepMillis(1000/30); // TODO: implement target frame rate? US might need 30 here? } } }
/* Call to render the next GL frame */ void Java_cc_openframeworks_OFAndroid_render( JNIEnv* env, jclass thiz ) { if(paused || surfaceDestroyed) return; if(!threadedTouchEvents){ mutex.lock(); queue<ofTouchEventArgs> events = touchEventArgsQueue; while(!touchEventArgsQueue.empty()) touchEventArgsQueue.pop(); mutex.unlock(); while(!events.empty()){ switch(events.front().type){ case ofTouchEventArgs::down: ofNotifyMousePressed(events.front().x,events.front().y,0); ofNotifyEvent(ofEvents().touchDown,events.front()); break; case ofTouchEventArgs::up: ofNotifyMouseReleased(events.front().x,events.front().y,0); ofNotifyEvent(ofEvents().touchUp,events.front()); break; case ofTouchEventArgs::move: ofNotifyMouseMoved(events.front().x,events.front().y); ofNotifyMouseDragged(events.front().x,events.front().y,0); ofNotifyEvent(ofEvents().touchMoved,events.front()); break; case ofTouchEventArgs::doubleTap: ofNotifyEvent(ofEvents().touchDoubleTap,events.front()); break; case ofTouchEventArgs::cancel: ofNotifyEvent(ofEvents().touchCancelled,events.front()); break; } events.pop(); } } ofNotifyUpdate(); if(ofGetGLProgrammableRenderer()){ ofGetGLProgrammableRenderer()->startRender(); } int width, height; width = sWindowWidth; height = sWindowHeight; height = height > 0 ? height : 1; // set viewport, clear the screen //glViewport( 0, 0, width, height ); ofViewport(0, 0, width, height, false); // used to be glViewport( 0, 0, width, height ); float * bgPtr = ofBgColorPtr(); bool bClearAuto = ofbClearBg(); if ( bClearAuto == true || ofGetFrameNum() < 3){ ofClear(bgPtr[0]*255,bgPtr[1]*255,bgPtr[2]*255, bgPtr[3]*255); } if(bSetupScreen) ofSetupScreen(); ofNotifyDraw(); if(ofGetGLProgrammableRenderer()){ ofGetGLProgrammableRenderer()->finishRender(); } }
/* Call to render the next GL frame */ void Java_cc_openframeworks_OFAndroid_render( JNIEnv* env, jclass thiz ) { unsigned long beginFrameMicros = ofGetElapsedTimeMicros(); if(paused) return; lastFrameTime = double(beginFrameMicros - previousFrameMicros)/1000000.; previousFrameMicros = beginFrameMicros; if(!threadedTouchEvents){ mutex.lock(); while(!touchEventArgsQueue.empty()){ switch(touchEventArgsQueue.front().type){ case ofTouchEventArgs::down: ofNotifyEvent(ofEvents().touchDown,touchEventArgsQueue.front()); break; case ofTouchEventArgs::up: ofNotifyEvent(ofEvents().touchUp,touchEventArgsQueue.front()); break; case ofTouchEventArgs::move: ofNotifyEvent(ofEvents().touchMoved,touchEventArgsQueue.front()); break; case ofTouchEventArgs::doubleTap: ofNotifyEvent(ofEvents().touchDoubleTap,touchEventArgsQueue.front()); break; } touchEventArgsQueue.pop(); } mutex.unlock(); } ofNotifyUpdate(); int width, height; width = sWindowWidth; height = sWindowHeight; height = height > 0 ? height : 1; // set viewport, clear the screen //glViewport( 0, 0, width, height ); ofViewport(0, 0, width, height, false); // used to be glViewport( 0, 0, width, height ); float * bgPtr = ofBgColorPtr(); bool bClearAuto = ofbClearBg(); if ( bClearAuto == true || nFrameCount < 3){ ofClear(bgPtr[0]*255,bgPtr[1]*255,bgPtr[2]*255, bgPtr[3]*255); } if(bSetupScreen) ofSetupScreen(); ofNotifyDraw(); unsigned long currTime = ofGetElapsedTimeMicros(); unsigned long frameMicros = currTime - beginFrameMicros; nFrameCount++; // increase the overall frame count*/ frames++; if(currTime - onesec>=1000000){ frameRate = frames; frames = 0; onesec = currTime; } if(bFrameRateSet && frameMicros<oneFrameTime) usleep(oneFrameTime-frameMicros); }