Advertisement
thecplusplusguy

OpenGL (SDL,C++) - ray tracing - functions.cpp

Sep 29th, 2011
3,466
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.59 KB | None | 0 0
  1. //http://www.youtube.com/user/thecplusplusguy
  2. //watch the video for explonation
  3. //ray-sphere and ray-plane collision detection.
  4. //if you find a bug, let me know
  5. //the other files are the same, as earlier, download those, if you want to run.
  6. #include "functions.h"
  7.  
  8. float camX=0.0,camY=0.0,camZ=5.0;
  9. float camYaw=0.0;
  10. float camPitch=0.0;
  11. enum {SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
  12. unsigned int skybox[6];
  13. #ifndef M_PI
  14. #define M_PI 3.1415926535
  15. #endif
  16.  
  17.  
  18. void initskybox()
  19. {
  20.     skybox[SKY_LEFT]=loadTexture("left.bmp");
  21.     skybox[SKY_BACK]=loadTexture("back.bmp");
  22.     skybox[SKY_RIGHT]=loadTexture("right.bmp");
  23.     skybox[SKY_FRONT]=loadTexture("front.bmp");
  24.     skybox[SKY_TOP]=loadTexture("top.bmp");
  25.     skybox[SKY_BOTTOM]=loadTexture("bottom.bmp");
  26. }
  27.  
  28. void killskybox()
  29. {
  30.     glDeleteTextures(6,&skybox[0]);
  31. }
  32.  
  33. void lockCamera()
  34. {
  35.     if(camPitch>90)
  36.         camPitch=90;
  37.     if(camPitch<-90)
  38.         camPitch=-90;
  39.     if(camYaw<0.0)
  40.         camYaw+=360.0;
  41.     if(camYaw>360.0)
  42.         camYaw-=360;
  43. }
  44.  
  45. void moveCamera(float dist,float dir)
  46. {
  47.     float rad=(camYaw+dir)*M_PI/180.0;
  48.     camX-=sin(rad)*dist;
  49.     camZ-=cos(rad)*dist;
  50. }
  51.  
  52. void moveCameraUp(float dist,float dir)
  53. {
  54.     float rad=(camPitch+dir)*M_PI/180.0;
  55.     camY+=sin(rad)*dist;   
  56. }
  57.  
  58. void Control(float movevel,float mousevel,bool mi)
  59. {
  60.     if(mi)
  61.     {
  62.         int MidX=320;
  63.         int MidY=240;
  64.         SDL_ShowCursor(SDL_DISABLE);
  65.         int tmpx,tmpy;
  66.         SDL_GetMouseState(&tmpx,&tmpy);
  67.         camYaw+=mousevel*(MidX-tmpx);
  68.         camPitch+=mousevel*(MidY-tmpy);
  69.         lockCamera();
  70.         SDL_WarpMouse(MidX,MidY);
  71.         Uint8* state=SDL_GetKeyState(NULL);
  72.         if(state[SDLK_w])
  73.         {
  74.             if(camPitch!=90 && camPitch!=-90)
  75.                 moveCamera(movevel,0.0);
  76.             moveCameraUp(movevel,0.0);
  77.         }else if(state[SDLK_s])
  78.         {
  79.             if(camPitch!=90 && camPitch!=-90)
  80.                 moveCamera(movevel,180.0);
  81.             moveCameraUp(movevel,180.0);
  82.         }      
  83.         if(state[SDLK_a])
  84.             moveCamera(movevel,90.0);
  85.         else if(state[SDLK_d])
  86.             moveCamera(movevel,270);   
  87.     }
  88.     glRotatef(-camPitch,1.0,0.0,0.0);
  89.     glRotatef(-camYaw,0.0,1.0,0.0);
  90. }
  91.  
  92. void UpdateCamera()
  93. {
  94.     glTranslatef(-camX,-camY,-camZ);
  95. }
  96.  
  97. void drawCube(float size)
  98. {
  99.     float difamb[]={1.0,0.5,0.3,1.0};
  100.     glBegin(GL_QUADS);
  101.         //front face
  102.         glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,difamb);
  103.         glNormal3f(0.0,0.0,1.0);
  104.         glVertex3f(size/2,size/2,size/2);
  105.         glVertex3f(-size/2,size/2,size/2);
  106.         glVertex3f(-size/2,-size/2,size/2);
  107.         glVertex3f(size/2,-size/2,size/2);
  108.  
  109.         //left face
  110.         glNormal3f(-1.0,0.0,0.0);
  111.         glVertex3f(-size/2,size/2,size/2);
  112.         glVertex3f(-size/2,size/2,-size/2);
  113.         glVertex3f(-size/2,-size/2,-size/2);
  114.         glVertex3f(-size/2,-size/2,size/2);
  115.  
  116.         //back face
  117.         glNormal3f(0.0,0.0,-1.0);
  118.         glVertex3f(size/2,size/2,-size/2);
  119.         glVertex3f(-size/2,size/2,-size/2);
  120.         glVertex3f(-size/2,-size/2,-size/2);
  121.         glVertex3f(size/2,-size/2,-size/2);
  122.  
  123.         //right face
  124.         glNormal3f(1.0,0.0,0.0);
  125.         glVertex3f(size/2,size/2,-size/2);
  126.         glVertex3f(size/2,size/2,size/2);
  127.         glVertex3f(size/2,-size/2,size/2);
  128.         glVertex3f(size/2,-size/2,-size/2);
  129.  
  130.         //top face
  131.         glNormal3f(0.0,1.0,0.0);
  132.         glVertex3f(size/2,size/2,size/2);
  133.         glVertex3f(-size/2,size/2,size/2);
  134.         glVertex3f(-size/2,size/2,-size/2);
  135.         glVertex3f(size/2,size/2,-size/2);
  136.  
  137.         //bottom face
  138.         glNormal3f(0.0,-1.0,0.0);
  139.         glVertex3f(size/2,-size/2,size/2);
  140.         glVertex3f(-size/2,-size/2,size/2);
  141.         glVertex3f(-size/2,-size/2,-size/2);
  142.         glVertex3f(size/2,-size/2,-size/2);
  143.     glEnd();
  144. }
  145.  
  146. void drawSkybox(float size)
  147. {
  148.     glDisable(GL_LIGHTING);
  149.     glDisable(GL_DEPTH_TEST);
  150.     glEnable(GL_TEXTURE_2D);
  151.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_BACK]);
  152.     glBegin(GL_QUADS);
  153.         //back face
  154.         glTexCoord2f(0,0);
  155.         glVertex3f(size/2,size/2,size/2);
  156.         glTexCoord2f(1,0);
  157.         glVertex3f(-size/2,size/2,size/2);
  158.         glTexCoord2f(1,1);
  159.         glVertex3f(-size/2,-size/2,size/2);
  160.         glTexCoord2f(0,1);
  161.         glVertex3f(size/2,-size/2,size/2);
  162.     glEnd();
  163.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_LEFT]);
  164.     glBegin(GL_QUADS); 
  165.         //left face
  166.         glTexCoord2f(0,0);
  167.         glVertex3f(-size/2,size/2,size/2);
  168.         glTexCoord2f(1,0);
  169.         glVertex3f(-size/2,size/2,-size/2);
  170.         glTexCoord2f(1,1);
  171.         glVertex3f(-size/2,-size/2,-size/2);
  172.         glTexCoord2f(0,1);
  173.         glVertex3f(-size/2,-size/2,size/2);
  174.     glEnd();
  175.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_FRONT]);
  176.     glBegin(GL_QUADS); 
  177.         //front face
  178.         glTexCoord2f(1,0);
  179.         glVertex3f(size/2,size/2,-size/2);
  180.         glTexCoord2f(0,0);
  181.         glVertex3f(-size/2,size/2,-size/2);
  182.         glTexCoord2f(0,1);
  183.         glVertex3f(-size/2,-size/2,-size/2);
  184.         glTexCoord2f(1,1);
  185.         glVertex3f(size/2,-size/2,-size/2);
  186.     glEnd();
  187.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_RIGHT]);
  188.     glBegin(GL_QUADS); 
  189.         //right face
  190.         glTexCoord2f(0,0);
  191.         glVertex3f(size/2,size/2,-size/2);
  192.         glTexCoord2f(1,0);
  193.         glVertex3f(size/2,size/2,size/2);
  194.         glTexCoord2f(1,1);
  195.         glVertex3f(size/2,-size/2,size/2);
  196.         glTexCoord2f(0,1);
  197.         glVertex3f(size/2,-size/2,-size/2);
  198.     glEnd();
  199.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_TOP]);      
  200.     glBegin(GL_QUADS);          //top face
  201.         glTexCoord2f(1,0);
  202.         glVertex3f(size/2,size/2,size/2);
  203.         glTexCoord2f(0,0);
  204.         glVertex3f(-size/2,size/2,size/2);
  205.         glTexCoord2f(0,1);
  206.         glVertex3f(-size/2,size/2,-size/2);
  207.         glTexCoord2f(1,1);
  208.         glVertex3f(size/2,size/2,-size/2);
  209.     glEnd();
  210.     glBindTexture(GL_TEXTURE_2D,skybox[SKY_BOTTOM]);       
  211.     glBegin(GL_QUADS); 
  212.         //bottom face
  213.         glTexCoord2f(1,1);
  214.         glVertex3f(size/2,-size/2,size/2);
  215.         glTexCoord2f(0,1);
  216.         glVertex3f(-size/2,-size/2,size/2);
  217.         glTexCoord2f(0,0);
  218.         glVertex3f(-size/2,-size/2,-size/2);
  219.         glTexCoord2f(1,0);
  220.         glVertex3f(size/2,-size/2,-size/2);
  221.     glEnd();
  222.     glEnable(GL_LIGHTING);
  223.     glEnable(GL_DEPTH_TEST);
  224.     glDisable(GL_TEXTURE_2D);
  225. }
  226.  
  227. bool raysphere(float xc,float yc, float zc,float xd,float yd, float zd,float xs,float ys, float zs,float r)
  228. {
  229.     float b=2*(xd*(xs-xc)+yd*(ys-yc)+zd*(zs-zc));
  230.     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;
  231.     float disc=(b*b-4*c);
  232.     if(disc<0)
  233.         return false;
  234.     else
  235.         return true;
  236.         //(x+y)^2=x^2+2xy+y^2
  237. }
  238.  
  239. 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)
  240. {
  241.     float a=xd*nx+yd*ny+zd*nz;
  242.     if(a==0)
  243.         return false;
  244.     float t=((p1.x*nx+p1.y*ny+p1.z*nz-nx*xs-ny*ys-nz*zs)/a);
  245.     if(t<0)
  246.         return false;
  247.     float x=xs+t*xd;
  248.     float y=ys+t*yd;
  249.     float z=zs+t*zd;
  250.     coordinate cp(x,y,z);
  251.     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)
  252.         return true;
  253.     return false;
  254. }
  255.  
  256.  
  257. float trianglearea(coordinate p1,coordinate p2,coordinate p3)
  258. {
  259.         //area of the triangle with the heron fomula
  260.         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));
  261.         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));
  262.         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));
  263.         float s=(a+b+c)/2.;
  264.         return (sqrt(s*((s-a)*(s-b)*(s-c))));
  265.  
  266. }
  267.  
  268.  
  269. unsigned int loadTexture(const char* filename)
  270. {
  271.     unsigned int num;
  272.     glGenTextures(1,&num);
  273.     SDL_Surface* img=SDL_LoadBMP(filename);
  274.     glBindTexture(GL_TEXTURE_2D,num);
  275.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  276.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  277. //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
  278. //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
  279.     glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,img->w,img->h,0,GL_RGB,GL_UNSIGNED_SHORT_5_6_5,img->pixels);
  280.     SDL_FreeSurface(img);
  281.     return num;
  282. }
  283.  
  284.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement