void draw_hind_hud_on_texture (void) { // // set active 3D environment now else 2D clipping will be affected // set_main_3d_full_screen_params (DISPLAY_3D_TINT_CLEAR, DISPLAY_3D_LIGHT_LEVEL_HIGH, DISPLAY_3D_NOISE_LEVEL_NONE); set_3d_active_environment (main_3d_env); //////////////////////////////////////// // // set up HUD 2D environment // //////////////////////////////////////// set_2d_active_environment (hud_env); // // window // set_2d_window (hud_env, HUD_WINDOW_X_MIN, HUD_WINDOW_Y_MIN, HUD_WINDOW_X_MAX, HUD_WINDOW_Y_MAX); if (hud_display_model) { // move HUD coordinate system with head movements to simulate the collimation effect (focus on infinity) float head_offset_x = 0.0, head_offset_y = 0.0, head_offset_z = 0.0; if (get_view_mode() == VIEW_MODE_COCKPIT_PANEL_SPECIAL_HAVOC_HUD) { if (custom_3d_models.arneh_mi24v_cockpit) get_hind_3d_cockpit_hud_view_position(&head_offset_x, &head_offset_y, &head_offset_z); } else { head_offset_x = -getViewpointOffsetX(head_offset_x); head_offset_y = -getViewpointOffsetY(head_offset_y); head_offset_z = -getViewpointOffsetY(head_offset_z); head_offset_x += wide_cockpit_position[WIDEVIEW_HIND_PILOT].c.x; head_offset_y += wide_cockpit_position[WIDEVIEW_HIND_PILOT].c.y; head_offset_z += wide_cockpit_position[WIDEVIEW_HIND_PILOT].c.z; } { // move texture UV coordinates to move and scale the texture unsigned i; for (i=0; i<num_texture_coordinates; i++) { float scale, u = hud_texture_uv_coordinates[i].u, v = hud_texture_uv_coordinates[i].v; // scale hud to keep same absolute size no matter distance to hud u -= 0.5; v -= 0.5; hud_distance = hud_position_z - head_offset_z; scale = hud_position_z / hud_distance; u *= scale; v *= scale; u += 0.5; v += 0.5; // then displace hud to keep it directly in front of pilot's position u -= (scale) * head_offset_x / hud_width; v += (scale) * (head_offset_y - hud_position_y) / hud_height; hud_display_model->surface_texture_points[i].u = u; hud_display_model->surface_texture_points[i].v = v; } } } // // viewport // draw_large_hud = FALSE; hud_viewport_size = HUD_VIEWPORT_SMALL_SIZE; hud_viewport_x_org = HUD_VIEWPORT_TEXTURE_X_ORG; hud_viewport_y_org = HUD_VIEWPORT_TEXTURE_Y_ORG; hud_viewport_x_min = hud_viewport_x_org - (hud_viewport_size * 0.5); hud_viewport_y_min = hud_viewport_y_org - (hud_viewport_size * 0.5); hud_viewport_x_max = hud_viewport_x_org + (hud_viewport_size * 0.5) - 0.001; hud_viewport_y_max = hud_viewport_y_org + (hud_viewport_size * 0.5) - 0.001; set_2d_viewport (hud_env, hud_viewport_x_min, hud_viewport_y_min, hud_viewport_x_max, hud_viewport_y_max); // // get screen co-ords (vitural cockpit texture - scaling only works near screen centre) // hud_screen_x_min = full_screen_x_mid - ((HUD_VIEWPORT_SMALL_SIZE / (640.0 * 2.0)) * full_screen_width); hud_screen_y_min = full_screen_y_mid - ((HUD_VIEWPORT_SMALL_SIZE / (480.0 * 2.0)) * full_screen_height); hud_screen_x_max = full_screen_x_mid + ((HUD_VIEWPORT_SMALL_SIZE / (640.0 * 2.0)) * full_screen_width) - 0.001; hud_screen_y_max = full_screen_y_mid + ((HUD_VIEWPORT_SMALL_SIZE / (480.0 * 2.0)) * full_screen_height) - 0.001; hud_screen_x_scale = 640.0 / full_screen_width; hud_screen_y_scale = 480.0 / full_screen_height; //////////////////////////////////////// // // draw HUD // //////////////////////////////////////// set_active_screen (hud_texture_screen); if (lock_screen (hud_texture_screen)) { rgb_colour clear_hud_colour; if (backup_sight_active) { set_rgb_colour (clear_hud_colour, backup_sight_colour.r, backup_sight_colour.g, backup_sight_colour.b, 0); } else { set_rgb_colour (clear_hud_colour, hud_colour.r, hud_colour.g, hud_colour.b, 0); } set_block (0, 0, HUD_VIEWPORT_SMALL_SIZE - 1, HUD_VIEWPORT_SMALL_SIZE - 1, clear_hud_colour); if (electrical_system_active()) if (backup_sight_active) draw_backup_sight(); else if (!hind_damage.head_up_display) { set_mono_font_colour (hud_colour); draw_layout_grid (); if (hud_mode == HUD_MODE_WEAPON) draw_weapon_mode_hud (TRUE); } // last pixel must be transparent because it's repeated when texture doesn't fill entire polygon draw_line(0, 0, 0, HUD_VIEWPORT_SMALL_SIZE - 1, clear_hud_colour); draw_line(0, 0, HUD_VIEWPORT_SMALL_SIZE - 1, 0, clear_hud_colour); draw_line(0, HUD_VIEWPORT_SMALL_SIZE - 1, HUD_VIEWPORT_SMALL_SIZE - 1, HUD_VIEWPORT_SMALL_SIZE - 1, clear_hud_colour); draw_line(HUD_VIEWPORT_SMALL_SIZE - 1, 0, HUD_VIEWPORT_SMALL_SIZE - 1, HUD_VIEWPORT_SMALL_SIZE - 1, clear_hud_colour); flush_screen_texture_graphics (hud_texture_screen); unlock_screen (hud_texture_screen); } set_active_screen (video_screen); }
void update_lightning_effect (entity *en) { session *raw; int lightning_flag = FALSE; float new_time; ASSERT (en); raw = (session *) get_local_entity_data (en); if (get_comms_model () == COMMS_MODEL_SERVER) { // // SERVER : decrease timer, if timer reaches zero create a strike, and reset timer (c/s) // raw->lightning_timer -= get_delta_time (); if (raw->lightning_timer <= 0.0) { lightning_flag = TRUE; new_time = LIGHTNING_EFFECT_MINIMUM_TIMER + ((LIGHTNING_EFFECT_MAXIMUM_TIMER - LIGHTNING_EFFECT_MINIMUM_TIMER) * frand1 ()); #if DEBUG_MODULES debug_log ("SS_UPDT : Set lightning timer %.2f", new_time); #endif set_client_server_entity_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER, new_time); } } else { // // CLIENT : decrease timer only if non-zero and create strike if zero reached ( new timer will be set by server ) // if (raw->lightning_timer > 0.0) { raw->lightning_timer -= get_delta_time (); if (raw->lightning_timer <= 0.0) { lightning_flag = TRUE; raw->lightning_timer = 0.0; } } } if (lightning_flag) { // // create lightning // env_3d *current_3d_env; current_3d_env = get_3d_active_environment (); if (current_3d_env == main_3d_env) { current_3d_env = NULL; } else { set_3d_active_environment (main_3d_env); } add_3d_lightning_strike (LIGHTNING_TYPE_CLOUD_BURST, 0.3, raw->weather_position.x, raw->weather_position.z); add_3d_lightning_strike (LIGHTNING_TYPE_FORKED_1, 0.3, raw->weather_position.x, raw->weather_position.z); if (current_3d_env) { set_3d_active_environment (current_3d_env); } if (get_comms_model () == COMMS_MODEL_SERVER) { sound_sample_indices sound_effect_index; // // lightning sound effect // sound_effect_index = SOUND_SAMPLE_INDEX_AMBIENT_LIGHTNING; create_client_server_sound_effect_entity ( get_local_sector_entity (&(raw->weather_position)), ENTITY_SIDE_NEUTRAL, ENTITY_SUB_TYPE_EFFECT_SOUND_MISC, SOUND_CHANNEL_SOUND_EFFECT, SOUND_LOCALITY_ALL, &raw->weather_position, // position 1.0, // amplification 0.85+(0.3* frand1 ()), //pitch TRUE, // valid sound effect FALSE, // looping 1, // sample count &sound_effect_index // sample index list ); // // thunder sound effect // sound_effect_index = SOUND_SAMPLE_INDEX_AMBIENT_THUNDER; create_client_server_sound_effect_entity ( get_local_sector_entity (&(raw->weather_position)), ENTITY_SIDE_NEUTRAL, ENTITY_SUB_TYPE_EFFECT_SOUND_MISC, SOUND_CHANNEL_SOUND_EFFECT, SOUND_LOCALITY_ALL, &raw->weather_position, // position 1.0, // amplification 0.85+(0.3* frand1 ()), //pitch TRUE, // valid sound effect FALSE, // looping 1, // sample count &sound_effect_index // sample index list ); } } }
void draw_hokum_virtual_cockpit_periscope_mask (void) { vertex quad[4]; real_colour colour, specular; set_3d_active_environment (main_3d_env); if (begin_3d_scene ()) { colour.red = 255; colour.green = 255; colour.blue = 255; colour.alpha = 255; specular.red = 0; specular.green = 0; specular.blue = 0; specular.alpha = 255; set_d3d_transparency_on (); set_d3d_zbuffer_comparison (FALSE); set_d3d_culling (FALSE); set_d3d_texture_wrapping (0, FALSE); set_d3d_texture_filtering (FALSE); set_d3d_flat_shaded_textured_renderstate (get_system_texture_ptr (TEXTURE_INDEX_HOKUM_COCKPIT_WSO_SCOPE_VIEW)); //////////////////////////////////////// // // top left // //////////////////////////////////////// quad[0].i = full_screen_x_min; quad[0].j = full_screen_y_min; quad[0].z = 0.5; quad[0].q = 0.5; quad[0].u = 0.0; quad[0].v = 0.0; quad[1].i = full_screen_x_mid; quad[1].j = full_screen_y_min; quad[1].z = 0.5; quad[1].q = 0.5; quad[1].u = 1.0; quad[1].v = 0.0; quad[2].i = full_screen_x_mid; quad[2].j = full_screen_y_mid; quad[2].z = 0.5; quad[2].q = 0.5; quad[2].u = 1.0; quad[2].v = 1.0; quad[3].i = full_screen_x_min; quad[3].j = full_screen_y_mid; quad[3].z = 0.5; quad[3].q = 0.5; quad[3].u = 0.0; quad[3].v = 1.0; quad[0].next_vertex = &quad[1]; quad[1].next_vertex = &quad[2]; quad[2].next_vertex = &quad[3]; quad[3].next_vertex = NULL; draw_wbuffered_flat_shaded_textured_polygon (quad, colour, specular); //////////////////////////////////////// // // bottom left // //////////////////////////////////////// quad[0].i = full_screen_x_min; quad[0].j = full_screen_y_mid; quad[0].z = 0.5; quad[0].q = 0.5; quad[0].u = 0.0; quad[0].v = 1.0; quad[1].i = full_screen_x_mid; quad[1].j = full_screen_y_mid; quad[1].z = 0.5; quad[1].q = 0.5; quad[1].u = 1.0; quad[1].v = 1.0; quad[2].i = full_screen_x_mid; quad[2].j = full_screen_y_max; quad[2].z = 0.5; quad[2].q = 0.5; quad[2].u = 1.0; quad[2].v = 0.0; quad[3].i = full_screen_x_min; quad[3].j = full_screen_y_max; quad[3].z = 0.5; quad[3].q = 0.5; quad[3].u = 0.0; quad[3].v = 0.0; quad[0].next_vertex = &quad[1]; quad[1].next_vertex = &quad[2]; quad[2].next_vertex = &quad[3]; quad[3].next_vertex = NULL; draw_wbuffered_flat_shaded_textured_polygon (quad, colour, specular); //////////////////////////////////////// // // top right // //////////////////////////////////////// quad[0].i = full_screen_x_mid; quad[0].j = full_screen_y_min; quad[0].z = 0.5; quad[0].q = 0.5; quad[0].u = 1.0; quad[0].v = 0.0; quad[1].i = full_screen_x_max; quad[1].j = full_screen_y_min; quad[1].z = 0.5; quad[1].q = 0.5; quad[1].u = 0.0; quad[1].v = 0.0; quad[2].i = full_screen_x_max; quad[2].j = full_screen_y_mid; quad[2].z = 0.5; quad[2].q = 0.5; quad[2].u = 0.0; quad[2].v = 1.0; quad[3].i = full_screen_x_mid; quad[3].j = full_screen_y_mid; quad[3].z = 0.5; quad[3].q = 0.5; quad[3].u = 1.0; quad[3].v = 1.0; quad[0].next_vertex = &quad[1]; quad[1].next_vertex = &quad[2]; quad[2].next_vertex = &quad[3]; quad[3].next_vertex = NULL; draw_wbuffered_flat_shaded_textured_polygon (quad, colour, specular); //////////////////////////////////////// // // bottom left // //////////////////////////////////////// quad[0].i = full_screen_x_mid; quad[0].j = full_screen_y_mid; quad[0].z = 0.5; quad[0].q = 0.5; quad[0].u = 1.0; quad[0].v = 1.0; quad[1].i = full_screen_x_max; quad[1].j = full_screen_y_mid; quad[1].z = 0.5; quad[1].q = 0.5; quad[1].u = 0.0; quad[1].v = 1.0; quad[2].i = full_screen_x_max; quad[2].j = full_screen_y_max; quad[2].z = 0.5; quad[2].q = 0.5; quad[2].u = 0.0; quad[2].v = 0.0; quad[3].i = full_screen_x_mid; quad[3].j = full_screen_y_max; quad[3].z = 0.5; quad[3].q = 0.5; quad[3].u = 1.0; quad[3].v = 0.0; quad[0].next_vertex = &quad[1]; quad[1].next_vertex = &quad[2]; quad[2].next_vertex = &quad[3]; quad[3].next_vertex = NULL; draw_wbuffered_flat_shaded_textured_polygon (quad, colour, specular); //////////////////////////////////////// set_d3d_transparency_off (); set_d3d_zbuffer_comparison (TRUE); set_d3d_culling (TRUE); end_3d_scene (); } }
void draw_default_internal_virtual_cockpit_3d (unsigned int flags) { viewpoint vp; object_3d_sub_object_search_data search; object_3d_instance *virtual_cockpit_inst3d; //#ifndef DEBUG_WIDEVIEW set_global_wide_cockpit(FALSE); edit_wide_cockpit = FALSE; //#endif //////////////////////////////////////// // // virtual cockpit viewpoint is placed at the main object origin // //////////////////////////////////////// vp.x = 0.0; vp.y = 0.0; vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), vp.attitude); //////////////////////////////////////// // // render displays onto textures (before draw 3D scenes) // //////////////////////////////////////// if (flags & VIRTUAL_COCKPIT_UPFRONT_DISPLAY) { draw_default_upfront_display_on_texture (); } if (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) { draw_default_mfd_on_texture (MFD_LOCATION_LHS); } if (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) { draw_default_mfd_on_texture (MFD_LOCATION_RHS); } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_COCKPIT)) { set_cockpit_white_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // virtual cockpit // if (flags & VIRTUAL_COCKPIT_COCKPIT) { switch (get_local_entity_int_value (get_session_entity (), INT_TYPE_DAY_SEGMENT_TYPE)) { //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAWN: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAY: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level1_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DUSK: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_NIGHT: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level3_inst3d; break; } } #if DEMO_VERSION virtual_cockpit_inst3d = virtual_cockpit_level1_inst3d; #endif //VJ 28 is the subobject number of the pilot get_default_crew_viewpoint (28, virtual_cockpit_inst3d); virtual_cockpit_inst3d->vp.x += BASE_DX; virtual_cockpit_inst3d->vp.y += BASE_DY; virtual_cockpit_inst3d->vp.z += BASE_DZ; if (get_global_wide_cockpit ()) { virtual_cockpit_inst3d->vp.x += wide_cockpit_position[wide_cockpit_nr].c.x; virtual_cockpit_inst3d->vp.y += wide_cockpit_position[wide_cockpit_nr].c.y; virtual_cockpit_inst3d->vp.z += wide_cockpit_position[wide_cockpit_nr].c.z; //VJ 050207 included head pitch in fixed view setting pilot_head_pitch_datum = rad ( wide_cockpit_position[wide_cockpit_nr].c.p ); } //use subnr to eliminate each sub_object one by one, in edit_wide_view press the end key // virtual_cockpit_inst3d->sub_objects[subnr].visible_object = FALSE; //rotor virtual_cockpit_inst3d->sub_objects[1].visible_object = FALSE; //pilots (28 is back, 29 is front) virtual_cockpit_inst3d->sub_objects[28].visible_object = FALSE; virtual_cockpit_inst3d->sub_objects[29].visible_object = FALSE; //wipers virtual_cockpit_inst3d->sub_objects[37].visible_object = FALSE; // don't do this because it mersses up change smade to virtual_cockpit_inst3d // memcpy (&virtual_cockpit_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_inst3d->vp.position, virtual_cockpit_inst3d); } //C:\gms\Razorworks\eech-new\modules\3d\3dobjbuf.c draw_3d_scene (); print_edit_wide_cockpit (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_INSTRUMENT_NEEDLES | VIRTUAL_COCKPIT_INSTRUMENT_LARGE_NEEDLES)) { set_cockpit_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); //VJ# /* vp.x = wide_cockpit_position[wide_cockpit_nr].c.x; vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; vp.x += dx; vp.y += dy; vp.z += dz; */ vp.x = BASE_DX; vp.y = BASE_DY - 0.0800; vp.z = BASE_DZ; clear_zbuffer_screen (); if (begin_3d_scene ()) { // // instrument needles // if (flags & VIRTUAL_COCKPIT_INSTRUMENT_NEEDLES) { // // ADI slip // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI_SIDE_SLIP; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_default_virtual_cockpit_adi_slip_indicator_needle_value (); } // // airspeed // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_AIRSPEED; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = get_default_virtual_cockpit_airspeed_indicator_needle_value (); } // // altimeter // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ALTIMETER; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = get_default_virtual_cockpit_barometric_altimeter_needle_value (); } // // clock // { float hours, minutes, seconds; // // only read clock values if drawing virtual cockpit needles to prevent speeding up clock debug values // if (draw_virtual_cockpit_needles_on_fixed_cockpits) { get_default_virtual_cockpit_clock_hand_values (&hours, &minutes, &seconds); } else { hours = 0.0; minutes = 0.0; seconds = 0.0; } // // hour hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_HOUR_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = hours; } // // minute hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_MINUTE_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = minutes; } // // second hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_SECOND_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = seconds; } } memcpy (&virtual_cockpit_instrument_needles_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_instrument_needles_inst3d->vp.position, virtual_cockpit_instrument_needles_inst3d); } // // instrument large needles // if (flags & VIRTUAL_COCKPIT_INSTRUMENT_LARGE_NEEDLES) { // // ADI slip // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_large_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI_SIDE_SLIP; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_default_virtual_cockpit_adi_slip_indicator_needle_value (); } // // airspeed // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_large_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_AIRSPEED; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_default_virtual_cockpit_airspeed_indicator_needle_value (); } memcpy (&virtual_cockpit_instrument_large_needles_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_instrument_large_needles_inst3d->vp.position, virtual_cockpit_instrument_large_needles_inst3d); } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene without lighting // //////////////////////////////////////// if ( (flags & VIRTUAL_COCKPIT_DISPLAY_VIEW) && (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) && (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) ) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // lhs mfd // memcpy (&virtual_cockpit_display_view_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_display_view_mfd_inst3d->vp.position, virtual_cockpit_display_view_mfd_inst3d); // // rhs mfd // memcpy (&virtual_cockpit_display_view_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_display_view_mfd_inst3d->vp.position, virtual_cockpit_display_view_mfd_inst3d); draw_3d_scene (); end_3d_scene (); } } else { if (flags & (VIRTUAL_COCKPIT_UPFRONT_DISPLAY | VIRTUAL_COCKPIT_LHS_MFD_DISPLAY | VIRTUAL_COCKPIT_RHS_MFD_DISPLAY)) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); // vp.x = wide_cockpit_position[wide_cockpit_nr].c.x; // vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; // vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; if (begin_3d_scene ()) { // // up-front display // vp.y = BASE_DY - 0.0800 - _DY; if (flags & VIRTUAL_COCKPIT_UPFRONT_DISPLAY) { vp.y -= 0.01; memcpy (&virtual_cockpit_upfront_display_inst3d->vp, &vp, sizeof (viewpoint)); vp.y += 0.01; // virtual_cockpit_upfront_display_inst3d->vp.position.y = dy; insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_upfront_display_inst3d->vp.position, virtual_cockpit_upfront_display_inst3d); } // // lhs mfd // if (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) { memcpy (&virtual_cockpit_lhs_mfd_inst3d->vp, &vp, sizeof (viewpoint)); //virtual_cockpit_lhs_mfd_inst3d->vp.position.x += dx; insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_lhs_mfd_inst3d->vp.position, virtual_cockpit_lhs_mfd_inst3d); } // // rhs mfd // if (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) { memcpy (&virtual_cockpit_rhs_mfd_inst3d->vp, &vp, sizeof (viewpoint)); //virtual_cockpit_rhs_mfd_inst3d->vp.position.x -= dx; insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_rhs_mfd_inst3d->vp.position, virtual_cockpit_rhs_mfd_inst3d); } draw_3d_scene (); end_3d_scene (); } } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// // // draw fillet to mask TADS display // if ( (d3d_can_render_to_texture) && (flags & (VIRTUAL_COCKPIT_COCKPIT)) && (flags & (VIRTUAL_COCKPIT_LHS_MFD_DISPLAY)) && (flags & (VIRTUAL_COCKPIT_RHS_MFD_DISPLAY)) ) { set_cockpit_white_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { switch (get_local_entity_int_value (get_session_entity (), INT_TYPE_DAY_SEGMENT_TYPE)) { //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAWN: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAY: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level1_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DUSK: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_NIGHT: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level3_inst3d; break; } } #if DEMO_VERSION virtual_cockpit_inst3d = virtual_cockpit_fillet_level1_inst3d; #endif //VJ# vp.x = BASE_DX; vp.y = BASE_DY - 0.086 - _DY; vp.z = BASE_DZ-0.010; memcpy (&virtual_cockpit_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_inst3d->vp.position, virtual_cockpit_inst3d); draw_3d_scene (); end_3d_scene (); } } //draw_default_indicator_lamps_3d (); //draw_default_lamp_on_texture (); //VJ wideview mod, date: 18-mar-03 #if DEBUG_WIDEVIEW if (edit_wide_cockpit) { if (check_key(DIK_NUMPAD7)) { system_sleep(20); dy+= 0.002; } if (check_key(DIK_NUMPAD9)) { system_sleep(20); dy-= 0.002; } if (check_key(DIK_NUMPADSLASH)) { system_sleep(20); dx+= 0.002; } if (check_key(DIK_NUMPADSTAR)) { system_sleep(20); dx-= 0.002; } if (check_key(DIK_NUMPADMINUS)) { system_sleep(20); dz+= 0.002; } if (check_key(DIK_NUMPADPLUS)) { system_sleep(20); dz-= 0.002; } if (check_key(DIK_END)) { system_sleep (100); subnr++; } if (check_key(DIK_NUMPAD0)) { dx = 0; dy = 0; dz = 0; } } #endif move_edit_wide_cockpit (); //////////////////////////////////////// // // tidy up // //////////////////////////////////////// #if RECOGNITION_GUIDE set_3d_view_distances (main_3d_env, 10000.0, 100.0, 1.0, 0.0); #else set_3d_view_distances (main_3d_env, 10000.0, 1.0, 1.0, 0.0); #endif realise_3d_clip_extents (main_3d_env); }
void draw_default_external_virtual_cockpit_3d (unsigned int flags) { viewpoint vp; object_3d_sub_object_search_data search; float theta; object_3d_instance *inst3d; //////////////////////////////////////// // // virtual cockpit viewpoint is placed at the main object origin // //////////////////////////////////////// //NO wideview for 3d cockpit //#ifndef DEBUG_WIDEVIEW set_global_wide_cockpit(FALSE); edit_wide_cockpit = FALSE; //#endif vp.x = 0.0; vp.y = 0.0; vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), vp.attitude); //////////////////////////////////////// // // draw 3D scene without lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_MAIN_ROTOR | VIRTUAL_COCKPIT_STOWED_WIPER | VIRTUAL_COCKPIT_MOVING_WIPER)) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); /* vp.x += dx; vp.y += dy; vp.z += dz; vp.x = wide_cockpit_position[wide_cockpit_nr].c.x; vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; */ vp.x = BASE_DX; vp.y = BASE_DY - 0.164; vp.z = BASE_DZ; if (begin_3d_scene ()) { // // main rotor // if (flags & VIRTUAL_COCKPIT_MAIN_ROTOR) { if (!(get_helicopter_main_rotors_blurred (get_gunship_entity ()) && (!get_global_blurred_main_rotors_visible_from_cockpit ()))) { if (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_MAIN_ROTOR_DAMAGED)) { animate_damaged_helicopter_main_rotors (get_gunship_entity (), TRUE); } else { animate_helicopter_main_rotors (get_gunship_entity (), TRUE, FALSE); } inst3d = (object_3d_instance *) get_local_entity_ptr_value (get_gunship_entity (), PTR_TYPE_INSTANCE_3D_OBJECT); theta = get_rotation_angle_of_helicopter_main_rotors (inst3d); set_rotation_angle_of_helicopter_main_rotors (virtual_cockpit_main_rotor_inst3d, theta); animate_helicopter_virtual_cockpit_main_rotors (get_gunship_entity (), virtual_cockpit_main_rotor_inst3d); memcpy (&virtual_cockpit_main_rotor_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_main_rotor_inst3d->vp.position, virtual_cockpit_main_rotor_inst3d); } } // // wiper // if (wiper_mode == WIPER_MODE_STOWED) { if (flags & VIRTUAL_COCKPIT_STOWED_WIPER) { draw_default_virtual_cockpit_wiper (&vp); } } else { if (flags & VIRTUAL_COCKPIT_MOVING_WIPER) { draw_default_virtual_cockpit_wiper (&vp); } } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_COMPASS | VIRTUAL_COCKPIT_ADI | VIRTUAL_COCKPIT_LARGE_ADI)) { set_cockpit_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); vp.x = BASE_DX; vp.y = BASE_DY; vp.z = BASE_DZ-0.1; /* vp.x = BASE_DX+dx; vp.y = BASE_DY+dy; vp.z = BASE_DZ+dz; vp.x = wide_cockpit_position[wide_cockpit_nr].c.x; vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; */ //VJ# if (begin_3d_scene ()) { // // compass // if (flags & VIRTUAL_COCKPIT_COMPASS) { search.search_depth = 0; search.search_object = virtual_cockpit_compass_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_COMPASS_HEADING_NULL; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_heading = -current_flight_dynamics->heading.value; } memcpy (&virtual_cockpit_compass_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_compass_inst3d->vp.position, virtual_cockpit_compass_inst3d); } // // ADI // /* vp.x = wide_cockpit_position[wide_cockpit_nr].c.x; vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; vp.x += 0.0; vp.y += 0.22; vp.z += 0.18; */ if (flags & VIRTUAL_COCKPIT_ADI) { search.search_depth = 0; search.search_object = virtual_cockpit_adi_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { float heading, pitch, roll; get_default_virtual_cockpit_adi_angles (vp.attitude, &heading, &pitch, &roll); search.result_sub_object->relative_heading = -heading; search.result_sub_object->relative_pitch = pitch; search.result_sub_object->relative_roll = -roll; } memcpy (&virtual_cockpit_adi_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_adi_inst3d->vp.position, virtual_cockpit_adi_inst3d); } // // large ADI // if (flags & VIRTUAL_COCKPIT_LARGE_ADI) { search.search_depth = 0; search.search_object = virtual_cockpit_large_adi_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { float heading, pitch, roll; get_default_virtual_cockpit_adi_angles (vp.attitude, &heading, &pitch, &roll); search.result_sub_object->relative_heading = -heading; search.result_sub_object->relative_pitch = pitch; search.result_sub_object->relative_roll = -roll; } memcpy (&virtual_cockpit_large_adi_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_large_adi_inst3d->vp.position, virtual_cockpit_large_adi_inst3d); } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // rain effect // //////////////////////////////////////// if (flags & VIRTUAL_COCKPIT_RAIN_EFFECT) { if (rain_mode != RAIN_MODE_DRY) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { draw_default_virtual_cockpit_rain_effect (&vp); draw_3d_scene (); end_3d_scene (); } } } //////////////////////////////////////// // // tidy up // //////////////////////////////////////// #if RECOGNITION_GUIDE set_3d_view_distances (main_3d_env, 10000.0, 100.0, 1.0, 0.0); #else set_3d_view_distances (main_3d_env, 10000.0, 1.0, 1.0, 0.0); #endif realise_3d_clip_extents (main_3d_env); }
void draw_blackhawk_internal_virtual_cockpit (unsigned int flags) { viewpoint vp; object_3d_sub_object_search_data search; object_3d_instance *virtual_cockpit_inst3d; //////////////////////////////////////// // // virtual cockpit viewpoint is placed at the main object origin // //////////////////////////////////////// if (get_view_mode () == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_LHS_MFD) { get_display_viewpoint (VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_LHS_MFD, &vp); } else if (get_view_mode () == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_RHS_MFD) { get_display_viewpoint (VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_RHS_MFD, &vp); } else { vp.x = 0.0; vp.y = 0.0; vp.z = 0.0; //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) { vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; //VJ 050207 included head pitch in fixed view setting pilot_head_pitch_datum = rad ( wide_cockpit_position[wide_cockpit_nr].c.p ); if (edit_wide_cockpit) pilot_head_pitch = pilot_head_pitch_datum; } get_local_entity_attitude_matrix (get_gunship_entity (), vp.attitude); } //////////////////////////////////////// // // render displays onto textures (before draw 3D scenes) // //////////////////////////////////////// if (flags & VIRTUAL_COCKPIT_UPFRONT_DISPLAY) { draw_blackhawk_upfront_display_on_texture (); } if (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) { draw_blackhawk_mfd_on_texture (MFD_LOCATION_LHS); } if (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) { draw_blackhawk_mfd_on_texture (MFD_LOCATION_RHS); } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_COCKPIT)) { set_cockpit_white_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); //VJ 050108 wideview x coord used to clip apache cockpit if (get_global_wide_cockpit ()) clipx = wide_cockpit_position[wide_cockpit_nr].c.x; else clipx = 0; set_3d_view_distances (main_3d_single_light_env, 10.0+clipx, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // virtual cockpit // if (flags & VIRTUAL_COCKPIT_COCKPIT) { switch (get_local_entity_int_value (get_session_entity (), INT_TYPE_DAY_SEGMENT_TYPE)) { //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAWN: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAY: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level1_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DUSK: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_NIGHT: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_level3_inst3d; break; } } #if DEMO_VERSION virtual_cockpit_inst3d = virtual_cockpit_level1_inst3d; #endif memcpy (&virtual_cockpit_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_inst3d->vp.position, virtual_cockpit_inst3d); } draw_3d_scene (); print_edit_wide_cockpit (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_INSTRUMENT_NEEDLES | VIRTUAL_COCKPIT_INSTRUMENT_LARGE_NEEDLES)) { set_cockpit_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // instrument needles // if (flags & VIRTUAL_COCKPIT_INSTRUMENT_NEEDLES) { // // ADI slip // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI_SIDE_SLIP; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_blackhawk_virtual_cockpit_adi_slip_indicator_needle_value (); } // // airspeed // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_AIRSPEED; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = get_blackhawk_virtual_cockpit_airspeed_indicator_needle_value (); } // // altimeter // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ALTIMETER; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = get_blackhawk_virtual_cockpit_barometric_altimeter_needle_value (); } // // clock // { float hours, minutes, seconds; // // only read clock values if drawing virtual cockpit needles to prevent speeding up clock debug values // if (draw_virtual_cockpit_needles_on_fixed_cockpits) { get_blackhawk_virtual_cockpit_clock_hand_values (&hours, &minutes, &seconds); } else { hours = 0.0; minutes = 0.0; seconds = 0.0; } // // hour hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_HOUR_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = hours; } // // minute hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_MINUTE_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = minutes; } // // second hand // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_CLOCK_SECOND_HAND; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_needles_on_fixed_cockpits; search.result_sub_object->relative_roll = seconds; } } //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) { vp.z = wide_cockpit_position[wide_cockpit_nr].c.z + 0.03; vp.y = wide_cockpit_position[wide_cockpit_nr].c.y + 0.01; } memcpy (&virtual_cockpit_instrument_needles_inst3d->vp, &vp, sizeof (viewpoint)); if (get_global_wide_cockpit ()) { vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; } insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_instrument_needles_inst3d->vp.position, virtual_cockpit_instrument_needles_inst3d); } // // instrument large needles // if (flags & VIRTUAL_COCKPIT_INSTRUMENT_LARGE_NEEDLES) { // // ADI slip // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_large_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI_SIDE_SLIP; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_blackhawk_virtual_cockpit_adi_slip_indicator_needle_value (); } // // airspeed // search.search_depth = 0; search.search_object = virtual_cockpit_instrument_large_needles_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_AIRSPEED; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_roll = get_blackhawk_virtual_cockpit_airspeed_indicator_needle_value (); } memcpy (&virtual_cockpit_instrument_large_needles_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_instrument_large_needles_inst3d->vp.position, virtual_cockpit_instrument_large_needles_inst3d); } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene without lighting // //////////////////////////////////////// if ( (flags & VIRTUAL_COCKPIT_DISPLAY_VIEW) && (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) && (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) ) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // lhs mfd // memcpy (&virtual_cockpit_display_view_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_display_view_mfd_inst3d->vp.position, virtual_cockpit_display_view_mfd_inst3d); // // rhs mfd // memcpy (&virtual_cockpit_display_view_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_display_view_mfd_inst3d->vp.position, virtual_cockpit_display_view_mfd_inst3d); draw_3d_scene (); end_3d_scene (); } } else { if (flags & (VIRTUAL_COCKPIT_UPFRONT_DISPLAY | VIRTUAL_COCKPIT_LHS_MFD_DISPLAY | VIRTUAL_COCKPIT_RHS_MFD_DISPLAY)) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // up-front display // if (flags & VIRTUAL_COCKPIT_UPFRONT_DISPLAY) { memcpy (&virtual_cockpit_upfront_display_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_upfront_display_inst3d->vp.position, virtual_cockpit_upfront_display_inst3d); } //VJ wideview mod, date: 18-mar-03, 050123 if (get_global_wide_cockpit ()) { vp.y = wide_cockpit_position[wide_cockpit_nr].c.y + 0.008; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z + 0.005; } // // lhs mfd // if (flags & VIRTUAL_COCKPIT_LHS_MFD_DISPLAY) { memcpy (&virtual_cockpit_lhs_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_lhs_mfd_inst3d->vp.position, virtual_cockpit_lhs_mfd_inst3d); } // // rhs mfd // if (flags & VIRTUAL_COCKPIT_RHS_MFD_DISPLAY) { memcpy (&virtual_cockpit_rhs_mfd_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_rhs_mfd_inst3d->vp.position, virtual_cockpit_rhs_mfd_inst3d); } //VJ wideview mod, date: 18-mar-03, 050123 if (get_global_wide_cockpit ()) { vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; } draw_3d_scene (); end_3d_scene (); } } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// // // draw fillet to mask TADS display // if ( (d3d_can_render_to_texture) && //always draw fillet not only with tads //(get_blackhawk_tads_display_visible ()) && (flags & (VIRTUAL_COCKPIT_COCKPIT)) && (flags & (VIRTUAL_COCKPIT_LHS_MFD_DISPLAY)) && (flags & (VIRTUAL_COCKPIT_RHS_MFD_DISPLAY)) ) { set_cockpit_white_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { switch (get_local_entity_int_value (get_session_entity (), INT_TYPE_DAY_SEGMENT_TYPE)) { //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAWN: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DAY: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level1_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_DUSK: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level2_inst3d; break; } //////////////////////////////////////// case DAY_SEGMENT_TYPE_NIGHT: //////////////////////////////////////// { virtual_cockpit_inst3d = virtual_cockpit_fillet_level3_inst3d; break; } } #if DEMO_VERSION virtual_cockpit_inst3d = virtual_cockpit_fillet_level1_inst3d; #endif memcpy (&virtual_cockpit_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_inst3d->vp.position, virtual_cockpit_inst3d); draw_3d_scene (); end_3d_scene (); } } //VJ wideview mod, date: 18-mar-03 move_edit_wide_cockpit (); //////////////////////////////////////// // // tidy up // //////////////////////////////////////// #if RECOGNITION_GUIDE set_3d_view_distances (main_3d_env, 10000.0, 100.0, 1.0, 0.0); #else set_3d_view_distances (main_3d_env, 10000.0, 1.0, 1.0, 0.0); #endif realise_3d_clip_extents (main_3d_env); }
void draw_blackhawk_external_virtual_cockpit (unsigned int flags, unsigned char *wiper_rle_graphic) { viewpoint vp; object_3d_sub_object_search_data search; float theta; object_3d_instance *inst3d; //////////////////////////////////////// // // virtual cockpit viewpoint is placed at the main object origin // //////////////////////////////////////// if (get_view_mode () == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_LHS_MFD) { get_display_viewpoint (VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_LHS_MFD, &vp); } else if (get_view_mode () == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_RHS_MFD) { get_display_viewpoint (VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_RHS_MFD, &vp); } else { vp.x = 0.0; vp.y = 0.0; vp.z = 0.0; if (get_global_wide_cockpit ()) { vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; vp.z = wide_cockpit_position[wide_cockpit_nr].c.z; } get_local_entity_attitude_matrix (get_gunship_entity (), vp.attitude); } //////////////////////////////////////// // // draw 3D scene without lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_MAIN_ROTOR | VIRTUAL_COCKPIT_STOWED_WIPER | VIRTUAL_COCKPIT_MOVING_WIPER)) { set_3d_active_environment (main_3d_env); //VJ 050108 wideview x coord used to clip apache cockpit set_3d_view_distances (main_3d_env, 10.0 + clipx, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // main rotor // if (flags & VIRTUAL_COCKPIT_MAIN_ROTOR) { if (!(get_helicopter_main_rotors_blurred (get_gunship_entity ()) && (!get_global_blurred_main_rotors_visible_from_cockpit ()))) { if (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_MAIN_ROTOR_DAMAGED)) { animate_damaged_helicopter_main_rotors (get_gunship_entity (), TRUE); } else { animate_helicopter_main_rotors (get_gunship_entity (), TRUE, FALSE); } inst3d = (object_3d_instance *) get_local_entity_ptr_value (get_gunship_entity (), PTR_TYPE_INSTANCE_3D_OBJECT); theta = get_rotation_angle_of_helicopter_main_rotors (inst3d); set_rotation_angle_of_helicopter_main_rotors (virtual_cockpit_main_rotor_inst3d, theta); animate_helicopter_virtual_cockpit_main_rotors (get_gunship_entity (), virtual_cockpit_main_rotor_inst3d); memcpy (&virtual_cockpit_main_rotor_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_main_rotor_inst3d->vp.position, virtual_cockpit_main_rotor_inst3d); } } // // wiper // if (wiper_mode == WIPER_MODE_STOWED) { if (flags & VIRTUAL_COCKPIT_STOWED_WIPER) { draw_blackhawk_virtual_cockpit_wiper (&vp); } } else { if (flags & VIRTUAL_COCKPIT_MOVING_WIPER) { draw_blackhawk_virtual_cockpit_wiper (&vp); } } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // draw 3D scene with lighting // //////////////////////////////////////// if (flags & (VIRTUAL_COCKPIT_COMPASS | VIRTUAL_COCKPIT_ADI | VIRTUAL_COCKPIT_LARGE_ADI)) { set_cockpit_lighting (vp.attitude); set_3d_active_environment (main_3d_single_light_env); set_3d_view_distances (main_3d_single_light_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_single_light_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { // // compass // if (flags & VIRTUAL_COCKPIT_COMPASS) { search.search_depth = 0; search.search_object = virtual_cockpit_compass_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_COMPASS_HEADING_NULL; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->relative_heading = -current_flight_dynamics->heading.value; } //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) vp.y = wide_cockpit_position[wide_cockpit_nr].c.y + 0.01; memcpy (&virtual_cockpit_compass_inst3d->vp, &vp, sizeof (viewpoint)); //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_compass_inst3d->vp.position, virtual_cockpit_compass_inst3d); } // // ADI // if (flags & VIRTUAL_COCKPIT_ADI) { search.search_depth = 0; search.search_object = virtual_cockpit_adi_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { float heading, pitch, roll; get_blackhawk_virtual_cockpit_adi_angles (vp.attitude, &heading, &pitch, &roll); search.result_sub_object->relative_heading = -heading; search.result_sub_object->relative_pitch = pitch; search.result_sub_object->relative_roll = -roll; } //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) vp.y = wide_cockpit_position[wide_cockpit_nr].c.y+0.02; memcpy (&virtual_cockpit_adi_inst3d->vp, &vp, sizeof (viewpoint)); //VJ wideview mod, date: 18-mar-03 if (get_global_wide_cockpit ()) vp.y = wide_cockpit_position[wide_cockpit_nr].c.y; insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_adi_inst3d->vp.position, virtual_cockpit_adi_inst3d); } // // large ADI // if (flags & VIRTUAL_COCKPIT_LARGE_ADI) { search.search_depth = 0; search.search_object = virtual_cockpit_large_adi_inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_APACHE_VIRTUAL_COCKPIT_ADI; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { float heading, pitch, roll; get_blackhawk_virtual_cockpit_adi_angles (vp.attitude, &heading, &pitch, &roll); search.result_sub_object->relative_heading = -heading; search.result_sub_object->relative_pitch = pitch; search.result_sub_object->relative_roll = -roll; } memcpy (&virtual_cockpit_large_adi_inst3d->vp, &vp, sizeof (viewpoint)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &virtual_cockpit_large_adi_inst3d->vp.position, virtual_cockpit_large_adi_inst3d); } draw_3d_scene (); end_3d_scene (); } } //////////////////////////////////////// // // rendered wiper // //////////////////////////////////////// if (flags & VIRTUAL_COCKPIT_RENDERED_WIPER) { if (wiper_mode == WIPER_MODE_STOWED) { ASSERT (wiper_rle_graphic); if (lock_screen (active_screen)) { blit_rle_graphic (wiper_rle_graphic, ix_640_480, iy_640_480); unlock_screen (active_screen); } } } //////////////////////////////////////// // // rain effect // //////////////////////////////////////// if (flags & VIRTUAL_COCKPIT_RAIN_EFFECT) { if (rain_mode != RAIN_MODE_DRY) { set_3d_active_environment (main_3d_env); set_3d_view_distances (main_3d_env, 10.0, 0.1, 1.0, 0.0); realise_3d_clip_extents (main_3d_env); recalculate_3d_environment_settings (main_3d_env); clear_zbuffer_screen (); if (begin_3d_scene ()) { draw_blackhawk_virtual_cockpit_rain_effect (&vp); draw_3d_scene (); end_3d_scene (); } } } //////////////////////////////////////// // // tidy up // //////////////////////////////////////// #if RECOGNITION_GUIDE set_3d_view_distances (main_3d_env, 10000.0, 100.0, 1.0, 0.0); #else set_3d_view_distances (main_3d_env, 10000.0, 1.0, 1.0, 0.0); #endif realise_3d_clip_extents (main_3d_env); }
void draw_hind_virtual_cockpit_ort_symbology(void) { int mfd_screen_x_min, mfd_screen_y_min, mfd_screen_x_max, mfd_screen_y_max; rgb_colour background_colour, symbology_colour; set_3d_active_environment (main_3d_env); // // set up MFD 2D environment // set_2d_active_environment (mfd_env); set_2d_window (mfd_env, MFD_WINDOW_X_MIN, MFD_WINDOW_Y_MIN, MFD_WINDOW_X_MAX, MFD_WINDOW_Y_MAX); mfd_viewport_size = EO_VIEWPORT_SIZE; mfd_viewport_x_org = EO_VIEWPORT_SIZE * 0.5; mfd_viewport_y_org = EO_VIEWPORT_SIZE * 0.5; mfd_viewport_x_min = 0.0; mfd_viewport_y_min = 0.0; mfd_viewport_x_max = EO_VIEWPORT_SIZE - 0.001; mfd_viewport_y_max = EO_VIEWPORT_SIZE - 0.001; set_2d_viewport (mfd_env, mfd_viewport_x_min, mfd_viewport_y_min, mfd_viewport_x_max, mfd_viewport_y_max); mfd_screen_x_min = full_screen_x_mid - ((256.0 / (640.0 * 2.0)) * full_screen_width); mfd_screen_y_min = full_screen_y_mid - ((256.0 / (480.0 * 2.0)) * full_screen_height); mfd_screen_x_max = full_screen_x_mid + ((256.0 / (640.0 * 2.0)) * full_screen_width) - 0.001; mfd_screen_y_max = full_screen_y_mid + ((256.0 / (480.0 * 2.0)) * full_screen_height) - 0.001; i_translate_3d = mfd_screen_x_min; j_translate_3d = mfd_screen_y_min; i_scale_3d = 640.0 / full_screen_width; j_scale_3d = 480.0 / full_screen_height; symbology_colour = MFD_EO_TEXT_COLOUR; set_rgb_colour(background_colour, 255, 255, 255, 0); set_system_texture_screen (eo_texture_screen, TEXTURE_INDEX_AVCKPT_DISPLAY_RHS_MFD); draw_symbology_to_texture( eo_texture_screen, TEXTURE_INDEX_AVCKPT_DISPLAY_RHS_MFD, mfd_viewport_size, mfd_viewport_size, mfd_screen_x_min, mfd_screen_y_min, mfd_screen_x_max, mfd_screen_y_max, symbology_colour, background_colour, draw_hind_ort_symbology); }