/* RENDER.C symbols in this file: 001743B0 0020: _render_effects (0000) 001743D0 0010: _render_initialize (0000) 001743E0 0010: _render_initialize_for_new_map (0000) 001743F0 0010: _render_dispose_from_old_map (0000) 00174400 0010: _render_dispose (0000) 00174410 0110: _render_nonplayer_frame (0000) 00174520 00f0: _render_frame_pregame (0000) 00174610 0020: _render_frame_present (0000) 00174630 0070: _render_location_visible (0000) 001746A0 0050: _rendered_cluster_get (0000) 001746F0 03f0: _render_window (0000) 00174AE0 03f0: _render_player_frame (0000) 00174ED0 00f0: _render_frame (0000) 0029F44C 001f: ??_C@_0BP@JNDFGHKA@c?3?2halo?2SOURCE?2render?2render?4c?$AA@ (0000) 0029F470 0061: ??_C@_0GB@NHJDHKGO@location?9?$DOcluster_index?$DO?$DN0?5?$CG?$CG?5lo@ (0000) 0029F4D8 0052: ??_C@_0FC@DLFICDJP@rendered_cluster_index?$DO?$DN0?5?$CG?$CG?5ren@ (0000) 0029F530 0052: ??_C@_0FC@NBMIPGBN@window?9?$DOrender_camera?4viewport_b@ (0000) 0029F588 0051: ??_C@_0FB@IDPOBHAJ@window?9?$DOrender_camera?4viewport_b@ (0000) 0029F5DC 002c: ??_C@_0CM@LKHLGDKF@window?9?$DOrender_camera?4viewport_b@ (0000) 0029F608 002c: ??_C@_0CM@HBCHLAAA@window?9?$DOrender_camera?4viewport_b@ (0000) 0029F638 006d: ??_C@_0GN@PKELCNNH@?$CBmemcmp?$CI?$CGwindow?9?$DOrender_camera?4w@ (0000) 0029F6A8 0071: ??_C@_0HB@BCLIBPGM@?$CBmemcmp?$CI?$CGwindow?9?$DOrender_camera?4v@ (0000) 0029F720 0048: ??_C@_0EI@NGOLLMDP@?$CD?$CD?$CD?5ERROR?5something?5is?5wrong?5wit@ (0000) 0030D4D2 0004: _render_contrails_enabled (0000) _render_particles_enabled (0001) _render_particle_systems_enabled (0002) _render_weather_particle_systems_enabled (0003) 004B8B22 0001: _render_invalid_fog_warning_displayed (0000) */ /* ---------- headers */ #include "cseries.h" #include "cseries/errors.h" #include "render.h" #include "render_cameras_internal.h" #include "render_particles.h" #include "objects.h" #include "render_sprite.h" #include "scenario.h" #include "structure_bsp_definitions.h" #include "effects/player_effects.h" #include "structures/structure_visibility.h" #include "rasterizer.h" #include "rasterizer/rasterizer_lights.h" #include "profile.h" #include "progress_bar.h" #include "ui_widget.h" #include "bink_playback.h" #include "game.h" #include "game_engine.h" #include "interface/first_person_weapons.h" #include "interface/interface.h" #include "editor_stubs.h" #include "render_debug.h" #include "objects/object_lights_rendering.h" #include "effects/particle_systems.h" #include "effects/weather_particle_systems.h" #include "main/main.h" #include "structures/structures.h" #include "halo_vr.h" /* ---------- constants */ enum { _render_target_primary = 0, _render_target_secondary, }; enum { _decal_layer_primary = 0, _decal_layer_secondary, _decal_layer_light, _decal_layer_alpha_tested, _decal_layer_water, }; enum { _render_planar_fog_mode_fully_fogged = 2, }; /* ---------- macros */ #define RASTERIZER_TARGET_RENDER_PRIMARY_WIDTH halo_screen_width() #define RASTERIZER_TARGET_RENDER_PRIMARY_HEIGHT 480 /* ---------- structures */ #ifdef HALO_VR /* a screen flash that only darkens what is under it (the darken type, or a lighten toward black, as a fade to black is); the types as rasterizer_xbox_screen_effect.c numbers them: 1 lighten, 2 darken */ static boolean vr_screen_flash_darkens( struct render_screen_flash const *flash) { switch (flash->type) { case 2: return TRUE; case 1: return flash->color.red + flash->color.green + flash->color.blue < 0.3f; default: return FALSE; } } #endif /* ---------- prototypes */ static void render_nonplayer_frame( const struct render_window *window, long window_type); static void render_window( short local_player_index, const struct render_camera *camera, const struct render_frustum *frustum, const struct render_camera *rasterizer_camera, const struct render_frustum *rasterizer_frustum, short rasterizer_target, boolean has_mirror); static void render_player_frame( struct render_window *window, const point2d *screenshot_combined_index); void render_sky( void); /* ---------- globals */ struct render_globals render; static boolean render_invalid_fog_warning_displayed; extern short global_screenshot_count; boolean render_contrails_enabled = TRUE; boolean render_particles_enabled = TRUE; boolean render_particle_systems_enabled = TRUE; boolean render_weather_particle_systems_enabled = TRUE; /* ---------- public code */ void render_effects( boolean enable) { render_weather_particle_systems_enabled = enable; render_particle_systems_enabled = enable; render_particles_enabled = enable; render_contrails_enabled = enable; } void render_initialize( void) { render_objects_initialize(); } void render_initialize_for_new_map( void) { render_objects_initialize_for_new_map(); } void render_dispose_from_old_map( void) { render_objects_dispose_from_old_map(); } void render_dispose( void) { render_objects_dispose(); } static void render_nonplayer_frame( const struct render_window *window, long window_type) { struct rasterizer_window_begin_parameters parameters; profile_render_window_start(FALSE); memset(¶meters, 0, sizeof(parameters)); render.camera = window->render_camera; render_camera_build_frustum(&render.camera, NULL, &render.frustum, TRUE); parameters.camera = window->rasterizer_camera; render_camera_build_frustum(¶meters.camera, NULL, ¶meters.frustum, TRUE); parameters.rasterizer_target = _render_target_primary; parameters.suppress_clear = window_type == 0; parameters.window_index = NONE; rasterizer_window_begin(¶meters); switch (window_type) { case 0: /* letterbox bars and split screen dividers: laid out from the viewport, so not centered like the menus on a wide screen */ interface_draw_fullscreen_overlays(); rasterizer_debug_draw(); break; case 1: halo_screen_ui_offset(TRUE); game_engine_nonplayer_post_rasterize(); halo_screen_ui_offset(FALSE); break; default: match_assert("c:\\halo\\SOURCE\\render\\render.c", 287, !"unreachable"); break; } rasterizer_window_end(); profile_render_window_end(); return; } void render_frame_pregame( struct render_window const *window, struct bitmap_data *bitmap) { struct rasterizer_frame_begin_parameters parameters; struct rasterizer_window_begin_parameters rasterizer_parameters; render.frame_index++; rasterizer_frame_begin(¶meters); rasterizer_windows_begin(); profile_render_window_start(FALSE); memset(&rasterizer_parameters, 0, sizeof(rasterizer_parameters)); render.camera = window->render_camera; render_camera_build_frustum(&render.camera, NULL, &render.frustum, TRUE); rasterizer_parameters.camera = window->rasterizer_camera; render_camera_build_frustum(&rasterizer_parameters.camera, NULL, &rasterizer_parameters.frustum, TRUE); rasterizer_parameters.rasterizer_target = 0; rasterizer_window_begin(&rasterizer_parameters); halo_screen_ui_offset(TRUE); render_ui_widgets(0, &window->rasterizer_camera.viewport_bounds); halo_screen_ui_offset(FALSE); bink_playback_render(); { real progress; if (game_map_loading_in_progress(&progress)) { progress_bar_display(progress); } } rasterizer_window_end(); profile_render_window_end(); rasterizer_windows_end(); rasterizer_frame_end(); return; } void render_frame_present( const point2d *screenshot_index, struct bitmap_data *bitmap) { rasterizer_present(bitmap, screenshot_index); return; } boolean render_location_visible( struct location *location) { match_assert("c:\\halo\\SOURCE\\render\\render.c", 584, location->cluster_index>=0 && location->cluster_indexclusters.count); return TEST_FLAG(render.visible_cluster_flags[location->cluster_index>>5], location->cluster_index&31); } struct rendered_cluster *rendered_cluster_get( short rendered_cluster_index) { match_assert("c:\\halo\\SOURCE\\render\\render.c", 592, rendered_cluster_index>=0 && rendered_cluster_index