diff options
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/ofApp.cpp | 136 | ||||
| -rw-r--r-- | gui/src/ofApp.h | 20 |
2 files changed, 142 insertions, 14 deletions
diff --git a/gui/src/ofApp.cpp b/gui/src/ofApp.cpp index 48f9fc0..0544fa3 100644 --- a/gui/src/ofApp.cpp +++ b/gui/src/ofApp.cpp @@ -30,7 +30,7 @@ void ofApp::setup(){ //============================ GUI gui.add(contour_threshold.setup("threshold", 140, 0, 255)); - gui.add(contour_simplify.setup("simplify", 0.2, 0.0, 1.0)); + gui.add(contour_simplify.setup("simplify", 0.8, 0.0, 1.0)); gui.add(contour_useColour.setup("use colour", true)); gui.add(laser_R.setup("red", 140, 0, 255)); gui.add(laser_G.setup("green", 140, 0, 255)); @@ -40,6 +40,12 @@ void ofApp::setup(){ gui.add(shapes_randomise.setup("randomise shapes", true)); gui.add(shapes_amount.setup("shapes amount", 0.2, 0.0, 0.8)); gui.add(shapes_duration.setup("shape duration", 5, 0, 25)); + gui.add(use_mask.setup("use mask", true)); + gui.add(invert_mask.setup("invert mask", false)); + gui.add(use_segmenter.setup("use segmenter", false)); + gui.add(segmenter_speed.setup("segmenter speed", 0.2, -1.0, 1.0)); + gui.add(segmenter_length.setup("segmenter length", 0.2, 0.0, 1.0)); + gui.add(segmenter_number.setup("segmenter number", 1, 1, 8)); framecounter=0; @@ -328,11 +334,14 @@ void ofApp::draw(){ glPopMatrix(); + //================================== SVG + mask + + float scale=previewframesize.x/outputWindowSize.x; + //================================== SVG glPushMatrix(); - float scale=previewframesize.x/outputWindowSize.x; glTranslatef(230,300,0); @@ -347,6 +356,29 @@ void ofApp::draw(){ } glPopMatrix(); + + //================================== Mask + + glPushMatrix(); + + glTranslatef(230,600,0); + + ofDrawRectangle(20,20,previewframesize.x+4,previewframesize.y+4); + + ofFill(); + + glTranslatef(22,22,0); + + glScalef(scale,scale,scale); + + for (auto& shape:mask){ + shape.draw(); + } + + ofNoFill(); + + glPopMatrix(); + } } @@ -357,7 +389,13 @@ void ofApp::drawOutput(ofEventArgs & args){ ofSetColor(255,255,255); - vector <colourPolyline> laserOutput; + vector <colourPolyline> polyOutput; + + float phase=fmod(ofGetElapsedTimef()*segmenter_speed,1); + + while (phase<0.0f) { + phase+=1.0f; + } switch (source){ case TEST:{ @@ -383,7 +421,7 @@ void ofApp::drawOutput(ofEventArgs & args){ lineTransformer::makePolygon(6,200) ) ); - laserOutput.push_back(colourPolyline(poly,ofColor(laser_R,laser_G,laser_B))); + polyOutput.push_back(colourPolyline(poly,ofColor(laser_R,laser_G,laser_B))); } case NDI:{ @@ -413,7 +451,7 @@ void ofApp::drawOutput(ofEventArgs & args){ shape.addVertex(p,contour_useColour?c:ofColor(laser_R,laser_G,laser_B)); } shape.simplify(contour_simplify); - laserOutput.push_back(shape); + polyOutput.push_back(shape); } break; @@ -436,7 +474,7 @@ void ofApp::drawOutput(ofEventArgs & args){ shape.addVertex(p,contour_useColour?c:ofColor(laser_R,laser_G,laser_B)); } shape.simplify(contour_simplify); - laserOutput.push_back(shape); + polyOutput.push_back(shape); } } break; @@ -448,19 +486,63 @@ void ofApp::drawOutput(ofEventArgs & args){ framecounter=shapes_duration; } for (auto s:shape_selection){ - laserOutput.push_back(colourPolyline(segmenters[s].getPoly(),ofColor(laser_R,laser_G,laser_B))); + if (use_segmenter){ + auto segments=segmenters[s].getSegments(segmenter_number,segmenter_length,phase); + for (auto segment=segments.begin();segment!=segments.end();segment++){ + polyOutput.push_back(*segment); + } + } + else { + polyOutput.push_back(colourPolyline(segmenters[s].getPoly(),ofColor(laser_R,laser_G,laser_B))); + } } framecounter--; } else { for (auto shape=segmenters.begin();shape!=segmenters.end();shape++){ - laserOutput.push_back(colourPolyline(shape->getPoly(),ofColor(laser_R,laser_G,laser_B))); + if (use_segmenter){ + auto segments=shape->getSegments(segmenter_number,segmenter_length,phase); + for (auto segment=segments.begin();segment!=segments.end();segment++){ + polyOutput.push_back(*segment); + } + } + else { + polyOutput.push_back(colourPolyline(shape->getPoly(),ofColor(laser_R,laser_G,laser_B))); + + } } } break; } } + vector <colourPolyline> clippedOutput; + + if (mask.size()&&use_mask){ + clipper.Clear(); + clipper.addPolylines(mask, ClipperLib::ptClip); + vector <ofPolyline> shapes; //TODO make clipper clip colourpolylines + for (auto& poly: polyOutput) + { + shapes.push_back(poly); + } + clipper.addPolylines(shapes,ClipperLib::ptSubject); + vector <ofPolyline> clipped; + if (invert_mask){ + clipped = clipper.getClippedLines(ClipperLib::ctDifference); + }else { + clipped = clipper.getClippedLines(ClipperLib::ctIntersection); + } + for (auto& clip: clipped) + { + clip.simplify(contour_simplify); + clippedOutput.push_back(colourPolyline(clip,ofColor(laser_R,laser_G,laser_B))); + } + } + else { + clippedOutput=polyOutput; + } + glm::vec2 src[]={ glm::vec2(0,0), glm::vec2(ofGetWidth(),0), @@ -483,18 +565,19 @@ void ofApp::drawOutput(ofEventArgs & args){ vector <colourPolyline> warpedOutput; vector <colourPolyline> scaledWarpedOutput; - for (auto s:laserOutput){ + for (auto s:clippedOutput){ warpedOutput.push_back(lineTransformer::polyLineTransform(warp,s)); scaledWarpedOutput.push_back(lineTransformer::polyLineTransform(scaled_warp,s)); } int num = 0; + int pnum=0; - if (laserOutput.size()){ + if (polyOutput.size()){ num=laser.draw(scaledWarpedOutput); - for (auto& shape:warpedOutput){ shape.draw(); + pnum+=shape.size(); } } @@ -506,7 +589,8 @@ void ofApp::drawOutput(ofEventArgs & args){ ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)+" fps laser points: "+ofToString(num)); } else { - ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)+" fps laser error "); + + ofSetWindowTitle(ofToString(ofGetFrameRate(), 2)+" fps laser error points: "+ofToString(pnum)); } } @@ -726,6 +810,34 @@ void ofApp::dragEvent(ofDragInfo dragInfo){ } + if (dragInfo.position.x>250&&dragInfo.position.x<570&&dragInfo.position.y>620&&dragInfo.position.y<866){ + std::string filename= *dragInfo.files.begin(); + svg.load(filename); + vector <ofPath> imagepaths= svg.getPaths(); + + std::stringstream strm; + + if (imagepaths.size()){ + mask.clear(); + for (auto& path:imagepaths){ + path.setPolyWindingMode(OF_POLY_WINDING_ODD); + + vector <ofPolyline> outlines= path.getOutline(); + for (auto& outline:outlines){ + strm << outline.size() << "->"; + outline.simplify(contour_simplify); + strm << outline.size() << " "; + mask.push_back(outline); + } + strm << " , "; + } + + cout << "Mask: found " << imagepaths.size() << " paths with " << mask.size() << " shapes [ " << strm.str() << " ]" <<std::endl; + + } + + } + } //printf("%s at %i %i \n",dragInfo.files.begin(),dragInfo.position.x,dragInfo.position.y); diff --git a/gui/src/ofApp.h b/gui/src/ofApp.h index 8865da5..14d9934 100644 --- a/gui/src/ofApp.h +++ b/gui/src/ofApp.h @@ -9,6 +9,7 @@ #include "ofxSVG.h" #include "lineSegmenter.h" #include "ofxXmlSettings.h" +#include "ofxClipper.h" enum Source{ TEST, @@ -81,7 +82,7 @@ class ofApp: public ofBaseApp { // For received frame fps calculations double startTime, lastTime, frameTime, frameRate, fps; - //====== video input gui + //====== gui ofxIntSlider contour_threshold; ofxFloatSlider contour_simplify; @@ -91,9 +92,19 @@ class ofApp: public ofBaseApp { ofxIntSlider laser_B; ofxIntSlider laser_intensity; ofxIntSlider laser_points; + + //svg gui ofxToggle shapes_randomise; - ofxFloatSlider shapes_amount; + ofxFloatSlider shapes_amount; ofxIntSlider shapes_duration; + ofxToggle use_mask; + ofxToggle invert_mask; + + //segmenter + ofxToggle use_segmenter; + ofxFloatSlider segmenter_speed; + ofxFloatSlider segmenter_length; + ofxIntSlider segmenter_number; //======================================= //video player @@ -106,6 +117,11 @@ class ofApp: public ofBaseApp { set <int> shape_selection; int framecounter; + //======================================= //Mask clipping + + vector <ofPolyline> mask; + ofx::Clipper clipper; + //======================================= //positioning interface bool bShowPositionInterface; |
