summaryrefslogtreecommitdiffstats
path: root/progs
diff options
context:
space:
mode:
Diffstat (limited to 'progs')
-rw-r--r--progs/demos/gloss.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/progs/demos/gloss.c b/progs/demos/gloss.c
index 80f9e4672ea..0b2e7426d53 100644
--- a/progs/demos/gloss.c
+++ b/progs/demos/gloss.c
@@ -38,6 +38,7 @@
/* for convolution */
#define FILTER_SIZE 7
+static GLint WinWidth = 500, WinHeight = 500;
static GLuint CylinderObj = 0;
static GLuint TeapotObj = 0;
static GLuint Object = 0;
@@ -54,6 +55,11 @@ static GLfloat Shininess = 6;
static GLuint BaseTexture, SpecularTexture;
static GLboolean DoSpecTexture = GL_TRUE;
+static GLboolean ButtonDown = GL_FALSE;
+static GLint ButtonX, ButtonY;
+static GLfloat Xrot0, Yrot0;
+
+
/* performance info */
static GLint T0 = 0;
static GLint Frames = 0;
@@ -134,6 +140,8 @@ static void Reshape( int width, int height )
{
GLfloat h = 30.0;
GLfloat w = h * width / height;
+ WinWidth = width;
+ WinHeight = height;
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
@@ -198,6 +206,7 @@ static void Key( unsigned char key, int x, int y )
glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
printf("Shininess = %g\n", Shininess);
break;
+ case 'a':
case ' ':
ToggleAnimate();
break;
@@ -233,6 +242,36 @@ static void SpecialKey( int key, int x, int y )
}
+static void
+MouseMotion(int x, int y)
+{
+ const float k = 300.0;
+ if (ButtonDown) {
+ float dx = x - ButtonX;
+ float dy = y - ButtonY;
+ Xrot = Xrot0 + k * dy / WinWidth;
+ Yrot = Yrot0 + k * dx / WinHeight;
+ glutPostRedisplay();
+ }
+}
+
+
+static void
+MouseButton(int button, int state, int x, int y)
+{
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+ ButtonDown = GL_TRUE;
+ ButtonX = x;
+ ButtonY = y;
+ Xrot0 = Xrot;
+ Yrot0 = Yrot;
+ }
+ else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+ ButtonDown = GL_FALSE;
+ }
+}
+
+
static void Init( int argc, char *argv[] )
{
GLboolean convolve = GL_FALSE;
@@ -415,7 +454,7 @@ int main( int argc, char *argv[] )
{
glutInit( &argc, argv );
glutInitWindowPosition(0, 0);
- glutInitWindowSize( 500, 500 );
+ glutInitWindowSize(WinWidth, WinHeight);
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
@@ -427,6 +466,8 @@ int main( int argc, char *argv[] )
glutKeyboardFunc( Key );
glutSpecialFunc( SpecialKey );
glutDisplayFunc( Display );
+ glutMotionFunc(MouseMotion);
+ glutMouseFunc(MouseButton);
if (Animate)
glutIdleFunc( Idle );