ecere/gui/Window: Prevent uninitialized values if base Window methods not overridden...
[sdk] / samples / 3D / OpenGL / glSnippet.ec
1 import "ecere"
2 #include <GL/gl.h>
3
4 static void SetProjection(int width, int height, double zMin, double zMax)
5 {
6    int left = 0, top = 0, right = width - 1, bottom = height - 1;
7    int focalX = (width > height) ? width : height, focalY = focalX;
8    glViewport(0, height - bottom - 1, right - left + 1, bottom - top + 1);
9
10    glMatrixMode(GL_PROJECTION);
11    glLoadIdentity();
12    glFrustum(
13       (left   - (left + right) / 2.0f) * zMin / focalX,
14       (right  - (left + right) / 2.0f) * zMin / focalX,
15       (bottom - (bottom + top) / 2.0f) * zMin / focalY,
16       (top    - (bottom + top) / 2.0f) * zMin / focalY,
17       zMin, zMax);
18 }
19
20 class Snippet : Window
21 {
22    displayDriver = "OpenGL";
23    text = "GL Snippet";
24    nativeDecorations = true, borderStyle = sizable, hasClose = true, hasMaximize = true, hasMinimize = true;
25    background = 0;
26    size = { 640, 480 };
27
28    void OnRedraw(Surface surface)
29    {
30       float halfWhite[] = {0.5f, 0.5f, 0.5f, 1};
31       float black[] = {0, 0, 0, 1};
32       float blue[] = {0.3f, 0.2f, 1, 1};
33       float ambient[4] = { 0.2f, 0.2f, 0.2f };
34       float power = 0;
35       float light[] = { -0.810f, -0.585f, 0.468f, 0 };
36
37       Matrix view
38       {
39          {
40             1, 0, 0, 0,
41             0, 0, 1, 0,
42             0, -1, 0, 0,
43             0, 0, 9000, 1
44          }
45       };
46       Matrix cubeMatrix
47       {
48          {
49             1141.996897, -597.672467, 1529.258222, 0,
50             1427.537483, 1281.712735, -565.109902, 0,
51             -811.159554, 1414.213593, 1158.455908, 0,
52             0, 0, 0, 1
53          }
54       };
55       SetProjection(clientSize.w, clientSize.h, 3, 20000);
56
57       glMatrixMode(GL_MODELVIEW);
58       glLoadIdentity();
59
60       // Opposite hand
61       glScalef(1.0f,1.0f,-1.0f);
62
63       // View Matrix
64       glMultMatrixd(view.array);
65
66       // Setup Lighting (Light in world space)
67       #define GL_RESCALE_NORMAL 0x803A
68       glEnable(GL_RESCALE_NORMAL); // glEnable(GL_NORMALIZE);
69       glEnable(GL_CULL_FACE);
70       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
71       glShadeModel(GL_SMOOTH);
72       glEnable(GL_LIGHTING);
73       glEnable(GL_LIGHT0);
74       glLightfv(GL_LIGHT0, GL_DIFFUSE, halfWhite);
75       glLightfv(GL_LIGHT0, GL_SPECULAR, halfWhite);
76       glLightfv(GL_LIGHT0, GL_POSITION, light);
77
78       // Cube matrix
79       glMultMatrixd(cubeMatrix.array);
80
81       // Material
82       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&blue);
83       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&blue);
84       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&blue);
85       glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&black);
86       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, &power);
87
88       // The Cube
89       glBegin(GL_QUADS);
90
91          glNormal3f(0, -1, 0); glVertex3f(0.5f, -1, -0.5f);
92          glNormal3f(0, -1, 0); glVertex3f(0.5f, -1, 0.5f);
93          glNormal3f(0, -1, 0); glVertex3f(-0.5f, -1, 0.5f);
94          glNormal3f(0, -1, 0); glVertex3f(-0.5f, -1, -0.5f);
95
96          glNormal3f(0, 0, -1); glVertex3f(-0.5f, -1, -0.5f);
97          glNormal3f(0, 0, -1); glVertex3f(-0.5f, 0, -0.5f);
98          glNormal3f(0, 0, -1); glVertex3f(0.5f, 0, -0.5f);
99          glNormal3f(0, 0, -1); glVertex3f(0.5f, -1, -0.5f);
100
101          glNormal3f(0, 1, 0); glVertex3f(0.5f, 0, 0.5f);
102          glNormal3f(0, 1, 0); glVertex3f(0.5f, 0, -0.5f);
103          glNormal3f(0, 1, 0); glVertex3f(-0.5f, 0, -0.5f);
104          glNormal3f(0, 1, 0); glVertex3f(-0.5f, 0, 0.5f);
105
106          glNormal3f(0, 0, 1); glVertex3f(0.5f, -1, 0.5f);
107          glNormal3f(0, 0, 1); glVertex3f(0.5f, 0, 0.5f);
108          glNormal3f(0, 0, 1); glVertex3f(-0.5f, 0, 0.5f);
109          glNormal3f(0, 0, 1); glVertex3f(-0.5f, -1, 0.5f);
110
111          glNormal3f(1, 0, 0); glVertex3f(0.5f, -1, -0.5f);
112          glNormal3f(1, 0, 0); glVertex3f(0.5f, 0, -0.5f);
113          glNormal3f(1, 0, 0); glVertex3f(0.5f, 0, 0.5f);
114          glNormal3f(1, 0, 0); glVertex3f(0.5f, -1, 0.5f);
115
116          glNormal3f(-1, 0, 0); glVertex3f(-0.5f, -1, 0.5f);
117          glNormal3f(-1, 0, 0); glVertex3f(-0.5f, 0, 0.5f);
118          glNormal3f(-1, 0, 0); glVertex3f(-0.5f, 0, -0.5f);
119          glNormal3f(-1, 0, 0); glVertex3f(-0.5f, -1, -0.5f);
120
121       glEnd();
122    }
123 }
124
125 Snippet snippet { anchor = { horz = -160, vert = -120 } };