/* * 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(); }