summaryrefslogtreecommitdiff
path: root/src/viewpoint.cpp
diff options
context:
space:
mode:
authorTim Redfern <tim@eclectronics.org>2012-02-23 01:07:34 +0000
committerTim Redfern <tim@eclectronics.org>2012-02-23 01:07:34 +0000
commit61e590513b2e725a8df7eed75a041b188d4ecd39 (patch)
tree3e81b514ad7c225dbf491316d4acd35559572e4f /src/viewpoint.cpp
parentb3a0d6eb435fc2584466106ef613b99100b0a470 (diff)
proper vertigo effect
Diffstat (limited to 'src/viewpoint.cpp')
-rw-r--r--src/viewpoint.cpp73
1 files changed, 56 insertions, 17 deletions
diff --git a/src/viewpoint.cpp b/src/viewpoint.cpp
index 287cf26..fe8bb28 100644
--- a/src/viewpoint.cpp
+++ b/src/viewpoint.cpp
@@ -11,15 +11,15 @@ void viewpoint::setup(map<string,string>&settings){
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);
@@ -29,9 +29,11 @@ void viewpoint::setup(map<string,string>&settings){
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;
@@ -53,15 +55,23 @@ double viewpoint::getSetting(const string& setting){
void viewpoint::setLight(){
target.setPosition(vars[1].getVal(),vars[2].getVal(),vars[3].getVal());
//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);
@@ -78,18 +88,17 @@ void viewpoint::setDefaults(){
void viewpoint::begin(){
renderFBO.begin();
ofClear(0,0,0);
-
+
camera.begin();
- camera.setFov(vars[0].getVal());
}
//--------------------------------------------------------------
void viewpoint::end(bool showStats){
-
+
camera.end();
renderFBO.end();
-
+
ofPushMatrix();
-
+
bindTexture(renderFBO);
ofNoFill();
ofSetLineWidth(1.0);
@@ -99,7 +108,7 @@ void viewpoint::end(bool showStats){
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);
@@ -115,24 +124,54 @@ void viewpoint::end(bool showStats){
}
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("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;
+ }
}