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] = {-93.0f
, 36.0f
, 0.0f
};
26 GLfloat g_fScale
= 1.0f
;
27 GLfloat g_fAlpha
= 1.0f
;
34 gboolean g_bLMBPressed
= FALSE
;
35 gboolean g_bRMBPressed
= FALSE
;
36 GLuint g_auiColorBuffer
[2];
39 delete_handler (GtkWidget
* pWidget
,
43 glDeleteTextures (2, 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 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
))
170 glColor4f (0.0f
, 0.0f
, 0.0f
, 0.0f
);
171 glClearColor (0.0f
, 0.0f
, 0.0f
, 0.0f
);
173 glDisable (GL_DEPTH_TEST
);
174 glEnable (GL_NORMALIZE
);
176 glBlendFunc (GL_SRC_ALPHA
, GL_ONE_MINUS_SRC_ALPHA
);
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
);
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 (2, 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 /* end drawing to current GL-context */
251 gdk_gl_drawable_gl_end (pGlDrawable
);
257 expose_handler (GtkWidget
* pWidget
,
258 GdkEventExpose
* pEvent
,
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
;
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
))
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
,
311 g_pucSurfaceData
[0]);
313 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[1]);
314 glTexImage2D (GL_TEXTURE_RECTANGLE_ARB
,
322 g_pucSurfaceData
[1]);
324 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[0]);
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
);
340 glBindTexture (GL_TEXTURE_RECTANGLE_ARB
, g_auiColorBuffer
[1]);
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
);
358 if (gdk_gl_drawable_is_double_buffered (pGlDrawable
))
359 gdk_gl_drawable_swap_buffers (pGlDrawable
);
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
)
375 g_print ("fps: %d, last frame-time: %f\n", iFrames
, fFrameTimeDelta
);
377 fLastFullSecond
= fCurrentTimeStamp
;
380 fLastTimeStamp
= fCurrentTimeStamp
;
386 key_press_handler (GtkWidget
* pWidget
,
390 if (pEvent
->type
== GDK_KEY_PRESS
)
392 switch (pEvent
->keyval
)
396 delete_handler (pWidget
, NULL
, NULL
);
418 draw_handler (GtkWidget
* pWidget
)
420 gtk_widget_queue_draw (pWidget
);