#include "ofApp.h" #include "glew.h" int MAX_POINTS=20000; int LASER_INTENSITY=37; vector cmdnames={"moveTo","lineTo","curveTo","bezierTo","quadBezierTo","arc","arcNegative","close"}; //-------------------------------------------------------------- void ofApp::setup(){ ofxSVG svg; svg.load("lorenzo.svg"); imagepaths= svg.getPaths(); float simplify_factor=0.3f; std::stringstream strm; for (auto& path:imagepaths){ path.setPolyWindingMode(OF_POLY_WINDING_ODD); vector outlines= path.getOutline(); for (auto& outline:outlines){ strm << outline.size() << "->"; outline.simplify(simplify_factor); strm << outline.size() << " "; segmenters.push_back(lineSegmenter(outline)); } strm << " , "; } cout << "Drawing: found " << imagepaths.size() << " paths with " << segmenters.size() << " shapes [ " << strm.str() << " ]" < outlines= path.getOutline(); for (auto& outline:outlines){ mask.push_back(outline); } /* vector cmds=paths[i].getCommands(); std::stringstream strm; strm << "Mask: found " << cmds.size() << " commands ("; for (auto& cmd:cmds){ strm << cmdnames[cmd.type] <<","; } strm << ")" << std::endl; cout << strm.str(); */ } cout << "Mask: found " << maskpaths.size() << " paths with " << mask.size() << " shapes" < lasershapes; switch (mode){ case 0:{ //int s=((int)ofGetElapsedTimef())%segmenters.size(); //lasershapes.push_back(segmenters[s].getPoly()); for (auto shape=segmenters.begin();shape!=segmenters.end();shape++){ auto segments=shape->getSegments(numsegments,coverage,phase); for (auto segment=segments.begin();segment!=segments.end();segment++){ lasershapes.push_back(colourPolyline(*segment)); } } break; } case 1:{ vector shapes; for (auto shape=segmenters.begin();shape!=segmenters.end();shape++){ auto segments=shape->getSegments(numsegments,coverage,phase); for (auto segment=segments.begin();segment!=segments.end();segment++){ shapes.push_back(*segment); } } clipper.addPolylines(shapes,ClipperLib::ptSubject); vector clipped = clipper.getClippedLines(ClipperLib::ctIntersection); for (auto& clip: clipped) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } break; } case 2:{ vector shapes; for (auto shape=segmenters.begin();shape!=segmenters.end();shape++){ auto segments=shape->getSegments(numsegments,coverage,phase); for (auto segment=segments.begin();segment!=segments.end();segment++){ shapes.push_back(*segment); } } clipper.addPolylines(shapes,ClipperLib::ptSubject); vector clipped = clipper.getClippedLines(ClipperLib::ctDifference); for (auto& clip: clipped) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } break; } case 3:{ vector shapes; ofMatrix4x4 rm = ofMatrix4x4::newIdentityMatrix(); rm.translate(-600,-450,0); rm.rotateRad(ofGetElapsedTimef(),0,0,1); rm.translate(600,450,0); for (auto& segment:segmenters){ shapes.push_back(polyLineTransform(segment.getPoly(),rm)); } clipper.addPolylines(shapes,ClipperLib::ptSubject); vector clipped = clipper.getClippedLines(ClipperLib::ctIntersection); for (auto& clip: clipped) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } break; } case 4:{ vector clipped = clipper.getOffsets(maskpaths,((sin(ofGetElapsedTimef())+1)*5)+1,true); for (auto& clip: clipped) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } break; } case 5:{ //the N only fucks up when the other shapes are drawn! vector clipped; for (auto & maskpath:maskpaths){ auto clips=clipper.getOffsets(maskpath,-((phase*20)+1),true); clipped.insert(clipped.end(),clips.begin(),clips.end()); } vector simplified = clipper.simplifyPolylines(clipped); ofSetColor(255*(1.0f-phase),255*(1.0f-phase),255*(1.0f-phase)); for (auto& clip: simplified) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } /* float phase1=fmod(phase+0.5f,1.0f); clipped.clear(); clipped = clipper.getOffsets(maskpaths,-((phase*20)+1),true); simplified.clear(); simplified = clipper.simplifyPolylines(clipped); ofSetColor(255*(1.0f-phase1),255*(1.0f-phase1),255*(1.0f-phase1)); for (auto& clip: simplified) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } */ break; } case 6:{ vector shapes; for (auto& shape: mask) { shape.close(); shapes.push_back(shape); } vector clipped = clipper.getOffsets(shapes,((sin(ofGetElapsedTimef())+1)*5)+1); vector simplified = clipper.simplifyPolylines(clipped); for (auto& clip: simplified) { clip.draw(); segmentsdrawn++; pointsdrawn+=clip.size(); } break; } case 7: { ofPoint scale; if(dir.isValidIndex(dirIdx)){ //client.update(); /* scale=ofPoint(ofGetWidth()/client.getWidth(),ofGetHeight()/client.getHeight()); ofPixels pixels; ofTexture texture=client.getTexture(); texture.bind(); texture.readToPixels(pixels); texture.unbind(); colorImg.setFromPixels(pixels); grayImage = colorImg; grayImage.threshold(threshold); contourFinder.findContours(grayImage, 20, (340*240)/3, 10, true); */ scale=ofPoint(ofGetWidth()/syphonFbo.getWidth(),ofGetHeight()/syphonFbo.getHeight()); syphonFbo.begin(); client.draw(0, 0, syphonFbo.getWidth(),syphonFbo.getHeight()); syphonFbo.end(); //syphonFbo.draw(0,0,ofGetWidth(),ofGetHeight()); //works //printf("got fbo: %ix%i format %i\n",syphonFbo.getWidth(),syphonFbo.getHeight(),syphonFbo.getTexture().getPixelFormat()); //syphonFbo.updateTexture(0); ofTexture texture= syphonFbo.getTexture(); //texture.draw(0,0,ofGetWidth(),ofGetHeight()); //works //printf("got texture: %ix%i format %i\n",texture.getWidth(),texture.getHeight(),texture.getTextureData().glInternalFormat); ofPixels pixels; texture.readToPixels(pixels); //printf("got texture: %ix%i format %i\n",pixels.getWidth(),pixels.getHeight(),pixels.getPixelFormat()); //pixels are in RGBA format allegedly, but maybe this is the problem colorImg.setFromPixels(pixels); colorImg.draw(0,0,ofGetWidth(),ofGetHeight()); //mangled grayImage = colorImg; grayImage.threshold(threshold); contourFinder.findContours(grayImage, 20, (340*240)/3, 10, true); } else { movie.update(); scale=ofPoint(ofGetWidth()/movie.getWidth(),ofGetHeight()/movie.getHeight()); if (movie.isFrameNew()){ colorImg.setFromPixels(movie.getPixels()); grayImage = colorImg; grayImage.threshold(threshold); contourFinder.findContours(grayImage, 20, (340*240)/3, 10, true); } } vector shapes; for (int i = 0; i < contourFinder.nBlobs; i++){ colourPolyline shape; for (auto& point:contourFinder.blobs[i].pts){ ofVec3f p=point*scale; ofColor c=colorImg.getPixels().getColor(point.x,point.y); shape.addVertex(p,c); } shapes.push_back(shape); segmentsdrawn++; pointsdrawn+=shape.size(); shape.draw(); } break; } case 8:{ int w=ofRandom(1000); segmenters[w%segmenters.size()].draw(); segmentsdrawn=1; pointsdrawn+=segmenters[w%segmenters.size()].size(); break; } } /* ofxSVG svg; svg.load("lorenzos.svg"); vector paths= svg.getPaths(); for (auto& l:paths) l.draw(); */ int num = laser.draw(lasershapes); for (auto& shape:lasershapes){ shape.draw(); } if (num>0){ ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)+" fps laser points: "+ofToString(num)); } else { ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)+" fps laser error "); } //mainOutputSyphonServer.publishScreen(); } //-------------------------------------------------------------- void ofApp::exit() { } //-------------------------------------------------------------- void ofApp::keyPressed(ofKeyEventArgs &args){ } //-------------------------------------------------------------- void ofApp::keyReleased(int key){ switch(key){ case '[':{ numsegments=max(0,numsegments-1); break; } case ']':{ numsegments++; break; } case '{':{ coverage=coverage*0.9f; break; } case '}':{ coverage=min(coverage/0.9f,1.0f); break; } case 'p':{ mode=(mode+1)%9; break; } case '-':{ threshold=max(threshold-1,0); break; } case '=':{ threshold=min(threshold+1,255); break; } case ' ':{ if (dir.size() > 0) { dirIdx++; if(dirIdx > dir.size() - 1) dirIdx = 0; client.set(dir.getDescription(dirIdx)); string serverName = client.getServerName(); string appName = client.getApplicationName(); if(serverName == ""){ serverName = "null"; } if(appName == ""){ appName = "null"; } ofSetWindowTitle(serverName + ":" + appName); } else { ofSetWindowTitle("No Server"); } } } } //-------------------------------------------------------------- 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::outputWindowResized(ofResizeEventArgs &resizeargs){ } //-------------------------------------------------------------- void ofApp::gotMessage(ofMessage msg){ } //-------------------------------------------------------------- void ofApp::dragEvent(ofDragInfo dragInfo){ }