diff options
| author | Tim Redfern <tim@eclectronics.org> | 2011-12-19 13:44:25 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2011-12-19 13:44:25 +0000 |
| commit | 5523988d1729fe5c2757e046636d219639ee6724 (patch) | |
| tree | 1d9043ea18ff611bd24f033c61a86f745ca804f8 /src | |
linux osx project initial
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.cpp | 17 | ||||
| -rw-r--r-- | src/testApp.cpp | 409 | ||||
| -rw-r--r-- | src/testApp.h | 69 |
3 files changed, 495 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..6ff359a --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,17 @@ +#include "ofMain.h" +#include "testApp.h" +#include "ofAppGlutWindow.h" + +//======================================================================== +int main( ){ + + ofAppGlutWindow window; + ofSetupOpenGL(&window, 400,400, OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + window.setFrameRate(200.0f); + ofRunApp( new testApp()); + +} diff --git a/src/testApp.cpp b/src/testApp.cpp new file mode 100644 index 0000000..439f668 --- /dev/null +++ b/src/testApp.cpp @@ -0,0 +1,409 @@ +#include "testApp.h" +GLfloat lightOnePosition[] = {40.0, 40, 100.0, 0.0}; +GLfloat lightOneColor[] = {0.99, 0.99, 0.99, 0.5}; + +GLfloat lightTwoPosition[] = {-40.0, 40, 100.0, 0.0}; +GLfloat lightTwoColor[] = {0.99, 0.99, 0.99, 0.5}; + +//-------------------------------------------------------------- +void testApp::setup(){ + ofBackground(0,0,0); + + ///ofSetVerticalSync(true); + + //some model / light stuff + glEnable (GL_DEPTH_TEST); + glShadeModel (GL_SMOOTH); + + /* initialize lighting */ + glLightfv (GL_LIGHT0, GL_POSITION, lightOnePosition); + glLightfv (GL_LIGHT0, GL_DIFFUSE, lightOneColor); + glEnable (GL_LIGHT0); + glLightfv (GL_LIGHT1, GL_POSITION, lightTwoPosition); + glLightfv (GL_LIGHT1, GL_DIFFUSE, lightTwoColor); + glEnable (GL_LIGHT1); + glEnable (GL_LIGHTING); + glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE); + glEnable (GL_COLOR_MATERIAL); + + //load the bottle model - the 3ds and the texture file need to be in the same folder + bottle.loadModel("bottle.3DS", 1); + board.loadModel("box.3DS", 1); + //bottle.setRotation(0, 180, 1, 0, 0); + //board.setRotation(0, 180, 1, 0, 0); + + //you can create as many rotations as you want + //choose which axis you want it to effect + //you can update these rotations later on + //bottleModel.setRotation(0, -90, 1, 0, 0); + //bottleModel.setRotation(1, 270, 0, 0, 1); + //bottleModel.setScale(0.9, 0.9, 0.9); + bottle.setPosition(ofGetWidth()/2, ofGetHeight()/2, -50); + board.setPosition(ofGetWidth()/2, ofGetHeight()/2, -50); + + //ofDisableArbTex(); + + texture.loadMovie("gradblend01.mov"); + texture.play(); + + distortFactor=0.0; + + renderFBO.allocate(ofGetWidth(),ofGetHeight(),GL_RGB); + + mode=CALIBRATE; + + //approx 200 x 108 x 60 + //275:492 + //vfov = sin t/2 = 30/200 = 0.15 + fov=17.25; + aspect=1.79; + near=0; + far=3000; + + cx=0; + cy=0; + cz=-100; + + crx=cry=0; + + ex=0; + ey=0; + ez=0; + + + +} + +//-------------------------------------------------------------- +void testApp::update(){ + board.setRotation(1, 270 + ofGetElapsedTimef() * 60, 0, 1, 0); + texture.idleMovie(); +} + +//-------------------------------------------------------------- +void testApp::draw(){ + //ofPushView(); + //glMatrixMode(GL_PROJECTION); + //glLoadIdentity(); + //gluPerspective(fov,aspect,near,far); + // glTranslatef(0,0,-1000); + //glMatrixMode(GL_MODELVIEW); + // glLoadMatrixf(ofMatrix4x4::getInverseOf(getGlobalTransformMatrix()).getPtr()); + + //glEnable(GL_LIGHTING); + //ofRectangle vp=ofRectangle(0,0,ofGetWidth(),ofGetHeight()); + //camera.setFov(fov); + camera.begin(); + camera.setPosition(cx, cy, cz); + ofRotateY(cry); + ofRotateX(crx); + camera.setFov(fov); + ofVec3f lookAt; + lookAt.set(ex,ey,ez); + camera.lookAt(lookAt); + + glPushMatrix(); + + /* + + //fake back wall + ofSetColor(220, 20, 20); + glBegin(GL_QUADS); + glVertex3f(0.0, ofGetHeight(), -600); + glVertex3f(ofGetWidth(), ofGetHeight(), -600); + glVertex3f(ofGetWidth(), 0, -600); + glVertex3f(0, 0, -600); + glEnd(); + + //fake wall + ofSetColor(50, 150, 50); + glBegin(GL_QUADS); + glVertex3f(0.0, ofGetHeight(), 0); + glVertex3f(ofGetWidth(), ofGetHeight(), 0); + glVertex3f(ofGetWidth(), ofGetHeight(), -600); + glVertex3f(0, ofGetHeight(), -600); + glEnd(); + */ + //draw in middle of the screen + //glPushMatrix(); + //glTranslatef(ofGetWidth()/2,ofGetHeight()/2,0); +/* + //lets tumble the world with the mouse + glPushMatrix(); + + + //tumble according to mouse + glRotatef(-mouseY,1,0,0); + glRotatef(mouseX,0,1,0); + glTranslatef(-ofGetWidth()/2,-ofGetHeight()/2,0); +*/ + ofSetColor(255, 255, 255, 255); + ofFill(); + + //renderFBO.begin(); //render to FOB + ofClear(0,0,0); + + switch(mode) { + case CALIBRATE: + + glPushMatrix(); + glTranslatef(ofGetWidth(),(ofGetHeight())+100,0); + //board.draw(); + + int cx,cz; + + glFrontFace(GL_CW); + glBegin(GL_QUADS); + 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; + 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(); + + +/* + glBegin(GL_QUADS); + glVertex3f(-100, 0,-100); + glVertex3f(100, 0,-100); + glVertex3f(100, 0,100); + glVertex3f(-100, 0,100); + glEnd(); + */ + glPopMatrix(); + glFrontFace(GL_CCW); + bottle.draw(); + + break; + case DISPLAY: + + board.draw(); + bindTexture(texture); + bottle.draw(); + unbindTexture(texture); + break; + } + glPopMatrix(); + camera.end(); + + + + + //texture.getTextureReference().bind(); + + +/* + glBegin(GL_QUAD_STRIP); + glTexCoord2f (0.0, 0.0); + glVertex3f(ofGetWidth()/4,ofGetHeight()/4,0); + glTexCoord2f (0.0, 1.0); + glVertex3f(ofGetWidth()/4,(3*ofGetHeight())/4,0); + glTexCoord2f (1.0, 0.0); + glVertex3f((3*ofGetWidth())/4,ofGetHeight()/4,0); + glTexCoord2f (1.0, 1.0); + glVertex3f((3*ofGetWidth())/4,(3*ofGetHeight())/4,0); + glEnd(); + */ + + //texture.getTextureReference().unbind(); + + +/* + renderFBO.end(); + + //glPopMatrix(); + + //renderFBO.draw(0,0); + + glPushMatrix(); + + //renderFBO.getTextureReference().bind(); + bindTexture(renderFBO); + //draw a grid + //glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); + ofNoFill(); + + ofSetLineWidth(1.0); + //ofSetColor(I_fade1,I_fade1,I_fade1); + int gridX=50; + int gridY=50; + int xStep=ofGetWidth()/2; + int yStep=ofGetHeight()/2; + ofTranslate(ofGetWidth()/2,ofGetHeight()/2); + + 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)),distortFactor); + p1=distort(ofPoint(j,i),distortFactor); + glTexCoord2f((j+1)*0.5,((i-(2.0f/gridY))+1)*0.5); + glVertex3f(p0.x*xStep,p0.y*yStep,0); + glTexCoord2f((j+1)*0.5,(i+1)*0.5); + glVertex3f(p1.x*xStep,p1.y*yStep,0); + } + glEnd(); + } + + ofFill(); + glPopMatrix(); + + //renderFBO.getTextureReference().unbind(); + unbindTexture(renderFBO); + + ofSetHexColor(0x000000); + ofDrawBitmapString("fps: "+ofToString(ofGetFrameRate(), 2), 10, 15); + + + // add polygons here + //glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); + */ + +} + +//-------------------------------------------------------------- +void testApp::keyPressed(int key){ + switch (key) { + case 'q': + distortFactor-=0.001f; + break; + case 'a': + distortFactor+=0.001f; + break; + case 'w': + fov*=0.99; + break; + case 's': + fov*=1.01; + break; + case '1': + mode=CALIBRATE; + break; + case '2': + mode=DISPLAY; + break; + + //nav stuff + case 'g': + ex+=0.1; + break; + case 'd': + ex-=0.1; + break; + case 'r': + ey+=0.1; + break; + case 'v': + ey-=0.1; + break; + case 'c': + ez+=0.1; + break; + case 't': + ez-=0.1; + break; + + case 'h': + crx+1; + break; + case 'j': + cry-=1; + break; + case 'u': + //rotate camera in Y + break; + case 'n': + //rotate camera in Y + break; + + case 'o': + //dolly IN + break; + case 'l': + //dolly OUT + break; + + + + } + printf("fov: %f, mode: %d, distortion: %f\n",fov,mode,distortFactor); + +} + +//-------------------------------------------------------------- +void testApp::keyReleased(int key){ + +} + +//-------------------------------------------------------------- +void testApp::mouseMoved(int x, int y ){ + +} + +//-------------------------------------------------------------- +void testApp::mouseDragged(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mousePressed(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::mouseReleased(int x, int y, int button){ + +} + +//-------------------------------------------------------------- +void testApp::windowResized(int w, int h){ + +} + +//-------------------------------------------------------------- +void testApp::gotMessage(ofMessage msg){ + +} + +//-------------------------------------------------------------- +void testApp::dragEvent(ofDragInfo dragInfo){ + +} +void testApp::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 testApp::unbindTexture(ofBaseHasTexture &t) { + t.getTextureReference().unbind(); + + glMatrixMode(GL_TEXTURE); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); +} +ofPoint testApp::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)); +}; + diff --git a/src/testApp.h b/src/testApp.h new file mode 100644 index 0000000..fee5517 --- /dev/null +++ b/src/testApp.h @@ -0,0 +1,69 @@ +/* +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 + +#include "ofMain.h" +#include "ofx3DModelLoader.h" + +class testApp : public ofBaseApp{ + + public: + void setup(); + void update(); + void draw(); + + void keyPressed (int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + void dragEvent(ofDragInfo dragInfo); + void gotMessage(ofMessage msg); + + void bindTexture(ofBaseHasTexture &t); + void unbindTexture(ofBaseHasTexture &t); + + ofPoint distort(ofPoint pt,float d); + + ofx3DModelLoader bottle; + ofx3DModelLoader board; + + ofVideoPlayer texture; + + float distortFactor; + + ofFbo renderFBO; + + ofCamera camera; + + double fov,aspect,near,far; + + int mode; + + float cx,cy,cz,ex,ey,ez; + float crx,cry; //camera rotations + +}; |
