added accidentally deleted GDK_GL_MODE_ALPHA again and cleaned trailing white-spaces
[gl-cairo-cube.git] / events.c
blobbef86dc04c401a762947aa047bb2278bc7b3c167
1 /*******************************************************************************
2 **3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
3 ** 10 20 30 40 50 60 70 80
4 **
5 ** file:
6 ** events.c
7 **
8 ** author:
9 ** Mirco "MacSlow" Mueller <macslow@bangang.de>
11 ** copyright (C) Mirco Mueller, July 2006, placed under the terms of the GPL
13 *******************************************************************************/
15 #include "events.h"
16 #include "cairo-rendering.h"
18 #include <gdk/gdkkeysyms.h>
19 #include <GL/gl.h>
20 #include <GL/glu.h>
21 #include <GL/glut.h>
23 #include "globals.h"
25 GLfloat g_afAngle[3] = {-93.0f, 36.0f, 0.0f};
26 GLfloat g_fScale = 1.0f;
27 GLfloat g_fAlpha = 1.0f;
28 gdouble g_fCurrentX;
29 gdouble g_fCurrentY;
30 gdouble g_fDeltaX;
31 gdouble g_fDeltaY;
32 gdouble g_fLastX;
33 gdouble g_fLastY;
34 gboolean g_bLMBPressed = FALSE;
35 gboolean g_bRMBPressed = FALSE;
36 GLuint g_auiColorBuffer[2];
38 gboolean
39 delete_handler (GtkWidget* pWidget,
40 GdkEvent* pEvent,
41 gpointer data)
43 glDeleteTextures (2, g_auiColorBuffer);
44 gtk_main_quit ();
45 return TRUE;
48 gboolean
49 button_handler (GtkWidget* pWidget,
50 GdkEventButton* pEvent,
51 gpointer data)
53 switch (pEvent->button)
55 case 1:
56 if (pEvent->type == GDK_BUTTON_PRESS)
58 g_fCurrentX = pEvent->x;
59 g_fCurrentY = pEvent->y;
60 g_fLastX = g_fCurrentX;
61 g_fLastY = g_fCurrentY;
62 g_bLMBPressed = TRUE;
64 else if (pEvent->type == GDK_BUTTON_RELEASE)
65 g_bLMBPressed = FALSE;
66 break;
68 case 3:
69 if (pEvent->type == GDK_BUTTON_PRESS)
71 g_fCurrentX = pEvent->x;
72 g_fCurrentY = pEvent->y;
73 g_fLastX = g_fCurrentX;
74 g_fLastY = g_fCurrentY;
75 g_bRMBPressed = TRUE;
77 else if (pEvent->type == GDK_BUTTON_RELEASE)
78 g_bRMBPressed = FALSE;
79 break;
82 return TRUE;
85 gboolean
86 scroll_handler (GtkWidget* pWidget,
87 GdkEventScroll* pEvent,
88 gpointer data)
90 switch (pEvent->direction)
92 case GDK_SCROLL_UP:
93 if (g_fAlpha < 1.0f)
94 g_fAlpha += 0.05f;
95 break;
97 case GDK_SCROLL_DOWN:
98 if (g_fAlpha > 0.0f)
99 g_fAlpha -= 0.05f;
100 break;
102 /* just silence gcc */
103 default:
104 break;
107 return TRUE;
110 gboolean
111 motion_notify_handler (GtkWidget* pWidget,
112 GdkEventMotion *pEvent,
113 gpointer data)
115 if (g_bLMBPressed)
117 g_fCurrentX = pEvent->x;
118 g_fCurrentY = pEvent->y;
119 g_fDeltaX = g_fLastX - g_fCurrentX;
120 g_fDeltaY = g_fLastY - g_fCurrentY;
121 g_fLastX = g_fCurrentX;
122 g_fLastY = g_fCurrentY;
124 g_afAngle[0] -= g_fDeltaX;
125 g_afAngle[1] -= g_fDeltaY;
126 gtk_widget_queue_draw (pWidget);
129 if (g_bRMBPressed)
131 g_fCurrentY = pEvent->y;
132 g_fDeltaY = g_fLastY - g_fCurrentY;
133 g_fLastY = g_fCurrentY;
135 g_fScale -= g_fDeltaY / 100.0f;
136 gtk_widget_queue_draw (pWidget);
139 return TRUE;
142 void
143 screen_changed_handler (GtkWidget* pWidget,
144 GdkScreen* pOldScreen,
145 gpointer data)
147 GdkScreen* pScreen = gtk_widget_get_screen (pWidget);
148 GdkColormap* pColormap = gdk_screen_get_rgba_colormap (pScreen);
150 if (!pColormap)
152 g_print ("Could not get a RGBA-colormap. Using plain RGB now.\n");
153 pColormap = gdk_screen_get_rgb_colormap (pScreen);
156 gtk_widget_set_colormap (pWidget, pColormap);
159 void
160 realize_handler (GtkWidget* pWidget,
161 gpointer data)
163 GdkGLContext* pGlContext = gtk_widget_get_gl_context (pWidget);
164 GdkGLDrawable* pGlDrawable = gtk_widget_get_gl_drawable (pWidget);
166 /* make GL-context "current" */
167 if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
168 return;
170 glColor4f (0.0f, 0.0f, 0.0f, 0.0f);
171 glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
172 glClearDepth (1.0f);
173 glDisable (GL_DEPTH_TEST);
174 glEnable (GL_NORMALIZE);
175 glEnable (GL_BLEND);
176 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
177 glLineWidth (1.5f);
178 glShadeModel (GL_FLAT);
179 glEnable (GL_TEXTURE_RECTANGLE_ARB);
180 glPolygonMode (GL_FRONT, GL_FILL);
181 glPolygonMode (GL_BACK, GL_FILL);
182 glDisable (GL_CULL_FACE);
183 glLightModelf (GL_LIGHT_MODEL_TWO_SIDE, 0.0f);
184 glEnable (GL_LIGHTING);
185 glEnable (GL_LIGHT0);
187 g_print ("OpenGL version: %s\n", glGetString (GL_VERSION));
188 g_print ("OpenGL vendor: %s\n", glGetString (GL_VENDOR));
189 g_print ("OpenGL renderer: %s\n", glGetString (GL_RENDERER));
191 glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
192 glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
193 glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
195 glMatrixMode (GL_MODELVIEW);
196 glLoadIdentity ();
197 gluLookAt (0.0f, 0.0f, Z_NEAR,
198 0.0f, 0.0f, 0.0f,
199 0.0f, 1.0f, 0.0f);
200 glTranslatef (0.0f, 0.0f, -Z_NEAR);
202 /* end drawing to current GL-context */
203 gdk_gl_drawable_gl_end (pGlDrawable);
206 gboolean
207 configure_handler (GtkWidget* pWidget,
208 GdkEventConfigure* pEvent,
209 gpointer data)
211 GdkGLContext* pGlContext = gtk_widget_get_gl_context (pWidget);
212 GdkGLDrawable* pGlDrawable = gtk_widget_get_gl_drawable (pWidget);
213 GLsizei w = pWidget->allocation.width;
214 GLsizei h = pWidget->allocation.height;
216 /* make GL-context "current" */
217 if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
218 return FALSE;
220 glViewport (0, 0, w, h);
221 glMatrixMode (GL_PROJECTION);
222 glLoadIdentity ();
223 gluPerspective (2.0f * FOVY_2, (GLfloat) w / (GLfloat) h, 0.1f, 50.0f);
225 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
227 glGenTextures (2, g_auiColorBuffer);
228 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[0]);
229 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB,
231 GL_RGBA,
232 g_iWidth,
233 g_iHeight,
235 GL_RGBA,
236 GL_UNSIGNED_BYTE,
237 NULL);
239 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[1]);
240 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB,
242 GL_RGBA,
243 g_iWidth,
244 g_iHeight,
246 GL_RGBA,
247 GL_UNSIGNED_BYTE,
248 NULL);
250 /* end drawing to current GL-context */
251 gdk_gl_drawable_gl_end (pGlDrawable);
253 return TRUE;
256 gboolean
257 expose_handler (GtkWidget* pWidget,
258 GdkEventExpose* pEvent,
259 gpointer data)
261 GdkGLContext* pGlContext = gtk_widget_get_gl_context (pWidget);
262 GdkGLDrawable* pGlDrawable = gtk_widget_get_gl_drawable (pWidget);
263 static gint iFrames = 0;
264 static gdouble fLastTimeStamp = 0.0f;;
265 static gdouble fCurrentTimeStamp = 0.0f;;
266 static gdouble fLastFullSecond = 0.0f;;
267 gdouble fFrameTimeDelta = 0.0f;
268 gdouble fFullSecond = 0.0f;
269 GLfloat afVector[3];
270 GLfloat afMatrixBase[16];
271 GLfloat afFrontDiffuseMat[] = {1.0f * g_fAlpha, 0.5f * g_fAlpha, 0.25f * g_fAlpha, 1.0f * g_fAlpha};
272 GLfloat afBackDiffuseMat[] = {0.25f * g_fAlpha, 0.5f * g_fAlpha, 1.0f * g_fAlpha, 0.9f * g_fAlpha};
274 /* make GL-context "current" */
275 if (!gdk_gl_drawable_gl_begin (pGlDrawable, pGlContext))
276 return FALSE;
278 glPushMatrix ();
279 glTranslatef (0.0f, 0.0f, 0.5f);
280 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
281 glGetFloatv (GL_MODELVIEW_MATRIX, afMatrixBase);
282 afVector[0] = afMatrixBase[0];
283 afVector[1] = afMatrixBase[4];
284 afVector[2] = afMatrixBase[8];
285 glRotatef (g_afAngle[1] * 0.5f, afVector[0], afVector[1], afVector[2]);
286 afVector[0] = afMatrixBase[1];
287 afVector[1] = afMatrixBase[5];
288 afVector[2] = afMatrixBase[9];
289 glRotatef (g_afAngle[0] * 0.5f, afVector[0], afVector[1], afVector[2]);
290 glScalef (g_fScale, g_fScale, g_fScale);
292 glMaterialfv (GL_FRONT, GL_DIFFUSE, afFrontDiffuseMat);
293 glMaterialfv (GL_BACK, GL_DIFFUSE, afBackDiffuseMat);
295 render_zini (g_pCairoContext[0], g_iWidth, g_iHeight);
296 advance (&g_lineOne.start);
297 advance (&g_lineOne.end);
298 advance (&g_lineTwo.start);
299 advance (&g_lineTwo.end);
300 render_curve (g_pCairoContext[1], g_iWidth, g_iHeight, &g_lineOne, &g_lineTwo);
302 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[0]);
303 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB,
305 GL_RGBA,
306 g_iWidth,
307 g_iHeight,
309 GL_RGBA,
310 GL_UNSIGNED_BYTE,
311 g_pucSurfaceData[0]);
313 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[1]);
314 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB,
316 GL_RGBA,
317 g_iWidth,
318 g_iHeight,
320 GL_RGBA,
321 GL_UNSIGNED_BYTE,
322 g_pucSurfaceData[1]);
324 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[0]);
325 glBegin (GL_QUADS);
326 glNormal3f (0.0f, 0.0f, 1.0f);
327 glTexCoord2f (0.0f, 0.0f);
328 glVertex3f (1.0f, 1.0f, 1.0f);
329 glNormal3f (0.0f, 0.0f, 1.0f);
330 glTexCoord2f ((GLfloat) g_iWidth, 0.0f);
331 glVertex3f (-1.0f, 1.0f, 1.0f);
332 glNormal3f (0.0f, 0.0f, 1.0f);
333 glTexCoord2f ((GLfloat) g_iWidth, (GLfloat) g_iHeight);
334 glVertex3f (-1.0f, -1.0f, 1.0f);
335 glNormal3f (0.0f, 0.0f, 1.0f);
336 glTexCoord2f (0.0f, (GLfloat) g_iHeight);
337 glVertex3f (1.0f, -1.0f, 1.0f);
338 glEnd ();
340 glBindTexture (GL_TEXTURE_RECTANGLE_ARB, g_auiColorBuffer[1]);
341 glBegin (GL_QUADS);
342 glNormal3f (1.0f, 0.0f, 0.0f);
343 glTexCoord2f (0.0f, 0.0f);
344 glVertex3f (1.0f, 1.0f, 1.0f);
345 glNormal3f (1.0f, 0.0f, 0.0f);
346 glTexCoord2f ((GLfloat) g_iWidth, 0.0f);
347 glVertex3f (1.0f, 1.0f, -1.0f);
348 glNormal3f (1.0f, 0.0f, 0.0f);
349 glTexCoord2f ((GLfloat) g_iWidth, (GLfloat) g_iHeight);
350 glVertex3f (1.0f, -1.0f, -1.0f);
351 glNormal3f (1.0f, 0.0f, 0.0f);
352 glTexCoord2f (0.0f, (GLfloat) g_iHeight);
353 glVertex3f (1.0f, -1.0f, 1.0f);
354 glEnd ();
356 glPopMatrix ();
358 if (gdk_gl_drawable_is_double_buffered (pGlDrawable))
359 gdk_gl_drawable_swap_buffers (pGlDrawable);
360 else
361 glFlush ();
363 /* end drawing to current GL-context */
364 gdk_gl_drawable_gl_end (pGlDrawable);
366 fCurrentTimeStamp = g_timer_elapsed (g_pTimerId, &g_ulMilliSeconds);
367 g_ulMilliSeconds /= 1000;
368 fFrameTimeDelta = fCurrentTimeStamp - fLastTimeStamp;
369 fFullSecond = fCurrentTimeStamp - fLastFullSecond;
371 if (fFullSecond < 1.0f)
372 iFrames++;
373 else
375 g_print ("fps: %d, last frame-time: %f\n", iFrames, fFrameTimeDelta);
376 iFrames = 0;
377 fLastFullSecond = fCurrentTimeStamp;
380 fLastTimeStamp = fCurrentTimeStamp;
382 return TRUE;
385 gboolean
386 key_press_handler (GtkWidget* pWidget,
387 GdkEventKey* pEvent,
388 GMainLoop* pLoop)
390 if (pEvent->type == GDK_KEY_PRESS)
392 switch (pEvent->keyval)
394 case GDK_q :
395 case GDK_Escape :
396 delete_handler (pWidget, NULL, NULL);
397 break;
399 case GDK_Page_Up :
400 if (g_fAlpha < 1.0f)
401 g_fAlpha += 0.05;
402 break;
404 case GDK_Page_Down :
405 if (g_fAlpha > 0.0f)
406 g_fAlpha -= 0.05;
407 break;
409 default :
410 break;
414 return TRUE;
417 gboolean
418 draw_handler (GtkWidget* pWidget)
420 gtk_widget_queue_draw (pWidget);
422 return TRUE;