static void reset_lighting (View *view) { gint i; static float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f}; for (i = 0; i < view->nlights; i++) light_reset (view->lights[i]); glLightModelfv (GL_LIGHT_MODEL_AMBIENT, ambient); }
void light_load(void) { static char buf[MAXSTR]; int light = -1; fs_file fp; float v[4]; int i; light_reset(); if ((fp = fs_open("lights.txt", "r"))) { while (fs_gets(buf, sizeof (buf), fp)) { strip_newline(buf); if (sscanf(buf, "light %d", &i) == 1) { if (i >= 0 && i < LIGHT_MAX) light = i; } else if (sscanf(buf, "position %f %f %f %f", &v[0], &v[1], &v[2], &v[3]) == 4) { if (light >= 0) q_cpy(lights[light].p, v); } else if (sscanf(buf, "diffuse %f %f %f %f", &v[0], &v[1], &v[2], &v[3]) == 4) { if (light >= 0) q_cpy(lights[light].d, v); } else if (sscanf(buf, "ambient %f %f %f %f", &v[0], &v[1], &v[2], &v[3]) == 4) { if (light >= 0) q_cpy(lights[light].a, v); else q_cpy(light_ambient, v); } else if (sscanf(buf, "specular %f %f %f %f", &v[0], &v[1], &v[2], &v[3]) == 4) { if (light >= 0) q_cpy(lights[light].s, v); } } fs_close(fp); } }
void techroom_ships_render(float frametime) { // render all the common stuff tech_common_render(); if(Cur_entry_index == -1) return; // now render the trackball ship, which is unique to the ships tab float rev_rate = REVOLUTION_RATE; angles rot_angles, view_angles; int z, i, j; ship_info *sip = &Ship_info[Cur_entry_index]; model_render_params render_info; if (sip->uses_team_colors) { render_info.set_team_color(sip->default_team_name, "none", 0, 0); } // get correct revolution rate z = sip->flags; if (z & SIF_BIG_SHIP) { rev_rate *= 1.7f; } if (z & SIF_HUGE_SHIP) { rev_rate *= 3.0f; } // rotate the ship as much as required for this frame Techroom_ship_rot += PI2 * frametime / rev_rate; while (Techroom_ship_rot > PI2){ Techroom_ship_rot -= PI2; } // reorient ship if (Trackball_active) { int dx, dy; matrix mat1, mat2; if (Trackball_active) { mouse_get_delta(&dx, &dy); if (dx || dy) { vm_trackball(-dx, -dy, &mat1); vm_matrix_x_matrix(&mat2, &mat1, &Techroom_ship_orient); Techroom_ship_orient = mat2; } } } else { // setup stuff needed to render the ship view_angles.p = -0.6f; view_angles.b = 0.0f; view_angles.h = 0.0f; vm_angles_2_matrix(&Techroom_ship_orient, &view_angles); rot_angles.p = 0.0f; rot_angles.b = 0.0f; rot_angles.h = Techroom_ship_rot; vm_rotate_matrix_by_angles(&Techroom_ship_orient, &rot_angles); } gr_set_clip(Tech_ship_display_coords[gr_screen.res][SHIP_X_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_Y_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_W_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_H_COORD], GR_RESIZE_MENU); // render the ship g3_start_frame(1); g3_set_view_matrix(&sip->closeup_pos, &vmd_identity_matrix, sip->closeup_zoom * 1.3f); // lighting for techroom light_reset(); vec3d light_dir = vmd_zero_vector; light_dir.xyz.y = 1.0f; light_dir.xyz.x = 0.0000001f; light_add_directional(&light_dir, 0.85f, 1.0f, 1.0f, 1.0f); light_rotate_all(); // lighting for techroom Glowpoint_use_depth_buffer = false; model_clear_instance(Techroom_ship_modelnum); render_info.set_detail_level_lock(0); polymodel *pm = model_get(Techroom_ship_modelnum); for (i = 0; i < sip->n_subsystems; i++) { model_subsystem *msp = &sip->subsystems[i]; if (msp->type == SUBSYSTEM_TURRET) { float p = 0.0f; float h = 0.0f; for (j = 0; j < msp->n_triggers; j++) { // special case for turrets p = msp->triggers[j].angle.xyz.x; h = msp->triggers[j].angle.xyz.y; } if ( msp->subobj_num >= 0 ) { model_set_instance_techroom(Techroom_ship_modelnum, msp->subobj_num, 0.0f, h ); } if ( (msp->subobj_num != msp->turret_gun_sobj) && (msp->turret_gun_sobj >= 0) ) { model_set_instance_techroom(Techroom_ship_modelnum, msp->turret_gun_sobj, p, 0.0f ); } } } if(Cmdline_shadow_quality) { gr_reset_clip(); shadows_start_render(&Eye_matrix, &Eye_position, Proj_fov, gr_screen.clip_aspect, -sip->closeup_pos.xyz.z + pm->rad, -sip->closeup_pos.xyz.z + pm->rad + 200.0f, -sip->closeup_pos.xyz.z + pm->rad + 2000.0f, -sip->closeup_pos.xyz.z + pm->rad + 10000.0f); render_info.set_flags(MR_NO_TEXTURING | MR_NO_LIGHTING | MR_AUTOCENTER); model_render_immediate(&render_info, Techroom_ship_modelnum, &Techroom_ship_orient, &vmd_zero_vector); shadows_end_render(); gr_set_clip(Tech_ship_display_coords[gr_screen.res][SHIP_X_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_Y_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_W_COORD], Tech_ship_display_coords[gr_screen.res][SHIP_H_COORD], GR_RESIZE_MENU); } if (!Cmdline_nohtl) { gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance); gr_set_view_matrix(&Eye_position, &Eye_matrix); } uint render_flags = MR_AUTOCENTER; if(sip->flags2 & SIF2_NO_LIGHTING) render_flags |= MR_NO_LIGHTING; render_info.set_flags(render_flags); model_render_immediate(&render_info, Techroom_ship_modelnum, &Techroom_ship_orient, &vmd_zero_vector); Glowpoint_use_depth_buffer = true; batch_render_all(); if (!Cmdline_nohtl) { gr_end_view_matrix(); gr_end_proj_matrix(); } g3_end_frame(); gr_reset_clip(); }
int game_client_init(const char *file_name) { char *back_name = "", *grad_name = ""; int i; coins = 0; status = GAME_NONE; game_client_free(file_name); /* Load SOL data. */ if (!game_base_load(file_name)) return (gd.state = 0); if (!sol_load_vary(&gd.vary, &game_base)) { game_base_free(NULL); return (gd.state = 0); } if (!sol_load_draw(&gd.draw, &gd.vary, config_get_d(CONFIG_SHADOW))) { sol_free_vary(&gd.vary); game_base_free(NULL); return (gd.state = 0); } gd.state = 1; /* Initialize game state. */ game_tilt_init(&gd.tilt); game_view_init(&gd.view); gd.jump_e = 1; gd.jump_b = 0; gd.jump_dt = 0.0f; gd.goal_e = 0; gd.goal_k = 0.0f; /* Initialize interpolation. */ game_lerp_init(&gl, &gd); /* Initialize fade. */ gd.fade_k = 1.0f; gd.fade_d = -2.0f; /* Load level info. */ version.x = 0; version.y = 0; for (i = 0; i < gd.vary.base->dc; i++) { char *k = gd.vary.base->av + gd.vary.base->dv[i].ai; char *v = gd.vary.base->av + gd.vary.base->dv[i].aj; if (strcmp(k, "back") == 0) back_name = v; if (strcmp(k, "grad") == 0) grad_name = v; if (strcmp(k, "version") == 0) sscanf(v, "%d.%d", &version.x, &version.y); } /* * If the version of the loaded map is 1, assume we have a version * match with the server. In this way 1.5.0 replays don't trigger * bogus map compatibility warnings. Post-1.5.0 replays will have * CMD_MAP override this. */ game_compat_map = version.x == 1; /* Initialize particles. */ part_reset(); /* Initialize command state. */ cmd_state_init(&cs); /* Initialize background. */ back_init(grad_name); sol_load_full(&gd.back, back_name, 0); /* Initialize lighting. */ light_reset(); return gd.state; }