From 888a1b0e7a0b2aa64bcd78d248442ba2c9c0232c Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Sat, 3 Feb 2018 18:19:36 +0000 Subject: basic segmenter --- gui/src/ofApp.cpp | 136 +++++++++++++++++++++++++++++++++++++++++++++++++----- gui/src/ofApp.h | 20 +++++++- 2 files changed, 142 insertions(+), 14 deletions(-) (limited to 'gui/src') 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 laserOutput; + vector 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 clippedOutput; + + if (mask.size()&&use_mask){ + clipper.Clear(); + clipper.addPolylines(mask, ClipperLib::ptClip); + vector shapes; //TODO make clipper clip colourpolylines + for (auto& poly: polyOutput) + { + shapes.push_back(poly); + } + clipper.addPolylines(shapes,ClipperLib::ptSubject); + vector 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 warpedOutput; vector 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 imagepaths= svg.getPaths(); + + std::stringstream strm; + + if (imagepaths.size()){ + mask.clear(); + for (auto& path:imagepaths){ + path.setPolyWindingMode(OF_POLY_WINDING_ODD); + + vector 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() << " ]" < shape_selection; int framecounter; + //======================================= //Mask clipping + + vector mask; + ofx::Clipper clipper; + //======================================= //positioning interface bool bShowPositionInterface; -- cgit v1.2.3