diff options
| author | Comment <tim@gray.(none)> | 2014-02-26 10:57:16 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2014-02-26 10:57:16 +0000 |
| commit | 0e436679aa8c09a08e20849f204c969eb2d875b8 (patch) | |
| tree | 2619f53f16c571dc19326d395aa420ceb0a29de7 /basedProject/src | |
initial commit
Diffstat (limited to 'basedProject/src')
| -rw-r--r-- | basedProject/src/keyVar.cpp | 63 | ||||
| -rw-r--r-- | basedProject/src/keyVar.h | 36 | ||||
| -rw-r--r-- | basedProject/src/main.cpp | 7 | ||||
| -rw-r--r-- | basedProject/src/mapUtils.cpp | 156 | ||||
| -rw-r--r-- | basedProject/src/mapUtils.h | 20 | ||||
| -rw-r--r-- | basedProject/src/ofApp.cpp | 176 | ||||
| -rw-r--r-- | basedProject/src/ofApp.h | 60 | ||||
| -rw-r--r-- | basedProject/src/viewpoint.cpp | 196 | ||||
| -rw-r--r-- | basedProject/src/viewpoint.h | 66 |
9 files changed, 780 insertions, 0 deletions
diff --git a/basedProject/src/keyVar.cpp b/basedProject/src/keyVar.cpp new file mode 100644 index 0000000..1bf562a --- /dev/null +++ b/basedProject/src/keyVar.cpp @@ -0,0 +1,63 @@ +/* + * keyvar.cpp + + generalised cushioned keyboard controller + //todo time based rather than onoff to get around keyrepeat issue + */ + +#include "keyVar.h" +#define DEBUG 0 + +void keyVar::set(char _keyInc,char _keyDec,float _val,float _speed,float _accel,float _accelTime){ + keyInc=_keyInc; + keyDec=_keyDec; + val=_val; //initial value + speed=_speed; + accel=_accel; + accelTime=_accelTime; + state=0; + timePressed=timeCalc=0; + inc=0; + +} +void keyVar::keyPressed(char _key){ + //need to deal with key repeat: OSX anyway + if (_key==keyInc&&state!=1) { + state=1; + timePressed=timeCalc=ofGetElapsedTimef(); + if (DEBUG) printf("pressed %i:%i\n",_key,ofGetElapsedTimeMillis()); + } + if (_key==keyDec&&state!=-1) { + state=-1; + timePressed=timeCalc=ofGetElapsedTimef(); + if (DEBUG) printf("pressed %i:%i\n",_key,ofGetElapsedTimeMillis()); + } +} +void keyVar::keyReleased(char _key){ + if (_key==keyInc&&state==1) { + state=0; + if (DEBUG) printf("released %i:%i\n",_key,ofGetElapsedTimeMillis()); + } + if (_key==keyDec&&state==-1) { + state=0; + if (DEBUG) printf("released %i:%i\n",_key,ofGetElapsedTimeMillis()); + } +} +float keyVar::getVal(){ + float segment = min(1.0f,(ofGetElapsedTimef()-timePressed)/accelTime); + //if (state) + val+=pow(segment,accel)*speed*state; //(ofGetElapsedTimef()-timeCalc)* + inc=pow(segment,accel)*speed*state; + timeCalc=ofGetElapsedTimef(); + return val; +} +float keyVar::readVal(){ + return val; +} +float keyVar::getInc(){ + float segment = min(1.0f,(ofGetElapsedTimef()-timePressed)/accelTime); + return pow(segment,accel)*speed*state; +} +void keyVar::setVal(float _val){ + val=_val; +} diff --git a/basedProject/src/keyVar.h b/basedProject/src/keyVar.h new file mode 100644 index 0000000..043a963 --- /dev/null +++ b/basedProject/src/keyVar.h @@ -0,0 +1,36 @@ +/* + * keyvar.h + * 3dnav + * + * Created by Tim Redfern on 15/12/2011. + * Copyright 2011 __MyCompanyName__. All rights reserved. + * + */ + +#include "ofMain.h" + +class keyVar{ + + public: + void set(char _keyInc,char _keyDec,float _val,float _speed,float _accel,float accelTime); + void keyPressed(char _key); + void keyReleased(char _key); + float getVal(); + float getInc(); + void setVal(float _val); + + float readVal(); + float inc; //for syncing + +private: + char keyInc,keyDec; + long timePressed; + long timeCalc; + int state; //up-down-off + float val; + float speed; + float accelTime; + float accel; + + +}; diff --git a/basedProject/src/main.cpp b/basedProject/src/main.cpp new file mode 100644 index 0000000..6fe0e3d --- /dev/null +++ b/basedProject/src/main.cpp @@ -0,0 +1,7 @@ +#include "ofApp.h" + +int main() { + ofSetupOpenGL(4080,768, OF_WINDOW); + //ofSetupOpenGL(1536,288, OF_WINDOW); + ofRunApp(new ofApp()); +} diff --git a/basedProject/src/mapUtils.cpp b/basedProject/src/mapUtils.cpp new file mode 100644 index 0000000..d250c98 --- /dev/null +++ b/basedProject/src/mapUtils.cpp @@ -0,0 +1,156 @@ +/* + * mapUtils.h + * + * Created by Tim Redfern on 20/12/2011. + * global utils for projection mapping + * + */ + +#include "ofMain.h" + +//texture binding with normalised coords +void bindTexture(ofBaseHasTexture &t) { + ofTexture &tex = t.getTextureReference(); + tex.bind(); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + ofTextureData texData = tex.getTextureData(); + if(texData.textureTarget == GL_TEXTURE_RECTANGLE_ARB) { + glScalef(tex.getWidth(), tex.getHeight(), 1.0f); + } else { + glScalef(tex.getWidth() / texData.tex_w, tex.getHeight() / texData.tex_h, 1.0f); + } + + glMatrixMode(GL_MODELVIEW); +} +void unbindTexture(ofBaseHasTexture &t) { + t.getTextureReference().unbind(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); +} +void bindTex(ofTexture &tex) { + tex.bind(); + + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + ofTextureData texData = tex.getTextureData(); + if(texData.textureTarget == GL_TEXTURE_RECTANGLE_ARB) { + glScalef(tex.getWidth(), tex.getHeight(), 1.0f); + } else { + glScalef(tex.getWidth() / texData.tex_w, tex.getHeight() / texData.tex_h, 1.0f); + } + + glMatrixMode(GL_MODELVIEW); +} +void unbindTex(ofTexture &tex) { + tex.unbind(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); +} +ofPoint distort(ofPoint pt,float d){ + //normalised coords -1..1, d + float r=pow(pow(pow(pt.x,2.0f)+pow(pt.y,2.0f),0.5f),1.0f+d); + float a=atan2f(pt.x,pt.y); + return ofPoint(r*sin(a),r*cos(a)); +}; + +void drawBox(float size) { + // this func just draws a perfectly normal box with some texture coordinates + glBegin(GL_QUADS); + // Front Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-size, -size, size); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f( size, -size, size); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( size, size, size); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f(-size, size, size); // Top Left Of The Texture and Quad + // Back Face + glTexCoord2f(1.0f, 0.0f); glVertex3f(-size, -size, -size); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f(-size, size, -size); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( size, size, -size); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( size, -size, -size); // Bottom Left Of The Texture and Quad + // Top Face + glTexCoord2f(0.0f, 1.0f); glVertex3f(-size, size, -size); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f(-size, size, size); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f( size, size, size); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( size, size, -size); // Top Right Of The Texture and Quad + // Bottom Face + glTexCoord2f(1.0f, 1.0f); glVertex3f(-size, -size, -size); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( size, -size, -size); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( size, -size, size); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f(-size, -size, size); // Bottom Right Of The Texture and Quad + // Right face + glTexCoord2f(1.0f, 0.0f); glVertex3f( size, -size, -size); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f( size, size, -size); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f( size, size, size); // Top Left Of The Texture and Quad + glTexCoord2f(0.0f, 0.0f); glVertex3f( size, -size, size); // Bottom Left Of The Texture and Quad + // Left Face + glTexCoord2f(0.0f, 0.0f); glVertex3f(-size, -size, -size); // Bottom Left Of The Texture and Quad + glTexCoord2f(1.0f, 0.0f); glVertex3f(-size, -size, size); // Bottom Right Of The Texture and Quad + glTexCoord2f(1.0f, 1.0f); glVertex3f(-size, size, size); // Top Right Of The Texture and Quad + glTexCoord2f(0.0f, 1.0f); glVertex3f(-size, size, -size); // Top Left Of The Texture and Quad + glEnd(); +} +void drawBoard(float x,float y,float z) { + glPushMatrix(); + glTranslated(x,y,z); + glBegin(GL_QUADS); + int cx,cz; + for (int i=0;i<8;i++) { + for (int j=0;j<4;j++) { + cx=((i%2)*16)+(j*32)-56; + cz=(i*16)-56; + if ((i==7)&&(j==3)) { //draw special square + glVertex3f(cx+8, 0, cz-8); + glVertex3f(cx+8, 0, cz+8); + glVertex3f(cx+4, 0, cz+4); + glVertex3f(cx+4, 0, cz-4); + + glVertex3f(cx+4, 0, cz+4); + glVertex3f(cx+8, 0, cz+8); + glVertex3f(cx-8, 0, cz+8); + glVertex3f(cx-4, 0, cz+4); + + glVertex3f(cx-4, 0, cz-4); + glVertex3f(cx-4, 0, cz+4); + glVertex3f(cx-8, 0, cz+8); + glVertex3f(cx-8, 0, cz-8); + + glVertex3f(cx+8, 0, cz-8); + glVertex3f(cx+4, 0, cz-4); + glVertex3f(cx-4, 0, cz-4); + glVertex3f(cx-8, 0, cz-8); + } + else { + glVertex3f(cx+8, 0, cz-8); + glVertex3f(cx+8, 0, cz+8); + glVertex3f(cx-8, 0, cz+8); + glVertex3f(cx-8, 0, cz-8); + } + } + } + glEnd(); + glPopMatrix(); +} +void drawCylinder(float r,float h,float x,float y,float z) { + glPushMatrix(); + glTranslated(x,y,z); + glBegin(GL_QUADS); + float step=TWO_PI/50.0; + float txstep=1.0/50.0; + for (float i=0,j=0;i<=TWO_PI;i+=step,j+=txstep) { + glTexCoord2f(j,0); glVertex3f(cos(i)*r, 0, sin(i)*r); + glTexCoord2f(j,1); glVertex3f(cos(i)*r, -h, sin(i)*r); + glTexCoord2f(j+txstep,1); glVertex3f(cos(i+step)*r, -h, sin(i+step)*r); + glTexCoord2f(j+txstep,0); glVertex3f(cos(i+step)*r, 0, sin(i+step)*r); + } + glEnd(); + glPopMatrix(); +}
\ No newline at end of file diff --git a/basedProject/src/mapUtils.h b/basedProject/src/mapUtils.h new file mode 100644 index 0000000..c362e66 --- /dev/null +++ b/basedProject/src/mapUtils.h @@ -0,0 +1,20 @@ +/* + * mapUtils.h + * + * Created by Tim Redfern on 20/12/2011. + * global utils for projection mapping + * + */ +#pragma once + +#include "ofMain.h" + +void bindTexture(ofBaseHasTexture &t); +void unbindTexture(ofBaseHasTexture &t); +void bindTex(ofTexture &tex); +void unbindTex(ofTexture &tex); +ofPoint distort(ofPoint pt,float d); +void drawBox(float size); +void drawBoard(float x,float y,float z); +void drawCylinder(float r,float h,float x,float y,float z); + diff --git a/basedProject/src/ofApp.cpp b/basedProject/src/ofApp.cpp new file mode 100644 index 0000000..0dc6b46 --- /dev/null +++ b/basedProject/src/ofApp.cpp @@ -0,0 +1,176 @@ +#include "ofApp.h" +//-------------------------------------------------------------- +ofApp::~ofApp(){ + saveSettings("settings.xml"); +} + +//-------------------------------------------------------------- +void ofApp::setup() { + loadSettings("settings.xml"); + + ofBackground(0,0,0); + + ///ofSetVerticalSync(true); + + //some model / light stuff + glEnable (GL_DEPTH_TEST); + glShadeModel (GL_SMOOTH); + glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE); + glEnable (GL_COLOR_MATERIAL); + + ofDisableLighting(); + ofSetGlobalAmbientColor(ofColor(255,255,255)); + + fullscreen=false; + activeView=0; + + xhair.loadImage("crosshairs.png"); +} + +//-------------------------------------------------------------- +void ofApp::update() { + ofSetWindowTitle(ofToString(ofGetFrameRate())); +} + +//-------------------------------------------------------------- +void ofApp::draw() { + + for (int i=0;i<views.size();i++) { + views[i].setLight(); + } + for (int i=0;i<views.size();i++) { + //views[i].begin2d(); + views[i].begin(); + //ofFill(); + //ofEnableAlphaBlending(); + ofSetColor(0, 0, 255, 255); + ofDrawSphere(0,0,0,145); + ofSetColor(0, 255, 0, 255); + ofDrawSphere(200,0,230,75); + ofSetColor(255, 0,0, 255); + ofDrawSphere(-60,-190,280,47.5); + ofSetColor(255, 255,255, 255); + //xhair.draw(0,0,views[i].getWidth(),views[i].getHeight()); + + //views[i].end2d(); + views[i].end(); + } +} + +//-------------------------------------------------------------- +void ofApp::exit() { + +} + +//-------------------------------------------------------------- +void ofApp::keyPressed(int key){ + if (activeView<0) for (int i=0;i<views.size();i++) views[i].keyPressed(key); + else if (activeView<views.size()) views[activeView].keyPressed(key); + switch (key) { + case ' ': + fullscreen=!fullscreen; + ofSetFullscreen(fullscreen); + break; + case '8': + //mode=CALIBRATE; + break; + case '9': + //mode=DISPLAY; + break; + case '0': + //mode=GRAB; + break; + case '1': + activeView=-1; + break; + case '2': + activeView=0; + break; + case '3': + activeView=1; + break; + case '4': + activeView=2; + break; + case 'p': + saveSettings("settings.xml"); + break; + case 'z': + loadSettings("defaults.xml"); + break; + case ',': + case '<': + //prevMovie(); + break; + case '.': + case '>': + //nextMovie(); + break; + case '/': + //light=!light; + //printf(light?"LIGHT ON\n":"LIGHT OFF\n"); + break; + } +} + +void ofApp::keyReleased(int key){ + if (activeView<0) for (int i=0;i<views.size();i++) views[i].keyReleased(key); + else if (activeView<views.size()) views[activeView].keyReleased(key); +} + +void ofApp::loadSettings(string filename){ + //viewport settings are float/ normalised to 0..1 + if( !XML.loadFile(filename) ){ + printf("unable to load %s check data/ folder\n",filename.c_str()); + }else{ + if(XML.pushTag("map4")) { + int numViews=XML.getNumTags("view"); + if(numViews) { + views.resize(numViews); + for (int i=0;i<numViews;i++){ + XML.pushTag("view",i); + vector<string>keys; + XML.getAttributeNames("settings", keys, 0); + map<string,string>settings; + for (int k=0;k<keys.size();k++) { + settings[keys[k]]=XML.getAttribute("settings",keys[k],"none",0); + } + views[i].setup(settings); + XML.popTag(); + } + } + XML.popTag(); + } + printf("loaded settings: %i views\n",views.size()); + } + + //numViews=2; + //views[0].setup(ofGetScreenWidth()/2,ofGetScreenHeight(),0,0); + //views[1].setup(ofGetScreenWidth()/2,ofGetScreenHeight(),ofGetScreenWidth()/2,0); + //activeView=0; +} +//-------------------------------------------------------------- +void ofApp::saveSettings(string filename){ + //either re-navigate the whole thing OR + //save the number to the vp OR + //send a pointer to the vp + + //renavigate? easiest way to get the settings back out + if(XML.pushTag("map4")) { + for (int i=0;i<views.size();i++){ + XML.pushTag("view",i); + vector<string>keys; + XML.getAttributeNames("settings", keys, 0); + for (int k=0;k<keys.size();k++) { + XML.setAttribute("settings", keys[k], views[i].getSetting(keys[k]),0); + } + XML.popTag(); + } + XML.popTag(); + } + XML.saveFile(filename); + printf("saved %s\n",filename.c_str()); +} + +//-------------------------------------------------------------- + diff --git a/basedProject/src/ofApp.h b/basedProject/src/ofApp.h new file mode 100644 index 0000000..7090ab6 --- /dev/null +++ b/basedProject/src/ofApp.h @@ -0,0 +1,60 @@ +/* +projection calibration interface +tjr dec 2011 + +1- ideal KB interface to move around & calibrate camera +2- automatically save settings, key to reset + +logically + -rotate cam frame of reference + -move cam xyz WRT frame of reference + -don't do lookat + +speed interface detects each key on-off & applies key acceleration +have to track how many frames each key has been pressed for + +1- this is a case for a class +2- can key presses overlap? +3- class deals with keys in pairs as you can't move something simultaneously in 2 dirs +*/ + +#pragma once + +#define CALIBRATE 1 +#define DISPLAY 2 +#define GRAB 3 +#define NOTHING 4 + + +#include "ofMain.h" +#include "ofEvents.h" +#include "ofxXmlSettings.h" +//#include "ofx3DModelLoader.h" + +#include "mapUtils.h" +#include "viewpoint.h" + + +class ofApp : public ofBaseApp{ + + public: + ~ofApp(); + void setup(); + void update(); + void draw(); + void exit(); + + void loadSettings(string filename); + void saveSettings(string filename); + void keyPressed (int key); + void keyReleased(int key); + + ofxXmlSettings XML; + + vector<viewpoint> views; + int activeView; + bool fullscreen; + + ofImage xhair; + +}; diff --git a/basedProject/src/viewpoint.cpp b/basedProject/src/viewpoint.cpp new file mode 100644 index 0000000..85a3bf5 --- /dev/null +++ b/basedProject/src/viewpoint.cpp @@ -0,0 +1,196 @@ +#include "viewpoint.h" +#define DEBUG 0 + +void viewpoint::setup(map<string,string>&settings){ + //setup(float w, float h, float x, float y) { + x=ofToFloat(settings["x"]); + y=ofToFloat(settings["y"]); + w=ofToFloat(settings["w"]); + h=ofToFloat(settings["h"]); + if (DEBUG) printf("window: %f,%f %fx%f \n",ofGetWidth()*x,ofGetHeight()*y,ofGetWidth()*w,ofGetHeight()*h); + window=ofRectangle(ofGetWidth()*x,ofGetHeight()*y,ofGetWidth()*w,ofGetHeight()*h); + distortFactor=ofToFloat(settings["distort"]); + renderFBO.allocate(window.width,window.height,GL_RGB); + + //todo: load/save from xml + fov=17.25; + aspect=1.79; + near=1; + far=20; + + vars=new keyVar[9]; + + vars[0].set('w','s',ofToFloat(settings["fov"]),0.2,1.0,3.0); + vars[1].set('g','d',ofToFloat(settings["targX"]),1,1.0,3.0); + vars[2].set('r','v',ofToFloat(settings["targY"]),1,1.0,3.0); + vars[3].set('t','c',ofToFloat(settings["targZ"]),1,1.0,3.0); + vars[4].set('u','n',ofToFloat(settings["lat"]),1,1.0,3.0); + vars[5].set('j','h',ofToFloat(settings["lng"]),1,1.0,3.0); + vars[6].set(',','m',ofToFloat(settings["roll"]),1,1.0,3.0); + vars[7].set('o','l',ofToFloat(settings["dolly"]),1,1.0,3.0); + vars[8].set('q','a',ofToFloat(settings["distort"]),.00001,1.0,3.0); + + //light.enable(); + //light.setDirectional(); + + vertigo=false; +} +double viewpoint::getSetting(const string& setting){ + if (setting=="x") return x; + if (setting=="y") return y; + if (setting=="w") return w; + if (setting=="h") return h; + if (setting=="fov") return vars[0].getVal(); + if (setting=="targX") return vars[1].getVal(); + if (setting=="targY") return vars[2].getVal(); + if (setting=="targZ") return vars[3].getVal(); + if (setting=="lat") return vars[4].getVal(); + if (setting=="lng") return vars[5].getVal(); + if (setting=="roll") return vars[6].getVal(); + if (setting=="dolly") return vars[7].getVal(); + if (setting=="distort") return vars[8].getVal(); + return 0.0; +} +//-------------------------------------------------------------- +void viewpoint::setLight(){ + + ofNode c=ofNode(); + ofNode t=ofNode(); + t.setParent(c); + t.setPosition(vars[1].getVal(),vars[2].getVal(),vars[3].getVal()); + //make target controls relative to rotation + c.rotate(vars[5].getVal(), ofVec3f(0, 1, 0)); + + target.setPosition(t.getGlobalPosition()); + //camera.orbit(vars[5].getVal(), vars[4].getVal(), vars[7].getVal(), target); + camera.setFov(vars[0].getVal()); + if (vertigo) { + //distance=width/(2 tan (fov *0.5) + //multiply distance by ratio of tans of fov before and after + vars[7].setVal((tan((vars[0].readVal()-vars[0].inc)*PI*0.0027777)*vars[7].readVal())/tan(vars[0].readVal()*PI*0.0027777)); + } + + + + ofVec3f p(0, 0, vars[7].getVal()); + //p.rotate(ofClamp(vars[2].getVal(), -89, 89), ofVec3f(1, 0, 0)); + p.rotate(vars[4].getVal(), ofVec3f(1, 0, 0)); + p.rotate(vars[5].getVal(), ofVec3f(0, 1, 0)); + p += target.getPosition(); + camera.setPosition(p); + + camera.lookAt(target,ofVec3f(0,1,0).rotate(vars[6].getVal(),ofVec3f(0,0,1)).rotate(vars[5].getVal(),ofVec3f(0,1,0))); + //light.setPosition(camera.getGlobalPosition()); + +} +void viewpoint::setDefaults(){ + vars[0].setVal(17.25); + vars[1].setVal(0.0); + vars[2].setVal(112.0); + vars[3].setVal(0.0); + vars[4].setVal(0.0); + vars[5].setVal(0.0); + vars[6].setVal(0.0); + vars[7].setVal(1000.0); + vars[8].setVal(0.0); +} +//-------------------------------------------------------------- +void viewpoint::begin(){ + renderFBO.begin(); + ofClear(0,0,0); + + camera.begin(); +} +void viewpoint::begin2d(){ + renderFBO.begin(); + ofClear(0,0,0); + +} +void viewpoint::end2d(){ + renderFBO.end(); + renderFBO.draw(getX(),getY()); +} +//-------------------------------------------------------------- +void viewpoint::end(bool showStats){ + + camera.end(); + renderFBO.end(); + + ofPushMatrix(); + + bindTexture(renderFBO); + ofNoFill(); + ofSetLineWidth(1.0); + //ofSetColor(I_fade1,I_fade1,I_fade1); + int gridX=50; + int gridY=50; + int xStep=window.width/2; + int yStep=window.height/2; + ofTranslate(window.x+xStep,window.y+yStep); + + //todo: distort texcoords instead of vertex coords + for (float i = -1; i < 1.001; i+=(2.0f/gridY)){ + glBegin(GL_QUAD_STRIP); + ofPoint p0; + ofPoint p1; + for (float j = -1; j < 1.001; j+=(2.0f/gridX)){ + p0=distort(ofPoint(j,i-(2.0f/gridY)),vars[8].getVal()); + p1=distort(ofPoint(j,i),vars[8].getVal()); + glTexCoord2f((j+1)*0.5,((i-(2.0f/gridY))+1)*0.5); + glVertex3f(p0.x*xStep,p0.y*yStep,-0.1); + glTexCoord2f((j+1)*0.5,(i+1)*0.5); + glVertex3f(p1.x*xStep,p1.y*yStep,-0.1); + } + glEnd(); + } + + ofFill(); + unbindTexture(renderFBO); + ofPopMatrix(); + + if (showStats) { + ofSetHexColor(0xFFFFFF); + //ofDrawBitmapString("camera: "+ofToString(camera.getX(), 2)+","+ofToString(camera.getY(), 2)+","+ofToString(camera.getZ(), 2)+" "+ofToString(vars[5].getVal())+"deg", window.x+10, window.y+window.height-30); + //ofDrawBitmapString("light: "+ofToString(light.getX(), 2)+","+ofToString(light.getY(), 2)+","+ofToString(light.getZ(), 2), window.x+10, window.y+window.height-18); + ofDrawBitmapString("fov: "+ofToString(vars[0].readVal(), 2)+" distance: "+ofToString(vars[7].readVal(), 2)+" distortion: "+ofToString(vars[8].readVal()), window.x+10, window.y+window.height-18); + } +} +//-------------------------------------------------------------- +void viewpoint::keyPressed(int key){ + for (int i=0;i<8;i++) vars[i].keyPressed(key); + if (DEBUG) printf("fov: %f distort: %f\n",vars[0].getVal(),vars[7].getVal()); + if (key=='!') setDefaults(); + switch(key) { + //'vertigo effect' always affects ALL VIEWPOINTS + //distance=width/(2 tan (fov *0.5) + // a way to 'back door' the variables? + // a new class that represents 2 linked variables? + case 'i': + vertigo=true; + //keyPressed('o'); + keyPressed('s'); + break; + case 'k': + vertigo=true; + //keyPressed('l'); + keyPressed('w'); + break; + } +} +//-------------------------------------------------------------- +void viewpoint::keyReleased(int key){ + for (int i=0;i<8;i++) vars[i].keyReleased(key); + switch (key) { + //'vertigo effect' always affects ALL VIEWPOINTS + case 'i': + vertigo=false; + //keyReleased('o'); + keyReleased('s'); + break; + case 'k': + vertigo=false; + //keyReleased('l'); + keyReleased('w'); + break; + } +} diff --git a/basedProject/src/viewpoint.h b/basedProject/src/viewpoint.h new file mode 100644 index 0000000..94e5fd1 --- /dev/null +++ b/basedProject/src/viewpoint.h @@ -0,0 +1,66 @@ +/* + * viewpoint.h + * 3dnav + * + * Created by Tim Redfern on 20/12/2011. + * one projector's viewpoint + * + */ + +#include "ofMain.h" +#include "mapUtils.h" +#include "keyVar.h" + +class viewpoint { + + public: + + void setup(map<string,string>&settings); + double getSetting(const string& setting); + + void begin(); + void end(bool showStats=false); + + void begin2d(); + void end2d(); + + void setDefaults(); + + void keyPressed(int key); + void keyReleased(int key); + void setLight(); + + ofFbo renderFBO; + + float distortFactor; + + bool vertigo; + + float getWidth(){ return ofGetWidth()*w; }; + float getHeight(){ return ofGetHeight()*h; }; + float getX(){ return ofGetWidth()*x; }; + float getY(){ return ofGetHeight()*y; }; + + + private: + + ofRectangle window; + + double fov,aspect,near,far; + + ofCamera camera; + ofNode target; + + keyVar* vars; + + //int lightNum; + //GLfloat lightColour[]; + + //GLfloat* getLightPosition; + + //ofLight light; + + float x,y,w,h; + + +}; |
