summaryrefslogtreecommitdiffstats
path: root/progs/demos/renormal.c
blob: bd099dcdc8025dd5d5aa23a709531b7c4be7908d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/* $Id: renormal.c,v 1.1 1999/08/19 00:55:40 jtg Exp $ */

/*
 * Test GL_EXT_rescale_normal extension
 * Brian Paul  January 1998   This program is in the public domain.
 */

/*
 * $Id: renormal.c,v 1.1 1999/08/19 00:55:40 jtg Exp $
 */


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>


static GLfloat Phi = 0.0;


static void Idle(void)
{
   Phi += 0.1;
   glutPostRedisplay();
}


static void Display( void )
{
   GLfloat scale = 0.6 + 0.5 * sin(Phi);
   glClear( GL_COLOR_BUFFER_BIT );
   glPushMatrix();
   glScalef(scale, scale, scale);
   glutSolidSphere(2.0, 20, 20);
   glPopMatrix();
   glutSwapBuffers();
}


static void Reshape( int width, int height )
{
   glViewport( 0, 0, width, height );
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
   glMatrixMode( GL_MODELVIEW );
   glLoadIdentity();
   glTranslatef( 0.0, 0.0, -15.0 );
}



static void Init( void )
{
   static GLfloat mat[4] = { 0.8, 0.8, 0.0, 1.0 };
   static GLfloat pos[4] = { -1.0, 1.0, 1.0, 0.0 };

   /* setup lighting, etc */
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat);
   glLightfv(GL_LIGHT0, GL_POSITION, pos);

   glEnable(GL_CULL_FACE);

   glDisable(GL_RESCALE_NORMAL_EXT);
   glDisable(GL_NORMALIZE);
}


#define UNSCALED  1
#define NORMALIZE 2
#define RESCALE   3
#define QUIT      4


static void ModeMenu(int entry)
{
   if (entry==UNSCALED) {
      glDisable(GL_RESCALE_NORMAL_EXT);
      glDisable(GL_NORMALIZE);
   }
   else if (entry==NORMALIZE) {
      glEnable(GL_NORMALIZE);
      glDisable(GL_RESCALE_NORMAL_EXT);
   }
   else if (entry==RESCALE) {
      glDisable(GL_NORMALIZE);
      glEnable(GL_RESCALE_NORMAL_EXT);
   }
   else if (entry==QUIT) {
      exit(0);
   }
   glutPostRedisplay();
}


int main( int argc, char *argv[] )
{
   glutInit( &argc, argv );
   glutInitWindowSize( 400, 400 );

   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );

   glutCreateWindow(argv[0]);

   Init();

   glutIdleFunc( Idle );
   glutReshapeFunc( Reshape );
   glutDisplayFunc( Display );

   glutCreateMenu(ModeMenu);
   glutAddMenuEntry("Unscaled", UNSCALED);
   glutAddMenuEntry("Normalize", NORMALIZE);
   glutAddMenuEntry("Rescale EXT", RESCALE);
   glutAddMenuEntry("Quit", QUIT);
   glutAttachMenu(GLUT_RIGHT_BUTTON);

   glutMainLoop();
   return 0;
}