summaryrefslogtreecommitdiff
path: root/gui/src
diff options
context:
space:
mode:
Diffstat (limited to 'gui/src')
-rw-r--r--gui/src/ofApp.cpp136
-rw-r--r--gui/src/ofApp.h20
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;