#include "ofApp.h"
#include "ofConstants.h"

//--------------------------------------------------------------
void ofApp::setup(){
	ofSetFrameRate(60);
	player.setPixelFormat(OF_PIXELS_RGBA);
	player.load("fingers.mov");
	bg.allocate(player.getPixels());
	pixels.allocate(player.getWidth(),player.getHeight());
	pixels.setUseTexture(false);
	thres.allocate(player.getWidth(),player.getHeight(),GL_R8);
	thres.setRGToRGBASwizzles(true);

	pixelsBuffer.allocate(pixels.getPixels(),GL_DYNAMIC_READ);
	shader.setupShaderFromFile(GL_COMPUTE_SHADER,"computeShader.glsl");
	shader.linkProgram();
	grabBG = true;
	player.play();

	player.update();
	player.getTexture().bindAsImage(0,GL_READ_ONLY);
	bg.bindAsImage(1,GL_READ_ONLY);
	thres.bindAsImage(2,GL_WRITE_ONLY);
}

//--------------------------------------------------------------
void ofApp::update(){
	player.update();
	if(player.isFrameNew()){
		if(grabBG){
			bg.loadData(player.getPixels());
			grabBG = false;
		}
		shader.begin();
		shader.setUniform1f("elapsedTime",ofGetElapsedTimef());
		shader.dispatchCompute(player.getWidth()/32, player.getHeight()/30, 1);
		shader.end();
		thres.copyTo(pixelsBuffer);
		unsigned char * p = pixelsBuffer.map<unsigned char>(GL_READ_ONLY);
		pixels.setFromPixels(p,player.getWidth(),player.getHeight());
		pixelsBuffer.unmap();
		contourFinder.findContours(pixels,10,player.getWidth()*player.getHeight()/3,10,false,false);
	}
}

//--------------------------------------------------------------
void ofApp::draw(){
	player.draw(0,0);
	thres.draw(player.getWidth(),0);
	contourFinder.draw();
	ofDrawBitmapString(ofGetFrameRate(),20,20);
}

//--------------------------------------------------------------
void ofApp::keyPressed(int key){
	if(key==' '){
		grabBG = true;
	}
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){

}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){

}

//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

}