From e775f024476943beacc433c39b6b1003f7ba0d86 Mon Sep 17 00:00:00 2001 From: Comment Date: Wed, 16 Jan 2013 14:41:27 +0000 Subject: frame engine with alpha channel and blending --- liveengineUnmapped/src/layers.cpp | 151 +++++++++++++++++++++++++++++++----- liveengineUnmapped/src/layers.h | 85 +++++++++++++++++++- liveengineUnmapped/src/main.cpp | 2 +- liveengineUnmapped/src/playlist.cpp | 45 +++++++++-- liveengineUnmapped/src/playlist.h | 10 +-- liveengineUnmapped/src/testApp.cpp | 120 +++++++++++----------------- liveengineUnmapped/src/testApp.h | 15 +++- liveengineUnmapped/src/viewport.cpp | 1 + liveengineUnmapped/src/viewport.h | 4 +- 9 files changed, 319 insertions(+), 114 deletions(-) (limited to 'liveengineUnmapped/src') diff --git a/liveengineUnmapped/src/layers.cpp b/liveengineUnmapped/src/layers.cpp index 4ac0c59..36f9b14 100755 --- a/liveengineUnmapped/src/layers.cpp +++ b/liveengineUnmapped/src/layers.cpp @@ -63,7 +63,7 @@ void svglayer::draw(float a,unsigned char* controllers,int cx,int cy,bool transp getCentre(cx,cy); //draw layers grouped by controllers float layerspercontroller=((float)svg.getNumPath())/6.0f; - + for (int i=0;i<6;i++) { for (int j=(int)(i*layerspercontroller);j<(int)((i+1)*layerspercontroller);j++) { svg.getPathAt(j).setFillColor(fills[i]*a*controllers[i]); @@ -78,38 +78,149 @@ void svglayer::draw(float a,unsigned char* controllers,int cx,int cy,bool transp svglayer::~svglayer() { //dtor -} - +} + +//------------------------------------------------------------------------ imglayer::imglayer() { - //img.setUseTexture(false); + //sprite.setUseTexture(false); } -imglayer::imglayer(string _f) -{ - load(_f); +imglayer::imglayer(string _filename,int _frames,int _start,float _rate,int n, int e){ + load(_filename,_frames,_start,_rate,n,e); } -void imglayer::load(string _f){ - bool success=img.loadImage(_f); - printf("%s\n",success?"loaded":"not loaded"); +void imglayer::load(string _filename,int _frames,int _start,float _rate,int n, int e){ + startNote=n; + endNote=e; + sprite.load(_filename,_frames,_start); + sprite.setFrameRate(_rate); } -/* -WTF is going on with the image drawing - - -*/ + void imglayer::draw(float a,int cx,int cy,float colShift) { - //if (img.isAllocated()) if (!img.isUsingTexture()) img.setUseTexture(true); //has to be done from the main thread? still doesn't work - img.draw(0,0,ofGetWidth(),ofGetHeight()); - printf("drawing %f\n",ofGetElapsedTimef()); + //if (sprite.isAllocated()) if (!sprite.isUsingTexture()) sprite.setUseTexture(true); //has to be done from the main thread? still doesn't work + sprite.update(); + int x,y,w,h; + if ((((float)cx)/cy)<(((float)sprite.getWidth())/sprite.getHeight())){ + x=0; + w=cx; + h=((float)cx)*(((float)sprite.getHeight())/sprite.getWidth()); + y=(cy-h)/2; + } + else { + y=0; + h=cy; + w=((float)cy)*(((float)sprite.getWidth())/sprite.getHeight()); + x=(cx-w)/2; + } + ofEnableAlphaBlending(); + sprite.draw(x,y,w,h); + ofDisableAlphaBlending(); } void imglayer::draw(float a,unsigned char* controllers,int cx,int cy,bool transparentBlack=false,float colShift=0.0f) { imglayer::draw(a,cx,cy,colShift); -} +} + +void imglayer::setNote(int note) +{ + //is called rerpeatedly no startNote,endNote + //printf("note %i (%i - %i)\n",note,startNote,endNote); + if ((startNote<=note)&&(endNote>=note)) { + if (!sprite.getIsPlaying()) { + + sprite.play(); + + } + //printf("triggered frame %i of %i\n",(int)(((((float)note-startNote)/((float)endNote-startNote)))*sprite.getTotalFrames()),sprite.getTotalFrames()); + sprite.setCurrentFrame((int)(((((float)note-startNote)/((float)endNote-startNote)))*sprite.getTotalFrames())); + //printf("movie %i (%i - %i) frame: %i\n",note,startNote,endNote,(int)(((((float)note-startNote)/((float)endNote-startNote)))*mov.getTotalNumFrames())); + } + else { + if (sprite.getIsPlaying()) { + sprite.stop(); + } + } + +}; imglayer::~imglayer() { - //img.setUseTexture(false); //free texture + //sprite.setUseTexture(false); //free texture +} +//------------------------------------------------------------------------ +videolayer::videolayer() { + //sprite.setUseTexture(false); +} +videolayer::videolayer(string _f,int n,int e,float s) +{ + startNote=n; + endNote=e; + speed=s; + load(_f); +} + +void videolayer::load(string _f){ + name=_f; + mov.setPixelFormat(OF_PIXELS_BGRA); + mov.setUseTexture(false); + bool success=mov.loadMovie(_f); + if (success) { + mov.stop(); + } + printf("%s %s %i bpp\n",success?"loaded":"not loaded",_f.c_str(),success?mov.getPixelsRef().getBytesPerPixel():0); +} + +void videolayer::draw(float a,int cx,int cy,float colShift) { + if (mov.isPlaying()) { + mov.update(); + //unsigned char *pix=mov.getPixels(); + //for (int i=0;i>2)+(pix[i+1]>>1)+(pix[i+2]>>2); + int x,y,w,h; + if ((((float)cx)/cy)<(((float)mov.getWidth())/mov.getHeight())){ + x=0; + w=cx; + h=((float)cx)*(((float)mov.getHeight())/mov.getWidth()); + y=(cy-h)/2; + } + else { + y=0; + h=cy; + w=((float)cy)*(((float)mov.getWidth())/mov.getHeight()); + x=(cx-w)/2; + } + ofEnableAlphaBlending(); + mov.draw(x,y,w,h); + ofDisableAlphaBlending(); + } +} + +void videolayer::draw(float a,unsigned char* controllers,int cx,int cy,bool transparentBlack=false,float colShift=0.0f) { + draw(a,cx,cy,colShift); +} + +void videolayer::setNote(int note) +{ + + if ((startNote<=note)&&(endNote>=note)) { + if (!mov.isPlaying()) { + //printf("starting movie!\n"); + mov.setUseTexture(true); + mov.play(); + mov.setSpeed(speed); + } + mov.setFrame((int)(((((float)note-startNote)/((float)endNote-startNote)))*mov.getTotalNumFrames())); + //printf("movie %i (%i - %i) frame: %i\n",note,startNote,endNote,(int)(((((float)note-startNote)/((float)endNote-startNote)))*mov.getTotalNumFrames())); + } + else { + if (mov.isPlaying()) { + mov.stop(); + } + } + +}; + + +videolayer::~videolayer() +{ } diff --git a/liveengineUnmapped/src/layers.h b/liveengineUnmapped/src/layers.h index c6f4171..f8ed650 100755 --- a/liveengineUnmapped/src/layers.h +++ b/liveengineUnmapped/src/layers.h @@ -3,6 +3,7 @@ #include "ofxSVGTiny.h" #include "ofMain.h" +#include "ofxSprite.h" class layer { @@ -13,7 +14,10 @@ class layer virtual void load(string _f){}; virtual void draw(float a,int cx,int cy,float colShift){}; virtual void draw(float a,unsigned char* controllers,int cx,int cy,bool transparentBlack=false,float colShift=0.0f){ draw(a,cx,cy,colShift);}; - bool getLoaded() {return isLoaded;}; + bool getLoaded() {return isLoaded;}; + virtual void setNote(int note) {}; + string name; + int startNote,endNote; protected: bool isLoaded; private: @@ -37,18 +41,91 @@ class svglayer: public layer vector strokes; float xo,yo; }; + +class sunkenSprite: public ofxSprite { + public: + float playhead,frameRate; + void setFrameRate(float frameRate) { this->frameRate = frameRate;}; + void play() { + startTime=ofGetElapsedTimef(); + ofxSprite::play(); + } + void update() { + if (!getIsPlaying()) return; + playhead=fmod(speed * frameRate * (ofGetElapsedTimef()-startTime),(float)getTotalFrames()); + ofxSprite::setCurrentFrame(playhead); + + } + void setCurrentFrame(float frame) { + //this idea doesn't work - fucks up when frameRate is 0 - + //need to rethink + + //when frameRate is 0 startTime doesn't matter + //this still might not be not entirely correct + if (frameRate>0) startTime-=(frame-pos) / ((float)(frameRate * speed )); + //printf("sunkensprite setting frame %i of %i\n",(int)frame,getTotalFrames()); + //printf("1 checking frame %i of %i\n",(int)frame,getTotalFrames()); + ofxSprite::setCurrentFrame(frame); + /* + pos = frame; + printf("2 checking frame %i of %i\n",(int)frame,getTotalFrames()); + printf("requesting movie frame %i of %i\n",(int)pos,getTotalFrames()); + if (pos<0) if (loop) { pos += totalFrames; } else stop(); + if (pos>=totalFrames) if (loop) { + while (pos>=totalFrames) pos -= totalFrames; + } else { pos = totalFrames-.00001f; isPlaying=false; } + printf("set movie frame %i of %i\n",(int)pos,totalFrames); + */ + } + void draw(int x,int y,int w,int h) { + + int f=playhead; + float fr=fmod(playhead,1.0); + ofSetColor(255,255,255,(1.0-fr)*255); + //not always? + getImageAtFrame(f).setUseTexture(true); + getImageAtFrame(f).reloadTexture(); + getImageAtFrame(f).draw(x,y,w,h); + ofSetColor(255,255,255,fr*255); + f=(f+1)%getTotalFrames(); + getImageAtFrame(f).setUseTexture(true); + getImageAtFrame(f).reloadTexture(); + getImageAtFrame(f).draw(x,y,w,h); + } + + private: + float startTime; + +}; class imglayer: public layer { public: imglayer(); - imglayer(string _f); + imglayer(string _f,int _frames=1,int _start=1,float _rate=0,int note=0,int endnote=0); virtual ~imglayer(); - void load(string _f); + void load(string _filename,int _frames=1,int _start=1,float _rate=0.0,int note=0,int endnote=0); void draw(float a,int cx,int cy,float colShift); void draw(float a,unsigned char* controllers,int cx,int cy,bool transparentBlack,float colShift); + void setNote(int n); protected: private: - ofImage img; + sunkenSprite sprite; +}; + +class videolayer: public layer +{ + public: + videolayer(); + videolayer(string _f,int n,int e,float s); + virtual ~videolayer(); + void load(string _f); + void draw(float a,int cx,int cy,float colShift); + void draw(float a,unsigned char* controllers,int cx,int cy,bool transparentBlack,float colShift); + void setNote(int n); + protected: + private: + float speed; + ofVideoPlayer mov; }; #endif // SVGLAYER_H diff --git a/liveengineUnmapped/src/main.cpp b/liveengineUnmapped/src/main.cpp index 6f40023..f0c0c0f 100755 --- a/liveengineUnmapped/src/main.cpp +++ b/liveengineUnmapped/src/main.cpp @@ -7,7 +7,7 @@ int main( ){ ofAppGlutWindow window; - ofSetupOpenGL(ofxFensterManager::get(),2048,768, OF_WINDOW); //2048,768 + ofSetupOpenGL(ofxFensterManager::get(),1024,768, OF_WINDOW); //2048,768 //ofSetupOpenGL(&window, 1024,768, OF_WINDOW); // <-------- setup the GL context //ofSetupOpenGL(&window, 1024,768, OF_WINDOW); diff --git a/liveengineUnmapped/src/playlist.cpp b/liveengineUnmapped/src/playlist.cpp index 51bd852..683cd3c 100755 --- a/liveengineUnmapped/src/playlist.cpp +++ b/liveengineUnmapped/src/playlist.cpp @@ -25,26 +25,61 @@ void playlist::load(string _name){ void playlist::threadedFunction(){ if( lock() ){ - loadsvg(); + loadLayers(); unlock(); } } -void playlist::loadsvg(){ +void playlist::loadLayers(){ int numLayers=0; layers.clear(); name=XML.getAttribute("playlist", "name", ""); + float speed=XML.getAttribute("playlist", "speed", 0); if(XML.pushTag("playlist")) { numLayers=XML.getNumTags("svglayer"); if(numLayers) { for (int i=0;inote) { + for (int j=note+1;jnote) { + for (int j=note+1;j<=endnote;j++) { + layers[j]=layers[note]; + } + } + } + thumbnailed=false; + } XML.popTag(); } diff --git a/liveengineUnmapped/src/playlist.h b/liveengineUnmapped/src/playlist.h index 846de74..2790835 100755 --- a/liveengineUnmapped/src/playlist.h +++ b/liveengineUnmapped/src/playlist.h @@ -12,17 +12,17 @@ class playlist : public ofThread { playlist(); virtual ~playlist(); void loadimg(); - void loadsvg(); + void loadLayers(); void load(string _name); void threadedFunction(); - void makeThumbnail(); + void makeThumbnail(); - ofFbo thumbnail; - bool thumbnailed; + ofFbo thumbnail; + bool thumbnailed; ofxXmlSettings XML; map layers; - string name; + string name; protected: private: }; diff --git a/liveengineUnmapped/src/testApp.cpp b/liveengineUnmapped/src/testApp.cpp index cada0e7..c6fb94e 100755 --- a/liveengineUnmapped/src/testApp.cpp +++ b/liveengineUnmapped/src/testApp.cpp @@ -87,7 +87,6 @@ void testApp::setup(){ colShift=0; controlColours=false; - debug=false; noteRandomiseColours=false; transparentBlack=false; reversemain=false; @@ -145,6 +144,16 @@ void testApp::setup(){ gui.add(transparentBlack.setup("transparent black", false)); gui.add(resetDrawscale.setup("reset draw scale")); gui.add(resetFBscale.setup("reset FB scale")); + fadeScale=128; + gui.add(fS.setup("fade scale",fadeScale,0,255,255)); + + gui.add(oscScale.setup("scale size LFO", false)); + gui.add(breakOsc.setup("break oscillators", false)); + gui.add(randomOsc.setup("randomise oscillators", false)); + scaleAmplitude=0.5f; + gui.add(sA.setup("fade scale",scaleAmplitude,0,2.0,255)); + scaleFrequency=1.0f; + gui.add(sF.setup("fade freq",scaleFrequency,0,5.0,255)); resetDrawscale.addListener(this,&testApp::resetDrawscalePressed); resetFBscale.addListener(this,&testApp::resetFBscalePressed); @@ -159,6 +168,7 @@ void testApp::setup(){ guiWin->setup(); guiWin->setParent(this); + debug=false; } @@ -184,13 +194,16 @@ void testApp::draw(){ float lambda=max(0.0f,1.0f-((ofGetElapsedTimef()-lastnoteTime)/decayTime)); - ofSetColor(255-fadetime,255-fadetime,255-fadetime); //for feedback + int ft=255-(fadetime*((float)fadeScale)*0.1); + //if(ofGetFrameNum()%25==0) printf("fadeScale %i\n",(int)fadeScale); + ofSetColor(ft,ft,ft); //for feedback + float os=oscScale?(sin((breakOsc?ofGetElapsedTimef()-(randomOsc?randOffs:lastnoteTime):ofGetElapsedTimef()))*scaleFrequency)*scaleAmplitude:0.0f; //vp1.draw(lambda,controllers,xshift,yshift,list,transparentBlack,note,mode,controller_colours,controlColours,scale,fscale,noteRandomiseColours?colShift:0.0f); //vp2.draw(lambda,controllers,reversemain?-xshift:xshift,yshift,list,transparentBlack,note,mode,controller_colours,controlColours,reversemain?1.0f/scale:scale,reversemain?1.0f/fscale:fscale,noteRandomiseColours?colShift:0.0f); for (int i=0;idraw(lambda,controllers,even&&reversemain?-xshift:xshift,yshift,list,transparentBlack,note,mode,controller_colours,controlColours,even&&reversemain?1.0f/scale:scale,even&&reversemain?1.0f/fscale:fscale,noteRandomiseColours?colShift:0.0f); + viewports[i]->draw(lambda,controllers,even&&reversemain?-xshift:xshift,yshift,list,transparentBlack,note,mode,controller_colours,controlColours,even&&reversemain?1.0f/(scale+os):scale+os,even&&reversemain?1.0f/fscale:fscale,noteRandomiseColours?colShift:0.0f); } ofSetColor(255,255,255); @@ -337,65 +350,8 @@ void testApp::keyPressed(int key, ofxFenster* win){ else keyPressed(key); } void testApp::keyPressed(int key){ - if(key == 'q'){ - list.load("insects.xml"); - } - if(key == 'Q'){ - list.load("birds.xml"); - } - if(key == 'w'){ - list.load("teamsports.xml"); - } - if(key == 'W'){ - list.load("american_football.xml"); - } - if(key == 'e'){ - list.load("organs.xml"); - } - if(key == 'E'){ - list.load("crests.xml"); - } - if(key == 'r'){ - list.load("tai_chi.xml"); - } - if(key == 'R'){ - list.load("cricket.xml"); - } - if(key == 't'){ - list.load("reptiles.xml"); - } - if(key == 'T'){ - list.load("tools.xml"); - } - if(key == 'y'){ - list.load("miltary_ladies.xml"); - } - if(key == 'Y'){ - list.load("women_ethnic.xml"); - } - if(key == 'u'){ - list.load("knights.xml"); - } - if(key == 'U'){ - list.load("food.xml"); - } - if(key == 'i'){ - list.load("mil_historic.xml"); - } - if(key == 'I'){ - list.load("mil_ethnic.xml"); - } - if(key == 'o'){ - list.load("yoga.xml"); - } - if(key == 'O'){ - list.load("computers.xml"); - } - if(key == 'p'){ - list.load("dancing.xml"); - } - if(key == 'P'){ - list.load("trainers.xml"); + if(key =='q'){ + nmidiMessage(144,ofRandom(64)+36,127); } if(key == 's'){ XML.saveFile("settings.xml"); @@ -532,7 +488,11 @@ void testApp::toggleFPS(){ showFPS=!showFPS; } -void testApp::newMidiMessage(ofxMidiEventArgs& eventArgs){ +void testApp::newMidiMessage(ofxMidiEventArgs& eventArgs){ + if ((midiChannel==0)||(eventArgs.channel==midiChannel)) { + nmidiMessage(eventArgs.status,eventArgs.byteOne,eventArgs.byteTwo); + } +} //newMessage(eventArgs.port, eventArgs.channel, eventArgs.byteTwo, eventArgs.timestamp); @@ -548,30 +508,38 @@ void testApp::newMidiMessage(ofxMidiEventArgs& eventArgs){ */ //printf("%d %d %d %d %d\n",eventArgs.port,eventArgs.channel,eventArgs.status,eventArgs.byteOne,eventArgs.byteTwo); - +void testApp::nmidiMessage(int event,int data1, int data2) { + if (debug) printf("midi: %i %i\n",event,data1); bool noteOn; //this old thing! - - if ((midiChannel==0)||(eventArgs.channel==midiChannel)) { - switch(eventArgs.status) { + int i; + switch(event) { case 144: //noteon-off channel 0 - noteOn=(eventArgs.byteTwo==0?false:true); + noteOn=(data2==0?false:true); //for (int i=0;inote==eventArgs.byteOne) layers[i]->setActive(noteOn); //} - if (debug) printf("note: %i %i\n",eventArgs.byteOne,eventArgs.byteTwo); - note=eventArgs.byteOne; + + note=data1; lastnoteTime=ofGetElapsedTimef(); - if (noteRandomiseColours) { - makeColours(); // - } + if (list.layers.size()&&list.lock()) { //if playlist is loaded + map::iterator itr; + //for(itr = list.layers.begin(); itr != list.layers.end(); ++itr){ + // list.layers[itr->first]->setNote(note); + //} + list.layers[note]->setNote(note); + list.unlock(); + } + if (noteRandomiseColours) { + makeColours(); // + } + randOffs=ofRandom(1.0f); break; case 176: //control change channel 0 //for (int i=0;imix==eventArgs.byteOne) layers[i]->setMixAmt(((float)eventArgs.byteTwo)/127.0f); //} - if (debug) printf("cc: %i %i\n",eventArgs.byteOne,eventArgs.byteTwo); - controllers[eventArgs.byteOne-START_CONTROLLER]=eventArgs.byteTwo; + if (debug) printf("cc: %i %i\n",data1,data2); + if (data1>=START_CONTROLLER) controllers[data1-START_CONTROLLER]=data2; } - } } diff --git a/liveengineUnmapped/src/testApp.h b/liveengineUnmapped/src/testApp.h index fe988f1..e3ca574 100755 --- a/liveengineUnmapped/src/testApp.h +++ b/liveengineUnmapped/src/testApp.h @@ -121,6 +121,8 @@ class testApp : public ofxFensterListener, public ofxMidiListener{ void keyPressedEvent(ofKeyEventArgs &args); void windowEvent(ofResizeEventArgs &args); + void nmidiMessage(int event,int data1, int data2); + void makeColours(); void toggleFPS(); @@ -165,7 +167,7 @@ class testApp : public ofxFensterListener, public ofxMidiListener{ void newMidiMessage(ofxMidiEventArgs& eventArgs); playlist list; - + ofxPanel gui; ofxToggle reversemain; @@ -174,6 +176,17 @@ class testApp : public ofxFensterListener, public ofxMidiListener{ ofxToggle transparentBlack; ofxButton resetDrawscale; ofxButton resetFBscale; + ofxIntSlider fS; + ofxParameter fadeScale; + ofxToggle oscScale; + ofxToggle breakOsc; + ofxToggle randomOsc; + ofxFloatSlider sA; + ofxParameter scaleAmplitude; + ofxFloatSlider sF; + ofxParameter scaleFrequency; + + float randOffs; void resetDrawscalePressed(bool & pressed); void resetFBscalePressed(bool & pressed); diff --git a/liveengineUnmapped/src/viewport.cpp b/liveengineUnmapped/src/viewport.cpp index a15d5ba..e533ef4 100755 --- a/liveengineUnmapped/src/viewport.cpp +++ b/liveengineUnmapped/src/viewport.cpp @@ -73,6 +73,7 @@ void viewport::draw(float a,unsigned char* controllers,int xshift,int yshift,pla ofTranslate(w/2,h/2); ofScale(scale,scale,scale); ofTranslate(-w/2,-h/2); + ofSetColor(255,255,255); if (controlColours) list.layers[note]->draw(a,controllers,w,h,transparentBlack,colShift); else list.layers[note]->draw(a,w,h,colShift); ofPopMatrix(); diff --git a/liveengineUnmapped/src/viewport.h b/liveengineUnmapped/src/viewport.h index 6d8f4bb..a83cc87 100755 --- a/liveengineUnmapped/src/viewport.h +++ b/liveengineUnmapped/src/viewport.h @@ -6,7 +6,7 @@ #define NUM_NOTES 64 #define START_NOTE 36 -#define NUM_CONTROLLERS 6 +#define NUM_CONTROLLERS 26 #define START_CONTROLLER 102 #define NOTHING 0 @@ -28,7 +28,7 @@ class viewport protected: private: int x, y,w,h,ox,oy; - + }; #endif // VIEWPORT_H -- cgit v1.2.3