progs/glsl: let the mouse rotate the scene
authorRALOVICH, Kristóf <tade60@freemail.hu>
Sun, 28 Mar 2010 02:11:29 +0000 (22:11 -0400)
committerBrian Paul <brianp@vmware.com>
Mon, 29 Mar 2010 17:47:38 +0000 (11:47 -0600)
progs/glsl/fsraytrace.c
progs/glsl/vsraytrace.c

index 8d54757e590e99638f17efff239f3814eba927c1..357da67b9c6e76fe5d0ae1278b9b2561bb03b18a 100644 (file)
 #include <GL/glew.h>
 #include <GL/glut.h>
 #include "shaderutil.h"
-
+#include <math.h>
 
 static int Win;
 static int WinWidth = 512, WinHeight = 512;
-static GLfloat Xrot = 0, Yrot = 0;
 static int mouseGrabbed = 0;
 static GLuint vertShader;
 static GLuint fragShader;
 static GLuint program;
+static float rot[9] = {1,0,0,  0,1,0,   0,0,1};
 
 static const char* vsSource =
-  "varying vec2 rayDir;\n"
-  "\n"
-  "void main()\n"
-  "{\n"
-  "  rayDir = gl_MultiTexCoord0.xy - vec2(0.5,0.5);\n"
-  "  gl_Position = gl_ProjectionMatrix * gl_Vertex;\n"
+  "varying vec2 rayDir;                                                \n"
+  "                                                                    \n"
+  "void main()                                                         \n"
+  "{                                                                   \n"
+  "  rayDir = gl_MultiTexCoord0.xy - vec2(0.5,0.5);                    \n"
+  "  gl_Position = gl_ProjectionMatrix * gl_Vertex;                    \n"
   "}\n";
 
 static const char* fsSource =
@@ -213,29 +213,46 @@ static const char* fsSource =
   "    clamp(dot(reflect(-L,N),camera_dir),0.0,1.0),16.0);             \n"
   "}                                                                   \n"
   "                                                                    \n"
-  "\n"
-  "void\n"
-  "main()\n"
-  "{\n"
-  "  const float z = -0.5;\n"
+  "void main()                                                         \n"
+  "{                                                                   \n"
+  "  const float z = -0.5;                                             \n"
   "  const vec3 cameraPos = vec3(0,0,3);                               \n"
-  "  Ray r = Ray(cameraPos, normalize(vec3(rayDir, z) * rot));\n"
-  "  gl_FragColor = trace1(r);\n"
+  "  Ray r = Ray(cameraPos, normalize(vec3(rayDir, z) * rot));         \n"
+  "  gl_FragColor = trace1(r);                                         \n"
   "}\n";
 
+static inline
+float
+deg2rad(const float degree)
+{
+  return( degree * 0.017453292519943295769236907684886F);
+}
 
-
-static void
-Idle(void)
+static inline void
+rotate_xy(float* mat3, const float degreesAroundX, const float degreesAroundY)
 {
-  glutPostRedisplay();
+  const float rad1 = deg2rad(degreesAroundX);
+  const float c1 = cosf(rad1);
+  const float s1 = sinf(rad1);
+  const float rad2 = deg2rad(degreesAroundY);
+  const float c2 = cosf(rad2);
+  const float s2 = sinf(rad2);
+  mat3[0] = c2;    mat3[3] = 0.0F; mat3[6] = s2;
+  mat3[1] = s1*s2; mat3[4] = c1;   mat3[7] = -s1*c2;
+  mat3[2] = -c1*s2;mat3[5] = s1;   mat3[8] = c1*c2;
 }
 
+static inline void
+identity(float* mat3)
+{
+  mat3[0] = 1.0F; mat3[3] = 0.0F; mat3[6] = 0.0F;
+  mat3[1] = 0.0F; mat3[4] = 1.0F; mat3[7] = 0.0F;
+  mat3[2] = 0.0F; mat3[5] = 0.0F; mat3[8] = 1.0F;
+}
 
 static void
 Draw(void)
 {
-  float rot[9] = {1,0,0,  0,1,0,   0,0,1};
   GLint location = glGetUniformLocation(program, "rot");
   static const float m = -10.F;
   static const float p =  10.F;
@@ -311,9 +328,11 @@ drag(int x, int y)
   float scale = 1.5F;
   if(mouseGrabbed)
   {
-    Xrot = (float)(x - WinWidth/2) / scale;
-    Yrot = (float)(y - WinHeight/2) / scale;
-    printf("%4.2f %4.2f\n", Xrot, Yrot);
+    static GLfloat xRot = 0, yRot = 0;
+    xRot = (float)(x - WinWidth/2) / scale;
+    yRot = (float)(y - WinHeight/2) / scale;
+    identity(rot);
+    rotate_xy(rot, yRot, xRot);
   }
 }
 
@@ -380,7 +399,7 @@ main(int argc, char *argv[])
   glutDisplayFunc(Draw);
   glutMouseFunc(mouse);
   glutPassiveMotionFunc(drag);
-  glutIdleFunc(Idle);
+  glutIdleFunc(Draw);
   Init();
   glutMainLoop();
   return 0;
index 962b1bdb4c1ab02c58d90bc2c17f4765729b3fa5..327d48b897e6186e6dff1da0acf34541b7d195fb 100644 (file)
 #include <GL/glew.h>
 #include <GL/glut.h>
 #include "shaderutil.h"
-
+#include <math.h>
 
 static int Win;
 static int WinWidth = 256, WinHeight = 256;
 static int mouseGrabbed = 0;
+static GLuint vertShader;
+static GLuint program;
+float rot[9] = {1,0,0,  0,1,0,   0,0,1};
 
 static const char* vsSource =
   "const float INF     = 9999.9;                                       \n"
@@ -206,11 +209,37 @@ static const char* vsSource =
   "  Ray ray = Ray(cameraPos, rayDir);                                 \n"
   "  gl_Position = gl_Vertex;                                          \n"
   "  gl_FrontColor = trace1(ray);                                      \n"
-  "}                                                                   \n";
+  "}\n";
 
-static GLuint vertShader;
-static GLuint program;
 
+static inline
+float
+deg2rad(const float degree)
+{
+  return( degree * 0.017453292519943295769236907684886F);
+}
+
+static inline void
+rotate_xy(float* mat3, const float degreesAroundX, const float degreesAroundY)
+{
+  const float rad1 = deg2rad(degreesAroundX);
+  const float c1 = cosf(rad1);
+  const float s1 = sinf(rad1);
+  const float rad2 = deg2rad(degreesAroundY);
+  const float c2 = cosf(rad2);
+  const float s2 = sinf(rad2);
+  mat3[0] = c2;    mat3[3] = 0.0F; mat3[6] = s2;
+  mat3[1] = s1*s2; mat3[4] = c1;   mat3[7] = -s1*c2;
+  mat3[2] = -c1*s2;mat3[5] = s1;   mat3[8] = c1*c2;
+}
+
+static inline void
+identity(float* mat3)
+{
+  mat3[0] = 1.0F; mat3[3] = 0.0F; mat3[6] = 0.0F;
+  mat3[1] = 0.0F; mat3[4] = 1.0F; mat3[7] = 0.0F;
+  mat3[2] = 0.0F; mat3[5] = 0.0F; mat3[8] = 1.0F;
+}
 
 static void
 Draw(void)
@@ -219,7 +248,6 @@ Draw(void)
   const float h = 0.5F * WinHeight;
   int x,y;
 
-  float rot[9] = {1,0,0,  0,1,0,   0,0,1};
   GLint location = glGetUniformLocation(program, "rot");
 
   glUseProgram(program);
@@ -287,9 +315,14 @@ static
 void
 drag(int x, int y)
 {
+  float scale = 1.5F;
   if(mouseGrabbed)
   {
-    printf("%4d %4d\n", x, y);
+    static GLfloat xRot = 0, yRot = 0;
+    xRot = (float)(x - WinWidth/2) / scale;
+    yRot = (float)(y - WinHeight/2) / scale;
+    identity(rot);
+    rotate_xy(rot, yRot, xRot);
   }
 }
 
@@ -355,7 +388,7 @@ main(int argc, char *argv[])
   glutDisplayFunc(Draw);
   glutIdleFunc(Draw);
   glutMouseFunc(mouse);
-  glutMotionFunc(drag);
+  glutPassiveMotionFunc(drag);
   Init();
   glutMainLoop();
   return 0;