void halo_draw_setup(void) { int n; halo_draw_type *halo_draw; view.render->halo_draw.in_view_count=0; // clear all halo spots for (n=0;n!=view.render->halo_draw.count;n++) { halo_draw=&view.render->halo_draw.halos[n]; halo_draw->in_view=FALSE; // is it behind the z? if (!gl_project_in_view_z(&halo_draw->pnt)) continue; // cull halo if (!halo_draw_setup_cull(&iface.halo_list.halos[halo_draw->idx],halo_draw->obj_idx,&halo_draw->pnt,&halo_draw->pixel_sz,&halo_draw->alpha)) continue; // project the halo // and check if on screen halo_draw->proj_pnt.x=halo_draw->pnt.x; halo_draw->proj_pnt.y=halo_draw->pnt.y; halo_draw->proj_pnt.z=halo_draw->pnt.z; gl_project_point(&halo_draw->proj_pnt); halo_draw->proj_pnt.y=view.screen.y_sz-halo_draw->proj_pnt.y; if (((halo_draw->proj_pnt.x+halo_draw->pixel_sz)<0) || ((halo_draw->proj_pnt.y+halo_draw->pixel_sz)<0) || ((halo_draw->proj_pnt.x-halo_draw->pixel_sz)>=view.screen.x_sz) || ((halo_draw->proj_pnt.y-halo_draw->pixel_sz)>=view.screen.y_sz)) continue; halo_draw->in_view=TRUE; view.render->halo_draw.in_view_count++; } }
void remote_draw_names_setup(void) { int n,x,y,z,dist; bool hit,has_tag; d3pnt spt,ept,hpt; obj_type *obj; model_type *mdl; ray_trace_contact_type contact; if (!net_setup.client.joined) return; if (!setup.network.show_names) return; // clear all name draws obj=server.objs; for (n=0;n!=server.count.obj;n++) { obj->draw.remote_name.on=FALSE; obj++; } // remove names behind z or off-screen // ignore console as it won't matter for projection gl_3D_view(); gl_3D_rotate(&view.render->camera.pnt,&view.render->camera.ang); gl_setup_project(); for (n=0;n!=view.render->draw_list.count;n++) { if (view.render->draw_list.items[n].type!=view_render_type_object) continue; obj=&server.objs[view.render->draw_list.items[n].idx]; if (!obj->player) continue; if (obj->hidden) continue; // get name point has_tag=FALSE; mdl=NULL; if ((obj->draw.uid!=-1) && (obj->draw.on)) mdl=model_find_uid(obj->draw.uid); if (mdl!=NULL) { x=obj->pnt.x; y=obj->pnt.y; z=obj->pnt.z; has_tag=model_get_name_position(mdl,&obj->draw.setup,&x,&y,&z); } if (!has_tag) { x=obj->pnt.x; y=(obj->pnt.y-obj->size.y)-map_enlarge; z=obj->pnt.z; } // translate and rotate point dist=distance_get(x,y,z,view.render->camera.pnt.x,view.render->camera.pnt.y,view.render->camera.pnt.z); if (dist>=remote_name_max_distance) continue; obj->draw.remote_name.pnt.x=x; obj->draw.remote_name.pnt.y=y; obj->draw.remote_name.pnt.z=z; // is it behind the z? if (!gl_project_in_view_z(x,y,z)) continue; // project names gl_project_point(&x,&y,&z); obj->draw.remote_name.proj_pnt.x=x; obj->draw.remote_name.proj_pnt.y=y; obj->draw.remote_name.proj_pnt.z=z; // calculate the fade if (dist<remote_name_min_distance) { obj->draw.remote_name.fade=1.0f; } else { obj->draw.remote_name.fade=1.0f-((float)(dist-remote_name_min_distance)/(float)(remote_name_max_distance-remote_name_min_distance)); } obj->draw.remote_name.size=hud.font.text_size_medium-(int)((float)(hud.font.text_size_medium*dist)/(float)(remote_name_max_distance-remote_name_min_distance)); if (obj->draw.remote_name.size<10) obj->draw.remote_name.size=10; obj->draw.remote_name.on=TRUE; } // ray trace remote name to camera's eye level // to check for visibility ept.x=view.render->camera.pnt.x; ept.y=view.render->camera.pnt.y; ept.z=view.render->camera.pnt.z; contact.obj.on=TRUE; contact.proj.on=FALSE; contact.hit_mode=poly_ray_trace_hit_mode_all; contact.origin=poly_ray_trace_origin_object; for (n=0;n!=server.count.obj;n++) { obj=&server.objs[n]; if (!obj->draw.remote_name.on) continue; spt.x=obj->draw.remote_name.pnt.x; spt.y=obj->draw.remote_name.pnt.y; spt.z=obj->draw.remote_name.pnt.z; contact.obj.ignore_uid=obj->uid; hit=ray_trace_map_by_point(&spt,&ept,&hpt,&contact); if (camera.mode==cv_fpp) { if (hit) { if (contact.obj.uid!=server.player_obj_uid) { obj->draw.remote_name.on=FALSE; continue; } } else { obj->draw.remote_name.on=FALSE; continue; } } else { if (hit) { obj->draw.remote_name.on=FALSE; continue; } } } }