diff --git a/example/bin/data/magslideshow_settings.xml b/example/bin/data/magslideshow_settings.xml index 58c00da..3e12c23 100644 --- a/example/bin/data/magslideshow_settings.xml +++ b/example/bin/data/magslideshow_settings.xml @@ -1,14 +1,14 @@ - 1920 - 1080 + 800 + 600 2 - PING-PONG + NORMAL 0 Dissolve - 2 + 3 FitProportionally diff --git a/example/bin/data/ofxpimapper.xml b/example/bin/data/ofxpimapper.xml index 7821700..73dc26f 100644 --- a/example/bin/data/ofxpimapper.xml +++ b/example/bin/data/ofxpimapper.xml @@ -2,16 +2,16 @@ - 194.000000000 - 57.187255859 + 119.000000000 + 379.000000000 - 467.000000000 - 412.000000000 + 387.000000000 + 96.000000000 - 40.374511719 - 210.812774658 + 405.000000000 + 657.000000000 @@ -33,23 +33,68 @@ image4.jpg - + - 407.565002441 - 111.782531738 + 162.000000000 + 96.000000000 - 700.434936523 - 111.782531738 + 637.290893555 + 79.031463623 - 700.434936523 - 258.217407227 + 605.286376953 + 652.968627930 - 407.565002441 - 258.217407227 + 180.000000000 + 657.000000000 + + + + + 0.159322947 + 0.055312362 + + + 0.830520868 + 0.055312362 + + + 0.830520868 + 0.938813090 + + + 0.159322947 + 0.938813090 + + + + fbo + Slide Show Source + + + 1 + + + + + + 860.523620605 + 46.077301025 + + + 887.000000000 + 402.000000000 + + + 1379.000000000 + 533.000000000 + + + 1183.476318359 + 46.077301025 @@ -71,8 +116,98 @@ - fbo - Slide Show Source + image + image2.jpg + + + 1 + + + + + + 1364.000000000 + 252.000000000 + + + 742.000000000 + 392.000000000 + + + 795.000000000 + 857.000000000 + + + 1372.000000000 + 756.000000000 + + + + + 0.101562500 + 0.000000000 + + + 0.884374976 + 0.000000000 + + + 0.884374976 + 1.002777815 + + + 0.101562500 + 1.002777815 + + + + video + control-panel-and-operation.mp4 + + + 1 + + + + + + 341.000000000 + 222.000000000 + + + 341.000000000 + 990.000000000 + + + 1365.000000000 + 990.000000000 + + + 1365.000000000 + 222.000000000 + + + + + 0.016666668 + 0.006666641 + + + 0.536666691 + 0.006666641 + + + 0.536666691 + 0.526666641 + + + 0.016666668 + 0.526666641 + + + + image + image2.jpg 1 diff --git a/example/src/main.cpp b/example/src/main.cpp index d743ec0..2c8ec5b 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -14,7 +14,7 @@ int main(int argc, char * argv[]){ break; } } - + Settings::instance()->setFullscreen(fullscreen); ofSetupOpenGL(1024, 768, OF_WINDOW); diff --git a/src/Application/Modes/ProjectionMappingMode.cpp b/src/Application/Modes/ProjectionMappingMode.cpp index 9495743..9344fa3 100644 --- a/src/Application/Modes/ProjectionMappingMode.cpp +++ b/src/Application/Modes/ProjectionMappingMode.cpp @@ -58,8 +58,12 @@ void ProjectionMappingMode::onKeyPressed(Application * app, ofKeyEventArgs & arg case 'q': app->createSurface(SurfaceType::QUAD_SURFACE); - break; - + break; + + case 'r': + app->createSurface(SurfaceType::CIRCLE_SURFACE); + break; + case 'g': app->createSurface(SurfaceType::GRID_WARP_SURFACE); break; diff --git a/src/Application/SettingsLoader.cpp b/src/Application/SettingsLoader.cpp index 9f8d5fd..9582c4c 100644 --- a/src/Application/SettingsLoader.cpp +++ b/src/Application/SettingsLoader.cpp @@ -20,46 +20,46 @@ bool SettingsLoader::load( SurfaceManager & surfaceManager, MediaServer & mediaServer, string fileName){ - + ofxXmlSettings * xmlSettings = new ofxXmlSettings(); string sourceType = ""; string sourceName = ""; - + BaseSource * source = 0; - + if(!xmlSettings->loadFile(fileName)){ ofLogWarning("SettingsLoader::load()") << "Could not load XML settings"; return false; } - + if(!xmlSettings->tagExists("surfaces")){ xmlSettings->addTag("surfaces"); } - + // Count tags. unsigned int numPresets = xmlSettings->getNumTags("surfaces"); cout << "numPresets: " << numPresets << endl; - + // Clear previous presets and surfaces first. surfaceManager.clearPresets(); - + // Loop through tags in the XML. for(unsigned int i = 0; i < numPresets; ++i){ - + xmlSettings->pushTag("surfaces", i); - + SurfaceStack * surfaces = surfaceManager.createPreset(); int numSurfaces = xmlSettings->getNumTags("surface"); for(int i = 0; i < numSurfaces; i++){ if(xmlSettings->tagExists("surface", i)){ - + SurfaceType type = SurfaceType::NONE; if(xmlSettings->attributeExists("surface", "type")){ type = static_cast( xmlSettings->getAttribute("surface", "type", 0, i)); } - + xmlSettings->pushTag("surface", i); // attempt to load surface source @@ -122,6 +122,13 @@ bool SettingsLoader::load( quadSurface->setSource(source); } surfaces->push_back(quadSurface); + }else if(type == SurfaceType::CIRCLE_SURFACE){ + QuadSurface * base = (QuadSurface*)getQuadSurface(xmlSettings); + CircleSurface * circleSurface = new CircleSurface(*base); + if(sourceName != "none" && source != 0){ + circleSurface->setSource(source); + } + surfaces->push_back(circleSurface); }else if(type == SurfaceType::GRID_WARP_SURFACE){ BaseSurface * gridWarpSurface = getGridWarpSurface(xmlSettings); if(sourceName != "none" && source != 0){ @@ -209,7 +216,8 @@ bool SettingsLoader::save(SurfaceManager & surfaceManager, string fileName){ // Save surface options // For now only if quad surface - if(surface->getType() == SurfaceType::QUAD_SURFACE){ + if (surface->getType() == SurfaceType::QUAD_SURFACE || + surface->getType() == SurfaceType::CIRCLE_SURFACE) { QuadSurface * qs = (QuadSurface *)surface; if(!xmlSettings->tagExists("properties")){ xmlSettings->addTag("properties"); @@ -227,13 +235,13 @@ bool SettingsLoader::save(SurfaceManager & surfaceManager, string fileName){ xmlSettings->addValue("gridRows", gws->getGridRows()); xmlSettings->popTag(); } - + xmlSettings->popTag(); // surface } xmlSettings->popTag(); // surfaces - + } // for - + xmlSettings->save(fileName); } @@ -245,17 +253,17 @@ bool SettingsLoader::create(string fileName){ BaseSurface * SettingsLoader::getTriangleSurface(ofxXmlSettings * xmlSettings){ vector vertices; - + if(xmlSettings->tagExists("vertices")){ xmlSettings->pushTag("vertices"); - + if(xmlSettings->tagExists("vertex", 0)){ xmlSettings->pushTag("vertex", 0); vertices.push_back(ofVec2f(xmlSettings->getValue("x", 0.0f), xmlSettings->getValue("y", 0.0f))); xmlSettings->popTag(); } - + if(xmlSettings->tagExists("vertex", 1)){ xmlSettings->pushTag("vertex", 1); vertices.push_back(ofVec2f(xmlSettings->getValue("x", 100.0f), @@ -277,14 +285,14 @@ BaseSurface * SettingsLoader::getTriangleSurface(ofxXmlSettings * xmlSettings){ if(xmlSettings->tagExists("texCoords")){ xmlSettings->pushTag("texCoords"); - + if(xmlSettings->tagExists("texCoord", 0)){ xmlSettings->pushTag("texCoord", 0); texCoords.push_back(ofVec2f(xmlSettings->getValue("x", 0.0f), xmlSettings->getValue("y", 0.0f))); xmlSettings->popTag(); } - + if(xmlSettings->tagExists("texCoord", 1)){ xmlSettings->pushTag("texCoord", 1); texCoords.push_back(ofVec2f(xmlSettings->getValue("x", 1.0f), @@ -308,16 +316,16 @@ BaseSurface * SettingsLoader::getTriangleSurface(ofxXmlSettings * xmlSettings){ SurfaceType::TRIANGLE_SURFACE); triangleSurface->setVertices(vertices); triangleSurface->setTexCoords(texCoords); - + return triangleSurface; } BaseSurface * SettingsLoader::getQuadSurface(ofxXmlSettings * xmlSettings){ vector vertices; - + if(xmlSettings->tagExists("vertices")){ xmlSettings->pushTag("vertices"); - + if(xmlSettings->tagExists("vertex", 0)){ xmlSettings->pushTag("vertex", 0); vertices.push_back(ofVec2f(xmlSettings->getValue("x", 0.0f), @@ -348,7 +356,7 @@ BaseSurface * SettingsLoader::getQuadSurface(ofxXmlSettings * xmlSettings){ xmlSettings->popTag(); // vertices } - + vector texCoords; if(xmlSettings->tagExists("texCoords")){ @@ -360,7 +368,7 @@ BaseSurface * SettingsLoader::getQuadSurface(ofxXmlSettings * xmlSettings){ xmlSettings->getValue("y", 0.0f))); xmlSettings->popTag(); } - + if(xmlSettings->tagExists("texCoord", 1)){ xmlSettings->pushTag("texCoord", 1); texCoords.push_back(ofVec2f(xmlSettings->getValue("x", 1.0f), @@ -384,14 +392,14 @@ BaseSurface * SettingsLoader::getQuadSurface(ofxXmlSettings * xmlSettings){ xmlSettings->popTag(); // texCoords } - + // Create and add quad surface BaseSurface * quadSurface = SurfaceFactory::instance()->createSurface( SurfaceType::QUAD_SURFACE); quadSurface->setVertices(vertices); quadSurface->setTexCoords(texCoords); - + // Read properties // Only perspective warping for now bool perspectiveWarping = false; @@ -402,18 +410,18 @@ BaseSurface * SettingsLoader::getQuadSurface(ofxXmlSettings * xmlSettings){ } QuadSurface * qs = (QuadSurface *)quadSurface; qs->setPerspectiveWarping(perspectiveWarping); - + return quadSurface; } BaseSurface * SettingsLoader::getGridWarpSurface(ofxXmlSettings * xmlSettings){ vector vertices; - + if(xmlSettings->tagExists("vertices")){ xmlSettings->pushTag("vertices"); - + int iv = 0; - + while(xmlSettings->tagExists("vertex", iv)){ xmlSettings->pushTag("vertex", iv); vertices.push_back(ofVec2f(xmlSettings->getValue("x", 0.0f), @@ -424,14 +432,14 @@ BaseSurface * SettingsLoader::getGridWarpSurface(ofxXmlSettings * xmlSettings){ xmlSettings->popTag(); // vertices } - + vector texCoords; if(xmlSettings->tagExists("texCoords")){ xmlSettings->pushTag("texCoords"); int it = 0; - + while(xmlSettings->tagExists("texCoord", it)){ xmlSettings->pushTag("texCoord", it); texCoords.push_back(ofVec2f(xmlSettings->getValue("x", 0.0f), @@ -442,7 +450,7 @@ BaseSurface * SettingsLoader::getGridWarpSurface(ofxXmlSettings * xmlSettings){ xmlSettings->popTag(); // texCoords } - + // Read properties // Only perspective warping for now int gridCols = 0; @@ -453,7 +461,7 @@ BaseSurface * SettingsLoader::getGridWarpSurface(ofxXmlSettings * xmlSettings){ gridRows = xmlSettings->getValue("gridRows", 0); xmlSettings->popTag(); // properties } - + // Create and add quad surface BaseSurface * gridWarpSurface = SurfaceFactory::instance()->createSurface( @@ -463,16 +471,16 @@ BaseSurface * SettingsLoader::getGridWarpSurface(ofxXmlSettings * xmlSettings){ ((GridWarpSurface *)gridWarpSurface)->createGridMesh(); gridWarpSurface->setVertices(vertices); gridWarpSurface->setTexCoords(texCoords); - + return gridWarpSurface; } BaseSurface * SettingsLoader::getHexagonSurface(ofxXmlSettings * xmlSettings){ vector vertices; - + if(xmlSettings->tagExists("vertices")){ xmlSettings->pushTag("vertices"); - + unsigned int v = 0; while(xmlSettings->tagExists("vertex", v)){ xmlSettings->pushTag("vertex", v); @@ -489,7 +497,7 @@ BaseSurface * SettingsLoader::getHexagonSurface(ofxXmlSettings * xmlSettings){ if(xmlSettings->tagExists("texCoords")){ xmlSettings->pushTag("texCoords"); - + unsigned int t = 0; while(xmlSettings->tagExists("texCoord", t)){ xmlSettings->pushTag("texCoord", t); @@ -508,7 +516,7 @@ BaseSurface * SettingsLoader::getHexagonSurface(ofxXmlSettings * xmlSettings){ SurfaceType::HEXAGON_SURFACE); hexagonSurface->setVertices(vertices); hexagonSurface->setTexCoords(texCoords); - + return hexagonSurface; } diff --git a/src/Gui/Widgets/TextureEditorWidget.cpp b/src/Gui/Widgets/TextureEditorWidget.cpp index 6ce0a88..617c0a6 100644 --- a/src/Gui/Widgets/TextureEditorWidget.cpp +++ b/src/Gui/Widgets/TextureEditorWidget.cpp @@ -149,7 +149,8 @@ void TextureEditorWidget::createJoints(){ if(surface->getType() == SurfaceType::TRIANGLE_SURFACE){ tc = texCoords; - }else if(surface->getType() == SurfaceType::QUAD_SURFACE){ + }else if(surface->getType() == SurfaceType::QUAD_SURFACE || + surface->getType() == SurfaceType::CIRCLE_SURFACE){ tc = texCoords; }else if(surface->getType() == SurfaceType::HEXAGON_SURFACE){ tc = texCoords; diff --git a/src/Info/Info.cpp b/src/Info/Info.cpp index 9d9f489..7823ee0 100644 --- a/src/Info/Info.cpp +++ b/src/Info/Info.cpp @@ -13,15 +13,16 @@ Info::Info(){ " 3. Projection mapping mode\n" " - Press <,> and <.> to select previous or next surface\n" " - Press \"<\" and \">\" to select previous or next vertex\n" - " - Press to add new triangle surface\n" - " - Press to add new quad surface\n" - " - Press

to toggle perspective warping while quad surface selected\n" - " - Press to add new grid surface\n" + " - Press to add new Triangle surface\n" + " - Press to add new Quad surface\n" + " - Press to add a new ciRcle surface\n" + " - Press

to toggle Perspective warping while quad surface selected\n" + " - Press to add new Grid surface\n" " - Press <[> and <]> to remove or add columns to selected grid surface\n" " - Press <{> and <}> to remove or add rows to selected grid surface\n" " - Press <+> and <-> to scale surface up and down\n" " - Press <9> and <0> to move selected surface one layer up or down\n" - " - Press to hide/show layer panel\n" + " - Press to hide/show Layer panel\n" " - Press to delete selection\n" " - Press to play/pause the video\n" " - Type to clear composition\n" diff --git a/src/Surfaces/CircleSurface.cpp b/src/Surfaces/CircleSurface.cpp new file mode 100644 index 0000000..2f73354 --- /dev/null +++ b/src/Surfaces/CircleSurface.cpp @@ -0,0 +1,305 @@ +// +// CircleSurface.cpp +// Copyright (c) 2017 Cristobal Mendoza +// http://cuppetellimendoza.com + +#include "CircleSurface.h" + +namespace ofx { +namespace piMapper { + +CircleSurface::CircleSurface() : QuadSurface() { + setup(); +} + +CircleSurface::CircleSurface(QuadSurface &surface) { + setup(); + setVertices(surface.getVertices()); + setTexCoords(surface.getTexCoords()); + setPerspectiveWarping(surface.getPerspectiveWarping()); +} + +CircleSurface::~CircleSurface() {} + +void CircleSurface::setup() { + + QuadSurface::setup(); + setPerspectiveWarping(true); + + lastSourceTextureId = UINT_MAX; + updateMask = true; +// maskIsReady = false; + +// glESVertexShader = CIRCLE_SURFACE_STRINGIFY( +// attribute vec4 position; +// attribute vec4 color; +// attribute vec4 normal; +// attribute vec2 texcoord; +// +// uniform mat4 modelViewMatrix; +// uniform mat4 projectionMatrix; +// uniform sampler2D maskTex; +// +// varying vec4 colorVarying; +// varying vec2 texCoordVarying; +// +// void main() { +// +// //get our current vertex position so we can modify it +// vec4 pos = projectionMatrix*modelViewMatrix*position; +// +// gl_Position = pos; +// colorVarying = color; +// texCoordVarying = texcoord; +// } +// ); +// +// glESFragmentShader = CIRCLE_SURFACE_STRINGIFY( +////#ifdef GL_ES +//// define default precision for float, vec, mat. +// precision highp float; +////#endif +// +// uniform sampler2D tex0; +// uniform sampler2D maskTex; +// uniform vec4 globalColor; +// +// varying vec2 texCoordVarying; +// +// void main (void) +// { +// vec2 pos = texCoordVarying; +// vec3 src = texture2D(tex0, pos).rgb; +// float mask = texture2D(maskTex, pos).r; +// gl_FragColor = vec4( src , mask); +// } +// ); +// +// gl2FragmentShader = "#version 120\n #extension GL_ARB_texture_rectangle : enable\n"; +// gl2FragmentShader += CIRCLE_SURFACE_STRINGIFY( +// uniform sampler2DRect tex0; +// uniform sampler2DRect maskTex; +// +// void main (void) { +// vec2 pos = gl_TexCoord[0].st; +// +// vec3 src = texture2DRect(tex0, pos).rgb; +// float mask = texture2DRect(maskTex, pos).r; +// +// gl_FragColor = vec4(src, mask); +// } +// ); +// +//#ifdef TARGET_OPENGLES +// maskShader.setupShaderFromSource(GL_VERTEX_SHADER, glESVertexShader); +// maskShader.setupShaderFromSource(GL_FRAGMENT_SHADER, glESFragmentShader); +// maskShader.bindDefaults(); +// maskShader.linkProgram(); +//#else +// if (ofIsGLProgrammableRenderer()) { +// +// } else { +// maskShader.setupShaderFromSource(GL_FRAGMENT_SHADER, gl2FragmentShader); +// maskShader.linkProgram(); +// } +//#endif + + ofVec2f t1 = ofVec2f(ofVec2f(0.0f, 0.0f)); + ofVec2f t2 = ofVec2f(ofVec2f(1.0f, 0.0f)); + ofVec2f t3 = ofVec2f(ofVec2f(1.0f, 1.0f)); + ofVec2f t4 = ofVec2f(ofVec2f(0.0f, 1.0f)); + + defaultTexCoords.push_back(t1); + defaultTexCoords.push_back(t2); + defaultTexCoords.push_back(t3); + defaultTexCoords.push_back(t4); +} + +void CircleSurface::draw() { + + ofEnableAlphaBlending(); + if (source->getTexture() == 0) + { + return; + } + if (!source->getTexture()->isAllocated()){ + return; + } + + if (source != currentSource) { // Pointer comparison + // Create the mask here + setupTextures(); + lastSourceTextureId = UINT_MAX; + currentSource = source; + } + + + // Save Normie state: + auto isNorm = ofGetUsingNormalizedTexCoords(); + + // If we get to this part of the function, the mask fbo + // should already be allocated and the mask texture created. + + ofEnableNormalizedTexCoords(); + // Get the texture from the source an store a copy + // of the source texture's id: + auto sourceTex = ofTexture(*(source->getTexture())); + auto sourceTexId = sourceTex.getTextureData().textureID; + + // Draw the mask only if the sources are FBO's, videos, + // or if the last texture id was UINT_MAX (which means that + // the mask has not yet been draw). +// if (source->getType() == SOURCE_TYPE_FBO || +// source->getType() == SOURCE_TYPE_VIDEO || +// lastSourceTextureId == UINT_MAX) { + if (true) { + lastSourceTextureId = sourceTexId; + drawMaskForSource(sourceTex); + } + + // Swap the texture id of the source with the one of our + // newly drawn outputFbo: + source->getTexture()->getTextureData().textureID = outputFbo.getTexture().getTextureData().textureID; + auto texCoords = getMesh().getTexCoords(); + getMesh().clearTexCoords(); + getMesh().addTexCoords(defaultTexCoords); + // Draw the Quad: + QuadSurface::draw(); + + // Reset the texture id of the source + source->getTexture()->getTextureData().textureID = lastSourceTextureId; + + // Reset the texture coords of the QuadSurface mesh: + getMesh().clearTexCoords(); + getMesh().addTexCoords(texCoords); + + if (!isNorm) ofDisableNormalizedTexCoords(); +} + +void CircleSurface::setFeathering(float f) { + feathering = f; + updateMask = true; +} + + +void CircleSurface::drawMaskForSource(ofTexture &sourceTex) { + auto quadTexCoords = getMesh().getTexCoords(); + + maskMesh.clearTexCoords(); + + // Set the mesh's texture coords to the quads. + // This gets us the coordinates set in the TextureEditor + maskMesh.addTexCoords(quadTexCoords); + outputFbo.begin(true); + { + ofClear(0, 0, 0, 0); + ofEnableNormalizedTexCoords(); + ofSetColor(255); + ofFill(); + ofSetRectMode(OF_RECTMODE_CORNER); +//#ifdef TARGET_RASPBERRY_PI + sourceTex.bind(); + maskMesh.draw(); + sourceTex.unbind(); + // Masking without shaders... + ofPushStyle(); + ofEnableBlendMode(OF_BLENDMODE_MULTIPLY); + ofSetColor(255); + ofFill(); + ofDisableNormalizedTexCoords(); + maskFbo.draw(0, 0); + ofPopStyle(); +//#else +// maskShader.begin(); +// maskShader.setUniformTexture("maskTex", maskFbo.getTexture(), 1); +// ofSetColor(255); +// ofFill(); +// ofSetRectMode(OF_RECTMODE_CORNER); +// scaledSourceFbo.getTexture().bind(); +// maskMesh.draw(); +// scaledSourceFbo.getTexture().unbind(); +// maskShader.end(); +//#endif + + } + outputFbo.end(); + +} + +void CircleSurface::setupTextures() { + float w = source->getTexture()->getWidth(); + float h = source->getTexture()->getHeight(); + float dia = 0; + if (w > h) { + dia = h; + } else { + dia = w; + } + + float padding = 10; + + maskFbo.allocate(w, h); + maskFbo.begin(false); + ofPushStyle(); + ofSetupScreenOrtho(w, h, -1, 1); + ofClear(0, 0, 0, 255); + ofFill(); + ofSetColor(255); + ofSetCircleResolution(300); + ofDrawEllipse(w/2, h/2, w-padding, h-padding); + ofPopStyle(); + maskFbo.end(); + + outputFbo.allocate(w, h); + outputFbo.begin(); + ofClear(0, 0, 0, 255); + outputFbo.end(); + +// scaledSourceFbo.allocate(w, h); +// scaledSourceFbo.begin(); +// ofClear(0, 0, 0, 255); +// scaledSourceFbo.end(); + + // This is lifted from QuadSurface::setup to ensure that the two + // meshes are similar: + + // Create 4 points for the 2 triangles + ofVec2f p1 = ofVec2f(0, 0); + ofVec2f p2 = ofVec2f(0, h); + ofVec2f p3 = ofVec2f(w, h); + ofVec2f p4 = ofVec2f(w, 0); + + // Create 4 point for the texture coordinates + ofVec2f t1 = ofVec2f(ofVec2f(0.0f, 1.0f)); + ofVec2f t2 = ofVec2f(ofVec2f(1.0f, 1.0f)); + ofVec2f t3 = ofVec2f(ofVec2f(1.0f, 0.0f)); + ofVec2f t4 = ofVec2f(ofVec2f(0.0f, 0.0f)); + + // Clear maskMesh + maskMesh.clear(); + + // Create a surface with the points + maskMesh.addVertex(p1); + maskMesh.addVertex(p2); + maskMesh.addVertex(p3); + maskMesh.addVertex(p4); + + // Add 2 triangles + maskMesh.addTriangle(0, 2, 3); + maskMesh.addTriangle(0, 1, 2); + + // Add texture coordinates + maskMesh.addTexCoord(t1); + maskMesh.addTexCoord(t2); + maskMesh.addTexCoord(t3); + maskMesh.addTexCoord(t4); +} + + + +int CircleSurface::getType() { + return SurfaceType::CIRCLE_SURFACE; +} + +} +} \ No newline at end of file diff --git a/src/Surfaces/CircleSurface.h b/src/Surfaces/CircleSurface.h new file mode 100644 index 0000000..ddbfe33 --- /dev/null +++ b/src/Surfaces/CircleSurface.h @@ -0,0 +1,64 @@ +// +// CircleSurface.h +// Copyright (c) 2017 Cristobal Mendoza +// http://cuppetellimendoza.com + +#ifndef OFXPIMAPPER_CIRCLESURFACE_H +#define OFXPIMAPPER_CIRCLESURFACE_H + +#include "QuadSurface.h" + +#define CIRCLE_SURFACE_STRINGIFY(A) #A + +namespace ofx { +namespace piMapper { + +class CircleSurface : public QuadSurface { + public: + CircleSurface(); + CircleSurface(QuadSurface &surface); + int getType() override; + ~CircleSurface(); + void draw() override; + void setup() override; + + // TODO: Feathering + void setFeathering(float f); + + protected: + void setupTextures(); + void drawMaskForSource(ofTexture &sourceTexture); + ofFbo maskFbo; +// ofFbo scaledSourceFbo; + ofFbo outputFbo; +// ofShader maskShader; + float feathering = 0.0f; + bool updateMask; + bool maskIsReady; + +// string glESFragmentShader; +// string glESVertexShader; +// +// string gl2FragmentShader; +// string gl2VertexShader; + + ofMesh maskMesh; + + // TODO: gl3 Shaders +// string gl3VertexShader; +// string gl3FragmentShader; + + private: + std::vector defaultTexCoords; + // We will use this pointer to determine if the source has changed. + // This is a total kludge, but it keeps me from messing with the + // upstream source. + BaseSource* currentSource = 0; + unsigned int lastSourceTextureId; +}; + +} +} + + +#endif //OFXPIMAPPER_CIRCLESURFACE_H diff --git a/src/Surfaces/SurfaceFactory.cpp b/src/Surfaces/SurfaceFactory.cpp index 1adbba2..b85ae01 100644 --- a/src/Surfaces/SurfaceFactory.cpp +++ b/src/Surfaces/SurfaceFactory.cpp @@ -21,6 +21,8 @@ BaseSurface * SurfaceFactory::createSurface(SurfaceType type){ return createGridWarpSurface(); }else if(type == SurfaceType::HEXAGON_SURFACE){ return createHexagonSurface(); + }else if(type == SurfaceType::CIRCLE_SURFACE){ + return createCircleSurface(); }else{ throw runtime_error("Undefined surface type"); } @@ -83,5 +85,10 @@ HexagonSurface * SurfaceFactory::createHexagonSurface(){ return hexagonSurface; } +CircleSurface * SurfaceFactory::createCircleSurface() { + CircleSurface * circleSurface = new CircleSurface(); + return circleSurface; +} + } // namespace piMapper } // namespace ofx diff --git a/src/Surfaces/SurfaceFactory.h b/src/Surfaces/SurfaceFactory.h index 90b2827..14cd012 100644 --- a/src/Surfaces/SurfaceFactory.h +++ b/src/Surfaces/SurfaceFactory.h @@ -7,6 +7,7 @@ #include "QuadSurface.h" #include "GridWarpSurface.h" #include "HexagonSurface.h" +#include "CircleSurface.h" namespace ofx { namespace piMapper { @@ -26,6 +27,7 @@ class SurfaceFactory { QuadSurface * createQuadSurface(); GridWarpSurface * createGridWarpSurface(); HexagonSurface * createHexagonSurface(); + CircleSurface* createCircleSurface(); }; } // namespace piMapper diff --git a/src/Surfaces/SurfaceType.h b/src/Surfaces/SurfaceType.h index ae52270..b039427 100644 --- a/src/Surfaces/SurfaceType.h +++ b/src/Surfaces/SurfaceType.h @@ -8,7 +8,8 @@ enum SurfaceType{ QUAD_SURFACE, GRID_WARP_SURFACE, HEXAGON_SURFACE, - NONE + NONE, + CIRCLE_SURFACE }; } // namespace piMapper