Skip to content

Commit

Permalink
See desc
Browse files Browse the repository at this point in the history
* improve first person spectator cam
* add lighting based cylindrical fog for gpus where other type wont work
correctly
* improve network graph
  • Loading branch information
xtreme8000 committed May 14, 2019
1 parent afab133 commit d88ca3e
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 48 deletions.
3 changes: 3 additions & 0 deletions resources/config.ini
Expand Up @@ -13,6 +13,9 @@ multisamples = 0
greedy_meshing = 0
vsync = 1
show_fps = 0
voxlap_models = 0
force_displaylist = 0
smooth_fog = 0

[controls]
move_forward = 87
Expand Down
2 changes: 1 addition & 1 deletion src/camera.c
Expand Up @@ -36,7 +36,7 @@ float camera_fov_scaled() {
int render_fpv = (camera_mode==CAMERAMODE_FPS) || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode);
int local_id = (camera_mode==CAMERAMODE_FPS)?local_player_id:cameracontroller_bodyview_player;

if(render_fpv && players[local_id].held_item==TOOL_GUN && players[local_id].input.buttons.rmb && !players[local_id].input.keys.sprint)
if(render_fpv && players[local_id].held_item==TOOL_GUN && players[local_id].input.buttons.rmb && !players[local_id].input.keys.sprint && players[local_id].alive)
return camera_fov*atan(tan((camera_fov/180.0F*PI)/2)/2.0F)*2.0F;
return camera_fov;
}
Expand Down
11 changes: 11 additions & 0 deletions src/config.c
Expand Up @@ -64,6 +64,7 @@ void config_save() {
config_seti("voxlap_models",settings.voxlap_models);
config_seti("force_displaylist",settings.force_displaylist);
config_seti("inverty",settings.invert_y);
config_seti("smooth_fog",settings.smooth_fog);

for(int k=0;k<list_size(&config_keys);k++) {
struct config_key_pair* e = list_get(&config_keys,k);
Expand Down Expand Up @@ -138,6 +139,9 @@ static int config_read_key(void* user, const char* section, const char* name, co
if(!strcmp(name,"inverty")) {
settings.invert_y = atoi(value);
}
if(!strcmp(name,"smooth_fog")) {
settings.smooth_fog = atoi(value);
}
}
if(!strcmp(section,"controls")) {
for(int k=0;k<list_size(&config_keys);k++) {
Expand Down Expand Up @@ -388,6 +392,13 @@ void config_reload() {
.help="Enable this on buggy drivers",
.name="Force Displaylist"
});
list_add(&config_settings,&(struct config_setting){
.value=&settings_tmp.smooth_fog,
.type=CONFIG_TYPE_INT,
.max=1,
.help="Enable this on buggy drivers",
.name="Smooth fog"
});
list_add(&config_settings,&(struct config_setting){
.value=&settings_tmp.show_fps,
.type=CONFIG_TYPE_INT,
Expand Down
1 change: 1 addition & 0 deletions src/config.h
Expand Up @@ -44,6 +44,7 @@ extern struct RENDER_OPTIONS {
int voxlap_models;
int force_displaylist;
int invert_y;
int smooth_fog;
} settings, settings_tmp;

extern struct list config_keys;
Expand Down
67 changes: 49 additions & 18 deletions src/glx.c
Expand Up @@ -209,19 +209,42 @@ void glx_displaylist_draw(struct glx_displaylist* x, int type) {

void glx_enable_sphericalfog() {
#ifndef OPENGL_ES
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glBindTexture(GL_TEXTURE_2D,texture_gradient.texture_id);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
float t_plane[4] = {1.0F/settings.render_distance/2.0F,0.0F,0.0F,-camera_x/settings.render_distance/2.0F+0.5F};
float s_plane[4] = {0.0F,0.0F,1.0F/settings.render_distance/2.0F,-camera_z/settings.render_distance/2.0F+0.5F};
glTexGenfv(GL_T,GL_EYE_PLANE,t_plane);
glTexGenfv(GL_S,GL_EYE_PLANE,s_plane);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_S);
if(!settings.smooth_fog) {
glEnable(GL_TEXTURE_2D);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glBindTexture(GL_TEXTURE_2D,texture_gradient.texture_id);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_EYE_LINEAR);
float t_plane[4] = {1.0F/settings.render_distance/2.0F,0.0F,0.0F,-camera_x/settings.render_distance/2.0F+0.5F};
float s_plane[4] = {0.0F,0.0F,1.0F/settings.render_distance/2.0F,-camera_z/settings.render_distance/2.0F+0.5F};
glTexGenfv(GL_T,GL_EYE_PLANE,t_plane);
glTexGenfv(GL_S,GL_EYE_PLANE,s_plane);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_S);
} else {
matrix_select(matrix_model);
matrix_push();
matrix_identity();
matrix_upload();
matrix_pop();

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT,GL_DIFFUSE);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,(float[]){fog_color[0],fog_color[1],fog_color[2],1.0F});

glLightfv(GL_LIGHT1,GL_POSITION,(float[]){camera_x,(settings.render_distance*map_size_y)/16.0F,camera_z,1.0F});
float dir[3] = {0.0F,-1.0F,0.0F};
glLightfv(GL_LIGHT1,GL_SPOT_DIRECTION,(float[]){0.0F,-1.0F,0.0F});
glLightfv(GL_LIGHT1,GL_DIFFUSE,(float[]){1.0F,1.0F,1.0F,1.0F});
glLightfv(GL_LIGHT1,GL_AMBIENT,(float[]){-fog_color[0],-fog_color[1],-fog_color[2],1.0F});
glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,tan(16.0F/map_size_y)/PI*180.0F);
glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,128.0F);
glNormal3f(0.0F,1.0F,0.0F);
}
#else
matrix_select(matrix_model);
matrix_push();
Expand Down Expand Up @@ -253,11 +276,19 @@ void glx_enable_sphericalfog() {

void glx_disable_sphericalfog() {
#ifndef OPENGL_ES
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_S);
glBindTexture(GL_TEXTURE_2D,0);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glDisable(GL_TEXTURE_2D);
if(!settings.smooth_fog) {
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_S);
glBindTexture(GL_TEXTURE_2D,0);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glDisable(GL_TEXTURE_2D);
} else {
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHT1);
glDisable(GL_LIGHTING);
float a[4] = {0.2F,0.2F,0.2F,1.0F};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,a);
}
#else
glDisable(GL_COLOR_MATERIAL);
glDisable(GL_LIGHT1);
Expand Down
55 changes: 31 additions & 24 deletions src/hud.c
Expand Up @@ -270,17 +270,15 @@ static void hud_ingame_render(float scalex, float scalef) {
glDisable(GL_DEPTH_TEST);
font_select(FONT_SMALLFNT);
char dbg_str[32];
for(int k=0;k<40;k++) {
float in_h = min((float)network_stats[39-k].ingoing/90.0F,160.0F);
float out_h = min(in_h+(float)network_stats[39-k].outgoing/90.0F,160.0F);
float ping_h = min(out_h+network_stats[39-k].avg_ping/25.0F,160.0F);

glColor3f(1.0F,0.0F,0.0F);
texture_draw_empty(8.0F*scalex+4*k*scalef,(220.0F+ping_h)*scalef,4.0F*scalef,ping_h*scalef);
if(!k) {
sprintf(dbg_str,"ping: %i",network_stats[1].avg_ping);
font_render(8.0F*scalex,202.0F*scalef,8.0F*scalef,dbg_str);
}
int max = 0;
for(int k=0;k<40;k++) {
max = max(max,network_stats[k].ingoing+network_stats[k].outgoing);
}
for(int k=0;k<40;k++) {
float in_h = (float)(network_stats[39-k].ingoing)/max*160.0F;
float out_h = (float)(network_stats[39-k].ingoing+network_stats[39-k].outgoing)/max*160.0F;
float ping_h = min(network_stats[39-k].avg_ping/25.0F,160.0F);

glColor3f(0.0F,0.0F,1.0F);
texture_draw_empty(8.0F*scalex+4*k*scalef,(220.0F+out_h)*scalef,4.0F*scalef,out_h*scalef);
Expand All @@ -295,6 +293,13 @@ static void hud_ingame_render(float scalex, float scalef) {
sprintf(dbg_str,"in: %i b/s",network_stats[1].ingoing);
font_render(8.0F*scalex,212.0F*scalef,8.0F*scalef,dbg_str);
}

glColor3f(1.0F,0.0F,0.0F);
texture_draw_empty(8.0F*scalex+4*k*scalef,(220.0F+ping_h)*scalef,4.0F*scalef,ping_h*scalef);
if(!k) {
sprintf(dbg_str,"ping: %i",network_stats[1].avg_ping);
font_render(8.0F*scalex,202.0F*scalef,8.0F*scalef,dbg_str);
}
}
font_select(FONT_FIXEDSYS);
glColor3f(1.0F,1.0F,1.0F);
Expand Down Expand Up @@ -429,7 +434,10 @@ static void hud_ingame_render(float scalex, float scalef) {
}
}

if(camera_mode==CAMERAMODE_BODYVIEW) {
int is_local = (camera_mode==CAMERAMODE_FPS) || (cameracontroller_bodyview_player==local_player_id);
int local_id = (camera_mode==CAMERAMODE_FPS)?local_player_id:cameracontroller_bodyview_player;

if(camera_mode==CAMERAMODE_BODYVIEW || (camera_mode==CAMERAMODE_SPECTATOR && cameracontroller_bodyview_mode)) {
if(cameracontroller_bodyview_player!=local_player_id) {
font_select(FONT_SMALLFNT);
switch(players[cameracontroller_bodyview_player].team) {
Expand All @@ -450,7 +458,7 @@ static void hud_ingame_render(float scalex, float scalef) {
int cnt = local_player_respawn_time-(int)(window_time()-local_player_death_time);
char coin[16];
sprintf(coin,"INSERT COIN:%i",cnt);
font_centered(settings.window_width/2.0F,53.0F*scalef,53.0F*scalef,coin);
font_centered(settings.window_width/2.0F,53.0F*scalef*(cameracontroller_bodyview_mode?2.0F:1.0F),53.0F*scalef,coin);
if(local_player_respawn_cnt_last!=cnt) {
if(cnt<4) {
sound_create(NULL,SOUND_LOCAL,(cnt==1)?&sound_beep1:&sound_beep2,0.0F,0.0F,0.0F);
Expand All @@ -461,13 +469,10 @@ static void hud_ingame_render(float scalex, float scalef) {
glColor3f(1.0F,1.0F,1.0F);
}

int is_local = (camera_mode==CAMERAMODE_FPS) || (cameracontroller_bodyview_player==local_player_id);
int local_id = (camera_mode==CAMERAMODE_FPS)?local_player_id:cameracontroller_bodyview_player;

if(camera_mode==CAMERAMODE_FPS || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode)) {
glColor3f(1.0F,1.0F,1.0F);
if(camera_mode==CAMERAMODE_FPS || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode)) {
glColor3f(1.0F,1.0F,1.0F);

if(players[local_id].held_item==TOOL_GUN && players[local_id].input.buttons.rmb) {
if(players[local_id].held_item==TOOL_GUN && players[local_id].input.buttons.rmb && players[local_id].alive) {
struct texture* zoom;
switch(players[local_id].weapon) {
case WEAPON_RIFLE:
Expand All @@ -480,23 +485,25 @@ static void hud_ingame_render(float scalex, float scalef) {
zoom = &texture_zoom_shotgun;
break;
}
float zoom_factor = max(0.25F*(1.0F-((window_time()-weapon_last_shot)/weapon_delay(players[local_id].weapon)))+1.0F,1.0F);
float last_shot = is_local?weapon_last_shot:players[local_id].gun_shoot_timer;
float zoom_factor = max(0.25F*(1.0F-((window_time()-last_shot)/weapon_delay(players[local_id].weapon)))+1.0F,1.0F);
texture_draw(zoom,(settings.window_width-settings.window_height*4.0F/3.0F*zoom_factor)/2.0F,settings.window_height*(zoom_factor*0.5F+0.5F),settings.window_height*4.0F/3.0F*zoom_factor,settings.window_height*zoom_factor);
} else {
texture_draw(&texture_target,(settings.window_width-16)/2.0F,(settings.window_height+16)/2.0F,16,16);
}

if(window_time()-local_player_last_damage_timer<=0.5F) {
if(window_time()-local_player_last_damage_timer<=0.5F && is_local) {
float ang = atan2(players[local_player_id].orientation.z,players[local_player_id].orientation.x)-atan2(camera_z-local_player_last_damage_z,camera_x-local_player_last_damage_x)+PI;
texture_draw_rotated(&texture_indicator,settings.window_width/2.0F,settings.window_height/2.0F,200,200,ang);
}

if(local_player_health<=30 && is_local)
int health = is_local?(players[local_id].alive?local_player_health:0):(players[local_id].alive?100:0);
if(health<=30)
glColor3f(1,0,0);
else
glColor3f(1,1,1);
char hp[4];
sprintf(hp,"%i",is_local?local_player_health:100);
sprintf(hp,"%i",health);
font_render(settings.window_width/2.0F-font_length(53.0F*scalef,hp),53.0F*scalef,53.0F*scalef,hp);
texture_draw(&texture_health,settings.window_width/2.0F,44.0F*scalef,32.0F*scalef,32.0F*scalef);

Expand All @@ -511,11 +518,11 @@ static void hud_ingame_render(float scalex, float scalef) {
off = 64*scalef;
case TOOL_SPADE:
item_mini = &texture_block;
sprintf(item_mini_str,"%i",local_player_blocks);
sprintf(item_mini_str,"%i",is_local?local_player_blocks:50);
break;
case TOOL_GRENADE:
item_mini = &texture_grenade;
sprintf(item_mini_str,"%i",local_player_grenades);
sprintf(item_mini_str,"%i",is_local?local_player_grenades:3);
break;
case TOOL_GUN:
{
Expand Down
28 changes: 23 additions & 5 deletions src/main.c
Expand Up @@ -84,6 +84,13 @@ void drawScene(float dt) {
matrix_upload();
chunk_draw_visible();

if(settings.smooth_fog) {
glFogi(GL_FOG_MODE,GL_EXP2);
glFogf(GL_FOG_DENSITY,0.015F);
glFogfv(GL_FOG_COLOR,fog_color);
glEnable(GL_FOG);
}

glShadeModel(GL_FLAT);
kv6_calclight(-1,-1,-1);
matrix_upload();
Expand Down Expand Up @@ -229,6 +236,10 @@ void display(float dt) {
grenade_update(dt);
tracer_update(dt);

int render_fpv = (camera_mode==CAMERAMODE_FPS) || ((camera_mode==CAMERAMODE_BODYVIEW || camera_mode==CAMERAMODE_SPECTATOR) && cameracontroller_bodyview_mode);
int is_local = (camera_mode==CAMERAMODE_FPS) || (cameracontroller_bodyview_player==local_player_id);
int local_id = (camera_mode==CAMERAMODE_FPS)?local_player_id:cameracontroller_bodyview_player;

if(players[local_player_id].items_show && window_time()-players[local_player_id].items_show_start>=0.5F) {
players[local_player_id].items_show = 0;
}
Expand Down Expand Up @@ -273,10 +284,14 @@ void display(float dt) {
}

int* pos = NULL;
switch(players[local_player_id].held_item) {
switch(players[local_id].held_item) {
case TOOL_BLOCK:
if(!players[local_player_id].input.keys.sprint && camera_mode==CAMERAMODE_FPS)
pos = camera_terrain_pick(0);
if(!players[local_id].input.keys.sprint && render_fpv) {
if(is_local)
pos = camera_terrain_pick(0);
else
pos = camera_terrain_pickEx(0,camera_x,camera_y,camera_z,players[local_id].orientation_smooth.x,players[local_id].orientation_smooth.y,players[local_id].orientation_smooth.z);
}
break;
default:
pos = NULL;
Expand All @@ -289,7 +304,7 @@ void display(float dt) {
glDepthMask(GL_FALSE);
struct Point cubes[64];
int amount = 0;
if(local_player_drag_active && players[local_player_id].input.buttons.rmb && players[local_player_id].held_item==TOOL_BLOCK) {
if(is_local && local_player_drag_active && players[local_player_id].input.buttons.rmb && players[local_player_id].held_item==TOOL_BLOCK) {
amount = map_cube_line(local_player_drag_x,local_player_drag_z,63-local_player_drag_y,pos[0],pos[2],63-pos[1],cubes);
} else {
amount = 1;
Expand All @@ -301,7 +316,7 @@ void display(float dt) {
int tmp = cubes[amount-1].y;
cubes[amount-1].y = 63-cubes[amount-1].z;
cubes[amount-1].z = tmp;
if(amount<=local_player_blocks) {
if(amount<=(is_local?local_player_blocks:50)) {
glColor3f(1.0F,1.0F,1.0F);
}

Expand Down Expand Up @@ -391,6 +406,8 @@ void display(float dt) {
}

glx_disable_sphericalfog();
if(settings.smooth_fog)
glDisable(GL_FOG);
}
}

Expand Down Expand Up @@ -583,6 +600,7 @@ int main(int argc, char** argv) {
settings.voxlap_models = 0;
settings.force_displaylist = 0;
settings.invert_y = 0;
settings.smooth_fog = 0;
strcpy(settings.name,"DEV_CLIENT");

if(!file_dir_exists("logs"))
Expand Down
1 change: 1 addition & 0 deletions src/ping.c
Expand Up @@ -41,6 +41,7 @@ void ping_init() {
}

void ping_deinit() {
pthread_mutex_lock(&ping_lock); //stop the ping thread from running
enet_socket_destroy(sock);
enet_socket_destroy(lan);
}
Expand Down

0 comments on commit d88ca3e

Please sign in to comment.