Florian Report post Posted December 23, 2007 I wanted to have a look at the eye candy effect positioning problem and I need the ID of the bone points. So I added for(currPoint = 0; currPoint < nrPoints; currPoint++) { unsigned char str[4]; int view[4]; sprintf((char *)str, "%3d", currPoint); draw_ortho_ingame_string(points[currPoint][0] + 0.02, points[currPoint][1], points[currPoint][2], str, 1, SMALL_INGAME_FONT_X_LEN, SMALL_INGAME_FONT_Y_LEN); } to cal_render_bones in cal.c. The result ist this: http://www.superfloh.dyndns.org/el/elscreen008_test.jpg What did I do wrong? How can I print little numbers with the bone point IDs next to the points? Share this post Link to post Share on other sites
Florian Report post Posted December 24, 2007 Hmm, well, I'm a n00b with openGL, so my solution to this will probably look very very st00pid to the experienced programmers, but hey, it works http://www.superfloh.dyndns.org/el/bones.jpg http://www.superfloh.dyndns.org/el/bones.png (better quality) =================================================================== RCS file: /cvsroot/elc/elc/cal.c,v retrieving revision 1.69 diff -u -d -p -r1.69 cal.c --- cal.c 20 Dec 2007 19:31:28 -0000 1.69 +++ cal.c 24 Dec 2007 00:41:55 -0000 @@ -12,6 +12,7 @@ #include "tiles.h" #endif /* NEW_SOUND */ #ifdef DEBUG +#include "font.h" #include "init.h" #endif /* DEBUG */ #ifdef OPENGL_TRACE @@ -24,6 +25,9 @@ #include "lights.h" #endif +void draw_number_at_xyz(float x, float y, float z, int number); +void draw_char_at_xyz(float x, float y, float z, int chr); + void cal_actor_set_anim_delay(int id, struct cal_anim anim, float delay) { actor *pActor = actors_list[id]; @@ -277,12 +281,145 @@ void cal_render_bones(actor *act) } glEnd(); + + for(currPoint = 0; currPoint < nrPoints; currPoint++) { + //unsigned char str[4]; + //int view[4]; + //sprintf((char *)str, "%3d", currPoint); + //draw_ortho_ingame_string(points[currPoint][0] + 0.02, points[currPoint][1], points[currPoint][2], str, 1, SMALL_INGAME_FONT_X_LEN, SMALL_INGAME_FONT_Y_LEN); + draw_number_at_xyz(points[currPoint][0], points[currPoint][1], points[currPoint][2], currPoint); + } #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE } +void draw_number_at_xyz(float x, float y, float z, int number) { + int num = number; + int chr = 0; + printf("draw number: %d\n", number); + if (num > 9) { + chr = num / 10; + draw_char_at_xyz(x, y, z, chr); + } + draw_char_at_xyz(x, y + 0.03, z, num % 10); +} + +void draw_char_at_xyz(float x, float y, float z, int chr) { + glLineWidth(2.0f); + glColor3f(0.0f, 1.0f, 0.0f); + switch (chr) { + case 0: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y, z); + glEnd(); + break; + case 1: + printf(" draw char: %d\n", chr); + glBegin(GL_LINES); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.04); + glEnd(); + break; + case 2: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y, z); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y - 0.02, z + 0.02); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.04); + glEnd(); + break; + case 3: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.02); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.04); + glEnd(); + break; + case 4: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.02); + glVertex3f(x, y, z + 0.02); + glEnd(); + glBegin(GL_LINES); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.04); + glEnd(); + break; + case 5: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y, z + 0.04); + glEnd(); + break; + case 6: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.02); + glEnd(); + break; + case 7: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y, z); + glEnd(); + break; + case 8: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y, z); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y - 0.02, z); + glVertex3f(x, y, z); + glEnd(); + glBegin(GL_LINES); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.02); + glEnd(); + break; + case 9: + printf(" draw char: %d\n", chr); + glBegin(GL_LINE_STRIP); + glVertex3f(x, y, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.02); + glVertex3f(x, y - 0.02, z + 0.04); + glVertex3f(x, y, z + 0.04); + glVertex3f(x, y, z); + glEnd(); + break; + default: + break; + } +} __inline__ void render_submesh(int meshId, int submeshCount, struct CalRenderer * pCalRenderer, float meshVertices[30000][3], float meshNormals[30000][3], float meshTextureCoordinates[30000][2], CalIndex meshFaces[50000][3]) { Share this post Link to post Share on other sites
bluap Report post Posted December 24, 2007 (edited) Hmm, well, I'm a n00b with openGL, so my solution to this will probably look very very st00pid to the experienced programmers, but hey, it works :) I'm the openGL n00b, those pics great and very funny at the same time. I've a copy of "OpenGL programming guide" on loan that I intend to dip into over my Christmas break. I'm not expecting to get far but when you're starting from nothing its all improvement Edited December 24, 2007 by bluap Share this post Link to post Share on other sites
Schmurk Report post Posted January 2, 2008 I like the workaround you found However, as I also need to know the bones IDs for the missiles implementation, I took a look at the problem and here's a patch corresponding to a way to do it by using fonts Index: cal.c =================================================================== RCS file: /cvsroot/elc/elc/cal.c,v retrieving revision 1.69 diff -u -r1.69 cal.c --- cal.c 20 Dec 2007 19:31:28 -0000 1.69 +++ cal.c 2 Jan 2008 20:39:50 -0000 @@ -246,6 +246,12 @@ int currLine; int currPoint; struct CalSkeleton *skel; + GLdouble model[16], proj[16]; + GLint view[4]; + GLdouble px,py,pz; + char buf[16]; + float font_size_x = SMALL_INGAME_FONT_X_LEN/ALT_INGAME_FONT_X_LEN; + float font_size_y = SMALL_INGAME_FONT_Y_LEN/ALT_INGAME_FONT_X_LEN; skel=CalModel_GetSkeleton(act->calmodel); nrLines = CalSkeleton_GetBoneLines(skel,&lines[0][0][0]); @@ -277,6 +283,40 @@ } glEnd(); + + glGetDoublev(GL_MODELVIEW_MATRIX, model); + glGetDoublev(GL_PROJECTION_MATRIX, proj); + glGetIntegerv(GL_VIEWPORT, view); + + glPushMatrix(); + glLoadIdentity(); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + + glOrtho(view[0],view[2]+view[0],view[1],view[3]+view[1],0.0f,-1.0f); + + glPushAttrib(GL_ENABLE_BIT); + + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + glColor4f(1.0, 0.0, 0.0, 1.0); + + for (currPoint = 0; currPoint < nrPoints; currPoint++) { + sprintf(buf, "%d", currPoint); + gluProject(points[currPoint][0], points[currPoint][1], points[currPoint][2], model, proj, view, &px, &py, &pz); + draw_ortho_ingame_string(px, py, pz, buf, 1, font_size_x, font_size_y); + } + + glPopAttrib(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE Share this post Link to post Share on other sites
Placid Report post Posted January 3, 2008 Those screenshots are hilarious. I want that as a feature! Share this post Link to post Share on other sites