#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)); };