void draw_floatingmessage(floating_message *message, float healthbar_z) { float cut; double f, width, y, x, z; double model[16],proj[16]; int view[4]; if(!message)return; cut=message->active_time/4000.0f; f = ((float)(message->active_time-(cur_time-message->first_time)))/message->active_time; glColor4f(message->color[0], message->color[1], message->color[2], f > cut ? 1.0f : (f / cut)); width = (float)get_string_width((unsigned char*)message->message) * INGAME_FONT_X_LEN * name_zoom * 8.0; //Figure out where the point just above the actor's head is in the viewport glGetDoublev(GL_MODELVIEW_MATRIX, model); glGetDoublev(GL_PROJECTION_MATRIX, proj); glGetIntegerv(GL_VIEWPORT, view); if (first_person) { x=window_width/2.0; y=window_height/2.0-40.0; } else { gluProject(0.0, 0.0, healthbar_z * get_actor_scale(your_actor), model, proj, view, &x, &y, &z); y += 50*name_zoom; // size of the actor name/bar } switch(message->direction){ case FLOATINGMESSAGE_EAST: x+=-width/2.0f-(f*window_width*0.1f); y+=window_height*0.1; break; case FLOATINGMESSAGE_SOUTH: x+=-width/2.0f; y+=f*window_height*0.1; break; case FLOATINGMESSAGE_WEST: x+=-width/2.0f+(f*window_width*0.1f); y+=window_height*0.1; break; case FLOATINGMESSAGE_MIDDLE: x+=-width/2.0f; y+=f*window_height*0.05f; break; case FLOATINGMESSAGE_NORTH: default: x+=-width/2.0f; y+=(1.0-f)*window_height*0.1; break; } glPushMatrix(); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(view[0],view[2]+view[0],view[1],view[3]+view[1],0.0f,-1.0f); draw_ortho_ingame_string(x, y, 0, (unsigned char*)message->message, 1, INGAME_FONT_X_LEN*8.0, INGAME_FONT_Y_LEN*8.0); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); }
void display_map_markers() { int ax, ay; float z,x,y; int i; GLdouble model[16],proj[16]; GLint view[4]; GLdouble hx,hy,hz; float banner_width; float font_scale = 1.0f/ALT_INGAME_FONT_X_LEN; float font_size_x=font_scale*SMALL_INGAME_FONT_X_LEN; float font_size_y=font_scale*SMALL_INGAME_FONT_Y_LEN; char tmpb[4]; actor *me; me = get_our_actor(); if(!me) return; ax = me->x_pos; ay = me->y_pos; 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); glDepthFunc(GL_LEQUAL); glEnable(GL_TEXTURE_2D); glColor4f(1.0,1.0,1.0,1.0); glDisable(GL_LIGHTING); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); for(i=0;i<max_mark;i++){ x=marks[i].x/2.0; y=marks[i].y/2.0; x += (TILESIZE_X / 2); y += (TILESIZE_Y / 2); if(DST(ax,ay,x,y)>MARK_DIST||marks[i].x<0||!marks_3d) continue; z = get_tile_height(marks[i].x, marks[i].y)+2.3; gluProject(x, y, z, model, proj, view, &hx, &hy, &hz); //shorten text memcpy(tmpb,marks[i].text+MARK_CLIP_POS,4); marks[i].text[MARK_CLIP_POS]=marks[i].text[MARK_CLIP_POS+1]=marks[i].text[MARK_CLIP_POS+2]='.'; marks[i].text[MARK_CLIP_POS+3]=0; banner_width = ((float)get_string_width((unsigned char*)marks[i].text)*(font_size_x*name_zoom))/2.0; draw_ortho_ingame_string(hx-banner_width, hy, hz, (unsigned char*)marks[i].text, 4, font_size_x, font_size_y); //restore text memcpy(marks[i].text+MARK_CLIP_POS,tmpb,4); } glDisable(GL_BLEND); glDisable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); //glEnable(GL_LIGHTING); glDepthFunc(GL_LESS); }
void cal_render_bones(actor *act) { float lines[1024][2][3]; float points[1024][3]; int nrLines; int nrPoints; int currLine; int currPoint; struct CalSkeleton *skel; skel=CalModel_GetSkeleton(act->calmodel); nrLines = CalSkeleton_GetBoneLines(skel,&lines[0][0][0]); glLineWidth(2.0f); glColor3f(1.0f, 1.0f, 1.0f); glLineStipple(1, 0x3030); glEnable(GL_LINE_STIPPLE); glBegin(GL_LINES); for(currLine = 0; currLine < nrLines; currLine++) { glVertex3f(lines[currLine][0][0], lines[currLine][0][1], lines[currLine][0][2]); glVertex3f(lines[currLine][1][0], lines[currLine][1][1], lines[currLine][1][2]); } glEnd(); glDisable(GL_LINE_STIPPLE); // draw the bone points nrPoints = CalSkeleton_GetBonePoints(skel,&points[0][0]); glPointSize(4.0f); glColor3f(0.0f, 1.0f, 1.0f); glBegin(GL_POINTS); for(currPoint = 0; currPoint < nrPoints; currPoint++) { glVertex3f(points[currPoint][0], points[currPoint][1], points[currPoint][2]); } glEnd(); #ifdef DEBUG // draw the bones orientation if (render_bones_orientation) { float shift[3], pos[3]; glLineWidth(3.0f); glBegin(GL_LINES); for (currPoint = nrPoints; currPoint--;) { shift[0] = 0.1; shift[1] = 0.0; shift[2] = 0.0; cal_get_actor_bone_local_position(act, currPoint, shift, pos); glColor3f(1.0, 0.0, 0.0); glVertex3f(points[currPoint][0], points[currPoint][1], points[currPoint][2]); glVertex3fv(pos); shift[0] = 0.0; shift[1] = 0.1; shift[2] = 0.0; cal_get_actor_bone_local_position(act, currPoint, shift, pos); glColor3f(0.0, 1.0, 0.0); glVertex3f(points[currPoint][0], points[currPoint][1], points[currPoint][2]); glVertex3fv(pos); shift[0] = 0.0; shift[1] = 0.0; shift[2] = 0.1; cal_get_actor_bone_local_position(act, currPoint, shift, pos); glColor3f(0.0, 0.0, 1.0); glVertex3f(points[currPoint][0], points[currPoint][1], points[currPoint][2]); glVertex3fv(pos); } glEnd(); } // draw bones id if (render_bones_id) { GLdouble model[16], proj[16]; GLint view[4]; GLdouble px,py,pz; unsigned 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; 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, 1.0, 1.0); for (currPoint = nrPoints; currPoint--;) { struct CalBone *bone; bone = CalSkeleton_GetBone(skel, currPoint); sprintf((char*)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(); } #endif // DEBUG glLineWidth(1.0f); #ifdef OPENGL_TRACE CHECK_GL_ERRORS(); #endif //OPENGL_TRACE }