void toggle_ground_stabilisation (void) { if (command_line_ground_stabilisation_available) { if (eo_ground_stabilised) { eo_ground_stabilised = 0; } else { matrix3x3 attitude; eo_ground_stabilised = 1; get_local_entity_attitude_matrix (get_gunship_entity (), attitude); eo_ground_stabilisation_value_heading = atan2 (attitude [2][0], attitude [2][2]); eo_ground_stabilisation_value_pitch = asin (attitude [2][1]); // eo_ground_stabilisation_value_roll = atan2 (-attitude [0][1], attitude [1][1]); } } }
static void update_recognition_guide_camera (camera *raw, object_3d_camera_index_numbers index) { entity *en; object_3d_instance *inst3d; viewpoint vp; // // pre-amble // ASSERT (raw); ASSERT (raw->external_view_entity); en = raw->external_view_entity; // // get camera position and attitude // inst3d = (object_3d_instance *) get_local_entity_ptr_value (en, PTR_TYPE_INSTANCE_3D_OBJECT); ASSERT (inst3d); set_3d_exclusive_instance ( inst3d ); get_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &inst3d->vp.position); get_local_entity_attitude_matrix (en, inst3d->vp.attitude); get_object_3d_camera_position (inst3d, index, 0, 0.0, &vp); raw->position = vp.position; memcpy (raw->attitude, vp.attitude, sizeof (matrix3x3)); // // keep point above ground (unless point off map) // if (point_inside_map_area (&raw->position)) { raw->position.y = max (raw->position.y, get_3d_terrain_point_data (raw->position.x, raw->position.z, &raw->terrain_info) + 0.5f); } // // motion vector // get_local_entity_vec3d (en, VEC3D_TYPE_MOTION_VECTOR, &raw->motion_vector); }
void get_comanche_eo_relative_centred_viewpoint (viewpoint *vp) { entity *source; object_3d_instance *inst3d; object_3d_sub_object_search_data search; ASSERT (vp); source = get_gunship_entity (); inst3d = (object_3d_instance *) get_local_entity_ptr_value (source, PTR_TYPE_INSTANCE_3D_OBJECT); ASSERT (inst3d); inst3d->vp.x = 0.0; inst3d->vp.y = 0.0; inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (source, inst3d->vp.attitude); search.search_depth = 0; search.search_object = inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_COMANCHE_EO_CAMERA; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { get_3d_sub_object_world_viewpoint (search.result_sub_object, vp); } else { // // can happpen if the object is being destroyed // memcpy (&vp->position, &inst3d->vp.position, sizeof (vec3d)); debug_log ("OBJECT_3D_SUB_OBJECT_COMANCHE_EO_CAMERA missing from Comanche"); } memcpy (&vp->attitude, &inst3d->vp.attitude, sizeof (matrix3x3)); // // fix up the instance position (just in case) // get_local_entity_vec3d (source, VEC3D_TYPE_POSITION, &inst3d->vp.position); }
void get_default_crew_viewpoint (int index, object_3d_instance *virtual_cockpit_inst3d) { viewpoint vp; float head_pitch_datum; head_pitch_datum = pilot_head_pitch_datum; // // rotate head // virtual_cockpit_inst3d->sub_objects[index].relative_heading = -pilot_head_heading; virtual_cockpit_inst3d->sub_objects[index].relative_pitch = head_pitch_datum - pilot_head_pitch; virtual_cockpit_inst3d->sub_objects[index].relative_roll = 0.0; // // get viewpoint (avoid jitter) // virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); get_3d_sub_object_world_viewpoint (&virtual_cockpit_inst3d->sub_objects[index], &vp); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &pilot_head_vp.position); // x,y,z is here north south east west! //inserting fixed values here does not work because of head movement pilot_head_vp.x += vp.x; pilot_head_vp.y += vp.y; pilot_head_vp.z += vp.z; memcpy (pilot_head_vp.attitude, vp.attitude, sizeof (matrix3x3)); vp.x = -vp.x; vp.y = -vp.y; vp.z = -vp.z; multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, pilot_head_vp.attitude, &vp.position); }
void get_ah64a_eo_centred_viewpoint (viewpoint *vp) { entity *source; object_3d_instance *inst3d; object_3d_sub_object_search_data search; ASSERT (vp); source = get_gunship_entity (); inst3d = (object_3d_instance *) get_local_entity_ptr_value (source, PTR_TYPE_INSTANCE_3D_OBJECT); ASSERT (inst3d); get_local_entity_vec3d (source, VEC3D_TYPE_POSITION, &inst3d->vp.position); get_local_entity_attitude_matrix (source, inst3d->vp.attitude); search.search_depth = 0; search.search_object = inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_AH64D_TADS_HEADING; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { get_3d_sub_object_world_viewpoint (search.result_sub_object, vp); } else { // // can happpen if the object is being destroyed // memcpy (&vp->position, &inst3d->vp.position, sizeof (vec3d)); debug_log ("OBJECT_3D_SUB_OBJECT_AH64D_TADS_HEADING missing from Apache"); } memcpy (&vp->attitude, &inst3d->vp.attitude, sizeof (matrix3x3)); }
void get_hokum_crew_viewpoint (void) { object_3d_sub_object_search_data search_head, search_viewpoint; viewpoint vp; float head_pitch_datum; // // select head // if (get_local_entity_int_value (get_pilot_entity (), INT_TYPE_CREW_ROLE) == CREW_ROLE_PILOT) { search_head.sub_object_index = OBJECT_3D_SUB_OBJECT_PILOT_HEAD; search_viewpoint.sub_object_index = OBJECT_3D_SUB_OBJECT_PILOT_VIEWPOINT; head_pitch_datum = pilot_head_pitch_datum; } else { search_head.sub_object_index = OBJECT_3D_SUB_OBJECT_WSO_HEAD; search_viewpoint.sub_object_index = OBJECT_3D_SUB_OBJECT_WSO_VIEWPOINT; head_pitch_datum = co_pilot_head_pitch_datum; } // // rotate head // search_head.search_depth = 0; search_head.search_object = virtual_cockpit_inst3d; if (find_object_3d_sub_object (&search_head) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search_head.result_sub_object->relative_heading = -pilot_head_heading; search_head.result_sub_object->relative_pitch = head_pitch_datum - pilot_head_pitch; search_head.result_sub_object->relative_roll = 0.0; } else { debug_fatal ("Failed to locate crew's head in virtual cockpit"); } // // get viewpoint (avoid jitter) // search_viewpoint.search_object = virtual_cockpit_inst3d; search_viewpoint.search_depth = 0; if (find_object_3d_sub_object (&search_viewpoint) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); get_3d_sub_object_world_viewpoint (search_viewpoint.result_sub_object, &vp); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &pilot_head_vp.position); pilot_head_vp.x += vp.x; pilot_head_vp.y += vp.y; pilot_head_vp.z += vp.z; memcpy (pilot_head_vp.attitude, vp.attitude, sizeof (matrix3x3)); vp.x = -vp.x; vp.y = -vp.y; vp.z = -vp.z; multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, pilot_head_vp.attitude, &vp.position); } else { debug_fatal ("Failed to locate crew's viewpoint in virtual cockpit"); } }
void update_vector_altitude_dynamics (void) { static float last_ground_height = 0; matrix3x3 attitude; float heading, pitch, roll, ground_height, centre_of_gravity_to_ground_distance; vec3d position, *face_normal; centre_of_gravity_to_ground_distance = get_local_entity_float_value (get_gunship_entity (), FLOAT_TYPE_CENTRE_OF_GRAVITY_TO_GROUND_DISTANCE); get_local_entity_attitude_matrix (get_gunship_entity (), attitude); ground_height = get_local_entity_float_value (get_gunship_entity (), FLOAT_TYPE_TERRAIN_ELEVATION); // // debug // if ((ground_height < -1000) || (ground_height > 32000)) { debug_log ("!!!!!!!!!!!!!! GROUND HEIGHT %f", ground_height); ground_height = last_ground_height; } // // end // last_ground_height = ground_height; current_flight_dynamics->altitude.value = current_flight_dynamics->position.y; current_flight_dynamics->altitude.min = ground_height; switch (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_OPERATIONAL_STATE)) { case OPERATIONAL_STATE_LANDED: { if (current_flight_dynamics->world_velocity_y.value > 0.0) { #if DEBUG_DYNAMICS debug_log ("VECTOR DYN: takeoff !"); #endif set_local_entity_int_value (get_gunship_entity (), INT_TYPE_OPERATIONAL_STATE, OPERATIONAL_STATE_NAVIGATING); delete_local_entity_from_parents_child_list (get_gunship_entity (), LIST_TYPE_CURRENT_WAYPOINT); transmit_entity_comms_message (ENTITY_COMMS_MOBILE_TAKEOFF, get_gunship_entity ()); } else { entity *wp; vec3d wp_pos; wp = get_local_entity_parent (get_gunship_entity (), LIST_TYPE_CURRENT_WAYPOINT); if (wp) { get_local_waypoint_formation_position (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_FORMATION_POSITION), wp, &wp_pos); ground_height = wp_pos.y; } current_flight_dynamics->world_velocity_y.value = max (current_flight_dynamics->world_velocity_y.value, 0.0); current_flight_dynamics->velocity_y.value = max (current_flight_dynamics->velocity_y.value, 0.0); memset (¤t_flight_dynamics->world_motion_vector, 0, sizeof (vec3d)); current_flight_dynamics->velocity_x.value = bound (current_flight_dynamics->velocity_x.value, knots_to_metres_per_second (-10), knots_to_metres_per_second (50)); current_flight_dynamics->velocity_y.value = 0; current_flight_dynamics->velocity_z.value = bound (current_flight_dynamics->velocity_z.value, knots_to_metres_per_second (-10), knots_to_metres_per_second (50)); current_flight_dynamics->position.y = ground_height + centre_of_gravity_to_ground_distance; current_flight_dynamics->altitude.value = ground_height + centre_of_gravity_to_ground_distance; heading = get_heading_from_attitude_matrix (attitude); //get_3d_terrain_face_normal (&n, current_flight_dynamics->position.x, current_flight_dynamics->position.z); face_normal = get_local_entity_ptr_value (get_gunship_entity (), PTR_TYPE_TERRAIN_FACE_NORMAL); get_3d_transformation_matrix_from_face_normal_and_heading (attitude, face_normal, heading); pitch = get_pitch_from_attitude_matrix (attitude); pitch += rad (aircraft_database [ENTITY_SUB_TYPE_AIRCRAFT_AH64D_APACHE_LONGBOW].fuselage_angle); roll = get_roll_from_attitude_matrix (attitude); get_3d_transformation_matrix (attitude, heading, pitch, roll); position.x = current_flight_dynamics->position.x; position.y = current_flight_dynamics->position.y; position.z = current_flight_dynamics->position.z; set_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &position); set_local_entity_attitude_matrix (get_gunship_entity (), attitude); } break; } default: { if (current_flight_dynamics->world_velocity_y.value < 0.0) { if (current_flight_dynamics->altitude.value < current_flight_dynamics->altitude.min + centre_of_gravity_to_ground_distance) { if (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_OPERATIONAL_STATE) != OPERATIONAL_STATE_LANDED) { // // need to find what wp the user is trying to land on .... // //entity //*wp; #if DEBUG_DYNAMICS debug_log ("VECTOR DYN: landed !"); #endif set_local_entity_int_value (get_gunship_entity (), INT_TYPE_OPERATIONAL_STATE, OPERATIONAL_STATE_LANDED); //transmit_entity_comms_message (ENTITY_COMMS_MOBILE_LAND, get_gunship_entity (), wp); } } } break; } } current_flight_dynamics->altitude.value = bound ( current_flight_dynamics->altitude.value, current_flight_dynamics->altitude.min, current_flight_dynamics->altitude.max); }
void update_vector_attitude_dynamics (void) { matrix3x3 delta_attitude, attitude; float heading, pitch, roll; vec3d result, test_point; get_local_entity_attitude_matrix (get_gunship_entity (), attitude); // get heading, pitch, and roll heading = atan2 (attitude [2][0], attitude [2][2]); pitch = asin (attitude [2][1]); roll = atan2 (-attitude [0][1], attitude [1][1]); current_flight_dynamics->heading.value = heading; current_flight_dynamics->pitch.value = pitch; current_flight_dynamics->roll.value = roll; // // roll // current_flight_dynamics->roll.delta = 30 * current_flight_dynamics->main_rotor_roll_angle.value * get_delta_time (); // // pitch // current_flight_dynamics->pitch.delta = 30 * current_flight_dynamics->main_rotor_pitch_angle.value * get_delta_time (); // // heading // current_flight_dynamics->heading.delta = 15 * (-(current_flight_dynamics->tail_rotor_thrust.value * current_flight_dynamics->tail_boom_length.value * current_flight_dynamics->tail_rotor_diameter.value) * get_delta_time () / current_flight_dynamics->mass.value); get_3d_transformation_matrix (delta_attitude, -current_flight_dynamics->heading.delta, current_flight_dynamics->pitch.delta, current_flight_dynamics->roll.delta); multiply_matrix3x3_vec3d (&test_point, current_flight_dynamics->attitude, ¤t_flight_dynamics->rotation_origin); multiply_matrix3x3_matrix3x3 (current_flight_dynamics->attitude, delta_attitude, attitude); multiply_matrix3x3_vec3d (&result, current_flight_dynamics->attitude, ¤t_flight_dynamics->rotation_origin); result.x -= test_point.x; result.y -= test_point.y; result.z -= test_point.z; current_flight_dynamics->position.x -= result.x; current_flight_dynamics->position.y -= result.y; current_flight_dynamics->position.z -= result.z; }
void get_kiowa_crew_viewpoint (void) { object_3d_sub_object_search_data search_head, search_viewpoint; viewpoint vp; float head_pitch_datum; // // select head // if (get_local_entity_int_value (get_pilot_entity (), INT_TYPE_CREW_ROLE) == CREW_ROLE_PILOT) { search_head.sub_object_index = OBJECT_3D_SUB_OBJECT_PILOT_HEAD; search_viewpoint.sub_object_index = OBJECT_3D_SUB_OBJECT_PILOT_VIEWPOINT; head_pitch_datum = pilot_head_pitch_datum; } else { search_head.sub_object_index = OBJECT_3D_SUB_OBJECT_WSO_HEAD; search_viewpoint.sub_object_index = OBJECT_3D_SUB_OBJECT_WSO_VIEWPOINT; head_pitch_datum = co_pilot_head_pitch_datum; } // // rotate head // search_head.search_depth = 0; search_head.search_object = virtual_cockpit_inst3d; if (find_object_3d_sub_object (&search_head) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search_head.result_sub_object->relative_heading = -pilot_head_heading; search_head.result_sub_object->relative_pitch = head_pitch_datum - pilot_head_pitch; if ((command_line_TIR_6DOF == TRUE)&&(query_TIR_active() == TRUE)) // Retro 6Feb2005 search_head.result_sub_object->relative_roll = TIR_GetRoll() / 16383. * PI / 2.; // Retro 6Feb2005 else search_head.result_sub_object->relative_roll = 0.0; } else { debug_fatal ("Failed to locate crew's head in virtual cockpit"); } // // get viewpoint (avoid jitter) // search_viewpoint.search_object = virtual_cockpit_inst3d; search_viewpoint.search_depth = 0; if (find_object_3d_sub_object (&search_viewpoint) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); get_3d_sub_object_world_viewpoint (search_viewpoint.result_sub_object, &vp); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &pilot_head_vp.position); pilot_head_vp.x += vp.x; pilot_head_vp.y += vp.y; pilot_head_vp.z += vp.z; if ((command_line_TIR_6DOF == TRUE)&&(query_TIR_active() == TRUE)) // Retro 6Feb2005 (whole block) { matrix3x3 invAttitude; vec3d shiftVP, shiftWorld; // First lets find out the displacement the user wants.. this is in the user's viewsystem coords !! // Now store this info in a temp vect3d.. shiftVP.x = current_custom_cockpit_viewpoint.x; shiftVP.y = current_custom_cockpit_viewpoint.y; shiftVP.z = current_custom_cockpit_viewpoint.z; // Now we need to convert our vec3d into world coords.. for this we need the inverse of the viewpoint attitude matrix.. get_inverse_matrix (invAttitude, vp.attitude); // And rotate ! Voila, the result vec3d is now in world coords.. multiply_transpose_matrix3x3_vec3d (&shiftWorld, invAttitude, &shiftVP); // Now apply that displacement.. BUT ONLY TO THE HEAD !! pilot_head_vp.x -= shiftWorld.x; pilot_head_vp.y -= shiftWorld.y; pilot_head_vp.z -= shiftWorld.z; } memcpy (pilot_head_vp.attitude, vp.attitude, sizeof (matrix3x3)); vp.x = -vp.x; vp.y = -vp.y; vp.z = -vp.z; multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, pilot_head_vp.attitude, &vp.position); if ((command_line_TIR_6DOF == TRUE)&&(query_TIR_active() == TRUE)) // Retro 6Feb2005 (whole block) { // Now shift the viewpoint (AND the model) by the positive displacement.. puts the cockpit back were it belongs.. // but the viewpoint (the head) is in another place.. fini virtual_cockpit_inst3d->vp.x += current_custom_cockpit_viewpoint.x; virtual_cockpit_inst3d->vp.y += current_custom_cockpit_viewpoint.y; virtual_cockpit_inst3d->vp.z += current_custom_cockpit_viewpoint.z; } } else { debug_fatal ("Failed to locate crew's viewpoint in virtual cockpit"); } }
void get_kiowa_display_viewpoint (view_modes mode) { object_3d_sub_object_index_numbers index; object_3d_sub_object_search_data search; vec3d position; ASSERT (get_gunship_entity ()); ASSERT (virtual_cockpit_inst3d); switch (mode) { //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_PILOT_LHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_FL; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_PILOT_RHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_FR; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_CO_PILOT_LHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_RL; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_CO_PILOT_RHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_RR; break; } //////////////////////////////////////// default: //////////////////////////////////////// { debug_fatal ("Invalid view mode = %d", mode); break; } } virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; //////////////////////////////////////// // #if DEBUG_MODULE_FINE_DISPLAY_CAMERA_POSITION_ADJUSTMENT get_identity_matrix3x3 (virtual_cockpit_inst3d->vp.attitude); #else get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); #endif // //////////////////////////////////////// search.search_depth = 0; search.search_object = virtual_cockpit_inst3d; search.sub_object_index = index; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { get_3d_sub_object_world_viewpoint (search.result_sub_object, &main_vp); } else { debug_fatal ("Failed to locate display viewpoint in virtual cockpit"); } position.x = -main_vp.x; position.y = -main_vp.y; position.z = -main_vp.z; //////////////////////////////////////// // #if DEBUG_MODULE_FINE_DISPLAY_CAMERA_POSITION_ADJUSTMENT { static float z_offset = 0.0; float dx, dy, dz; if (check_key (DIK_Q)) { z_offset -= 0.0001; } if (check_key (DIK_A)) { z_offset += 0.0001; } dx = main_vp.zv.x * z_offset; dy = main_vp.zv.y * z_offset; dz = main_vp.zv.z * z_offset; position.x += dx; position.y += dy; position.z += dz; debug_filtered_log ("offset=%.6f x=%.6f y=%.6f z=%.6f", z_offset, position.x, position.y, position.z); } #endif // //////////////////////////////////////// multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, main_vp.attitude, &position); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &position); main_vp.x += position.x; main_vp.y += position.y; main_vp.z += position.z; }
void update_cinematic_camera_continued (camera *raw) { entity *en; object_3d_instance *inst3d; viewpoint vp; float normalised_timer; // // pre-amble // ASSERT (raw); ASSERT (raw->external_view_entity); en = raw->external_view_entity; // // get camera position and attitude // switch (raw->cinematic_camera_index) { //////////////////////////////////////// case OBJECT_3D_INVALID_CAMERA_INDEX: //////////////////////////////////////// { float combined_heading, z_min, z_max; vec3d rel_camera_position; combined_heading = get_local_entity_float_value (en, FLOAT_TYPE_HEADING); combined_heading += raw->cinematic_camera_heading; get_3d_transformation_matrix (raw->attitude, combined_heading, raw->cinematic_camera_pitch, 0.0); z_min = get_local_entity_float_value (en, FLOAT_TYPE_CHASE_VIEW_MIN_DISTANCE); z_max = get_local_entity_float_value (en, FLOAT_TYPE_CHASE_VIEW_MAX_DISTANCE); ASSERT (z_min < z_max); rel_camera_position.x = 0.0; rel_camera_position.y = 0.0; rel_camera_position.z = -(((z_max - z_min) * 0.1) + z_min); multiply_matrix3x3_vec3d (&rel_camera_position, raw->attitude, &rel_camera_position); get_local_entity_target_point (en, &raw->position); raw->position.x += rel_camera_position.x; raw->position.y += rel_camera_position.y; raw->position.z += rel_camera_position.z; break; } //////////////////////////////////////// case OBJECT_3D_CAMERA_SCENIC_MOVING: //////////////////////////////////////// { normalised_timer = raw->cinematic_camera_timer / raw->cinematic_camera_lifetime; inst3d = get_local_entity_ptr_value (en, PTR_TYPE_INSTANCE_3D_OBJECT); get_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &inst3d->vp.position); get_local_entity_attitude_matrix (en, inst3d->vp.attitude); get_object_3d_camera_position (inst3d, raw->cinematic_camera_index, raw->cinematic_camera_depth, normalised_timer, &vp); raw->position = vp.position; memcpy (raw->attitude, vp.attitude, sizeof (matrix3x3)); break; } //////////////////////////////////////// case OBJECT_3D_CAMERA_SCENIC_STATIC: //////////////////////////////////////// { normalised_timer = 0.0; inst3d = get_local_entity_ptr_value (en, PTR_TYPE_INSTANCE_3D_OBJECT); get_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &inst3d->vp.position); get_local_entity_attitude_matrix (en, inst3d->vp.attitude); get_object_3d_camera_position (inst3d, raw->cinematic_camera_index, raw->cinematic_camera_depth, normalised_timer, &vp); raw->position = vp.position; memcpy (raw->attitude, vp.attitude, sizeof (matrix3x3)); break; } } // // keep point above ground (unless point off map) // if (point_inside_map_area (&raw->position)) { raw->position.y = max (raw->position.y, get_3d_terrain_point_data (raw->position.x, raw->position.z, &raw->terrain_info) + 0.5); } // // motion vector // get_local_entity_vec3d (en, VEC3D_TYPE_MOTION_VECTOR, &raw->motion_vector); }
void get_hokum_display_viewpoint (view_modes mode) { object_3d_sub_object_index_numbers index; object_3d_sub_object_search_data search; vec3d position; ASSERT (get_gunship_entity ()); ASSERT (virtual_cockpit_inst3d); switch (mode) { //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_PILOT_LHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_LHS_2; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_PILOT_RHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_LHS_1; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_CO_PILOT_LHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_RHS_1; break; } //////////////////////////////////////// case VIEW_MODE_VIRTUAL_COCKPIT_CO_PILOT_RHS_DISPLAY: //////////////////////////////////////// { index = OBJECT_3D_SUB_OBJECT_COCKPIT_VIEW_MFD_RHS_2; break; } //////////////////////////////////////// default: //////////////////////////////////////// { debug_fatal ("Invalid view mode = %d", mode); break; } } virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); search.search_depth = 0; search.search_object = virtual_cockpit_inst3d; search.sub_object_index = index; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { get_3d_sub_object_world_viewpoint (search.result_sub_object, &main_vp); } else { debug_fatal ("Failed to locate display viewpoint in virtual cockpit"); } position.x = -main_vp.x; position.y = -main_vp.y; position.z = -main_vp.z; multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, main_vp.attitude, &position); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &position); main_vp.x += position.x; main_vp.y += position.y; main_vp.z += position.z; }
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); }
static void get_display_viewpoint (view_modes mode, viewpoint *display_viewpoint) { object_3d_sub_object_index_numbers index; object_3d_sub_object_search_data search; viewpoint vp; ASSERT (display_viewpoint); if ((!full_screen_hi_res) && (application_video_colourdepth == 16)) { display_viewpoint->x = 0.0; display_viewpoint->y = 0.0; display_viewpoint->z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), display_viewpoint->attitude); return; } if (mode == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_LHS_MFD) { index = OBJECT_3D_SUB_OBJECT_APACHE_COCKPIT_LHS_MFD_CAMERA; } else if (mode == VIEW_MODE_COCKPIT_PANEL_SPECIAL_APACHE_RHS_MFD) { index = OBJECT_3D_SUB_OBJECT_APACHE_COCKPIT_RHS_MFD_CAMERA; } else { debug_fatal ("Invalid view mode = %d", mode); } virtual_cockpit_inst3d = virtual_cockpit_level1_inst3d; search.search_depth = 0; search.search_object = virtual_cockpit_inst3d; search.sub_object_index = index; if (find_object_3d_sub_object (&search) != SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { debug_fatal ("Failed to locate display viewpoint in virtual cockpit"); } virtual_cockpit_inst3d->vp.x = 0.0; virtual_cockpit_inst3d->vp.y = 0.0; virtual_cockpit_inst3d->vp.z = 0.0; get_local_entity_attitude_matrix (get_gunship_entity (), virtual_cockpit_inst3d->vp.attitude); get_3d_sub_object_world_viewpoint (search.result_sub_object, &vp); get_local_entity_vec3d (get_gunship_entity (), VEC3D_TYPE_POSITION, &main_vp.position); main_vp.x += vp.x; main_vp.y += vp.y; main_vp.z += vp.z; memcpy (main_vp.attitude, vp.attitude, sizeof (matrix3x3)); vp.x = -vp.x; vp.y = -vp.y; vp.z = -vp.z; multiply_transpose_matrix3x3_vec3d (&virtual_cockpit_inst3d->vp.position, vp.attitude, &vp.position); memcpy (display_viewpoint, &virtual_cockpit_inst3d->vp, sizeof (viewpoint)); }
void handle_ground_stabilisation (void) { // loke 030322 // handle the ground stabilisation // improved stabilization thealx 130218 if (eo_ground_stabilised) { vec3d *velocity; matrix3x3 attitude; float accel, delta_pitch, delta_roll, heading, anglex, angley, correctionx; float horizontal_pan_offset, vertical_pan_offset; velocity = get_local_entity_vec3d_ptr (get_gunship_entity (), VEC3D_TYPE_MOTION_VECTOR); accel = velocity->y * get_entity_movement_delta_time(); get_local_entity_attitude_matrix (get_gunship_entity (), attitude); heading = atan2 (attitude [2][0], attitude [2][2]); delta_pitch = pitch - asin (attitude [2][1]); pitch = asin (attitude [2][1]); delta_roll = roll - atan2 (-attitude [0][1], attitude [1][1]); roll = atan2 (-attitude [0][1], attitude [1][1]); if (eo_azimuth > (PI / 2)) { anglex = PI - eo_azimuth; correctionx = - cos (anglex); } else if (eo_azimuth < (- PI / 2)) { anglex = - PI - eo_azimuth; correctionx = - cos (anglex); } else { anglex = eo_azimuth; correctionx = cos (anglex); } angley = eo_elevation; // GCsDriver start 180 deg. bug workaround // problem : // when crossing 180 deg stabilised view switches focus to 109 or 250 deg // crossing 0 / 360 deg is fine // solution : ? // sth like this should do but what`s the C equivalent ? // horizontal_pan_offset = mod((eo_ground_stabilisation_value_heading - heading), 2*pi); // workaround : // if we cross border we have to invert the rad // this gives just a little "glitch" when crossing 180 AND 0/360 deg // glitch width depends on turn rate (and distance centered point to 180/0 line) if ((eo_ground_stabilisation_value_heading > 0)&&(heading < 0)) { eo_ground_stabilisation_value_heading *= -1; anglex *= -1; } else if ((eo_ground_stabilisation_value_heading < 0)&&(heading > 0)) { eo_ground_stabilisation_value_heading *= -1; anglex *= -1; } // GCsDriver end 180 deg. bug workaround horizontal_pan_offset = (eo_ground_stabilisation_value_heading - heading) * cos(angley) + delta_roll * sin(angley) * correctionx + sin(anglex) * sin(delta_pitch) * eo_elevation; vertical_pan_offset = (eo_ground_stabilisation_value_pitch - pitch) * correctionx - delta_roll * sin(anglex) - 0.00028 * accel; eo_azimuth += horizontal_pan_offset; if (eo_azimuth > 0) { eo_azimuth = min (eo_azimuth, eo_max_azimuth); } else { eo_azimuth = max (eo_azimuth, eo_min_azimuth); } eo_elevation += vertical_pan_offset; if (vertical_pan_offset > 0) { eo_elevation = min (eo_elevation, eo_max_elevation); } else { eo_elevation = max (eo_elevation, eo_min_elevation); } eo_ground_stabilisation_value_heading = heading; eo_ground_stabilisation_value_pitch = pitch; } }
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); }