#include "testApp.h"


//--------------------------------------------------------------
void testApp::setup(){	 
     nPts = 0;
     rotateAmount.set(0,0,1);
     speedOfRotation = 0.1f;
     
     ofBackground(255,255,255);
     
     
     
     ofxVec3f center(ofGetWidth()/2, ofGetHeight()/2, 0);
     
     xAxisMin.set(-100,0,0);
     xAxisMax.set(100,0,0);
     yAxisMin.set(0,-100,0);
     yAxisMax.set(0,100,0);
     zAxisMin.set(0,0,-100);
     zAxisMax.set(0,0,100);
     
     xAxisMin += center;
     xAxisMax += center;
     yAxisMin += center;
     yAxisMax += center;
     zAxisMin += center;
     zAxisMax += center;
    
     bDrawnAnything = false;        // added this cause theo saw this example
                                    // and was like "how do I tell zach that a rotating
                                    // cross is not that interesting ??"  before realizing
                                    // that one should draw :)
     
}

//--------------------------------------------------------------
void testApp::update(){
     
     // rotation occurs around 0,0,0 position.
     // since 0,0,0 is the top left corner, we need to:
     // (A) move over, 
     // (B) rotate
     // (C) move back
     // this could all be one for loop, but broken out here for 
     // clarity on the steps:
            
     ofxVec3f center(ofGetWidth()/2, ofGetHeight()/2,0);
     
     // move the points so that their center (ofGetW/2, ofGetH/2) is at 0,0,0
     for (int i = 0; i < nPts; i++){
        pts[i]-= center;
     }
   
     // rotate the points
     for (int i = 0; i < nPts; i++){
        pts[i] = pts[i].rotated(speedOfRotation, rotateAmount);
     }
     
     // move them back
     for (int i = 0; i < nPts; i++){
        pts[i]+= center;
     }
     
    
     xAxisMin -= center;
     xAxisMax -= center;
     yAxisMin -= center;
     yAxisMax -= center;
     zAxisMin -= center;
     zAxisMax -= center;
     
     
     xAxisMin.rotate(speedOfRotation, rotateAmount);
     xAxisMax.rotate(speedOfRotation, rotateAmount);
     yAxisMin.rotate(speedOfRotation, rotateAmount);
     yAxisMax.rotate(speedOfRotation, rotateAmount);
     zAxisMin.rotate(speedOfRotation, rotateAmount);
     zAxisMax.rotate(speedOfRotation, rotateAmount);
     
     xAxisMin += center;
     xAxisMax += center;
     yAxisMin += center;
     yAxisMax += center;
     zAxisMin += center;
     zAxisMax += center;
}

//--------------------------------------------------------------
void testApp::draw(){
     
     ofSetColor(0x000000);
     ofNoFill();
     ofBeginShape();
     for (int i = 0; i < nPts; i++){
         ofVertex(pts[i].x, pts[i].y);
     }
     ofEndShape();
     
     string info = "speed of rotation (a/z): " + ofToString(speedOfRotation,3) + "\n" +
                  "rotateAmount in x (s/x): " + ofToString(rotateAmount.x,3) + "\n" +
                  "rotateAmount in y (d/c): " + ofToString(rotateAmount.y,3) + "\n" +
                  "rotateAmount in z (f/v): " + ofToString(rotateAmount.z,3);
     
     ofFill();
     ofSetColor(0xE5A93F);
     ofRect(10,10,300,70);
     ofSetColor(0x000000);
     ofDrawBitmapString(info,30,30);
     
     
     ofSetColor(50,50,255);
     glBegin(GL_LINES);
        glVertex3f(xAxisMin.x, xAxisMin.y, xAxisMin.z);
        glVertex3f(xAxisMax.x, xAxisMax.y, xAxisMax.z);
        glVertex3f(yAxisMin.x, yAxisMin.y, yAxisMin.z);
        glVertex3f(yAxisMax.x, yAxisMax.y, yAxisMax.z);
        glVertex3f(zAxisMin.x, zAxisMin.y, zAxisMin.z);
        glVertex3f(zAxisMax.x, zAxisMax.y, zAxisMax.z);
     glEnd();
    
    
    if (bDrawnAnything == false){
        ofSetColor(0,0,0);
        ofDrawBitmapString("draw something!", ofGetWidth()/2 + 100,ofGetHeight()/2 + 20);                    
    }
     
}

//--------------------------------------------------------------
void testApp::keyPressed  (int key){ 
    
    switch (key){
        case 'a':
            speedOfRotation += 0.05f;
            break;
        case 'z':
            speedOfRotation -= 0.05f;
            break;
        case 's':
            rotateAmount.x += 0.05f;
            break;
        case 'x':
             rotateAmount.x -= 0.05f;
            break;  
        case 'd':
            rotateAmount.y += 0.05f;
            break;
        case 'c':
             rotateAmount.y -= 0.05f;
            break; 
        case 'f':
            rotateAmount.z += 0.05f;
            break;
        case 'v':
             rotateAmount.z -= 0.05f;
            break;   
    }
}

//--------------------------------------------------------------
void testApp::keyReleased  (int key){ 
}

//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){
}

//--------------------------------------------------------------
void testApp::mouseDragged(int x, int y, int button){
     
     bDrawnAnything = true;
     
     if (nPts < MAX_N_PTS){    
        pts[nPts].x = x;
        pts[nPts].y = y;
        nPts++;
     }
}

//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){
     nPts = 0;
}

//--------------------------------------------------------------
void testApp::mouseReleased(){
}