Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //http://www.youtube.com/user/thecplusplusguy
- //watch the video for explonation
- //ray-sphere and ray-plane collision detection.
- //if you find a bug, let me know
- //the other files are the same, as earlier, download those, if you want to run.
- #include "functions.h"
- float camX=0.0,camY=0.0,camZ=5.0;
- float camYaw=0.0;
- float camPitch=0.0;
- enum {SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
- unsigned int skybox[6];
- #ifndef M_PI
- #define M_PI 3.1415926535
- #endif
- void initskybox()
- {
- skybox[SKY_LEFT]=loadTexture("left.bmp");
- skybox[SKY_BACK]=loadTexture("back.bmp");
- skybox[SKY_RIGHT]=loadTexture("right.bmp");
- skybox[SKY_FRONT]=loadTexture("front.bmp");
- skybox[SKY_TOP]=loadTexture("top.bmp");
- skybox[SKY_BOTTOM]=loadTexture("bottom.bmp");
- }
- void killskybox()
- {
- glDeleteTextures(6,&skybox[0]);
- }
- void lockCamera()
- {
- if(camPitch>90)
- camPitch=90;
- if(camPitch<-90)
- camPitch=-90;
- if(camYaw<0.0)
- camYaw+=360.0;
- if(camYaw>360.0)
- camYaw-=360;
- }
- void moveCamera(float dist,float dir)
- {
- float rad=(camYaw+dir)*M_PI/180.0;
- camX-=sin(rad)*dist;
- camZ-=cos(rad)*dist;
- }
- void moveCameraUp(float dist,float dir)
- {
- float rad=(camPitch+dir)*M_PI/180.0;
- camY+=sin(rad)*dist;
- }
- void Control(float movevel,float mousevel,bool mi)
- {
- if(mi)
- {
- int MidX=320;
- int MidY=240;
- SDL_ShowCursor(SDL_DISABLE);
- int tmpx,tmpy;
- SDL_GetMouseState(&tmpx,&tmpy);
- camYaw+=mousevel*(MidX-tmpx);
- camPitch+=mousevel*(MidY-tmpy);
- lockCamera();
- SDL_WarpMouse(MidX,MidY);
- Uint8* state=SDL_GetKeyState(NULL);
- if(state[SDLK_w])
- {
- if(camPitch!=90 && camPitch!=-90)
- moveCamera(movevel,0.0);
- moveCameraUp(movevel,0.0);
- }else if(state[SDLK_s])
- {
- if(camPitch!=90 && camPitch!=-90)
- moveCamera(movevel,180.0);
- moveCameraUp(movevel,180.0);
- }
- if(state[SDLK_a])
- moveCamera(movevel,90.0);
- else if(state[SDLK_d])
- moveCamera(movevel,270);
- }
- glRotatef(-camPitch,1.0,0.0,0.0);
- glRotatef(-camYaw,0.0,1.0,0.0);
- }
- void UpdateCamera()
- {
- glTranslatef(-camX,-camY,-camZ);
- }
- void drawCube(float size)
- {
- float difamb[]={1.0,0.5,0.3,1.0};
- glBegin(GL_QUADS);
- //front face
- glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,difamb);
- glNormal3f(0.0,0.0,1.0);
- glVertex3f(size/2,size/2,size/2);
- glVertex3f(-size/2,size/2,size/2);
- glVertex3f(-size/2,-size/2,size/2);
- glVertex3f(size/2,-size/2,size/2);
- //left face
- glNormal3f(-1.0,0.0,0.0);
- glVertex3f(-size/2,size/2,size/2);
- glVertex3f(-size/2,size/2,-size/2);
- glVertex3f(-size/2,-size/2,-size/2);
- glVertex3f(-size/2,-size/2,size/2);
- //back face
- glNormal3f(0.0,0.0,-1.0);
- glVertex3f(size/2,size/2,-size/2);
- glVertex3f(-size/2,size/2,-size/2);
- glVertex3f(-size/2,-size/2,-size/2);
- glVertex3f(size/2,-size/2,-size/2);
- //right face
- glNormal3f(1.0,0.0,0.0);
- glVertex3f(size/2,size/2,-size/2);
- glVertex3f(size/2,size/2,size/2);
- glVertex3f(size/2,-size/2,size/2);
- glVertex3f(size/2,-size/2,-size/2);
- //top face
- glNormal3f(0.0,1.0,0.0);
- glVertex3f(size/2,size/2,size/2);
- glVertex3f(-size/2,size/2,size/2);
- glVertex3f(-size/2,size/2,-size/2);
- glVertex3f(size/2,size/2,-size/2);
- //bottom face
- glNormal3f(0.0,-1.0,0.0);
- glVertex3f(size/2,-size/2,size/2);
- glVertex3f(-size/2,-size/2,size/2);
- glVertex3f(-size/2,-size/2,-size/2);
- glVertex3f(size/2,-size/2,-size/2);
- glEnd();
- }
- void drawSkybox(float size)
- {
- glDisable(GL_LIGHTING);
- glDisable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_BACK]);
- glBegin(GL_QUADS);
- //back face
- glTexCoord2f(0,0);
- glVertex3f(size/2,size/2,size/2);
- glTexCoord2f(1,0);
- glVertex3f(-size/2,size/2,size/2);
- glTexCoord2f(1,1);
- glVertex3f(-size/2,-size/2,size/2);
- glTexCoord2f(0,1);
- glVertex3f(size/2,-size/2,size/2);
- glEnd();
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_LEFT]);
- glBegin(GL_QUADS);
- //left face
- glTexCoord2f(0,0);
- glVertex3f(-size/2,size/2,size/2);
- glTexCoord2f(1,0);
- glVertex3f(-size/2,size/2,-size/2);
- glTexCoord2f(1,1);
- glVertex3f(-size/2,-size/2,-size/2);
- glTexCoord2f(0,1);
- glVertex3f(-size/2,-size/2,size/2);
- glEnd();
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_FRONT]);
- glBegin(GL_QUADS);
- //front face
- glTexCoord2f(1,0);
- glVertex3f(size/2,size/2,-size/2);
- glTexCoord2f(0,0);
- glVertex3f(-size/2,size/2,-size/2);
- glTexCoord2f(0,1);
- glVertex3f(-size/2,-size/2,-size/2);
- glTexCoord2f(1,1);
- glVertex3f(size/2,-size/2,-size/2);
- glEnd();
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_RIGHT]);
- glBegin(GL_QUADS);
- //right face
- glTexCoord2f(0,0);
- glVertex3f(size/2,size/2,-size/2);
- glTexCoord2f(1,0);
- glVertex3f(size/2,size/2,size/2);
- glTexCoord2f(1,1);
- glVertex3f(size/2,-size/2,size/2);
- glTexCoord2f(0,1);
- glVertex3f(size/2,-size/2,-size/2);
- glEnd();
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_TOP]);
- glBegin(GL_QUADS); //top face
- glTexCoord2f(1,0);
- glVertex3f(size/2,size/2,size/2);
- glTexCoord2f(0,0);
- glVertex3f(-size/2,size/2,size/2);
- glTexCoord2f(0,1);
- glVertex3f(-size/2,size/2,-size/2);
- glTexCoord2f(1,1);
- glVertex3f(size/2,size/2,-size/2);
- glEnd();
- glBindTexture(GL_TEXTURE_2D,skybox[SKY_BOTTOM]);
- glBegin(GL_QUADS);
- //bottom face
- glTexCoord2f(1,1);
- glVertex3f(size/2,-size/2,size/2);
- glTexCoord2f(0,1);
- glVertex3f(-size/2,-size/2,size/2);
- glTexCoord2f(0,0);
- glVertex3f(-size/2,-size/2,-size/2);
- glTexCoord2f(1,0);
- glVertex3f(size/2,-size/2,-size/2);
- glEnd();
- glEnable(GL_LIGHTING);
- glEnable(GL_DEPTH_TEST);
- glDisable(GL_TEXTURE_2D);
- }
- bool raysphere(float xc,float yc, float zc,float xd,float yd, float zd,float xs,float ys, float zs,float r)
- {
- float b=2*(xd*(xs-xc)+yd*(ys-yc)+zd*(zs-zc));
- float c=xs*xs-2*xs*xc+xc*xc+ys*ys-2*ys*yc+yc*yc+zs*zs-2*zs*zc+zc*zc-r*r;
- float disc=(b*b-4*c);
- if(disc<0)
- return false;
- else
- return true;
- //(x+y)^2=x^2+2xy+y^2
- }
- bool rayplane(float nx,float ny,float nz,float xs,float ys,float zs,float xd,float yd,float zd,coordinate p1,coordinate p2,coordinate p3,coordinate p4)
- {
- float a=xd*nx+yd*ny+zd*nz;
- if(a==0)
- return false;
- float t=((p1.x*nx+p1.y*ny+p1.z*nz-nx*xs-ny*ys-nz*zs)/a);
- if(t<0)
- return false;
- float x=xs+t*xd;
- float y=ys+t*yd;
- float z=zs+t*zd;
- coordinate cp(x,y,z);
- if(abs(trianglearea(p1,p3,p4)-trianglearea(p1,p4,cp)-trianglearea(p1,p3,cp)-trianglearea(p3,p4,cp))<0.000001 || abs(trianglearea(p1,p2,p3)-trianglearea(p1,p2,cp)-trianglearea(p2,p3,cp)-trianglearea(p1,p3,cp))<0.000001)
- return true;
- return false;
- }
- float trianglearea(coordinate p1,coordinate p2,coordinate p3)
- {
- //area of the triangle with the heron fomula
- float a=sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*(p2.z-p1.z));
- float b=sqrt((p3.x-p2.x)*(p3.x-p2.x)+(p3.y-p2.y)*(p3.y-p2.y)+(p3.z-p2.z)*(p3.z-p2.z));
- float c=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y)+(p1.z-p3.z)*(p1.z-p3.z));
- float s=(a+b+c)/2.;
- return (sqrt(s*((s-a)*(s-b)*(s-c))));
- }
- unsigned int loadTexture(const char* filename)
- {
- unsigned int num;
- glGenTextures(1,&num);
- SDL_Surface* img=SDL_LoadBMP(filename);
- glBindTexture(GL_TEXTURE_2D,num);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- // glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
- // glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
- glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,img->w,img->h,0,GL_RGB,GL_UNSIGNED_SHORT_5_6_5,img->pixels);
- SDL_FreeSurface(img);
- return num;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement