105
147
static argtype vars[] = {
107
{&grab, "grab", "Grab", "False", t_Bool},
149
{&grab, "grab", "Grab", DEF_GRAB, t_Bool},
109
{&move, "move", "Move", "False", t_Bool},
110
{&nomove, "nomove", "noMove", "False", t_Bool},
111
{&rotate, "rotate", "Rotate", "False", t_Bool},
112
{&norotate, "norotate", "noRotate", "False", t_Bool},
113
/*{&size, "size", "Size", "-1", t_Int},*/
114
{&zoom, "zoom", "Zoom", "False", t_Bool},
115
{&nozoom, "nozoom", "noZoom", "False", t_Bool},
116
{&image, "image", "Image", "DEFAULT", t_String},
117
{&duration, "duration", "Duration", "30", t_Int},
151
{&move, "move", "Move", DEF_MOVE, t_Bool},
152
{&nomove, "nomove", "noMove", DEF_NOMOVE, t_Bool},
153
{&rotate, "rotate", "Rotate", DEF_ROTATE, t_Bool},
154
{&norotate, "norotate", "noRotate", DEF_NOROTATE, t_Bool},
155
{&zoom, "zoom", "Zoom", DEF_ZOOM, t_Bool},
156
{&nozoom, "nozoom", "noZoom", DEF_NOZOOM, t_Bool},
157
{&image, "image", "Image", DEF_IMAGE, t_String},
158
{&duration, "duration", "Duration", DEF_DURATION, t_Int},
120
161
static OptionStruct desc[] = {
474
536
int texture_width, int texture_height,
477
gleidestruct *gp = (gleidestruct *) closure;
479
gp->max_tx = (GLfloat) image_width / texture_width;
480
gp->max_ty = (GLfloat) image_height / texture_height;
482
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
483
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
484
(gp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
486
gp->waiting_for_image_p = False;
487
gp->start_time = time ((time_t *) 0);
539
texture *tp = (texture *) closure;
542
gp->max_tx = (GLfloat) image_width / texture_width;
543
gp->max_ty = (GLfloat) image_height / texture_height;
546
/* new - taken from flipscreen */
547
tp->width = texture_width;
548
tp->height = texture_height;
549
tp->min_tx = (GLfloat) geometry->x / tp->width;
550
tp->min_ty = (GLfloat) geometry->y / tp->height;
551
tp->max_tx = (GLfloat) (geometry->x + geometry->width) / tp->width;
552
tp->max_ty = (GLfloat) (geometry->y + geometry->height) / tp->height;
555
printf("Image w,h: (%d, %d)\n", image_width, image_height);
556
printf("Texture w,h: (%d, %d)\n", texture_width, texture_height);
557
printf("Geom x,y: (%d, %d)\n", geometry->x, geometry->y);
558
printf("Geom w,h: (%d, %d)\n", geometry->width, geometry->height);
559
printf("Max Tx,Ty: (%f, %f)\n", tp->max_tx, tp->max_ty);
562
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
563
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
564
(tp->mipmap_p ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
566
tp->waiting_for_image_p = False;
567
tp->start_time = time ((time_t *) 0);
492
getSnapshot(ModeInfo *mi, GLuint name)
571
getSnapshot(ModeInfo *mi, texture *texture)
494
573
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
576
printf("getSnapshot");
496
579
if (MI_IS_WIREFRAME(mi))
499
582
gp->mipmap_p = True;
500
583
load_texture_async (mi->xgwa.screen, mi->window,
501
584
*gp->glx_context, 0, 0, gp->mipmap_p,
502
name, image_loaded_cb, gp);
507
setup_file_texture (ModeInfo *mi, char *filename, GLuint name)
585
texture->id, image_loaded_cb, texture);
586
texture->start_time = time((time_t *)0);
589
#define TEXTURE_SIZE 256
592
plot(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
594
if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
597
c = ((x * TEXTURE_SIZE) + y) * 4;
598
/*printf("(%d,%d)[%d]\n", x, y, c);*/
607
plot2(unsigned char *buffer, int x, int y, int r, int g, int b, int a) {
609
if (x < 0 || x >= TEXTURE_SIZE || y < 0 || y >= TEXTURE_SIZE) {
612
c = ((x * TEXTURE_SIZE) + y) * 4;
613
/*printf("(%d,%d)[%d]\n", x, y, c);*/
619
if (y + 1 < TEXTURE_SIZE) {
626
if (x + 1 < TEXTURE_SIZE) {
627
c += (TEXTURE_SIZE * 4);
632
if (y + 1 < TEXTURE_SIZE) {
642
/* draw geometric shapes to texture */
643
/* modifies passed in buffer */
645
draw_shapes (unsigned char *buffer) {
652
for (i = 0 ; i < TEXTURE_SIZE * TEXTURE_SIZE * 4 ; i += 4) {
653
buffer[i + 0] = 0x00;
654
buffer[i + 1] = 0x00;
655
buffer[i + 2] = 0x00;
656
buffer[i + 3] = 0xff;
659
for (s = 0 ; s < 25 ; s++) {
660
int shape = random() % 3;
663
int r = (random() & 0xff);
664
int g = (random() & 0xff);
665
int b = (random() & 0xff);
670
x = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4); /* top left */
671
y = (random() % TEXTURE_SIZE) - (TEXTURE_SIZE / 4);
672
w = 10 + random() % (TEXTURE_SIZE / 4); /* size */
673
h = 10 + random() % (TEXTURE_SIZE / 4);
675
printf("Rectangle: (%d, %d)(%d, %d)\n", x, y, w, h);
683
for (i = x ; i < x + w && i < TEXTURE_SIZE; i++) {
684
for (j = y ; j < y + h && j < TEXTURE_SIZE; j++) {
685
plot(buffer, i, j, r, g, b, a);
692
x = random() % TEXTURE_SIZE; /* centre */
693
y = random() % TEXTURE_SIZE;
694
h = 10 + random() % (TEXTURE_SIZE / 8); /* radius */
696
printf("Circle: %d, %d, %d\n", x, y, h);
698
for (i = 0 ; i < h ; i++) {
700
for (j = 0 ; j < h ; j++) {
703
printf("xdist: %d\n", xdist);
704
printf("ydist: %d\n", ydist);
705
printf("radius: %d\n", h * h);
707
if ((xdist + ydist) < (h * h)) {
708
plot(buffer, x + i, y + j, r, b, g, a);
709
/* check we haven't already done these */
711
plot(buffer, x + i, y - j, r, b, g, a);
714
plot(buffer, x - i, y + j, r, b, g, a);
716
plot(buffer, x - i, y - j, r, b, g, a);
726
x = random() % TEXTURE_SIZE; /* top */
727
y = random() % TEXTURE_SIZE;
728
h = 10 + random() % (TEXTURE_SIZE / 4); /* height */
730
printf("Triangle: %d, %d, %d\n", x, y, h);
734
for (i = 0 ; i < h ; i++) {
735
for (j = left ; j < right ; j++) {
736
plot(buffer, j, y + i, r, g, b, a);
747
setup_random_texture (ModeInfo *mi, texture *texture)
749
int width = 0, height = 0;
751
unsigned char *my_data = NULL;
755
int r0, g0, b0, a0, r1, g1, b1, a1;
759
printf("RandomTexture\n");
762
/* use this texture */
763
glBindTexture(GL_TEXTURE_2D, texture->id);
768
* code for various generated patterns - noise, stripes, checks etc.
769
* random geometric shapes looked the best.
773
style = random() & 0x3;
774
r0 = random() & 0xff;
775
g0 = random() & 0xff;
776
b0 = random() & 0xff;
778
r1 = random() & 0xff;
779
g1 = random() & 0xff;
780
b1 = random() & 0xff;
786
height = width = TEXTURE_SIZE;
787
my_data = (void *)malloc(width * height * 4);
788
for (i = 0 ; i < width ; i += 2) {
789
for (j = 0 ; j < height ; j += 2) {
790
r0 = random() & 0xff;
791
g0 = random() & 0xff;
792
b0 = random() & 0xff;
794
plot2(my_data, i, j, r0, g0, b0, a0);
804
height = width = TEXTURE_SIZE;
805
my_data = (void *)malloc(width * height * 4);
806
draw_shapes(my_data);
812
height = width = TEXTURE_SIZE;
813
my_data = (void *)malloc(width * height * 4);
814
for (i = 0 ; i < height ; i += 2) {
815
for (j = 0 ; j < width ; j += 2) {
816
if (((i + j) & 0x3) == 0) {
817
plot2(my_data, i, j, r0, g0, b0, a0);
819
plot2(my_data, i, j, r1, g1, b1, a1);
825
case 3: /* random stripes */
826
printf("Stripes 2\n");
827
height = width = TEXTURE_SIZE;
828
my_data = (void *)malloc(width * height * 4);
829
for (i = 0 ; i < height ; i += 2) {
830
r0 = random() & 0xff;
831
g0 = random() & 0xff;
832
b0 = random() & 0xff;
834
for (j = 0 ; j < width ; j += 2) {
835
plot2(my_data, i, j, r0, g0, b0, a0);
842
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
844
GL_RGBA, GL_UNSIGNED_BYTE, my_data);
845
sprintf (buf, "random texture: (%dx%d)",
849
/* setup parameters for texturing */
850
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
851
glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
853
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
854
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
855
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
856
if (random() & 0x1) {
857
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
858
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
860
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
861
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
864
if (my_data != NULL) {
869
/* use full texture */
871
texture->min_tx = 0.0;
872
texture->max_tx = 2.0;
873
texture->min_ty = 0.0;
874
texture->max_ty = 2.0;
875
texture->start_time = time((time_t *)0);
879
setup_file_texture (ModeInfo *mi, char *filename, texture *texture)
509
881
Display *dpy = mi->dpy;
510
882
Visual *visual = mi->xgwa.visual;
533
909
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
534
910
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
535
911
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
913
/* use full texture */
914
texture->min_tx = 0.0;
915
texture->max_tx = 1.0;
916
texture->min_ty = 0.0;
917
texture->max_ty = 1.0;
918
texture->start_time = time((time_t *)0);
539
setup_texture(ModeInfo * mi, GLuint id)
922
setup_texture(ModeInfo * mi, texture *texture)
541
924
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
543
926
if (!image || !*image || !strcmp(image, "DEFAULT")) {
544
/* no image specified - grab screen */
546
/* max_tx and max_ty set in getSnapshot() */
927
/* no image specified - use system settings */
929
printf("SetupTexture: get_snapshot\n");
931
getSnapshot(mi, texture);
548
/* use supplied image file */
549
setup_file_texture(mi, image, id);
551
/* set tx params to use whole image */
933
if (strcmp(image, "GENERATE") == 0) {
935
printf("SetupTexture: random_texture\n");
937
setup_random_texture(mi, texture);
939
/* use supplied image file */
941
printf("SetupTexture: file_texture\n");
943
setup_file_texture(mi, image, texture);
946
/* copy start time from texture */
947
gp->start_time = texture->start_time;
556
949
check_gl_error("texture initialization");
558
/* Need to flip the texture top for bottom for some reason. */
559
glMatrixMode (GL_TEXTURE);
561
glMatrixMode (GL_MODELVIEW);
952
* resultant loaded image is upside down BUT
953
* it's a kaledescope and half of the hexagon is backwards anyway...
956
/* TODO: values for lissajous movement */
957
texture->x_period = frandrange(-2.0, 2.0);
958
texture->y_period = frandrange(-2.0, 2.0);
959
texture->r_period = frandrange(-2.0, 2.0);
960
texture->x_phase = frand(M_PI * 2);
961
texture->y_phase = frand(M_PI * 2);
962
texture->r_phase = frand(M_PI * 2);
964
printf("XPeriod %f XPhase %f\n", texture->x_period, texture->x_phase);
965
printf("YPeriod %f YPhase %f\n", texture->y_period, texture->y_phase);
966
printf("RPeriod %f RPhase %f\n", texture->r_period, texture->r_phase);
564
970
#define VERTEX0 glVertex3f( 0.0000f, 0.000f, 0.0f);
569
975
#define VERTEX5 glVertex3f(-XOFFSET, -0.500f, 0.0f);
570
976
#define VERTEX6 glVertex3f(-XOFFSET, 0.500f, 0.0f);
573
draw_hexagons(ModeInfo *mi, int translucency, GLuint texture)
979
** Three different functions for calculating texture coordinates
980
** which modify how the texture triangle moves over the source image.
985
/* the classic equilateral triangle rotating around centre */
987
calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
989
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
990
GLfloat centre_x = 0.5;
991
GLfloat centre_y = 0.5;
992
GLfloat radius_x = (texture->max_tx - texture->min_tx) / 2;
993
GLfloat radius_y = (texture->max_ty - texture->min_ty) / 2;
999
t[1].x = centre_x + .95 * radius_x * cos((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
1000
t[1].y = centre_y + .95 * radius_y * sin((gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS));
1002
/* t[2] is always 60' further around than t2 */
1003
tangle2 = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS) + (M_PI * 2 / 6);
1004
t[2].x = centre_x + .95 * radius_x * cos(tangle2);
1005
t[2].y = centre_y + .95 * radius_y * sin(tangle2);
1007
printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
1013
/* new lissajous movement pattern */
1015
calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
1017
/* equilateral triangle rotating around centre */
1018
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
1019
GLfloat width = texture->max_tx - texture->min_tx;
1020
GLfloat height = texture->max_ty - texture->min_ty;
1022
GLfloat centre_x = texture->min_tx + (width * .5);
1023
GLfloat centre_y = texture->min_ty + (height * .5);
1024
/* m radius and t radius should be = .5 */
1025
/* triangle radius is 30% available space */
1026
GLfloat t_radius_x = width * .3;
1027
GLfloat t_radius_y = height * .3;
1028
/* movement radius is 30% available space */
1029
GLfloat m_radius_x = width * .2;
1030
GLfloat m_radius_y = height * .2;
1033
/* centre of triangle */
1034
GLfloat angle = (gp->ymouse * 2 * M_PI) + (gp->tangle * RADIANS); /* to radians */
1035
GLfloat t_centre_x = centre_x + m_radius_x * cos(texture->x_period * angle + texture->x_phase);
1036
GLfloat t_centre_y = centre_y + m_radius_y * sin(texture->y_period * angle + texture->y_phase);
1039
printf("WH: %f, %f - tWH: %f, %f\n", width, height, texture->width, texture->height);
1040
printf("size: (%f, %f)\n", width, height);
1041
printf("centre: (%f, %f)\n", centre_x, centre_y);
1044
angle2 = texture->r_period * angle + texture->r_phase;
1045
t[0].x = t_centre_x + t_radius_x * cos(angle2);
1046
t[0].y = t_centre_y + t_radius_y * sin(angle2);
1047
t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
1048
t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
1049
t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
1050
t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
1053
printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t[0].x, t[0].y, t[1].x, t[1].y, texture->max_tx, texture->max_ty);
1059
/* corners into corners - meant to maximise coverage */
1061
calculate_texture_coords(ModeInfo *mi, texture *texture, vector2f t[3]) {
1063
/* equilateral triangle rotating around centre */
1064
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
1065
GLfloat width = texture->max_tx - texture->min_tx;
1066
GLfloat height = texture->max_ty - texture->min_ty;
1068
GLfloat centre_x = texture->min_tx + (width * .5);
1069
GLfloat centre_y = texture->min_ty + (height * .5);
1070
/* m radius and t radius should be = .5 */
1071
/* triangle radius calculated using maths 8) */
1072
#define TRADIUS (M_SQRT2 - 1.0)
1073
#define MRADIUS (1.0 - (M_SQRT2 / 2.0))
1074
GLfloat t_radius_x = width * TRADIUS * .95;
1075
GLfloat t_radius_y = height * TRADIUS * .95;
1076
/* movement radius also calculated using maths */
1077
GLfloat m_radius_x = width * MRADIUS * .95;
1078
GLfloat m_radius_y = height * MRADIUS * .95;
1079
GLfloat angle, angle2;
1080
GLfloat t_centre_x, t_centre_y;
1082
/* centre of triangle */
1083
angle = gp->tangle * RADIANS; /* to radians */
1084
t_centre_x = centre_x + m_radius_x * cos(angle);
1085
t_centre_y = centre_y + m_radius_y * sin(angle);
1087
printf("angle: %f, %f\n", angle, gp->tangle);
1088
printf("tcentre: %f,%f\n", t_centre_x, t_centre_y);
1089
printf("tradius: %f,%f\n", t_radius_x, t_radius_y);
1091
printf("size: (%f, %f)\n", width, height);
1092
printf("centre: (%f, %f)\n", centre_x, centre_y);
1093
printf("centre: (%f, %f)\n", centre_x, centre_y);
1094
printf("TRADIUS: %f\n", TRADIUS);
1095
printf("MRADIUS: %f\n", MRADIUS);
1098
/* angle2 is tied to tangle */
1099
angle2 = (180.0 - ((30.0 / 90.0) * gp->tangle)) * RADIANS;
1101
printf("Angle1: %f\tAngle2: %f\n", angle / RADIANS, angle2 / RADIANS);
1103
t[0].x = t_centre_x + t_radius_x * cos(angle2);
1104
t[0].y = t_centre_y + t_radius_y * sin(angle2);
1105
t[1].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_120);
1106
t[1].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_120);
1107
t[2].x = t_centre_x + t_radius_x * cos(angle2 + ANGLE_240);
1108
t[2].y = t_centre_y + t_radius_y * sin(angle2 + ANGLE_240);
1111
printf("texcoords:[%f,%f][%f,%f][%f,%f]\n", t[0].x, t[0].y, t[1].x, t[1].y, t[2].x, t[2].y);
1117
draw_hexagons(ModeInfo *mi, int translucency, texture *texture)
577
GLfloat t1x, t1y, t2x, t2y, t3x, t3y;
578
1123
gleidestruct *gp = &gleidescope[MI_SCREEN(mi)];
584
1128
col[3] = (float)translucency / MAX_FADE;
586
/* calculate vertices of equilateral triangle within image. */
587
/* t1 is always in centre */
588
t1x = gp->max_tx / 2;
589
t1y = gp->max_ty / 2;
591
t2x = (gp->max_tx / 2) * (1 + cos((gp->ymouse * 2 * M_PI) + (gp->tangle * M_PI / 180)));
592
t2y = (gp->max_ty / 2) * (1 + sin((gp->ymouse * 2 * M_PI) + (gp->tangle * M_PI / 180)));
593
/* t3 is always 60' further around than t2 */
594
tangle2 = (gp->ymouse * 2 * M_PI) + (gp->tangle * M_PI / 180) + (M_PI * 2 / 6);
595
t3x = (gp->max_tx / 2) * (1 + (cos(tangle2)));
596
t3y = (gp->max_ty / 2) * (1 + (sin(tangle2)));
597
/* NB image is flipped vertically hence: */
601
/*printf("texcoords:[%f,%f]->[%f,%f](%f,%f)\n", t1x, t1y, t2x, t2y, gp->max_tx, gp->max_ty);*/
1130
calculate_texture_coords(mi, texture, t);
603
1132
glColor4f(1.0, 1.0, 1.0, (float)translucency / MAX_FADE);
604
1133
glEnable(GL_TEXTURE_2D);
605
1134
glEnable(GL_BLEND);
606
1135
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
607
1136
glDepthMask(GL_FALSE);
608
glBindTexture(GL_TEXTURE_2D, gp->textures[texture]);
1137
glBindTexture(GL_TEXTURE_2D, texture->id);
1139
if (gp->list == -1) {
1140
gp->list = glGenLists(1);
1143
/* compile new list */
1144
glNewList(gp->list, GL_COMPILE);
1145
glBegin(GL_TRIANGLES);
1148
** six triangles to each hexagon
1151
glTexCoord2f(t[0].x, t[0].y);
1153
glTexCoord2f(t[1].x, t[1].y);
1155
glTexCoord2f(t[2].x, t[2].y);
1158
glTexCoord2f(t[0].x, t[0].y);
1160
glTexCoord2f(t[2].x, t[2].y);
1162
glTexCoord2f(t[1].x, t[1].y);
1165
glTexCoord2f(t[0].x, t[0].y);
1167
glTexCoord2f(t[1].x, t[1].y);
1169
glTexCoord2f(t[2].x, t[2].y);
1172
glTexCoord2f(t[0].x, t[0].y);
1174
glTexCoord2f(t[2].x, t[2].y);
1176
glTexCoord2f(t[1].x, t[1].y);
1179
glTexCoord2f(t[0].x, t[0].y);
1181
glTexCoord2f(t[1].x, t[1].y);
1183
glTexCoord2f(t[2].x, t[2].y);
1186
glTexCoord2f(t[0].x, t[0].y);
1188
glTexCoord2f(t[2].x, t[2].y);
1190
glTexCoord2f(t[1].x, t[1].y);
1196
/* call the list n times */
610
1197
for (i = 0 ; i < sizeof(hex) / sizeof(hex[0]) ; i++) {
614
1201
glTranslatef(hex[i].x, hex[i].y, 0.0);
616
glBegin(GL_TRIANGLES);
619
** six triangles to each hexagon
622
glTexCoord2f(t1x, t1y);
624
glTexCoord2f(t2x, t2y);
626
glTexCoord2f(t3x, t3y);
629
glTexCoord2f(t1x, t1y);
631
glTexCoord2f(t3x, t3y);
633
glTexCoord2f(t2x, t2y);
636
glTexCoord2f(t1x, t1y);
638
glTexCoord2f(t2x, t2y);
640
glTexCoord2f(t3x, t3y);
643
glTexCoord2f(t1x, t1y);
645
glTexCoord2f(t3x, t3y);
647
glTexCoord2f(t2x, t2y);
650
glTexCoord2f(t1x, t1y);
652
glTexCoord2f(t2x, t2y);
654
glTexCoord2f(t3x, t3y);
657
glTexCoord2f(t1x, t1y);
659
glTexCoord2f(t3x, t3y);
661
glTexCoord2f(t2x, t2y);
1202
glCallList(gp->list);