From 255e2b945fa84f92a64109e078a9665fff7bcc25 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 25 Jan 2010 07:35:25 +0000 Subject: [PATCH] Update sorting example with textures (broken) --- examples/sorting/flag.png | Bin 0 -> 5573 bytes examples/sorting/sort.c | 171 +++++++++++++++++++++++++++++++------- 2 files changed, 139 insertions(+), 32 deletions(-) create mode 100644 examples/sorting/flag.png diff --git a/examples/sorting/flag.png b/examples/sorting/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..70ff7267d64718fbeff6e06a4b9513b597b5a7f3 GIT binary patch literal 5573 zcmaJ_3pms5`~R}nl0zuegrZunQ?XeGkwcUmD#zv&o0*(@g`C+NIqR^(C`u_YY)M6# z#n2cM+rlfSNS1g>qQm~r{C@BMx_;O7|NoxryM3?wd7k^eKcCP29Cj_^)QMxVQYumq z1j!z^wseFbF&_BXO2R;or?J-(1c|4fvU9c)iW)~KqzHvXp%5(;LL!U95ppO(4pGQK z3ptQzkirpCC_)NRNI?rJkZ3NEBP3FUM52(077`(mE1DxjQ-o-u5RDe1ArMIjafA>> z2oZ%4S_lCH#0H^3EZ_`gL!vyQM&WRX91fbpfkbJ6MWJvgL=FYbp+F)OV30`R5Q!Wj znnQ#{puk)-g@Yz?&}a@C0vLfS2cmEwA_qcqAdnTH2EhPmfD*t0V<0hz4MKxhz!?$| z64{^;DHJq?0*Uy6w7?<~DMU1d2#M$d6krfdq@d9hGz8cKP+%?vB2pkU1p@Sd9snlr z266!Y00dwNP=jCqG(ZWa0vsSQhz&x6Sdd6L(J-(64>WHenMpy)S zjf1H8Yp_HN)-r+6AQq?+5D#$be8B)OX#F{BxAWj_z4kfE4mvFAj5=rT|IhM;{Br7| zAZTOQaZ7XO=)u`rrm;iT=pez_Dx97YP1JW@RxVBw-EK>OGc=w;Cp`(Oot}^pU=DBc|OHz z%Kd#EhOzFcHN~zaCiHRh%S@v{!FYpo@hw%>Cfim8olAp@_9!tP89Q(h-?Vhw+9T@r z+qs$PF{@nc$QS4^E%*6l>kd9ujhxqWvud|%V1eq$RW*m%n+k%k32V(^A!uSVXL?(mBzWac&Ni4!ja=W1FpQ*QoL@$PE7|FkJVyJCl__R zUY*L5VoMh#>^f?k5)r9cLCL>dLRUJkm$k!7`Y%i+MbPS6i`C6Kf|0JBbxxwrSNTqOw|nMXI2i~TDhhdak@UUQJm^SIZ8wYYFf!Q__C+B6uknCSGp8Hf3VGfV5GV}O5NBOSdZcwHSoUBNa#5re+{#@ssqyycz!+Z|;OymS&UZ1sa=dvq_7;m-egZ>HClA z)UwJs8m8P%yn(erUK_9A$Q=sSnes#(`~5|B$4}OgM*ByffoJw=)r8_3Zvy~R; z)Dgx(o-A$fz_IJCGd9Dredgbrm*%HOf~mam82aGlCgJzSnW(;LEfeQCS1W3FOKs%r zS#RCvj?{p}nV%1DdMq%fqE3qZXuMm~lBM~m06j8v!m=PeP+@%;cBf`(=fTCp z%A0*%&UROwwy5Z-}g(OT$n=_&xjfD|W5Vf}Xx04nT z0t2|U+#a&n9~7Bj+f81>%%A1Qd}c3az9E>KwoYiJTD$zgwX>_aPTn-k@jYzB&(0?TEKev?4lxy8GOsxl7(b!zFPs zq@cSR)>f>I&Ec(#kBU0j>KpnB$E$7o(@H;AoFq z3YE_E!McVL+0x|5!35KO0yA~#WPwb4kHxFP@~Kj`*>?Qb0vTG*mgKC(H_vPFILxYs zs~_Iw&T5UtibYjN#5P;LtBcmnUXNXgypTIm9qQ%0HXMpsYC&MGb`Z8(=@rTt2WF4; z;!szp!68Y zIvE#F(54NF9BtfV?BHKpcRBsE+f6%@!sT!ZtRH2qba9;1XHGqqi&o7R!&kSPHP)C% zwPezhBmXw$7s>Ryk;N2Zz93-oOKs3;eMEUV0j#pD{AP!PWKv*nCA{}syWcBPJlRnLM&bu`9464{6VG4ZSVw&AlE&GC=NA3(=&YGdVHH{6? z@-k09j*wnK7s^0_@#6K>%_+A!3CuK%GdN6DFG(;Po-GIB6)v-x=X>9q+HB5x6w~x& z+5mC(2w!`vG%Y{ARBogP^_tZZx=9o7^PLw}CyRke~{B24VgAys2J?Mt#jrxl8MG#M!1zkFOHhW-<0~86?blpvw=){+Ac*V zZN(tUy|3GX3+fH?`pKd~c~hN3c5p-E>-KQ0A`-S4&wWWSTX3?|?X|$IkPU*e?*yZ^ z_d1u)zlw{^H85rpMp0yv`!znnr)K4mlu`z`Mr^gf!nb>3P*yI-j8)+6G4R#!*6+37 z`&i@o?Yc0R^c($yd%~`_4u+k+NS?PkazE)&@{*lbopD<}x@pt_Vy+^~e3qMtFr25zt25))O@ zM@X*rN69~XJoTWdNXf^9#PvhTmn~ek*b;NfbAaG;xJZ)v@F}|{W7>@n1NS--R=@WU zTX#jS5#5xY?&t9bU)vw`dh4R;hwK%-PXvCuO85%1@XeVI@NcfKrWH|dop^@%(Ce6e zo_Y3gV|wAHl?y)h$J(GyB#dmpL}kEylkKRZ;KV?W^NnYFRq`A#oo) znjVffDVcsk@6agPuO`Rxq&~Siv7icmPPTkbE0XzC6NWO|f>O&#sR=;Me-Ji-9rSho z9yQvBACFH?9CRNttJYjMa&_+SyqFMhu(tf3-*mtpZd3QGgEc5QoS&&0=z>dQC#O2P zr8@j9MU@N&3I$I`T<4r?kG(?&*??p0I+cK8{y4ZRZuC=jnBvE5u}mb)YtM)uDw#W- zw!7+`m-b-gSD5zHk)+IVeD=wWHaB@ zJyJu$MuJeI4{hp8*~v;gUN-ucICZn{(0P6fQyjnJ#|%Q**k8(FVTt9S1bapnPZx6l@V^SK8?Qx-37$%u6`hKTgj zL4JF_C)?V=lOvrcF^F$NPTQw4>LMvJ^AdoK(J(1i-Ki#i?%?@Yd${V#GP6uVE#W2W zCGV+lb%`&Geqh8LjLsIbdli5>b+i}$buIoc<9-$MDL@hbLkjxM~^$en0OAl}C~ zRJjHpWf|~0IGmL9PI^Il2fZ1mt6OCgVA`2BWe4{}1P^uL^@?OvSqlX+^KM8Xvv5O> z*ggBng;dY_410Pw64vL7Kq2;>rbd0OQY?_+*ux3$Z(!hCo>g=b%o4A#nTbS{JZY&v z@XPqA^jAM$eXl7VGy`X39CcY3OctXa^+qAm%Tzw2GM_Cf9sKej;k3Q|*wI&#*poO6 za-&uuSEBSmLkd^@IW`sDpulykc#!#~T^sK==4Pcti&}i?>D@=zevdHp!oW;%WgLS@ zw<43O+6ZH~7dK%+rkEOovU@^jve+RMxYlACLgow+zdsICW7mH*2Aw_s`aLE^W&Zz< zwC4!g^?Qs`(_D{md19O3LWP|3NOj`R$>GfHl7If!r@`c>_%MEDdEGSJYU{LezAJ7U zr1Kk9o@T+664UwD_rJ}5Iz^`V|IQH{YL9*DUgdhBk~=&+?6tf&JX0+U`xY6=ZyMe| zJ+kdr(uJoD0?q8O>d&r~&$(}XRu@;|D!FglhpBhRZqSE*wR7K|{f5Ital=~rCl#BL zRzfi^`s)gw)CeP|gJPE=S}Xw>7CGRjndxlPY5b8q?+_$7-Ax&DMGFE*OklYN--5RHkcJ zv~^XsnQn!hUboHvtV`o+feVI_*dK%$D$m?tDyx=cY?Nyp5{`*$GWzjaNiC5za~8HC zs(D`Ha$NF%E#RNqr}ur4j<~3;%fpr=;$}llll&8YmBQM+yWV-%oP2RO1=}>pSaQ6# z^pVf6xnMCe@%r!8mNYp**@2**2YO8}zQoAAW4+O)7FlT{ z&Gh+qr-o0$9G3rj_G6z=OvuKMNqe`%g8!p-MOa}Y2)GD8Bj0d8@PbhK2KsvX26`w% xXB67Vz|hEWzmC4Xk-mO(!~6eq2nizu5M%y-hxH#k+du~BxYY^EY73t~{|Ef|fOY@? literal 0 HcmV?d00001 diff --git a/examples/sorting/sort.c b/examples/sorting/sort.c index 9ad01fa..7cb54c5 100644 --- a/examples/sorting/sort.c +++ b/examples/sorting/sort.c @@ -1,3 +1,4 @@ +#define GL_GLEXT_PROTOTYPES #include #include #include @@ -5,9 +6,14 @@ #include #include +gdouble pos[3]; +gdouble rot[3]; +guint tex; + typedef struct { - gfloat xyz[3]; + gfloat xyz[4]; gfloat color[4]; + gfloat texture[4]; } __attribute__ ((packed)) vert_t; static int sort_cmp(const void *a, const void *b) @@ -24,7 +30,7 @@ static gfloat *sort_start() { int size = 1000000; gfloat *data = g_new0(gfloat, size); - glFeedbackBuffer(size, GL_3D_COLOR, data); + glFeedbackBuffer(size, GL_4D_COLOR_TEXTURE, data); glRenderMode(GL_FEEDBACK); g_print("1st = %f\n", data[0]); return data; @@ -40,13 +46,26 @@ static void sort_end(gfloat *data) glGetIntegerv(GL_VIEWPORT, view); glMatrixMode(GL_PROJECTION); + glPushMatrix(); glLoadIdentity(); - glOrtho(view[0],view[2], view[1],view[3], -10,10); + glOrtho(view[0],view[2], view[1],view[3], -100,100); glMatrixMode(GL_MODELVIEW); + glPushMatrix(); glLoadIdentity(); glDisable(GL_LIGHTING); + glMatrixMode(GL_TEXTURE); + glPushMatrix(); + glLoadIdentity(); + + //glTranslatef(pos[0], pos[1], pos[2]); + //glTranslatef(0.05, 0.1, -2); + //glRotatef(0.03, 1, 1, 0); + + //gluPerspective(90, 0.8, 0.1, 10); + + /* Sort the vertexes (this only works with all-triangles */ int trisize = 2*sizeof(gfloat) + 3*sizeof(vert_t); int ntris = nvals*sizeof(gfloat) / trisize; @@ -65,25 +84,52 @@ static void sort_end(gfloat *data) /* Draw triangle */ glBegin(GL_TRIANGLES); for (int j = 0; j < n; j++) { - //g_print("\t%f, %f, %f\n", - // verts[j].xyz[0], - // verts[j].xyz[1], - // verts[j].xyz[2]); - glColor4fv(verts[j].color); - glVertex3fv(verts[j].xyz); + g_print("\t%7.2f, %6.2f, %6.2f %6.2f - " + "%5.2f, %5.2f, %5.2f, %5.2f\n", + verts[j].xyz[0], + verts[j].xyz[1], + verts[j].xyz[2], + verts[j].xyz[3], + verts[j].texture[0], + verts[j].texture[1], + verts[j].texture[2], + verts[j].texture[3]); + glTexCoord4f( + verts[j].texture[0], + verts[j].texture[1], + verts[j].texture[2], + verts[j].texture[3]); + glColor4f( + verts[j].color[0], + verts[j].color[1], + verts[j].color[2], + verts[j].color[3]); + if (j == 2) + verts[j].xyz[2] = -100; + glVertex3f( + verts[j].xyz[0], + verts[j].xyz[1], + verts[j].xyz[2]); } glEnd(); /* Draw line */ - glColor4f(1,1,1,1); - glBegin(GL_LINE_LOOP); - for (int j = 0; j < n; j++) - glVertex3fv(verts[j].xyz); - glEnd(); + //glDisable(GL_TEXTURE_2D); + //glBegin(GL_LINE_LOOP); + //glColor4f(1,1,1,1); + //for (int j = 0; j < n; j++) + // glVertex3fv(verts[j].xyz); + //glEnd(); } else { g_error("Unknown token: %f\n", token); } } + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_TEXTURE); + glPopMatrix(); g_free(data); } @@ -114,26 +160,45 @@ static gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); - /* Set up projection */ - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(1,-1, -0.7,0.7, -10,10); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); /* Draw teapots */ + g_print("%f,%f,%f\n", pos[0], pos[1], pos[2]); + g_print("%f,%f,%f\n", rot[0], rot[1], rot[2]); + glMatrixMode(GL_MODELVIEW); gfloat *data = sort_start(); glLoadIdentity(); - glTranslatef(0.05, 0.05, -2); - glRotatef(30, 1, -1, -0.2); - glColor4f(1.0, 0.2, 0.2, 0.6); - gdk_gl_draw_teapot(TRUE, 0.5); + glTranslatef(pos[0], pos[1], pos[2]); + glTranslatef(0.05, 0.1, -2); + glRotatef(60, 1, -1, -0.2); + glColor4f(1,1,1,1); + glDisable(GL_COLOR_MATERIAL); + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, tex); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex3f(-0.8, 0.5, 0.0); + glTexCoord2f(0, 1); glVertex3f(-0.8, -0.5, 0.0); + glTexCoord2f(1, 1); glVertex3f( 0.8, -0.5, 0.0); + glTexCoord2f(1, 0); glVertex3f( 0.8, 0.5, 0.0); + glEnd(); - glLoadIdentity(); - glTranslatef(-0.2, -0.05, -2); - glRotatef(30, 1, -1, -0.2); - glColor4f(0.2, 0.2, 1.0, 0.6); - gdk_gl_draw_teapot(TRUE, 0.5); + //glLoadIdentity(); + //glTranslatef(pos[0], pos[1], pos[2]); + //glTranslatef(0.05, 0.1, -2); + //glRotatef(30, 1, -1, -0.2); + //glColor4f(1.0, 0.2, 0.2, 0.5); + ////gdk_gl_draw_teapot(TRUE, 0.5); + //gdk_gl_draw_cube(TRUE, 0.5); + + //glLoadIdentity(); + //glTranslatef(pos[0], pos[1], pos[2]); + //glTranslatef(-0.2, 0, -2); + //glRotatef(30, 1, -1, -0.2); + //glColor4f(0.2, 0.2, 1.0, 0.5); + ////gdk_gl_draw_teapot(TRUE, 0.5); + //gdk_gl_draw_cube(TRUE, 0.5); sort_end(data); /* Flush */ @@ -147,19 +212,58 @@ static gboolean on_expose(GtkWidget *drawing, GdkEventExpose *event, gpointer _) static gboolean on_configure(GtkWidget *drawing, GdkEventConfigure *event, gpointer _) { - glViewport(0, 0, - drawing->allocation.width, - drawing->allocation.height); + gdouble width = drawing->allocation.width; + gdouble height = drawing->allocation.height; + glViewport(0, 0, width, height); + + /* Set up projection */ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + //gluPerspective(90, width/height, 0.1, 10); + gluPerspective(90, 0.8, 0.1, 10); + //glOrtho(1,-1, -0.7,0.7, -10,10); return FALSE; } static gboolean on_key_press(GtkWidget *widget, GdkEventKey *event, gpointer _) { - if (event->keyval == GDK_q) - gtk_main_quit(); + guint kv = event->keyval; + if (kv == GDK_q) gtk_main_quit(); + else if (kv == GDK_h) pos[0] -= 0.02; + else if (kv == GDK_j) pos[1] += 0.02; + else if (kv == GDK_k) pos[1] -= 0.02; + else if (kv == GDK_l) pos[0] += 0.02; + else if (kv == GDK_o) pos[2] -= 0.02; + else if (kv == GDK_i) pos[2] += 0.02; + else if (kv == GDK_H) rot[2] -= 2.0; + else if (kv == GDK_J) rot[0] += 2.0; + else if (kv == GDK_K) rot[0] -= 2.0; + else if (kv == GDK_L) rot[2] += 2.0; + gtk_widget_queue_draw(widget); return FALSE; } +static guint load_tex(gchar *filename) +{ + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename, NULL); + guchar *pixels = gdk_pixbuf_get_pixels(pixbuf); + int width = gdk_pixbuf_get_width(pixbuf); + int height = gdk_pixbuf_get_height(pixbuf); + int alpha = gdk_pixbuf_get_has_alpha(pixbuf); + guint tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, + (alpha ? GL_RGBA : GL_RGB), GL_UNSIGNED_BYTE, pixels); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + g_object_unref(pixbuf); + return tex; +} + int main(int argc, char **argv) { gtk_init(&argc, &argv); @@ -182,6 +286,9 @@ int main(int argc, char **argv) GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(drawing)); gdk_gl_drawable_gl_begin(gldrawable, glcontext); + /* Load texture */ + tex = load_tex("flag.png"); + gtk_main(); gdk_gl_drawable_gl_end(gldrawable); -- 2.43.2