static void draw_local_3d_object (entity *en, float range) { site_updatable *raw; object_3d_instance *inst3d; vec3d face_normal; day_segment_types day_segment_type; raw = (site_updatable *) get_local_entity_data (en); inst3d = construct_temporary_3d_object (raw->fix.object_3d_shape, raw->fix.alive); if (inst3d) { if (raw->fix.alive) { animate_site_radar (en, inst3d); animate_site_loading_doors (en, inst3d); } memcpy (&inst3d->vp.position, &raw->fix.position, sizeof (vec3d)); if (fixed_database[raw->fix.sub_type].align_with_terrain) { get_3d_terrain_face_normal (&face_normal, raw->fix.position.x, raw->fix.position.z); get_3d_transformation_matrix_from_face_normal_and_heading (inst3d->vp.attitude, &face_normal, raw->fix.heading); } else { get_3d_transformation_matrix (inst3d->vp.attitude, raw->fix.heading, 0.0, 0.0); } day_segment_type = (day_segment_types) get_local_entity_int_value (get_session_entity (), INT_TYPE_DAY_SEGMENT_TYPE); inst3d->object_sprite_lights = ((day_segment_type == DAY_SEGMENT_TYPE_NIGHT) || (day_segment_type == DAY_SEGMENT_TYPE_DUSK)); inst3d->object_has_shadow = FALSE; insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, inst3d); } }
void draw_local_city_building_object (entity *en, float range) { city_building *raw; object_3d_instance *inst3d; vec3d face_normal; raw = get_local_entity_data (en); if ( range < object_3d_information_database[raw->fix.object_3d_shape].maximum_distance ) { inst3d = construct_temporary_3d_object (raw->fix.object_3d_shape, FALSE); if (inst3d) { memcpy (&inst3d->vp.position, &raw->fix.position, sizeof (vec3d)); if (fixed_database[raw->fix.sub_type].align_with_terrain) { get_3d_terrain_face_normal (&face_normal, raw->fix.position.x, raw->fix.position.z); get_3d_transformation_matrix_from_face_normal_and_heading (inst3d->vp.attitude, &face_normal, raw->fix.heading); } else { get_3d_transformation_heading_matrix (inst3d->vp.attitude, raw->fix.heading); } inst3d->object_has_shadow = FALSE; insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, inst3d); } } }
static void draw_local_3d_object (entity *en, float range) { city *raw; entity *building; object_3d_instance *inst3d; raw = get_local_entity_data (en); // // Draw all city buildings // range *= current_3d_viewangle_distance_conversion_factor; if ((range < command_line_city_block_approximation_range * METRE) || (raw->approximation_object_3d_shape == OBJECT_3D_INVALID_OBJECT_INDEX)) { if ( raw->fix.object_3d_shape != OBJECT_3D_INVALID_OBJECT_INDEX ) { if ( range < object_3d_information_database[raw->fix.object_3d_shape].maximum_distance ) { inst3d = construct_temporary_3d_object (raw->fix.object_3d_shape, FALSE); if (inst3d) { memcpy (&inst3d->vp.position, &raw->fix.position, sizeof (vec3d)); get_3d_transformation_heading_matrix (inst3d->vp.attitude, raw->fix.heading); inst3d->object_has_shadow = FALSE; insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, inst3d); } } } building = raw->city_building_root.first_child; while (building) { draw_local_city_building_object (building, range); building = get_local_entity_child_succ (building, LIST_TYPE_CITY_BUILDING); } } else { // // Draw approximation object // if ((raw->fix.alive) && (raw->approximation_object_3d_shape != OBJECT_3D_INVALID_OBJECT_INDEX)) { // if ( range < object_3d_information_database[raw->approximation_object_3d_shape].maximum_distance ) { inst3d = construct_temporary_3d_object (raw->approximation_object_3d_shape, FALSE); if (inst3d) { memcpy (&inst3d->vp.position, &raw->fix.position, sizeof (vec3d)); get_3d_transformation_heading_matrix (inst3d->vp.attitude, raw->fix.heading); inst3d->object_has_shadow = FALSE; insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, inst3d); } } } } }
static void draw_local_3d_object (entity *en, float range) { helicopter *raw; int internal_view; raw = get_local_entity_data (en); // // the player's gunship is visible from the menus - where the in_cockpit flag is invalid // if (en == get_gunship_entity ()) { internal_view = ((in_cockpit) && (get_in_flight_game_mode () == IN_FLIGHT_GAME_MODE_SIMULATOR)); } else { internal_view = FALSE; } //////////////////////////////////////// // // SORT COMANCHE AND HOKUM INSTANCES // // It is necessary to switch parts on and off for all Comanche and Hokum instances // because the player can change gunship so the instances need to be fixed up. // //////////////////////////////////////// { int draw_virtual_cockpit_parts, draw_canopy_doors, draw_loading_doors, ejected; object_3d_sub_object_search_data search; if (raw->ac.object_3d_shape == OBJECT_3D_RAH66) { //////////////////////////////////////// // // Comanche // //////////////////////////////////////// // // draw 'canopy' doors on player object and 'loading' doors on AI object // draw_virtual_cockpit_parts = FALSE; draw_canopy_doors = FALSE; draw_loading_doors = FALSE; if (en == get_gunship_entity ()) { draw_canopy_doors = TRUE; if (internal_view) { draw_virtual_cockpit_parts = TRUE; } } else { draw_loading_doors = TRUE; } // // fuselage // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_RAH66_FUSELAGE; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = !draw_virtual_cockpit_parts; } // // canopy/loading doors // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_CANOPY_DOORS; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_canopy_doors; } search.search_depth = 1; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_CANOPY_DOORS; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_canopy_doors; } search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_LOADING_DOOR; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_loading_doors; } search.search_depth = 1; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_LOADING_DOOR; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_loading_doors; } } else if (raw->ac.object_3d_shape == OBJECT_3D_KA_52) { //////////////////////////////////////// // // Hokum // //////////////////////////////////////// // // draw 'canopy' doors on player object and 'loading' doors on AI object // ejected = get_local_entity_int_value (en, INT_TYPE_EJECTED); draw_virtual_cockpit_parts = FALSE; draw_canopy_doors = FALSE; draw_loading_doors = FALSE; if (en == get_gunship_entity ()) { if (!ejected) { draw_canopy_doors = TRUE; } if (internal_view) { draw_virtual_cockpit_parts = TRUE; } } else { if (!ejected) { draw_loading_doors = TRUE; } } // // stub wings // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_KA52_WINGS; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_virtual_cockpit_parts; } // // fuselage // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_KA52_FUSELAGE; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = !draw_virtual_cockpit_parts; } // // canopy/loading doors // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_CANOPY_DOORS; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_canopy_doors; } search.search_depth = 1; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_CANOPY_DOORS; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_canopy_doors; } search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_LOADING_DOOR; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_loading_doors; } search.search_depth = 1; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_LOADING_DOOR; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = draw_loading_doors; } // // ejector seats & crew // search.search_depth = 0; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_KA52_EJECTOR_SEAT; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = !ejected; } search.search_depth = 1; search.search_object = raw->ac.inst3d; search.sub_object_index = OBJECT_3D_SUB_OBJECT_KA52_EJECTOR_SEAT; if (find_object_3d_sub_object (&search) == SUB_OBJECT_SEARCH_RESULT_OBJECT_FOUND) { search.result_sub_object->visible_object = !ejected; } } } //////////////////////////////////////// if (en == get_gunship_entity ()) { // // update viewpoint // raw->ac.inst3d->vp.position = raw->ac.mob.position; memcpy (&raw->ac.inst3d->vp.attitude, &raw->ac.mob.attitude, sizeof (matrix3x3)); // // animate // if (!internal_view) { if (raw->main_rotor_damaged) { animate_damaged_helicopter_main_rotors (en, TRUE); } else { animate_helicopter_main_rotors (en, TRUE, FALSE); } } animate_helicopter_tail_rotor (en); animate_helicopter_wipers (en); animate_helicopter_eo (en); animate_aircraft_loading_doors (en); animate_aircraft_cargo_doors (en); animate_aircraft_undercarriage (en); animate_aircraft_weapon_system_ready (en); animate_aircraft_shadow (en); animate_aircraft_rudder (en); raw->ac.inst3d->object_internal_lighting = object_internal_lighting_valid (en); raw->ac.inst3d->object_sprite_lights = (raw->ac.inst3d->object_internal_lighting && sprite_light_valid (en)); // // draw // if (!internal_view) { if (!in_flight_invisible_object) { animate_and_draw_entity_muzzle_flash_effect (en); insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, raw->ac.inst3d); } } else { if (get_comanche_hokum_gunship ()) { if (get_global_draw_cockpit_graphics ()) { if (!get_global_glass_cockpit ()) { if ( (get_view_mode () == VIEW_MODE_VIRTUAL_COCKPIT_CREW) || (get_global_cockpit_detail_level () == COCKPIT_DETAIL_LEVEL_HIGH) ) { animate_and_draw_entity_muzzle_flash_effect (en); raw->ac.inst3d->vp.position = virtual_cockpit_inst3d->vp.position; memcpy (&raw->ac.inst3d->vp.attitude, &virtual_cockpit_inst3d->vp.attitude, sizeof (matrix3x3)); insert_relative_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_ZBUFFERED_OBJECT, &raw->ac.inst3d->vp.position, raw->ac.inst3d); } } } } } } else { // // update viewpoint // raw->ac.inst3d->vp.position = raw->ac.mob.position; memcpy (&raw->ac.inst3d->vp.attitude, &raw->ac.mob.attitude, sizeof (matrix3x3)); // // animate // if (get_local_entity_int_value (en, INT_TYPE_ALIVE)) { animate_helicopter_main_rotors (en, FALSE, FALSE); } else { animate_damaged_helicopter_main_rotors (en, FALSE); } animate_helicopter_tail_rotor (en); animate_aircraft_loading_doors (en); animate_aircraft_cargo_doors (en); animate_aircraft_undercarriage (en); animate_aircraft_weapon_system_ready (en); animate_aircraft_shadow (en); animate_and_draw_entity_muzzle_flash_effect (en); raw->ac.inst3d->object_internal_lighting = object_internal_lighting_valid (en); raw->ac.inst3d->object_sprite_lights = (raw->ac.inst3d->object_internal_lighting && sprite_light_valid (en)); // // draw // insert_object_into_3d_scene (OBJECT_3D_DRAW_TYPE_OBJECT, raw->ac.inst3d); } //////////////////////////////////////// // // draw comanche and hokum shadows // //////////////////////////////////////// if (raw->ac.object_3d_shape == OBJECT_3D_RAH66) { object_3d_instance *shadow_object; shadow_object = construct_temporary_3d_object (OBJECT_3D_RAH66_FUSELAGE, FALSE); shadow_object->vp = raw->ac.inst3d->vp; insert_object_shadow_into_3d_scene (shadow_object); } else if (raw->ac.object_3d_shape == OBJECT_3D_KA_52) { object_3d_instance *shadow_object; shadow_object = construct_temporary_3d_object (OBJECT_3D_KA_52_FUSELAGE, FALSE); shadow_object->vp = raw->ac.inst3d->vp; insert_object_shadow_into_3d_scene (shadow_object); } //////////////////////////////////////// #if DEBUG_MODULE if (en == get_external_view_entity ()) { draw_mobile_entity_debug_info (en); } #endif }