summaryrefslogtreecommitdiff
path: root/07_performance/src/oni.cpp
diff options
context:
space:
mode:
Diffstat (limited to '07_performance/src/oni.cpp')
-rw-r--r--07_performance/src/oni.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/07_performance/src/oni.cpp b/07_performance/src/oni.cpp
new file mode 100644
index 0000000..1fbd096
--- /dev/null
+++ b/07_performance/src/oni.cpp
@@ -0,0 +1,267 @@
+#include "oni.h"
+
+void syncOniPlayer::addPlayer(string name){
+ //ofxOpenNI *o=new ofxOpenNI;
+ //o->setupFromONI(name,true);
+ //o->setPaused(true);
+ //players.push_back(o);
+ players.push_back(NULL);
+ filenames.push_back(name);
+ soundplayer.setLoop(false);
+ //players[players.size()-1]->setSpeed(0.0f);
+ //players[players.size()-1]->setup(true);
+ //players[players.size()-1]->start();
+ //players[players.size()-1]->startPlayer(name);
+}
+void syncOniPlayer::play(){
+ for (int i=0;i<players.size();i++) {
+ players[i]=new ofxOpenNI();
+ //players[i]->setSafeThreading(true);
+ players[i]->setupFromONI(filenames[i],true);
+ //players[i]->setSafeThreading(true);
+ //players[i]->addDepthGenerator();
+ //players[i]->addImageGenerator();
+ //players[i]->setRegister(true);
+ players[i]->setLooped(false);
+ //players[i]->setBaseUserClass(user);
+ players[i]->start();
+ //players[players.size()-1]->setSpeed(1.0f);
+ if (audio!="") {
+ soundplayer.loadSound(audio);
+ soundplayer.play();
+ };
+ //sleep(2);
+ drawable=true;
+ startTime=ofGetElapsedTimef();
+ playerActive=true;
+ }
+}
+void syncOniPlayer::update(){
+ for (int i=0;i<players.size();i++) {
+ if (playerActive) players[i]->update();
+ }
+}
+void syncOniPlayer::pause(){
+ for (int i=0;i<players.size();i++) {
+ //players[players.size()-1]->setSpeed(0.0f);
+ players[i]->setPaused(true);
+ }
+}
+bool syncOniPlayer::isPlaying(){
+ if (players.size()) return players[0]->isPlaying();
+ else return false;
+}
+int syncOniPlayer::getCurrentFrame(){
+ if (players.size()) return players[0]->getCurrentFrame();
+ else return -1;
+}
+float syncOniPlayer::getPosition(){
+ if (players.size()) return players[0]->getPosition();
+ else return -1.0f;
+}
+void syncOniPlayer::drawWindows(){
+ if (!drawable) return;
+ for (int i=0;i<players.size();i++) {
+ if (players[i]==NULL) break;
+ ofTranslate(0, i * 400);
+ players[i]->drawDepth(50, 0,520,390);
+ players[i]->drawImage(600, 0,520,390);
+
+
+ }
+}
+void syncOniPlayer::drawCloud(int step){
+ int count;
+ for (int n=0;n<players.size();n++) {
+
+
+ const XnDepthPixel* depthmap=players[n]->getDepthGenerator().GetDepthMap();
+ //uint16_t* depthpixels=depthmap.getPixels();
+ int range=1700;
+
+ int depthW=players[n]->getWidth();
+ int depthH=players[n]->getHeight();
+
+ for (int i=0;i<depthW;i+=step) {
+
+ glBegin(GL_LINES);
+
+ for (int j=0;j<depthH;j+=step) {
+
+
+ ofPoint p= players[n]->projectiveToWorld(ofPoint(i,j,(float)(depthmap[j*depthW+i])));
+ //ofPoint p= projectiveToWorld(ofPoint(i,j,(float)depthmap[j*dmw+i]));
+
+ if (p.z == 0 || p.z>range) continue; // gets rid of background
+
+
+ glColor4ub((unsigned char)255, (unsigned char)255, (unsigned char)255, (unsigned char)255);
+ glVertex3f(p.x, p.y, p.z);
+ //if (i==320&&j==160) cerr<<"world point: "<<p.x<<","<<p.y<<","<<p.z<<endl;
+ }
+
+ glEnd();
+ }
+
+ }
+
+ return;
+}
+void syncOniPlayer::drawPoints(float _birth,float life,float dx,float dy, float dz,float size){
+ if (!drawable) return;
+
+ //glEnable(GL_PROGRAM_POINT_SIZE);
+ //glEnable(GL_POINT_SMOOTH);
+ //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ //glPointSize( size);
+ //glBegin(GL_POINTS);
+
+ if (playerActive){
+ //apply envelope
+ float attackSeconds=0.5f;
+ float playOutFraction=0.9f;
+ float birth;
+ float clipTime=ofGetElapsedTimef()-startTime;
+ if (clipTime<attackSeconds) {
+ //ramp in
+ birth=_birth*(clipTime/attackSeconds);
+ }
+ else if (players[0]->getPosition()>playOutFraction) {
+ //cerr<<"playing out!"<<endl;
+ birth=_birth*(1.0f-((players[0]->getPosition()-playOutFraction)/(1.0f-playOutFraction)));
+ //if it reaches the end stop creating points but allow old points to play out
+ if (players[0]->getPosition()>0.99) playerActive=false;
+ }
+ else birth=_birth;
+
+ //cerr<<birth<<" "<<clipTime<<" "<<players[0]->getPosition()<<endl;
+
+ const XnDepthPixel* depthmap=players[0]->getDepthGenerator().GetDepthMap();
+ const ofPixels& pixels=players[0]->getImagePixels();
+ int range=1700;
+ int dmw=players[0]->getWidth();
+ int dmh=players[0]->getHeight();
+ if (dmw&&dmh){
+ int step=pixels.getWidth()/dmw;
+ for (int o=0;o<birth;o++) {
+ int i=ofRandom(dmw);
+ int j=ofRandom(dmh);
+ ofPoint p= players[0]->projectiveToWorld(ofPoint(i,j,(float)depthmap[j*dmw+i]));
+ if (p.z <100 || p.z>range) continue;
+ //points.push_back(fpoint(p.x, p.y, p.z,pixels[((j*step*dmw)+(i*step))*3],pixels[((j*step*dmw)+(i*step))*3]+1,pixels[((j*step*dmw)+(i*step))*3]+2));
+ //fpoint f=fpoint(p.x, p.y, p.z,pixels[((j*step*dmw)+(i*step))*3],pixels[((j*step*dmw)+(i*step))*3]+1,pixels[((j*step*dmw)+(i*step))*3]+2);
+ //f.draw(life,dx,dy,dz);
+ if (pointPool.size()) {//take 1st dead particle
+ points[(*pointPool.begin())].setup(p.x, p.y, p.z,
+ LUT[pixels[((j*step*dmw)+(i*step))*3]],
+ LUT[pixels[((j*step*dmw)+(i*step))*3]+1],
+ LUT[pixels[((j*step*dmw)+(i*step))*3]+2]
+ );
+ pointPool.erase(pointPool.begin());
+ }
+ else {//make a new one
+ points.push_back(fpoint(p.x, p.y, p.z,pixels[((j*step*dmw)+(i*step))*3],pixels[((j*step*dmw)+(i*step))*3]+1,pixels[((j*step*dmw)+(i*step))*3]+2));
+ }
+ }
+ }
+ }
+ for (int i=0;i<points.size();i++){
+ if (!points[i].draw(life,dx,dy,dz,size)) {
+ pointPool.insert(i);
+ }
+ }
+ //glEnd();
+ glDisable( GL_BLEND );
+ //glDisable(GL_PROGRAM_POINT_SIZE);
+}
+int syncOniPlayer::getNumParticles(){
+ return points.size()-pointPool.size();
+}
+string syncOniPlayer::getCurrentFile(){
+ return filenames[0]+" "+audio;
+}
+void syncOniPlayer::stop(){
+ soundplayer.stop();
+ for (int i=0;i<players.size();i++) {
+ if (players[i]!=NULL) {
+ players[i]->stop();
+ delete players[i];
+ players[i]=NULL;
+ }
+ }
+ drawable=false;
+ playerActive=false;
+}
+//=================
+void oniManager::init(const char* filename){
+ playing=-1;
+ int numDevices=1;
+ string f=string(filename);
+ if( !XML.loadFile(f) ){
+ printf("unable to load recordings, check data/ folder\n");
+ }else{
+ if(XML.pushTag("TRSS")) {
+ int num=XML.getNumTags("rec");
+ if(num) {
+ for (int i=0;i<num;i++) {
+ players.push_back(syncOniPlayer());
+ players[i].addPlayer(XML.getAttribute("rec","left","",i));
+ if (numDevices==2) {
+ players[i].addPlayer(XML.getAttribute("rec","right","",i));
+ }
+ players[i].audio=XML.getAttribute("rec","audio","",i);
+ }
+ }
+ else printf("no recordings found!\n");
+ }
+ }
+}
+void oniManager::startPlayer(int newplayer){
+ if (players.size()>newplayer){
+ if (playing>-1) players[playing].stop();
+ usleep(5000);
+ playing=newplayer;
+ players[playing].play();
+ }
+}
+string oniManager::getCurrentFile(){
+ if (players.size()>playing&&playing>-1) return players[playing].getCurrentFile();
+ else return "";
+}
+int oniManager::getNumClips(){
+ return players.size();
+}
+void oniManager::update(){
+ //if (playing>-1&&!players[playing].isPlaying()) players[playing].play();
+ if (players.size()>playing&&playing>-1) players[playing].update();
+}
+void oniManager::drawWindows(){
+ if (players.size()>playing&&playing>-1) players[playing].drawWindows();
+}
+void oniManager::drawCloud(int step){
+ if (players.size()>playing&&playing>-1) players[playing].drawCloud(step);
+}
+void oniManager::next(){
+ int newp=(playing+1)%players.size();
+ startPlayer(newp);
+}
+void oniManager::previous(){
+ int newp=playing-1<0?players.size()-1:playing-1;
+ startPlayer(newp);
+}
+int oniManager::getNumParticles(){
+ if (players.size()>playing&&playing>-1) return players[playing].getNumParticles();
+ else return 0;
+}
+void oniManager::drawPoints(float size,float birth,float life,float dx,float dy, float dz){
+ if (players.size()>playing&&playing>-1) {
+ players[playing].drawPoints(birth,life,dx,dy,dz,size);
+ }
+}
+syncOniPlayer* oniManager::getCurrentPlayer(){
+ if (players.size()>playing&&playing>-1) return &players[playing];
+ else return NULL;
+}
+