1 /*******************************************************************************
2 **3456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
3 ** 10 20 30 40 50 60 70 80
9 ** Mirco "MacSlow" Mueller <macslow@bangang.de>
11 ** copyright (C) Mirco Mueller, July 2006, placed under the terms of the GPL
13 *******************************************************************************/
16 #include "cairo-rendering.h"
18 #include <gdk/gdkkeysyms.h>
25 GLfloat g_afAngle
[3] = {260.0f
, -58.0f
, 0.0f
};
26 GLfloat g_fScale
= 1.2f
;
27 GLfloat g_fAlpha
= 1.0f
;
34 gboolean g_bLMBPressed
= FALSE
;
35 gboolean g_bRMBPressed
= FALSE
;
36 GLuint g_auiColorBuffer
[3];
39 delete_handler (GtkWidget
* pWidget
,
43 glDeleteTextures (3, g_auiColorBuffer
);
49 button_handler (GtkWidget
* pWidget
,
50 GdkEventButton
* pEvent
,
53 switch (pEvent
->button
)
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
;
64 else if (pEvent
->type
== GDK_BUTTON_RELEASE
)
65 g_bLMBPressed
= FALSE
;
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
;
77 else if (pEvent
->type
== GDK_BUTTON_RELEASE
)
78 g_bRMBPressed
= FALSE
;
86 scroll_handler (GtkWidget
* pWidget
,
87 GdkEventScroll
* pEvent
,
90 switch (pEvent
->direction
)
102 /* just silence gcc */
111 motion_notify_handler (GtkWidget
* pWidget
,
112 GdkEventMotion
*pEvent
,
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
);
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
);
143 screen_changed_handler (GtkWidget
* pWidget
,
144 GdkScreen
* pOldScreen
,
147 GdkScreen
* pScreen
= gtk_widget_get_screen (pWidget
);
148 GdkColormap
* pColormap
= gdk_screen_get_rgba_colormap (pScreen
);
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
);
160 realize_handler (GtkWidget
* pWidget
,
163 GLfloat afLightDiffuse
[] = {1.0f
, 1.0f
, 1.0f
, 1.0f
};
164 GdkGLContext
* pGlContext
= gtk_widget_get_gl_context (pWidget
);
165 GdkGLDrawable
* pGlDrawable
= gtk_widget_get_gl_drawable (pWidget
);
167 /* make GL-context "current" */
168 if (!gdk_gl_drawable_gl_begin (pGlDrawable
, pGlContext
))
171 glColor4f (1.0f
, 1.0f
, 1.0f
, 1.0f
);
172 glClearColor (0.0f
, 0.0f
, 0.0f
, 0.0f
);
174 glDisable (GL_DEPTH_TEST
);
175 glEnable (GL_NORMALIZE
);
177 glBlendFunc (GL_ONE
, GL_ONE
);
178 glShadeModel (GL_FLAT
);
179 glEnable (GL_TEXTURE_RECTANGLE_ARB
);
180 glPolygonMode (GL_FRONT_AND_BACK
, GL_FILL
);
181 glDisable (GL_CULL_FACE
);
182 glLightModelf (GL_LIGHT_MODEL_TWO_SIDE
, 0.0f
);
183 glEnable (GL_LIGHTING
);
184 glEnable (GL_LIGHT0
);
185 glLightfv (GL_LIGHT0
, GL_DIFFUSE
, afLightDiffuse
);
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
);
197 gluLookAt (0.0f
, 0.0f
, Z_NEAR
,
200 glTranslatef (0.0f
, 0.0f
, -Z_NEAR
);
202 /* end drawing to current GL-context */
203 gdk_gl_drawable_gl_end (pGlDrawable
);
207 configure_handler (GtkWidget
* pWidget
,
208 GdkEventConfigure
* pEvent
,
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
))
220 glViewport (0, 0, w
, h
);
221 glMatrixMode (GL_PROJECTION
);
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 (3, g_auiColorBuffer
);
228 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[0]);
229 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
239 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[1]);
240 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
250 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[2]);
251 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
261 /* end drawing to current GL-context */
262 gdk_gl_drawable_gl_end (pGlDrawable
);
268 expose_handler (GtkWidget
* pWidget
,
269 GdkEventExpose
* pEvent
,
272 GdkGLContext
* pGlContext
= gtk_widget_get_gl_context (pWidget
);
273 GdkGLDrawable
* pGlDrawable
= gtk_widget_get_gl_drawable (pWidget
);
274 static gint iFrames
= 0;
275 static gdouble fLastTimeStamp
= 0.0f
;;
276 static gdouble fCurrentTimeStamp
= 0.0f
;;
277 static gdouble fLastFullSecond
= 0.0f
;;
278 gdouble fFrameTimeDelta
= 0.0f
;
279 gdouble fFullSecond
= 0.0f
;
281 GLfloat afMatrixBase
[16];
282 GLfloat afFrontDiffuseMat
[] = {1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
};
283 GLfloat afBackDiffuseMat
[] = {1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
, 1.0f
* g_fAlpha
};
285 /* make GL-context "current" */
286 if (!gdk_gl_drawable_gl_begin (pGlDrawable
, pGlContext
))
290 glTranslatef (0.0f
, 0.0f
, 0.5f
);
291 glClear (GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
292 glGetFloatv (GL_MODELVIEW_MATRIX
, afMatrixBase
);
293 afVector
[0] = afMatrixBase
[0];
294 afVector
[1] = afMatrixBase
[4];
295 afVector
[2] = afMatrixBase
[8];
296 glRotatef (g_afAngle
[1] * 0.5f
, afVector
[0], afVector
[1], afVector
[2]);
297 afVector
[0] = afMatrixBase
[1];
298 afVector
[1] = afMatrixBase
[5];
299 afVector
[2] = afMatrixBase
[9];
300 glRotatef (g_afAngle
[0] * 0.5f
, afVector
[0], afVector
[1], afVector
[2]);
301 glScalef (g_fScale
, g_fScale
, g_fScale
);
303 glMaterialfv (GL_FRONT
, GL_DIFFUSE
, afFrontDiffuseMat
);
304 glMaterialfv (GL_BACK
, GL_DIFFUSE
, afBackDiffuseMat
);
306 render_zini (g_pCairoContext
[0], g_iWidth
, g_iHeight
);
307 advance (&g_lineOne
.start
);
308 advance (&g_lineOne
.end
);
309 advance (&g_lineTwo
.start
);
310 advance (&g_lineTwo
.end
);
311 render_curve (g_pCairoContext
[1], g_iWidth
, g_iHeight
, &g_lineOne
, &g_lineTwo
);
312 render_flower (g_pCairoContext
[2], g_iWidth
, g_iHeight
);
314 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[0]);
315 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
323 g_pucSurfaceData
[0]);
325 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[1]);
326 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
334 g_pucSurfaceData
[1]);
336 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[2]);
337 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
345 g_pucSurfaceData
[2]);
347 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[0]);
349 glNormal3f (1.0f
, 0.0f
, 0.0f
);
350 glTexCoord2f (0.0f
, 0.0f
);
351 glVertex3f (1.0f
, 1.0f
, 1.0f
);
352 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
353 glVertex3f (1.0f
, 1.0f
, -1.0f
);
354 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
355 glVertex3f (1.0f
, -1.0f
, -1.0f
);
356 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
357 glVertex3f (1.0f
, -1.0f
, 1.0f
);
359 glNormal3f (0.0f
, 1.0f
, 0.0f
);
360 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
361 glVertex3f (1.0f
, 1.0f
, 1.0f
);
362 glTexCoord2f (0.0f
, 0.0f
);
363 glVertex3f (1.0f
, 1.0f
, -1.0f
);
364 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
365 glVertex3f (-1.0f
, 1.0f
, -1.0f
);
366 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
367 glVertex3f (-1.0f
, 1.0f
, 1.0f
);
370 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[1]);
372 glNormal3f (0.0f
, 0.0f
, 1.0f
);
373 glTexCoord2f (0.0f
, 0.0f
);
374 glVertex3f (1.0f
, 1.0f
, 1.0f
);
375 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
376 glVertex3f (-1.0f
, 1.0f
, 1.0f
);
377 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
378 glVertex3f (-1.0f
, -1.0f
, 1.0f
);
379 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
380 glVertex3f (1.0f
, -1.0f
, 1.0f
);
382 glNormal3f (0.0f
, -1.0f
, 0.0f
);
383 glTexCoord2f (0.0f
, 0.0f
);
384 glVertex3f (1.0f
, -1.0f
, 1.0f
);
385 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
386 glVertex3f (1.0f
, -1.0f
, -1.0f
);
387 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
388 glVertex3f (-1.0f
, -1.0f
, -1.0f
);
389 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
390 glVertex3f (-1.0f
, -1.0f
, 1.0f
);
393 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[2]);
395 glNormal3f (-1.0f
, 0.0f
, 0.0f
);
396 glTexCoord2f (0.0f
, 0.0f
);
397 glVertex3f (-1.0f
, 1.0f
, 1.0f
);
398 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
399 glVertex3f (-1.0f
, 1.0f
, -1.0f
);
400 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
401 glVertex3f (-1.0f
, -1.0f
, -1.0f
);
402 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
403 glVertex3f (-1.0f
, -1.0f
, 1.0f
);
405 glNormal3f (0.0f
, 0.0f
, -1.0f
);
406 glTexCoord2f (0.0f
, (GLfloat
) g_iHeight
);
407 glVertex3f (1.0f
, 1.0f
, -1.0f
);
408 glTexCoord2f (0.0f
, 0.0f
);
409 glVertex3f (-1.0f
, 1.0f
, -1.0f
);
410 glTexCoord2f ((GLfloat
) g_iWidth
, 0.0f
);
411 glVertex3f (-1.0f
, -1.0f
, -1.0f
);
412 glTexCoord2f ((GLfloat
) g_iWidth
, (GLfloat
) g_iHeight
);
413 glVertex3f (1.0f
, -1.0f
, -1.0f
);
418 if (gdk_gl_drawable_is_double_buffered (pGlDrawable
))
419 gdk_gl_drawable_swap_buffers (pGlDrawable
);
423 /* end drawing to current GL-context */
424 gdk_gl_drawable_gl_end (pGlDrawable
);
426 fCurrentTimeStamp
= g_timer_elapsed (g_pTimerId
, &g_ulMilliSeconds
);
427 g_ulMilliSeconds
/= 1000;
428 fFrameTimeDelta
= fCurrentTimeStamp
- fLastTimeStamp
;
429 fFullSecond
= fCurrentTimeStamp
- fLastFullSecond
;
431 if (fFullSecond
< 1.0f
)
435 g_print ("fps: %d, last frame-time: %f\n", iFrames
, fFrameTimeDelta
);
437 fLastFullSecond
= fCurrentTimeStamp
;
440 fLastTimeStamp
= fCurrentTimeStamp
;
446 key_press_handler (GtkWidget
* pWidget
,
450 if (pEvent
->type
== GDK_KEY_PRESS
)
452 switch (pEvent
->keyval
)
456 delete_handler (pWidget
, NULL
, NULL
);
478 draw_handler (GtkWidget
* pWidget
)
480 gtk_widget_queue_draw (pWidget
);