#include "ofxSVG.h"
ofxSVG* currentShape;
vector<ofxSVG> shapes;
int tileCount = 5;
float tileWidth, tileHeight;
float shapeSize = 50;
float newShapeSize = shapeSize;
float shapeAngle = 0;
ofColor shapeColor(0, 130, 164);
float maxDist;
int fillMode = 0;
int sizeMode = 0;
//--------------------------------------------------------------
void testApp::setup(){
ofBackground(255);
ofEnableSmoothing();
tileWidth = ofGetWidth()/(float)tileCount;
tileHeight = ofGetHeight()/(float)tileCount;
maxDist = sqrt((float)ofGetWidth()*ofGetWidth()+ofGetHeight()*ofGetHeight());
// load shapes
ofDirectory dir;
int n = dir.listDir("shapes");
for (int i = 0; i < n; i++ ) {
shapes.push_back(ofxSVG());
shapes.back().load(dir.getPath(i));
for (int i = 0; i < shapes.back().getNumPath(); i++ ) {
shapes.back().getPathAt(i).setUseShapeColor(false);
}
}
currentShape = &shapes[0];
}
//--------------------------------------------------------------
void testApp::update(){
}
//--------------------------------------------------------------
void testApp::draw(){
ofEnableAlphaBlending();
for (int gridY = 0; gridY < tileCount; gridY++ ) {
for (int gridX = 0; gridX < tileCount; gridX++ ) {
// calculate grid position
float posX = tileWidth * gridX + tileWidth*0.5;
float posY = tileHeight * gridY + tileHeight*0.5;
float dist = ofDist(mouseX, mouseY, posX, posY);
// calculate angle between mouse position and actual position of the shape
float angle = atan2(mouseY-posY, mouseX-posX) + ofDegToRad(shapeAngle);
// size mode
if ( sizeMode == 0 ) newShapeSize = shapeSize;
if ( sizeMode == 1 ) newShapeSize = shapeSize*1.5 - ofMap(dist, 0, 500/*Radius*/, 5, shapeSize);
if ( sizeMode == 2 ) newShapeSize = ofMap(dist, 0, 500/*Radius*/, 5, shapeSize);
// fill mode ( always use SVG style, seems SVGtiny don't have func to disable )
if ( fillMode == 0 ) ofSetColor(0);
if ( fillMode == 1 ) ofSetColor( shapeColor );
if ( fillMode == 2 ) ofSetColor( shapeColor, ofMap(dist, 0, maxDist, 255, 0));
if ( fillMode == 3 ) ofSetColor( shapeColor, ofMap(dist, 0, maxDist, 0, 255));
// draw shape
ofPushMatrix();
ofTranslate(posX, posY);
ofRotate(ofRadToDeg(angle));
// there is no CENTER MODE and size setting in SVGtiny, so use scale
ofScale(newShapeSize/shapeSize, newShapeSize/shapeSize);
currentShape->draw();
ofPopMatrix();
}
}
}
//--------------------------------------------------------------
void testApp::keyPressed(int key){
if ( key == 'c' ) fillMode = (fillMode+1)%4;
if ( key == 'd' ) sizeMode = (sizeMode+1)%3;
if ( key == 'g' ) {
tileCount = tileCount+5;
if ( tileCount > 20 ) tileCount = 10;
tileWidth = ofGetWidth()/(float)tileCount;
tileHeight = ofGetHeight()/(float)tileCount;
}
if (key == '1') currentShape = &shapes[0];
if (key == '2') currentShape = &shapes[1];
if (key == '3') currentShape = &shapes[2];
if (key == '4') currentShape = &shapes[3];
if (key == '5') currentShape = &shapes[4];
if (key == '6') currentShape = &shapes[5];
if (key == '7') currentShape = &shapes[6];
if (key == OF_KEY_UP ) shapeSize +=5;
if (key == OF_KEY_DOWN ) shapeSize = max(shapeSize-5, 5);
if (key == OF_KEY_LEFT ) shapeAngle -=5;
if (key == OF_KEY_RIGHT ) shapeAngle +=5;
if ( key == ' ' )
{
shapeColor.r = ofRandom(0, 255);
shapeColor.g = ofRandom(0, 255);
shapeColor.b = ofRandom(0, 255);
}
}
-GENERATIVE DESIGN-