int get_current_virtual_cockpit_camera (crew_roles role) { int current_virtual_cockpit_camera; if (get_local_entity_int_value (get_gunship_entity (), INT_TYPE_EJECTED)) { if (role == CREW_ROLE_PILOT) { ASSERT (get_number_of_3d_object_cameras (virtual_cockpit_inst3d, OBJECT_3D_CAMERA_VIEW_STATIC_PILOT_EJECT) > 0); current_virtual_cockpit_camera = 0; } else { ASSERT (get_number_of_3d_object_cameras (virtual_cockpit_inst3d, OBJECT_3D_CAMERA_VIEW_STATIC_WSO_EJECT) > 0); current_virtual_cockpit_camera = 0; } } else { if (role == CREW_ROLE_PILOT) { current_virtual_cockpit_camera = current_pilot_virtual_cockpit_camera; } else { current_virtual_cockpit_camera = current_co_pilot_virtual_cockpit_camera; } } return (current_virtual_cockpit_camera); }
static int recognition_guide_camera_valid (camera *raw, object_3d_camera_index_numbers index) { object_3d_instance *inst3d; ASSERT (raw); ASSERT (raw->external_view_entity); inst3d = (object_3d_instance *) get_local_entity_ptr_value (raw->external_view_entity, PTR_TYPE_INSTANCE_3D_OBJECT); ASSERT (inst3d); return (get_number_of_3d_object_cameras (inst3d, index) > 0); }
void reset_cinematic_camera (camera *raw) { entity *en; object_3d_instance *inst3d; int num_moving_cameras, num_static_cameras, attempts; // // pre-amble // ASSERT (raw); ASSERT (raw->external_view_entity); en = raw->external_view_entity; inst3d = get_local_entity_ptr_value (en, PTR_TYPE_INSTANCE_3D_OBJECT); // // select 3D camera // raw->cinematic_camera_index = OBJECT_3D_INVALID_CAMERA_INDEX; if (inst3d) { num_moving_cameras = get_number_of_3d_object_cameras (inst3d, OBJECT_3D_CAMERA_SCENIC_MOVING); num_static_cameras = get_number_of_3d_object_cameras (inst3d, OBJECT_3D_CAMERA_SCENIC_STATIC); if ((num_moving_cameras > 0) && (num_static_cameras > 0)) { if (frand1 () < 0.333) { raw->cinematic_camera_index = OBJECT_3D_CAMERA_SCENIC_MOVING; } else { raw->cinematic_camera_index = OBJECT_3D_CAMERA_SCENIC_STATIC; } } else if (num_moving_cameras > 0) { raw->cinematic_camera_index = OBJECT_3D_CAMERA_SCENIC_MOVING; } else if (num_static_cameras > 0) { raw->cinematic_camera_index = OBJECT_3D_CAMERA_SCENIC_STATIC; } } switch (raw->cinematic_camera_index) { //////////////////////////////////////// case OBJECT_3D_INVALID_CAMERA_INDEX: //////////////////////////////////////// { raw->cinematic_camera_depth = 0; raw->cinematic_camera_lifetime = (frand1 () * 2.0) + 2.0; raw->cinematic_camera_heading = rad (45.0) * ((float) (rand16 () % 8)); raw->cinematic_camera_pitch = rad (-45.0) * ((float) (rand16 () % 2)); #if DEBUG_MODULE debug_log ( "CINEMATIC CAMERA is INVALID (object = %s, moving cameras = %d, static cameras = %d, depth = %d, lifetime = %.2f, heading = %.2f, pitch = %.2f)", get_local_entity_string (en, STRING_TYPE_FULL_NAME), num_moving_cameras, num_static_cameras, raw->cinematic_camera_depth, raw->cinematic_camera_lifetime, deg (raw->cinematic_camera_heading), deg (raw->cinematic_camera_pitch) ); #endif break; } //////////////////////////////////////// case OBJECT_3D_CAMERA_SCENIC_MOVING: //////////////////////////////////////// { // // try and prevent using the same moving camera twice in succession // if (num_moving_cameras > 1) { attempts = 10; while (attempts--) { raw->cinematic_camera_depth = rand16 () % num_moving_cameras; if (raw->cinematic_camera_depth != raw->cinematic_camera_previous_moving_depth) { break; } } } else { raw->cinematic_camera_depth = 0; } raw->cinematic_camera_previous_moving_depth = raw->cinematic_camera_depth; raw->cinematic_camera_lifetime = get_object_3d_camera_lifetime (inst3d, raw->cinematic_camera_index, raw->cinematic_camera_depth); #if DEBUG_MODULE debug_log ( "CINEMATIC CAMERA is MOVING (object = %s, moving cameras = %d, static cameras = %d, depth = %d, lifetime = %.2f)", get_local_entity_string (en, STRING_TYPE_FULL_NAME), num_moving_cameras, num_static_cameras, raw->cinematic_camera_depth, raw->cinematic_camera_lifetime ); #endif ASSERT (raw->cinematic_camera_lifetime > 0.0); break; } //////////////////////////////////////// case OBJECT_3D_CAMERA_SCENIC_STATIC: //////////////////////////////////////// { // // try and prevent using the same static camera twice in succession // if (num_static_cameras > 1) { attempts = 10; while (attempts--) { raw->cinematic_camera_depth = rand16 () % num_static_cameras; if (raw->cinematic_camera_depth != raw->cinematic_camera_previous_static_depth) { break; } } } else { raw->cinematic_camera_depth = 0; } raw->cinematic_camera_previous_static_depth = raw->cinematic_camera_depth; raw->cinematic_camera_lifetime = (frand1 () * 2.0) + 2.0; #if DEBUG_MODULE debug_log ( "CINEMATIC CAMERA is STATIC (object = %s, moving cameras = %d, static cameras = %d, depth = %d, lifetime = %.2f)", get_local_entity_string (en, STRING_TYPE_FULL_NAME), num_moving_cameras, num_static_cameras, raw->cinematic_camera_depth, raw->cinematic_camera_lifetime ); #endif } } raw->cinematic_camera_timer = 0.0; // // motion vector // get_local_entity_vec3d (en, VEC3D_TYPE_MOTION_VECTOR, &raw->motion_vector); }
void initialise_common_virtual_cockpit_cameras (void) { #if DEBUG_MODULE_CREW_CAMERAS debug_colour_watch (DEBUG_COLOUR_AMBER, "pilot_crew_camera_index = %d", MT_INT, &pilot_crew_camera_index); debug_colour_watch (DEBUG_COLOUR_AMBER, "num_pilot_virtual_cockpit_cameras = %d", MT_INT, &num_pilot_virtual_cockpit_cameras); debug_colour_watch (DEBUG_COLOUR_AMBER, "current_pilot_virtual_cockpit_camera = %d", MT_INT, ¤t_pilot_virtual_cockpit_camera); debug_colour_watch (DEBUG_COLOUR_MAGENTA, "co_pilot_crew_camera_index = %d", MT_INT, &co_pilot_crew_camera_index); debug_colour_watch (DEBUG_COLOUR_MAGENTA, "num_co_pilot_virtual_cockpit_cameras = %d", MT_INT, &num_co_pilot_virtual_cockpit_cameras); debug_colour_watch (DEBUG_COLOUR_MAGENTA, "current_co_pilot_virtual_cockpit_camera = %d", MT_INT, ¤t_co_pilot_virtual_cockpit_camera); #endif //////////////////////////////////////// // // pilot // //////////////////////////////////////// if (virtual_cockpit_inst3d) { num_pilot_virtual_cockpit_cameras = get_number_of_3d_object_cameras (virtual_cockpit_inst3d, OBJECT_3D_CAMERA_VIEW_STATIC_PILOT); } else { num_pilot_virtual_cockpit_cameras = 0; } if (num_pilot_virtual_cockpit_cameras > 0) { current_pilot_virtual_cockpit_camera = 0; pilot_crew_camera_index = OBJECT_3D_CAMERA_VIEW_STATIC_PILOT; } else { current_pilot_virtual_cockpit_camera = INVALID_VIRTUAL_COCKPIT_CAMERA; pilot_crew_camera_index = OBJECT_3D_INVALID_CAMERA_INDEX; } //////////////////////////////////////// // // co-pilot // //////////////////////////////////////// if (virtual_cockpit_inst3d) { num_co_pilot_virtual_cockpit_cameras = get_number_of_3d_object_cameras (virtual_cockpit_inst3d, OBJECT_3D_CAMERA_VIEW_STATIC_WSO); } else { num_co_pilot_virtual_cockpit_cameras = 0; } if (num_co_pilot_virtual_cockpit_cameras > 0) { current_co_pilot_virtual_cockpit_camera = 0; co_pilot_crew_camera_index = OBJECT_3D_CAMERA_VIEW_STATIC_WSO; } else { current_co_pilot_virtual_cockpit_camera = INVALID_VIRTUAL_COCKPIT_CAMERA; co_pilot_crew_camera_index = OBJECT_3D_INVALID_CAMERA_INDEX; } }
void update_cinematic_camera (camera *raw) { // // pre-amble // ASSERT (raw); ASSERT (raw->external_view_entity); //////////////////////////////////////// // // This code has been added to protect against cases where an object // and its destroyed version have a different number of cameras. // switch (raw->cinematic_camera_index) { case OBJECT_3D_CAMERA_SCENIC_MOVING: case OBJECT_3D_CAMERA_SCENIC_STATIC: { object_3d_instance *inst3d; inst3d = get_local_entity_ptr_value (raw->external_view_entity, PTR_TYPE_INSTANCE_3D_OBJECT); if (raw->cinematic_camera_depth >= get_number_of_3d_object_cameras (inst3d, raw->cinematic_camera_index)) { #if DEBUG_MODULE debug_colour_log (DEBUG_COLOUR_RED, "CINEMATIC CAMERA ERROR - forced reset!!!"); #endif reset_cinematic_camera (raw); } break; } } // //////////////////////////////////////// // // update timer // raw->cinematic_camera_timer += get_delta_time (); if (raw->cinematic_camera_timer > raw->cinematic_camera_lifetime) { if (raw->auto_edit) { switch_auto_edit_entity (raw); if (switch_auto_edit_camera_mode (raw)) { // // switched to a different camera // return; } } reset_cinematic_camera (raw); } // // continue update // update_cinematic_camera_continued (raw); }