void Java_cc_openframeworks_OFAndroid_onTouchUp(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::up; if(threadedTouchEvents){ ofNotifyMouseReleased(x,y,0); ofNotifyEvent(ofEvents().touchUp,touch); }else{ mutex.lock(); touchEventArgsQueue.push(touch); mutex.unlock(); } }
void Java_cc_openframeworks_OFAndroid_onTouchDown(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::down; if(threadedTouchEvents) { window->events().notifyMousePressed(x,y,0); ofNotifyEvent(window->events().touchDown,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 Java_cc_openframeworks_OFAndroid_onTouchMoved(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::move; if(threadedTouchEvents){ ofNotifyMouseMoved(x,y); ofNotifyMouseDragged(x,y,0); ofNotifyEvent(ofEvents().touchMoved,touch); }else{ mutex.lock(); if(accumulateTouchEvents && !touchEventArgsQueue.empty() && touchEventArgsQueue.back().type==ofTouchEventArgs::move){ touchEventArgsQueue.back() = touch; }else{ touchEventArgsQueue.push(touch); } mutex.unlock(); } }
//-------------------------------------------------------------- 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); }