summaryrefslogtreecommitdiff
path: root/gui/src/ofApp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/src/ofApp.cpp')
-rw-r--r--gui/src/ofApp.cpp136
1 files changed, 124 insertions, 12 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);