310
429
if (iBitsPerChannel != 8)
312
431
g_object_unref (pSrcPixbuf);
313
glDeleteTextures (1, &uiTextureId);
317
/* add an alpha-channel if not already present and user wants to trim */
318
if (!gdk_pixbuf_get_has_alpha (pSrcPixbuf) && bTrim)
319
pNewPixbuf = gdk_pixbuf_add_alpha (pSrcPixbuf, FALSE, 0, 0, 0);
321
pNewPixbuf = gdk_pixbuf_copy (pSrcPixbuf);
323
/* the source pixbuf is no longer needed */
324
g_object_unref (pSrcPixbuf);
326
/* check if the new pixbuf was created successfully */
327
if (pNewPixbuf == NULL)
329
glDeleteTextures (1, &uiTextureId);
432
g_free ((gpointer) pTexture);
433
glDeleteTextures (1, &uiTextureId);
333
437
/* determine the number of components */
334
iChannels = gdk_pixbuf_get_n_channels (pNewPixbuf);
438
iChannels = gdk_pixbuf_get_n_channels (pSrcPixbuf);
336
440
/* get hold of dimensions and pixel-data */
337
iWidth = gdk_pixbuf_get_width (pNewPixbuf);
338
iHeight = gdk_pixbuf_get_height (pNewPixbuf);
339
pucPixelBuffer = gdk_pixbuf_get_pixels (pNewPixbuf);
441
iWidth = gdk_pixbuf_get_width (pSrcPixbuf);
442
iHeight = gdk_pixbuf_get_height (pSrcPixbuf);
443
pucPixelBuffer = gdk_pixbuf_get_pixels (pSrcPixbuf);
446
blur (pucPixelBuffer,
453
glow (pucPixelBuffer,
461
pTexture->uiTextureId = uiTextureId;
462
pTexture->uiUnit = uiUnit;
466
pTexture->fWidth = (GLfloat) iGlowWidth;
467
pTexture->fHeight = (GLfloat) iGlowHeight;
471
pTexture->fWidth = (GLfloat) iWidth;
472
pTexture->fHeight = (GLfloat) iHeight;
475
pTexture->iTarget = opengl_what_texture_target (pTexture->fWidth,
477
pTexture->iBufferSize = 0;
478
pTexture->pucBufferData = NULL;
480
pTexture->fMinS = 0.0f;
481
pTexture->fMinT = 0.0f;
482
pTexture->fMaxS = (pTexture->iTarget == GL_TEXTURE_2D) ? 1.0f : pTexture->fWidth;
483
pTexture->fMaxT = (pTexture->iTarget == GL_TEXTURE_2D) ? 1.0f : pTexture->fHeight;
341
485
/* see if the texture would fit */
342
if (!opengl_texture_proxy_check (iTarget,
486
if (!opengl_texture_proxy_check (pTexture->iTarget,
344
488
(iChannels == 4) ? GL_RGBA : GL_RGB,
489
(GLint) pTexture->fWidth,
490
(GLint) pTexture->fHeight))
493
g_free ((gpointer) pucGlowBuffer);
495
g_object_unref (pSrcPixbuf);
496
g_free ((gpointer) pTexture);
497
glDeleteTextures (1, &pTexture->uiTextureId);
501
/* finally create the GL texture-object */
502
glActiveTexture (pTexture->uiUnit);
503
glBindTexture (pTexture->iTarget, pTexture->uiTextureId);
504
glTexParameteri (pTexture->iTarget,
505
GL_TEXTURE_MIN_FILTER,
507
glTexParameteri (pTexture->iTarget,
508
GL_TEXTURE_MAG_FILTER,
511
glTexImage2D (pTexture->iTarget,
514
(GLsizei) pTexture->fWidth,
515
(GLsizei) pTexture->fHeight,
517
(iChannels == 4) ? GL_RGBA : GL_RGB,
521
glTexImage2D (pTexture->iTarget,
524
(GLsizei) pTexture->fWidth,
525
(GLsizei) pTexture->fHeight,
527
(iChannels == 4) ? GL_RGBA : GL_RGB,
531
g_object_unref (pSrcPixbuf);
534
g_free ((gpointer) pucGlowBuffer);
540
opengl_upload_mask (GLenum iTarget, /* GL texture-target to use */
541
GLuint uiUnit, /* GL multi-texture unit to use */
542
GLint iWidth, /* width of mask texture */
543
GLint iHeight /* height of mask texture */)
545
GLuint uiTextureId = 0;
546
guchar* pucPixelBuffer = NULL;
547
Texture* pTexture = NULL;
550
/* create a texture-object */
551
pTexture = (Texture*) g_malloc0 (sizeof (Texture));
555
/* create a GL texture-handle */
556
glGenTextures (1, &uiTextureId);
557
if (uiTextureId == 0)
559
g_free ((gpointer) pTexture);
563
/* see if the texture would fit */
564
if (!opengl_texture_proxy_check (iTarget,
348
g_object_unref (pNewPixbuf);
349
glDeleteTextures (1, &uiTextureId);
353
/* the MacSlow-ish aa-trick */
355
cairo_trim_image (pucPixelBuffer,
570
g_free ((gpointer) pTexture);
571
glDeleteTextures (1, &uiTextureId);
575
/* create pixel-buffer */
576
pucPixelBuffer = (guchar*) g_malloc0 (iWidth * iHeight * 4);
579
g_free ((gpointer) pTexture);
580
glDeleteTextures (1, &uiTextureId);
584
for (i = 0; i < iWidth * iHeight * 4; i++)
585
pucPixelBuffer[i] = 255;
588
cairo_trim_image (pucPixelBuffer,
593
pTexture->iTarget = iTarget;
594
pTexture->uiTextureId = uiTextureId;
595
pTexture->uiUnit = uiUnit;
596
pTexture->fWidth = (GLfloat) iWidth;
597
pTexture->fHeight = (GLfloat) iHeight;
598
pTexture->iBufferSize = 0;
599
pTexture->pucBufferData = NULL;
360
601
/* finally create the GL texture-object */
361
glBindTexture (iTarget, uiTextureId);
362
glTexParameteri (iTarget,
602
glActiveTexture (pTexture->uiUnit);
603
glBindTexture (pTexture->iTarget, pTexture->uiTextureId);
604
glTexParameteri (pTexture->iTarget,
363
605
GL_TEXTURE_MIN_FILTER,
365
glTexParameteri (iTarget,
607
glTexParameteri (pTexture->iTarget,
366
608
GL_TEXTURE_MAG_FILTER,
368
glTexImage2D (iTarget,
374
(iChannels == 4) ? GL_RGBA : GL_RGB,
610
glTexImage2D (pTexture->iTarget,
613
(GLsizei) pTexture->fWidth,
614
(GLsizei) pTexture->fHeight,
375
617
GL_UNSIGNED_BYTE,
377
g_object_unref (pNewPixbuf);
620
g_free ((gpointer) pucPixelBuffer);
386
626
opengl_upload_text_texture (gchar* pcText, /* text to render into texture */
627
GLuint uiUnit, /* GL multi-texture unit to use */
387
628
GLint iWidth, /* width of win. text appears in */
388
629
GLint iHeight /* height of win. text appears in */)
604
876
** regarding this issue: remember id-software games, which are OpenGL-
605
877
** -based... they regenerate all their game resources if you alter the
606
878
** game-resolution) */
607
glDeleteTextures (3, g_auiTextureIds);
608
g_auiTextureIds[0] = opengl_upload_texture (GL_TEXTURE_2D,
611
g_auiTextureIds[1] = opengl_upload_texture (GL_TEXTURE_2D,
614
g_auiTextureIds[2] = opengl_upload_texture (GL_TEXTURE_2D,
618
g_slice_free1 (sizeof (Texture), (gpointer) g_apTextTextures[0]);
619
g_slice_free1 (sizeof (Texture), (gpointer) g_apTextTextures[1]);
620
g_slice_free1 (sizeof (Texture), (gpointer) g_apTextTextures[2]);
621
g_apTextTextures[0] = opengl_upload_text_texture ("trimmed in Gimp",
624
g_apTextTextures[1] = opengl_upload_text_texture ("trimmed with cairo",
627
g_apTextTextures[2] = opengl_upload_text_texture ("untrimmed",
879
opengl_delete_texture (g_apTextures[0]);
880
opengl_delete_texture (g_apTextures[1]);
881
opengl_delete_texture (g_apTextures[2]);
882
opengl_delete_texture (g_apTextures[3]);
883
opengl_delete_texture (g_apTextures[4]);
884
g_apTextures[0] = opengl_upload_texture (GL_TEXTURE0,
888
g_apTextures[1] = opengl_upload_texture (GL_TEXTURE0,
892
g_apTextures[2] = opengl_upload_texture (GL_TEXTURE0,
896
g_apTextures[3] = opengl_upload_mask (GL_TEXTURE_2D,
900
g_apTextures[4] = opengl_upload_texture (GL_TEXTURE0,
904
g_apTextures[5] = opengl_upload_texture (GL_TEXTURE0,
909
opengl_delete_texture (g_apTextTextures[0]);
910
opengl_delete_texture (g_apTextTextures[1]);
911
opengl_delete_texture (g_apTextTextures[2]);
912
g_apTextTextures[0] = opengl_upload_text_texture ("embossed (GPU)",
916
g_apTextTextures[1] = opengl_upload_text_texture ("blurred (GPU)",
920
g_apTextTextures[2] = opengl_upload_text_texture ("edge-detect (GPU)",
927
opengl_draw_textured_quad (Texture* pTexture, /* texture to use */
928
GLuint uiFragProg, /* shader to use */
929
GLfloat* pfPosition, /* position of quad */
930
GLfloat fAngle, /* current rotation angle */
931
GLfloat* pfAxis, /* rotation-axis */
932
gboolean bNormal, /* normal or reflected */
933
GLfloat fValue /* value to pass to shader */)
935
GLfloat afMaterialDiffuseFrontFull[4] = {1.0f, 1.0f, 1.0f, 1.0f};
936
GLfloat afMaterialDiffuseBackFull[4] = {0.0f, 0.16f, 0.31f, 1.0f};
937
GLfloat afMaterialDiffuseFrontOff[4] = {1.0f, 1.0f, 1.0f, 0.0f};
938
GLfloat afMaterialDiffuseBackOff[4] = {0.0f, 0.16f, 0.31f, 0.0f};
939
GLfloat afMaterialDiffuseFrontQuarter[4] = {1.0f, 1.0f, 1.0f, 0.25f};
940
GLfloat afMaterialDiffuseBackQuarter[4] = {0.0f, 0.16f, 0.31f, 0.25f};
941
GLfloat fPixelSize = 0.0f;
944
g_assert (pTexture != NULL);
945
g_assert (pfPosition != NULL);
946
g_assert (pfAxis != NULL);
948
glActiveTexture (pTexture->uiUnit);
949
glEnable (pTexture->iTarget);
950
glBindTexture (pTexture->iTarget, pTexture->uiTextureId);
951
glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, uiFragProg);
953
fPixelSize = 1.0f / pTexture->fWidth;
955
glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB,
963
glTranslatef (pfPosition[X], pfPosition[Y], pfPosition[Z]);
964
glRotatef (fAngle, pfAxis[X], pfAxis[Y], pfAxis[Z]);
970
glNormal3f (0.0f, 0.0f, 1.0f);
971
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
972
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontFull);
973
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackFull);
974
glMultiTexCoord2fARB (pTexture->uiUnit,
977
glMultiTexCoord2fARB (GL_TEXTURE2,
979
pTexture->fMaxT - fPixelSize);
980
glMultiTexCoord2fARB (GL_TEXTURE3,
981
pTexture->fMinS + fPixelSize,
983
glMultiTexCoord2fARB (GL_TEXTURE4,
985
pTexture->fMaxT + fPixelSize);
986
glMultiTexCoord2fARB (GL_TEXTURE5,
987
pTexture->fMinS - fPixelSize,
989
glMultiTexCoord2fARB (GL_TEXTURE6,
991
pTexture->fMaxT + fPixelSize);
992
glMultiTexCoord2fARB (GL_TEXTURE7,
993
pTexture->fMinS + fPixelSize,
995
glVertex3f (-1.5f, -1.525f, 0.0f);
997
glMultiTexCoord2fARB (pTexture->uiUnit,
1000
glMultiTexCoord2fARB (GL_TEXTURE2,
1002
pTexture->fMaxT - fPixelSize);
1003
glMultiTexCoord2fARB (GL_TEXTURE3,
1004
pTexture->fMaxS + fPixelSize,
1006
glMultiTexCoord2fARB (GL_TEXTURE4,
1008
pTexture->fMaxT + fPixelSize);
1009
glMultiTexCoord2fARB (GL_TEXTURE5,
1010
pTexture->fMaxS - fPixelSize,
1012
glMultiTexCoord2fARB (GL_TEXTURE6,
1014
pTexture->fMaxT + fPixelSize);
1015
glMultiTexCoord2fARB (GL_TEXTURE7,
1016
pTexture->fMaxS + fPixelSize,
1018
glVertex3f ( 1.5f, -1.525f, 0.0f);
1020
glMultiTexCoord2fARB (pTexture->uiUnit,
1023
glMultiTexCoord2fARB (GL_TEXTURE2,
1025
pTexture->fMinT - fPixelSize);
1026
glMultiTexCoord2fARB (GL_TEXTURE3,
1027
pTexture->fMaxS + fPixelSize,
1029
glMultiTexCoord2fARB (GL_TEXTURE4,
1031
pTexture->fMinT + fPixelSize);
1032
glMultiTexCoord2fARB (GL_TEXTURE5,
1033
pTexture->fMaxS - fPixelSize,
1035
glMultiTexCoord2fARB (GL_TEXTURE6,
1037
pTexture->fMinT + fPixelSize);
1038
glMultiTexCoord2fARB (GL_TEXTURE7,
1039
pTexture->fMaxS + fPixelSize,
1041
glVertex3f ( 1.5f, 1.475f, 0.0f);
1043
glMultiTexCoord2fARB (pTexture->uiUnit,
1046
glMultiTexCoord2fARB (GL_TEXTURE2,
1048
pTexture->fMinT - fPixelSize);
1049
glMultiTexCoord2fARB (GL_TEXTURE3,
1050
pTexture->fMinS + fPixelSize,
1052
glMultiTexCoord2fARB (GL_TEXTURE4,
1054
pTexture->fMinT + fPixelSize);
1055
glMultiTexCoord2fARB (GL_TEXTURE5,
1056
pTexture->fMinS - fPixelSize,
1058
glMultiTexCoord2fARB (GL_TEXTURE6,
1060
pTexture->fMinT + fPixelSize);
1061
glMultiTexCoord2fARB (GL_TEXTURE7,
1062
pTexture->fMinS + fPixelSize,
1064
glVertex3f (-1.5f, 1.475f, 0.0f);
1068
glNormal3f (0.0f, 0.0f, 1.0f);
1069
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
1070
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontOff);
1071
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackOff);
1072
glMultiTexCoord2fARB (pTexture->uiUnit,
1074
pTexture->fMaxT * 0.5f);
1075
glMultiTexCoord2fARB (GL_TEXTURE2,
1077
pTexture->fMaxT * 0.5f - fPixelSize);
1078
glMultiTexCoord2fARB (GL_TEXTURE3,
1079
pTexture->fMinS + fPixelSize,
1080
pTexture->fMaxT * 0.5f);
1081
glMultiTexCoord2fARB (GL_TEXTURE4,
1083
pTexture->fMaxT * 0.5f + fPixelSize);
1084
glMultiTexCoord2fARB (GL_TEXTURE5,
1085
pTexture->fMinS - fPixelSize,
1086
pTexture->fMaxT * 0.5f);
1087
glMultiTexCoord2fARB (GL_TEXTURE6,
1089
pTexture->fMaxT * 0.5f + fPixelSize);
1090
glMultiTexCoord2fARB (GL_TEXTURE7,
1091
pTexture->fMinS + fPixelSize,
1092
pTexture->fMaxT * 0.5f);
1093
glVertex3f (-1.5f, -2.75f, 0.0f);
1095
glMultiTexCoord2fARB (pTexture->uiUnit,
1097
pTexture->fMaxT * 0.5f);
1098
glMultiTexCoord2fARB (GL_TEXTURE2,
1100
pTexture->fMaxT * 0.5f - fPixelSize);
1101
glMultiTexCoord2fARB (GL_TEXTURE3,
1102
pTexture->fMaxS + fPixelSize,
1103
pTexture->fMaxT * 0.5f);
1104
glMultiTexCoord2fARB (GL_TEXTURE4,
1106
pTexture->fMaxT * 0.5f + fPixelSize);
1107
glMultiTexCoord2fARB (GL_TEXTURE5,
1108
pTexture->fMaxS - fPixelSize,
1109
pTexture->fMaxT * 0.5f);
1110
glMultiTexCoord2fARB (GL_TEXTURE6,
1112
pTexture->fMaxT * 0.5f + fPixelSize);
1113
glMultiTexCoord2fARB (GL_TEXTURE7,
1114
pTexture->fMaxS + fPixelSize,
1115
pTexture->fMaxT * 0.5f);
1116
glVertex3f ( 1.5f, -2.75f, 0.0f);
1118
glColor4f (1.0f, 1.0f, 1.0f, 0.25f);
1119
glMaterialfv (GL_FRONT,
1121
afMaterialDiffuseFrontQuarter);
1122
glMaterialfv (GL_BACK,
1124
afMaterialDiffuseBackQuarter);
1125
glMultiTexCoord2fARB (pTexture->uiUnit,
1128
glMultiTexCoord2fARB (GL_TEXTURE2,
1130
pTexture->fMaxT - fPixelSize);
1131
glMultiTexCoord2fARB (GL_TEXTURE3,
1132
pTexture->fMaxS + fPixelSize,
1134
glMultiTexCoord2fARB (GL_TEXTURE4,
1136
pTexture->fMaxT + fPixelSize);
1137
glMultiTexCoord2fARB (GL_TEXTURE5,
1138
pTexture->fMaxS - fPixelSize,
1140
glMultiTexCoord2fARB (GL_TEXTURE6,
1142
pTexture->fMaxT + fPixelSize);
1143
glMultiTexCoord2fARB (GL_TEXTURE7,
1144
pTexture->fMaxS + fPixelSize,
1146
glVertex3f ( 1.5f, -1.475f, 0.0f);
1148
glMultiTexCoord2fARB (pTexture->uiUnit,
1151
glMultiTexCoord2fARB (GL_TEXTURE2,
1153
pTexture->fMaxT - fPixelSize);
1154
glMultiTexCoord2fARB (GL_TEXTURE3,
1155
pTexture->fMinS + fPixelSize,
1157
glMultiTexCoord2fARB (GL_TEXTURE4,
1159
pTexture->fMaxT + fPixelSize);
1160
glMultiTexCoord2fARB (GL_TEXTURE5,
1161
pTexture->fMinS - fPixelSize,
1163
glMultiTexCoord2fARB (GL_TEXTURE6,
1165
pTexture->fMaxT + fPixelSize);
1166
glMultiTexCoord2fARB (GL_TEXTURE7,
1167
pTexture->fMinS + fPixelSize,
1169
glVertex3f (-1.5f, -1.475f, 0.0f);
1174
glDisable (pTexture->iTarget);
1178
opengl_blur_pass (Texture* pSrcTexture, /* texture to read from */
1179
Texture* pDstTexture, /* texture to write to */
1180
GLuint uiFragProg, /* shader to use */
1181
GLfloat fDeviation, /* std. deviatino to use */
1182
PassDirection direction, /* do which pass of the blur */
1183
GLint iWindowWidth, /* width of window/context */
1184
GLint iWindowHeight /* height of window/context */)
1186
static GLfloat fPixelSize = 0.0f;
1187
static GLfloat afKernel[12];
1188
static GLfloat aafVertices[4][3];
1190
opengl_change_projection (TRUE, iWindowWidth, iWindowHeight);
1191
glDisable (GL_LIGHTING);
1192
glEnable (pSrcTexture->iTarget);
1193
glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, uiFragProg);
1194
glActiveTexture (pSrcTexture->uiUnit);
1195
glBindTexture (pSrcTexture->iTarget,
1196
pSrcTexture->uiTextureId);
1198
compute_1d_kernel (5, fDeviation, afKernel);
1200
if (direction == VERTICAL_PASS)
1202
fPixelSize = 1.0f / pSrcTexture->fHeight;
1204
aafVertices[0][X] = 0.0f;
1205
aafVertices[0][Y] = pSrcTexture->fHeight;
1206
aafVertices[0][Z] = 0.0f;
1208
aafVertices[1][X] = pSrcTexture->fWidth;
1209
aafVertices[1][Y] = pSrcTexture->fHeight;
1210
aafVertices[1][Z] = 0.0f;
1212
aafVertices[2][X] = pSrcTexture->fWidth;
1213
aafVertices[2][Y] = 0.0f;
1214
aafVertices[2][Z] = 0.0f;
1216
aafVertices[3][X] = 0.0f;
1217
aafVertices[3][Y] = 0.0f;
1218
aafVertices[3][Z] = 0.0f;
1220
else if (direction == HORIZONTAL_PASS)
1222
fPixelSize = 1.0f / pSrcTexture->fWidth;
1224
aafVertices[0][X] = 0.0f;
1225
aafVertices[0][Y] = pSrcTexture->fHeight;
1226
aafVertices[0][Z] = 0.0f;
1228
aafVertices[1][X] = pSrcTexture->fWidth;
1229
aafVertices[1][Y] = pSrcTexture->fHeight;
1230
aafVertices[1][Z] = 0.0f;
1232
aafVertices[2][X] = pSrcTexture->fWidth;
1233
aafVertices[2][Y] = 0.0f;
1234
aafVertices[2][Z] = 0.0f;
1236
aafVertices[3][X] = 0.0f;
1237
aafVertices[3][Y] = 0.0f;
1238
aafVertices[3][Z] = 0.0f;
1241
afKernel[11] = fPixelSize;
1243
glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB,
1249
glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB,
1255
glProgramLocalParameter4fARB (GL_FRAGMENT_PROGRAM_ARB,
1263
glTranslatef ((GLfloat) iWindowWidth / -2.0f,
1264
(GLfloat) iWindowHeight / -2.0f,
1267
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
1269
glMultiTexCoord2fARB (GL_TEXTURE0, fPixelSize * -5.0f, 1.0f);
1270
glMultiTexCoord2fARB (GL_TEXTURE1, fPixelSize * -4.0f, 1.0f);
1271
glMultiTexCoord2fARB (GL_TEXTURE2, fPixelSize * -3.0f, 1.0f);
1272
glMultiTexCoord2fARB (GL_TEXTURE3, fPixelSize * -2.0f, 1.0f);
1273
glMultiTexCoord2fARB (GL_TEXTURE4, fPixelSize * -1.0f, 1.0f);
1274
glMultiTexCoord2fARB (GL_TEXTURE5, fPixelSize * 0.0f, 1.0f);
1275
glMultiTexCoord2fARB (GL_TEXTURE6, fPixelSize * 1.0f, 1.0f);
1276
glMultiTexCoord2fARB (GL_TEXTURE7, fPixelSize * 2.0f, 1.0f);
1277
glVertex3f (aafVertices[0][X], aafVertices[0][Y], aafVertices[0][Z]);
1279
glMultiTexCoord2fARB (GL_TEXTURE0, fPixelSize * -5.0f, 0.0f);
1280
glMultiTexCoord2fARB (GL_TEXTURE1, fPixelSize * -4.0f, 0.0f);
1281
glMultiTexCoord2fARB (GL_TEXTURE2, fPixelSize * -3.0f, 0.0f);
1282
glMultiTexCoord2fARB (GL_TEXTURE3, fPixelSize * -2.0f, 0.0f);
1283
glMultiTexCoord2fARB (GL_TEXTURE4, fPixelSize * -1.0f, 0.0f);
1284
glMultiTexCoord2fARB (GL_TEXTURE5, fPixelSize * 0.0f, 0.0f);
1285
glMultiTexCoord2fARB (GL_TEXTURE6, fPixelSize * 1.0f, 0.0f);
1286
glMultiTexCoord2fARB (GL_TEXTURE7, fPixelSize * 2.0f, 0.0f);
1287
glVertex3f (aafVertices[1][X], aafVertices[1][Y], aafVertices[1][Z]);
1289
glMultiTexCoord2fARB (GL_TEXTURE0, 1.0f + fPixelSize * -5.0f, 0.0f);
1290
glMultiTexCoord2fARB (GL_TEXTURE1, 1.0f + fPixelSize * -4.0f, 0.0f);
1291
glMultiTexCoord2fARB (GL_TEXTURE2, 1.0f + fPixelSize * -3.0f, 0.0f);
1292
glMultiTexCoord2fARB (GL_TEXTURE3, 1.0f + fPixelSize * -2.0f, 0.0f);
1293
glMultiTexCoord2fARB (GL_TEXTURE4, 1.0f + fPixelSize * -1.0f, 0.0f);
1294
glMultiTexCoord2fARB (GL_TEXTURE5, 1.0f + fPixelSize * 0.0f, 0.0f);
1295
glMultiTexCoord2fARB (GL_TEXTURE6, 1.0f + fPixelSize * 1.0f, 0.0f);
1296
glMultiTexCoord2fARB (GL_TEXTURE7, 1.0f + fPixelSize * 2.0f, 0.0f);
1297
glVertex3f (aafVertices[2][X], aafVertices[2][Y], aafVertices[2][Z]);
1299
glMultiTexCoord2fARB (GL_TEXTURE0, 1.0f + fPixelSize * -5.0f, 1.0f);
1300
glMultiTexCoord2fARB (GL_TEXTURE1, 1.0f + fPixelSize * -4.0f, 1.0f);
1301
glMultiTexCoord2fARB (GL_TEXTURE2, 1.0f + fPixelSize * -3.0f, 1.0f);
1302
glMultiTexCoord2fARB (GL_TEXTURE3, 1.0f + fPixelSize * 2.0f, 1.0f);
1303
glMultiTexCoord2fARB (GL_TEXTURE4, 1.0f + fPixelSize * 1.0f, 1.0f);
1304
glMultiTexCoord2fARB (GL_TEXTURE5, 1.0f + fPixelSize * 0.0f, 1.0f);
1305
glMultiTexCoord2fARB (GL_TEXTURE6, 1.0f + fPixelSize * 1.0f, 1.0f);
1306
glMultiTexCoord2fARB (GL_TEXTURE7, 1.0f + fPixelSize * 2.0f, 1.0f);
1307
glVertex3f (aafVertices[3][X], aafVertices[3][Y], aafVertices[3][Z]);
1311
glDisable (pSrcTexture->iTarget);
1313
/* read-back the blurred image */
1314
glEnable (pDstTexture->iTarget);
1315
glBindTexture (pDstTexture->iTarget,
1316
pDstTexture->uiTextureId);
1317
glCopyTexSubImage2D (pDstTexture->iTarget,
1323
pDstTexture->fWidth,
1324
pDstTexture->fHeight);
1325
glDisable (pDstTexture->iTarget);
632
1328
/* the main action takes place here once everything is setup; this is what gets
633
1329
** called very time we force a refresh/redraw of the window */
635
opengl_draw (GLsizei iWidth, /* current width of the GL-context */
636
GLsizei iHeight /* current height of the GL-context */)
1331
opengl_draw (GLsizei iWidth, /* current width of the GL-context */
1332
GLsizei iHeight, /* current height of the GL-context */
1333
GLfloat fFactor /* some factor to use for anything */)
638
1335
static GLfloat fAngle = 0.0f;
639
GLfloat afMaterialDiffuseFrontFull[4] = {1.0f, 1.0f, 1.0f, 1.0f};
640
GLfloat afMaterialDiffuseBackFull[4] = {0.0f, 0.16f, 0.31f, 1.0f};
641
GLfloat afMaterialDiffuseFrontOff[4] = {1.0f, 1.0f, 1.0f, 0.0f};
642
GLfloat afMaterialDiffuseBackOff[4] = {0.0f, 0.16f, 0.31f, 0.0f};
643
GLfloat afMaterialDiffuseFrontQuarter[4] = {1.0f, 1.0f, 1.0f, 0.25f};
644
GLfloat afMaterialDiffuseBackQuarter[4] = {0.0f, 0.16f, 0.31f, 0.25f};
1336
static GLfloat afAxis[] = {0.0f, 1.0f, 0.0f};
1337
static GLfloat afPosition[] = {0.0f, 0.0f, 0.0f};
1338
static GLfloat fOldFactor = 0.0f;
646
1340
glClear (GL_COLOR_BUFFER_BIT);
1342
if (fOldFactor != fFactor)
1346
opengl_blur_pass (g_apTextures[1],
1353
opengl_blur_pass (g_apTextures[4],
1360
for (iPass = 0; iPass < 5; iPass++)
1362
opengl_blur_pass (g_apTextures[5],
1369
opengl_blur_pass (g_apTextures[4],
1378
fOldFactor = fFactor;
648
1381
/* disable texturing and lighting and draw the background using the
649
1382
** first shader */
650
1383
opengl_change_projection (TRUE, iWidth, iHeight);
654
1387
glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, g_auiFragProgs[0]);
655
1388
opengl_paint_bg (-iWidth/2.0f, -iHeight/2.0f, iWidth, iHeight);
657
/* enable texturing and lighting and draw the spinning image with the
1390
/* enable texturing and lighting and draw the spinning images with
659
1392
opengl_change_projection (FALSE, iWidth, iHeight);
660
glEnable (GL_TEXTURE_2D);
661
1393
glEnable (GL_LIGHTING);
662
glBindProgramARB (GL_FRAGMENT_PROGRAM_ARB, g_auiFragProgs[1]);
665
glBindTexture (GL_TEXTURE_2D, g_auiTextureIds[2]);
667
glTranslatef (-3.5f, 0.0f, -5.0f);
668
glRotatef (fAngle, 0.0f, 1.0f, 0.0f);
671
glNormal3f (0.0f, 0.0f, 1.0f);
672
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
673
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontFull);
674
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackFull);
675
glTexCoord2f (0.0f, 1.0f);
676
glVertex3f (-1.5f, -1.5375f, 0.0f);
677
glTexCoord2f (1.0f, 1.0f);
678
glVertex3f ( 1.5f, -1.5375f, 0.0f);
679
glTexCoord2f (1.0f, 0.0f);
680
glVertex3f ( 1.5f, 1.4625f, 0.0f);
681
glTexCoord2f (0.0f, 0.0f);
682
glVertex3f (-1.5f, 1.4625f, 0.0f);
683
/* left example's reflection */
684
glColor4f (1.0f, 1.0f, 1.0f, 0.0f);
685
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontOff);
686
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackOff);
687
glTexCoord2f (0.0f, 0.5f);
688
glVertex3f (-1.5f, -2.9625f, 0.0f);
689
glTexCoord2f (1.0f, 0.5f);
690
glVertex3f ( 1.5f, -2.9625f, 0.0f);
691
glColor4f (1.0f, 1.0f, 1.0f, 0.25f);
692
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontQuarter);
693
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackQuarter);
694
glTexCoord2f (1.0f, 1.0f);
695
glVertex3f ( 1.5f, -1.4625f, 0.0f);
696
glTexCoord2f (0.0f, 1.0f);
697
glVertex3f (-1.5f, -1.4625f, 0.0f);
701
glBindTexture (GL_TEXTURE_2D, g_auiTextureIds[1]);
703
glTranslatef (3.5f, 0.0f, -5.0f);
704
glRotatef (fAngle, 0.0f, 1.0f, 0.0f);
707
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
708
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontFull);
709
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackFull);
710
glTexCoord2f (0.0f, 1.0f);
711
glVertex3f (-1.5f, -1.5f, 0.0f);
712
glTexCoord2f (1.0f, 1.0f);
713
glVertex3f ( 1.5f, -1.5f, 0.0f);
714
glTexCoord2f (1.0f, 0.0f);
715
glVertex3f ( 1.5f, 1.5f, 0.0f);
716
glTexCoord2f (0.0f, 0.0f);
717
glVertex3f (-1.5f, 1.5f, 0.0f);
718
/* right example's reflection */
719
glColor4f (1.0f, 1.0f, 1.0f, 0.0f);
720
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontOff);
721
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackOff);
722
glTexCoord2f (0.0f, 0.5f);
723
glVertex3f (-1.5f, -3.0f, 0.0f);
724
glTexCoord2f (1.0f, 0.5f);
725
glVertex3f ( 1.5f, -3.0f, 0.0f);
726
glColor4f (1.0f, 1.0f, 1.0f, 0.25f);
727
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontQuarter);
728
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackQuarter);
729
glTexCoord2f (1.0f, 1.0f);
730
glVertex3f ( 1.5f, -1.5f, 0.0f);
731
glTexCoord2f (0.0f, 1.0f);
732
glVertex3f (-1.5f, -1.5f, 0.0f);
736
glBindTexture (GL_TEXTURE_2D, g_auiTextureIds[0]);
738
glTranslatef (0.0f, 0.0f, -5.0f);
739
glRotatef (fAngle, 0.0f, 1.0f, 0.0f);
742
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
743
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontFull);
744
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackFull);
745
glTexCoord2f (0.0f, 1.0f);
746
glVertex3f (-1.5f, -1.525f, 0.0f);
747
glTexCoord2f (1.0f, 1.0f);
748
glVertex3f ( 1.5f, -1.525f, 0.0f);
749
glTexCoord2f (1.0f, 0.0f);
750
glVertex3f ( 1.5f, 1.475f, 0.0f);
751
glTexCoord2f (0.0f, 0.0f);
752
glVertex3f (-1.5f, 1.475f, 0.0f);
753
/* middle example's reflection */
754
glColor4f (1.0f, 1.0f, 1.0f, 0.0f);
755
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontOff);
756
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackOff);
757
glTexCoord2f (0.0f, 0.5f);
758
glVertex3f (-1.5f, -2.75f, 0.0f);
759
glTexCoord2f (1.0f, 0.5f);
760
glVertex3f ( 1.5f, -2.75f, 0.0f);
761
glColor4f (1.0f, 1.0f, 1.0f, 0.25f);
762
glMaterialfv (GL_FRONT, GL_DIFFUSE, afMaterialDiffuseFrontQuarter);
763
glMaterialfv (GL_BACK, GL_DIFFUSE, afMaterialDiffuseBackQuarter);
764
glTexCoord2f (1.0f, 1.0f);
765
glVertex3f ( 1.5f, -1.475f, 0.0f);
766
glTexCoord2f (0.0f, 1.0f);
767
glVertex3f (-1.5f, -1.475f, 0.0f);
1397
afPosition[X] = -3.5f;
1398
afPosition[Y] = 0.0f;
1399
afPosition[Z] = -5.0f;
1400
opengl_draw_textured_quad (g_apTextures[0],
1407
opengl_draw_textured_quad (g_apTextures[0],
1416
afPosition[X] = 0.0f;
1417
afPosition[Y] = 0.0f;
1418
afPosition[Z] = -5.0f;
1419
opengl_draw_textured_quad (g_apTextures[5],
1426
opengl_draw_textured_quad (g_apTextures[5],
1435
afPosition[X] = 3.5f;
1436
afPosition[Y] = 0.0f;
1437
afPosition[Z] = -5.0f;
1438
opengl_draw_textured_quad (g_apTextures[2],
1445
opengl_draw_textured_quad (g_apTextures[2],
771
1453
/* draw the text-labels */
772
1454
opengl_change_projection (TRUE, iWidth, iHeight);