ofxPiMapper fixed for C++17 & oF 12.0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

153 lines
3.8 KiB

#include "ofxSurfaceManager.h"
ofxSurfaceManager::ofxSurfaceManager()
{
}
ofxSurfaceManager::~ofxSurfaceManager()
{
// delete all extra allocations from the heap
while ( triangleSurfaces.size() ) {
delete triangleSurfaces.back();
triangleSurfaces.pop_back();
}
while ( surfaceGuis.size() ) {
delete surfaceGuis.back();
surfaceGuis.pop_back();
}
}
void ofxSurfaceManager::setup()
{
}
void ofxSurfaceManager::update()
{
for ( int i=0; i<surfaceGuis.size(); i++ ) {
surfaceGuis[i]->update();
}
}
void ofxSurfaceManager::draw()
{
// Check GUI mode - we want to see the texture that we are editing
// together with the actual surface being projection mapped.
for ( int i=0; i<surfaceGuis.size(); i++ ) {
bool bDrawTexture = false;
if ( surfaceGuis[i]->isSelected() && surfaceGuis[i]->getMode() == ofxSurfaceGui::TEXTURE_MAPPING ) {
bDrawTexture = true;
}
if ( bDrawTexture ) {
// Draw texture of the surface in the background
//triangleSurface.getTexture()->draw(ofPoint(0,0));
triangleSurfaces[i]->drawTexture(ofVec2f(0, 0));
// Make the triangle surface transparent but still visible
// while we map the texture coordinates.
ofPushStyle();
ofSetColor(255, 255, 255, 200);
}
triangleSurfaces[i]->draw();
if ( bDrawTexture ) {
ofPopStyle();
}
surfaceGuis[i]->draw();
}
}
void ofxSurfaceManager::mousePressed(int x, int y, int button)
{
bool bSurfaceSelected = false;
for ( int i=0; i<surfaceGuis.size(); i++ ) {
if ( surfaceGuis[i]->hitTest(x, y) ) {
selectSurface(i);
bSurfaceSelected = true;
}
surfaceGuis[i]->mousePressed(x, y, button);
}
if (!bSurfaceSelected) {
unselectAllSurfaces();
}
}
void ofxSurfaceManager::mouseReleased(int x, int y, int button)
{
for ( int i=0; i<surfaceGuis.size(); i++ ) {
surfaceGuis[i]->mouseReleased(x, y, button);
}
}
void ofxSurfaceManager::mouseDragged(int x, int y, int button)
{
for ( int i=0; i<surfaceGuis.size(); i++ ) {
surfaceGuis[i]->mouseDragged(x, y, button);
}
}
void ofxSurfaceManager::addSurface()
{
addTriangleSurface();
}
void ofxSurfaceManager::removeSurface(int index)
{
if ( index >= surfaceGuis.size() ) {
throw std::runtime_error("Surface index out of bounds.");
return;
}
delete surfaceGuis[index];
surfaceGuis.erase( surfaceGuis.begin()+index );
delete triangleSurfaces[index];
triangleSurfaces.erase( triangleSurfaces.begin()+index );
}
void ofxSurfaceManager::setGuiMode(ofxSurfaceGui::editMode editMode)
{
for ( int i=0; i<surfaceGuis.size(); i++ ) {
surfaceGuis[i]->setMode(editMode);
}
}
void ofxSurfaceManager::selectSurface(int index)
{
if ( index >= surfaceGuis.size() ){
throw std::runtime_error("Surface index out of bounds.");
return;
}
surfaceGuis[index]->select();
}
void ofxSurfaceManager::unselectAllSurfaces()
{
for ( int i=0; i<surfaceGuis.size(); i++ ) {
surfaceGuis[i]->unselect();
}
}
int ofxSurfaceManager::size()
{
return surfaceGuis.size();
}
void ofxSurfaceManager::addTriangleSurface()
{
triangleSurfaces.push_back( new ofxTriangleSurface() );
surfaceGuis.push_back( new ofxSurfaceGui() );
surfaceGuis.back()->setup( *triangleSurfaces.back() );
}
void ofxSurfaceManager::addTriangleSurface(ofVec2f v1, ofVec2f v2, ofVec2f v3, ofVec2f t1, ofVec2f t2, ofVec2f t3, ofTexture* texturePtr)
{
addTriangleSurface();
triangleSurfaces.back()->setup(v1, v2, v3, t1, t2, t3, texturePtr);
}