mirror of
https://github.com/Cesarus85/ringfall-mjolnir-vr.git
synced 2026-10-24 00:00:33 +02:00
2176 lines
56 KiB
C
2176 lines
56 KiB
C
/*
|
|
RASTERIZER.C
|
|
|
|
symbols in this file:
|
|
0016BFE0 0040:
|
|
_rasterizer_initialize (0000)
|
|
0016C020 0010:
|
|
_rasterizer_reset_state (0000)
|
|
0016C030 00e0:
|
|
_rasterizer_frame_begin (0000)
|
|
0016C110 0010:
|
|
_rasterizer_windows_begin (0000)
|
|
0016C120 0010:
|
|
_rasterizer_window_begin (0000)
|
|
0016C130 0010:
|
|
_rasterizer_window_get_fog (0000)
|
|
0016C140 0010:
|
|
_rasterizer_window_set_fog (0000)
|
|
0016C150 0010:
|
|
_rasterizer_window_end (0000)
|
|
0016C160 0010:
|
|
_rasterizer_windows_end (0000)
|
|
0016C170 0010:
|
|
_rasterizer_frame_end (0000)
|
|
0016C180 0010:
|
|
_rasterizer_present (0000)
|
|
0016C190 0010:
|
|
_rasterizer_dispose (0000)
|
|
0016C1A0 0010:
|
|
_rasterizer_set_vblank_callback (0000)
|
|
0016C1B0 0010:
|
|
_rasterizer_profile_enable (0000)
|
|
0016C1C0 0010:
|
|
_rasterizer_dynamic_triangles_new (0000)
|
|
0016C1D0 0010:
|
|
_rasterizer_dynamic_triangles_lock (0000)
|
|
0016C1E0 0010:
|
|
_rasterizer_dynamic_triangles_unlock (0000)
|
|
0016C1F0 0010:
|
|
_rasterizer_dynamic_triangles_delete (0000)
|
|
0016C200 0010:
|
|
_rasterizer_dynamic_vertices_new (0000)
|
|
0016C210 0010:
|
|
_rasterizer_dynamic_vertices_get_type (0000)
|
|
0016C220 0010:
|
|
_rasterizer_dynamic_vertices_lock (0000)
|
|
0016C230 0010:
|
|
_rasterizer_dynamic_vertices_unlock (0000)
|
|
0016C240 0010:
|
|
_rasterizer_dynamic_vertices_delete (0000)
|
|
0016C250 0010:
|
|
_rasterizer_debug_immediate_begin (0000)
|
|
0016C260 0010:
|
|
_rasterizer_debug_immediate_line (0000)
|
|
0016C270 0010:
|
|
_rasterizer_debug_immediate_triangle (0000)
|
|
0016C280 0010:
|
|
_rasterizer_debug_immediate_end (0000)
|
|
0016C290 0010:
|
|
_rasterizer_debug_immediate_begin_screenspace (0000)
|
|
0016C2A0 0010:
|
|
_rasterizer_debug_immediate_line_screenspace (0000)
|
|
0016C2B0 0010:
|
|
_rasterizer_debug_immediate_linestrip_screenspace (0000)
|
|
0016C2C0 0010:
|
|
_rasterizer_debug_immediate_end_screenspace (0000)
|
|
0016C2D0 0010:
|
|
_rasterizer_decals_initialize (0000)
|
|
0016C2E0 0010:
|
|
_rasterizer_decals_update_function_pointers (0000)
|
|
0016C2F0 0010:
|
|
_rasterizer_decals_initialize_for_new_map (0000)
|
|
0016C300 0010:
|
|
_rasterizer_decals_dispose_from_old_map (0000)
|
|
0016C310 0010:
|
|
_rasterizer_decals_flush (0000)
|
|
0016C320 0010:
|
|
_rasterizer_decals_dispose (0000)
|
|
0016C330 0010:
|
|
_rasterizer_decal_vertices_new (0000)
|
|
0016C340 0010:
|
|
_rasterizer_decal_vertices_lock (0000)
|
|
0016C350 0010:
|
|
_rasterizer_decal_vertices_unlock (0000)
|
|
0016C360 0010:
|
|
_rasterizer_decal_vertices_delete (0000)
|
|
0016C370 0010:
|
|
_rasterizer_decals_begin (0000)
|
|
0016C380 0010:
|
|
_rasterizer_decals_draw (0000)
|
|
0016C390 0010:
|
|
_rasterizer_decals_end (0000)
|
|
0016C3A0 0010:
|
|
_rasterizer_detail_objects_begin (0000)
|
|
0016C3B0 0010:
|
|
_rasterizer_detail_objects_rebuild_vertices (0000)
|
|
0016C3C0 0010:
|
|
_rasterizer_detail_objects_draw (0000)
|
|
0016C3D0 0010:
|
|
_rasterizer_detail_objects_end (0000)
|
|
0016C3E0 0010:
|
|
_rasterizer_screen_effect (0000)
|
|
0016C3F0 0010:
|
|
_rasterizer_screen_flash (0000)
|
|
0016C400 0010:
|
|
_rasterizer_model_begin (0000)
|
|
0016C410 0010:
|
|
_rasterizer_model_draw (0000)
|
|
0016C420 0010:
|
|
_rasterizer_model_transparent_geometry_submit (0000)
|
|
0016C430 0010:
|
|
_rasterizer_model_end (0000)
|
|
0016C440 0010:
|
|
_rasterizer_models_end (0000)
|
|
0016C450 0010:
|
|
_rasterizer_environment_lightmaps_begin (0000)
|
|
0016C460 0010:
|
|
_rasterizer_environment_lightmap_begin (0000)
|
|
0016C470 0010:
|
|
_rasterizer_environment_lightmap_draw (0000)
|
|
0016C480 0010:
|
|
_rasterizer_environment_lightmap_end (0000)
|
|
0016C490 0010:
|
|
_rasterizer_environment_lightmaps_end (0000)
|
|
0016C4A0 0010:
|
|
_rasterizer_environment_diffuse_lights_begin (0000)
|
|
0016C4B0 0010:
|
|
_rasterizer_environment_diffuse_light_begin (0000)
|
|
0016C4C0 0010:
|
|
_rasterizer_environment_diffuse_light_draw (0000)
|
|
0016C4D0 0010:
|
|
_rasterizer_environment_diffuse_light_end (0000)
|
|
0016C4E0 0010:
|
|
_rasterizer_environment_diffuse_lights_end (0000)
|
|
0016C4F0 0010:
|
|
_rasterizer_environment_shadows_begin (0000)
|
|
0016C500 0010:
|
|
_rasterizer_environment_shadow_begin (0000)
|
|
0016C510 0010:
|
|
_rasterizer_environment_shadow_model_begin (0000)
|
|
0016C520 0010:
|
|
_rasterizer_environment_shadow_model_draw (0000)
|
|
0016C530 0010:
|
|
_rasterizer_environment_shadow_model_end (0000)
|
|
0016C540 0010:
|
|
_rasterizer_environment_shadow_draw (0000)
|
|
0016C550 0010:
|
|
_rasterizer_environment_shadow_end (0000)
|
|
0016C560 0010:
|
|
_rasterizer_environment_shadows_end (0000)
|
|
0016C570 0010:
|
|
_rasterizer_environment_diffuse_textures_begin (0000)
|
|
0016C580 0010:
|
|
_rasterizer_environment_diffuse_texture_draw (0000)
|
|
0016C590 0010:
|
|
_rasterizer_environment_diffuse_textures_end (0000)
|
|
0016C5A0 0010:
|
|
_rasterizer_environment_specular_lights_begin (0000)
|
|
0016C5B0 0010:
|
|
_rasterizer_environment_specular_light_begin (0000)
|
|
0016C5C0 0010:
|
|
_rasterizer_environment_specular_light_draw (0000)
|
|
0016C5D0 0010:
|
|
_rasterizer_environment_specular_light_end (0000)
|
|
0016C5E0 0010:
|
|
_rasterizer_environment_specular_lights_end (0000)
|
|
0016C5F0 0010:
|
|
_rasterizer_environment_specular_lightmaps_begin (0000)
|
|
0016C600 0010:
|
|
_rasterizer_environment_specular_lightmap_begin (0000)
|
|
0016C610 0010:
|
|
_rasterizer_environment_specular_lightmap_draw (0000)
|
|
0016C620 0010:
|
|
_rasterizer_environment_specular_lightmap_end (0000)
|
|
0016C630 0010:
|
|
_rasterizer_environment_specular_lightmaps_end (0000)
|
|
0016C640 0010:
|
|
_rasterizer_environment_reflection_lightmap_masks_begin (0000)
|
|
0016C650 0010:
|
|
_rasterizer_environment_reflection_lightmap_mask_begin (0000)
|
|
0016C660 0010:
|
|
_rasterizer_environment_reflection_lightmap_mask_draw (0000)
|
|
0016C670 0010:
|
|
_rasterizer_environment_reflection_lightmap_mask_end (0000)
|
|
0016C680 0010:
|
|
_rasterizer_environment_reflection_lightmap_masks_end (0000)
|
|
0016C690 0010:
|
|
_rasterizer_environment_reflection_mirrors_begin (0000)
|
|
0016C6A0 0010:
|
|
_rasterizer_environment_reflection_mirror_draw (0000)
|
|
0016C6B0 0010:
|
|
_rasterizer_environment_reflection_mirrors_end (0000)
|
|
0016C6C0 0010:
|
|
_rasterizer_environment_reflections_begin (0000)
|
|
0016C6D0 0010:
|
|
_rasterizer_environment_reflection_draw (0000)
|
|
0016C6E0 0010:
|
|
_rasterizer_environment_reflections_end (0000)
|
|
0016C6F0 0010:
|
|
_rasterizer_environment_transparent_geometry_begin (0000)
|
|
0016C700 0010:
|
|
_rasterizer_environment_transparent_geometry_submit (0000)
|
|
0016C710 0010:
|
|
_rasterizer_environment_transparent_geometry_end (0000)
|
|
0016C720 0010:
|
|
_rasterizer_environment_fog_begin (0000)
|
|
0016C730 0010:
|
|
_rasterizer_environment_fog_draw (0000)
|
|
0016C740 0010:
|
|
_rasterizer_environment_fog_end (0000)
|
|
0016C750 0010:
|
|
_rasterizer_environment_fog_screen_wind_get_vector (0000)
|
|
0016C760 0010:
|
|
_rasterizer_environment_fog_screen_begin (0000)
|
|
0016C770 0010:
|
|
_rasterizer_environment_fog_screen_draw (0000)
|
|
0016C780 0010:
|
|
_rasterizer_environment_fog_screen_end (0000)
|
|
0016C790 0010:
|
|
_rasterizer_hud_begin (0000)
|
|
0016C7A0 0010:
|
|
_rasterizer_hud_end (0000)
|
|
0016C7B0 0010:
|
|
_rasterizer_dynamic_unlit_geometry_draw (0000)
|
|
0016C7C0 0010:
|
|
_rasterizer_dynamic_lit_geometry_draw (0000)
|
|
0016C7D0 0010:
|
|
_rasterizer_dynamic_screen_geometry_draw (0000)
|
|
0016C7E0 0010:
|
|
_rasterizer_dynamic_screen_geometry_add_multitexture_params_to_base (0000)
|
|
0016C7F0 0010:
|
|
_rasterizer_psuedo_dynamic_screen_quad_draw (0000)
|
|
0016C800 0010:
|
|
_rasterizer_widget_submit (0000)
|
|
0016C810 0010:
|
|
_rasterizer_widget_begin (0000)
|
|
0016C820 0010:
|
|
_rasterizer_widget_set_texture (0000)
|
|
0016C830 0010:
|
|
_rasterizer_widget_set_tint_factor (0000)
|
|
0016C840 0010:
|
|
_rasterizer_widget_set_zbuffer_enable (0000)
|
|
0016C850 0010:
|
|
_rasterizer_widget_draw_sprite2d (0000)
|
|
0016C860 0010:
|
|
_rasterizer_widget_draw_sprite3d (0000)
|
|
0016C870 0010:
|
|
_rasterizer_widget_end (0000)
|
|
0016C880 0010:
|
|
_rasterizer_widget_submit_occlusion_test (0000)
|
|
0016C890 0010:
|
|
_rasterizer_widget_get_occlusion_test_result (0000)
|
|
0016C8A0 0010:
|
|
_rasterizer_hud_motion_sensor_blip_begin (0000)
|
|
0016C8B0 0010:
|
|
_rasterizer_hud_motion_sensor_blip_draw (0000)
|
|
0016C8C0 0010:
|
|
_rasterizer_hud_motion_sensor_blip_end (0000)
|
|
0016C8D0 00d0:
|
|
_rasterizer_debug_immediate_point (0000)
|
|
0016C9A0 0050:
|
|
_rasterizer_debug_immediate_vector (0000)
|
|
0016C9F0 0110:
|
|
_rasterizer_models_begin (0000)
|
|
0016CB00 0640:
|
|
_rasterizer_debug_model_vertices (0000)
|
|
0029D6DC 0010:
|
|
_rasterizer_global_defaults (0000)
|
|
0029D6EC 0030:
|
|
??_C@_0DA@KMFNEIAD@global_rasterizer_model_ambient_@ (0000)
|
|
0029D71C 0027:
|
|
??_C@_0CH@FLEENNB@c?3?2halo?2SOURCE?2rasterizer?2raster@ (0000)
|
|
0029D744 0029:
|
|
??_C@_0CJ@KNCEBLOJ@rasterizer?5model?5ambient?5reflect@ (0000)
|
|
0029D770 0004:
|
|
__real@461c4000 (0000)
|
|
0029D774 0004:
|
|
??_C@_03LDNPNKDL@?6V?$DN?$AA@ (0000)
|
|
0029D778 0005:
|
|
??_C@_04PEOOHEKN@?$CFd?$CFc?$AA@ (0000)
|
|
0029D780 0003:
|
|
??_C@_02BFBNNIBM@I?$DN?$AA@ (0000)
|
|
0029D784 0029:
|
|
??_C@_0CJ@NGJFILME@node_weight0?$DO?$DN0?40f?5?$CG?$CG?5node_weigh@ (0000)
|
|
0029D7B0 0028:
|
|
??_C@_0CI@MOEBMMIG@node_index1?$DMskinning?9?$DOnode_matri@ (0000)
|
|
0029D7D8 0028:
|
|
??_C@_0CI@PCCBCPIO@node_index0?$DMskinning?9?$DOnode_matri@ (0000)
|
|
0029D800 0044:
|
|
??_C@_0EE@KEGACHLN@part?9?$DOtriangle_buffer?4type?$DN?$DN_tri@ (0000)
|
|
0030D3D8 00f4:
|
|
_rasterizer_globals (0000)
|
|
_rasterizer_debug_options (0068)
|
|
004662EC 0008:
|
|
_bss_004662ec (0000)
|
|
_global_rasterizer_model_ambient_reflection_tint (0004)
|
|
*/
|
|
|
|
/* ---------- headers */
|
|
|
|
#include "cseries.h"
|
|
#include "physics/collisions.h"
|
|
#include "physics/collision_usage.h"
|
|
#include "real_math.h"
|
|
#include "rasterizer.h"
|
|
#include "rasterizer_geometry.h"
|
|
#include "render/render.h"
|
|
#include "render/render_debug.h"
|
|
#include "saved games/game_state.h"
|
|
#include "tag_files/tag_groups.h"
|
|
|
|
/* ---------- constants */
|
|
|
|
enum
|
|
{
|
|
MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTICES = 2048,
|
|
MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTEX_REFERENCES = 12,
|
|
};
|
|
|
|
/* ---------- macros */
|
|
|
|
#define rasterizer_model_obscurer_object_index bss_004662ec
|
|
#define rasterizer_debug_model_vertices_enabled rasterizer_debug_options.reserved0[7]
|
|
|
|
/* ---------- structures */
|
|
|
|
struct rasterizer_global_defaults
|
|
{
|
|
real near_clip_distance;
|
|
real far_clip_distance;
|
|
real first_person_weapon_near_clip_distance;
|
|
real first_person_weapon_far_clip_distance;
|
|
};
|
|
|
|
struct rasterizer_debug_options_definition
|
|
{
|
|
byte reserved0[0x10];
|
|
byte all;
|
|
byte field_11;
|
|
byte field_12;
|
|
byte field_13;
|
|
byte field_14;
|
|
byte field_15;
|
|
byte field_16;
|
|
byte field_17;
|
|
byte field_18;
|
|
byte field_19;
|
|
byte field_1A;
|
|
byte field_1B;
|
|
byte field_1C;
|
|
byte field_1D;
|
|
byte reserved1E[0x6E];
|
|
};
|
|
|
|
struct rasterizer_window_parameters
|
|
{
|
|
short rasterizer_target;
|
|
short window_index;
|
|
byte reserved04[4];
|
|
real_point3d camera_position;
|
|
real_vector3d camera_forward;
|
|
};
|
|
|
|
struct rasterizer_triangle_buffer
|
|
{
|
|
short type;
|
|
word pad;
|
|
long count;
|
|
void *data;
|
|
void *hardware_format;
|
|
};
|
|
|
|
struct rasterizer_model_vertex_compressed
|
|
{
|
|
real_point3d position;
|
|
unsigned long normal;
|
|
unsigned long binormal;
|
|
unsigned long tangent;
|
|
point2d texture_coordinates;
|
|
char node_indices[2];
|
|
short node_weight;
|
|
};
|
|
|
|
struct rasterizer_model_geometry_part
|
|
{
|
|
unsigned long flags;
|
|
short shader_index;
|
|
char previous_part_index;
|
|
char next_part_index;
|
|
short centroid_primary_node_index;
|
|
short centroid_secondary_node_index;
|
|
real centroid_primary_node_weight;
|
|
real centroid_secondary_node_weight;
|
|
real_point3d centroid;
|
|
struct tag_block uncompressed_vertices;
|
|
struct tag_block compressed_vertices;
|
|
struct tag_block triangles;
|
|
struct rasterizer_triangle_buffer triangle_buffer;
|
|
};
|
|
|
|
struct rasterizer_model_skinning
|
|
{
|
|
real_matrix4x3 const *node_matrices;
|
|
short node_matrix_count;
|
|
word pad;
|
|
};
|
|
|
|
struct rasterizer_debug_model_vertex
|
|
{
|
|
real_point3d position;
|
|
short triangle_vertex_indices[MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTEX_REFERENCES];
|
|
short model_vertex_indices[MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTEX_REFERENCES];
|
|
byte triangle_vertex_index_count;
|
|
byte model_vertex_index_count;
|
|
word pad;
|
|
};
|
|
|
|
/* ---------- prototypes */
|
|
|
|
void _rasterizer_reset_state(
|
|
void);
|
|
boolean _rasterizer_initialize(
|
|
void);
|
|
void _rasterizer_frame_begin(
|
|
struct rasterizer_frame_begin_parameters const *parameters);
|
|
void _rasterizer_present(
|
|
struct bitmap_data *screenshot_bitmap,
|
|
point2d const *screenshot_index);
|
|
void _rasterizer_window_get_fog(
|
|
struct render_fog *fog);
|
|
void _rasterizer_window_set_fog(
|
|
struct render_fog const *fog);
|
|
void _rasterizer_set_vblank_callback(
|
|
void (*callback)(unsigned long));
|
|
long _rasterizer_dynamic_triangles_new(
|
|
long triangle_count);
|
|
short *_rasterizer_dynamic_triangles_lock(
|
|
long triangle_buffer_index);
|
|
void _rasterizer_dynamic_triangles_unlock(
|
|
long triangle_buffer_index);
|
|
void _rasterizer_dynamic_triangles_delete(
|
|
long triangle_buffer_index);
|
|
long _rasterizer_dynamic_vertices_new(
|
|
short type,
|
|
long vertex_count);
|
|
short _rasterizer_dynamic_vertices_get_type(
|
|
long dynamic_vertex_buffer_index);
|
|
void *_rasterizer_dynamic_vertices_lock(
|
|
long dynamic_vertex_buffer_index);
|
|
void _rasterizer_dynamic_vertices_unlock(
|
|
long dynamic_vertex_buffer_index);
|
|
void _rasterizer_dynamic_vertices_delete(
|
|
long dynamic_vertex_buffer_index);
|
|
void _rasterizer_debug_immediate_line(
|
|
real_point3d const *p0,
|
|
real_point3d const *p1,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1);
|
|
void _rasterizer_debug_immediate_triangle(
|
|
real_point3d const *p0,
|
|
real_point3d const *p1,
|
|
real_point3d const *p2,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1,
|
|
real_rgb_color const *color2);
|
|
void _rasterizer_debug_immediate_line_screenspace(
|
|
point2d const *p0,
|
|
point2d const *p1,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1);
|
|
void _rasterizer_debug_immediate_linestrip_screenspace(
|
|
point2d const *points,
|
|
short point_count,
|
|
real_rgb_color const *color);
|
|
void *_rasterizer_decal_vertices_lock(
|
|
short cache_index,
|
|
unsigned long cache_size);
|
|
long _rasterizer_decal_vertices_new(
|
|
long size);
|
|
void _rasterizer_decal_vertices_delete(
|
|
long decal_vertex_buffer_index);
|
|
void _rasterizer_decal_vertices_unlock(
|
|
void);
|
|
void _rasterizer_widget_end(
|
|
void);
|
|
real_vector3d *uncompress_int32_to_real_vector3d(
|
|
real_vector3d *result,
|
|
unsigned long compressed);
|
|
|
|
void _rasterizer_decals_update_function_pointers(void);
|
|
void _rasterizer_decals_initialize(
|
|
void);
|
|
void _rasterizer_decals_initialize_for_new_map(
|
|
void);
|
|
void _rasterizer_decals_dispose_from_old_map(
|
|
void);
|
|
void _rasterizer_decals_dispose(
|
|
void);
|
|
void _rasterizer_decals_begin(
|
|
short type);
|
|
void _rasterizer_decals_end(
|
|
void);
|
|
void _rasterizer_decals_draw(
|
|
short cluster_index);
|
|
void _rasterizer_decals_flush(
|
|
void);
|
|
void _rasterizer_detail_objects_begin(
|
|
void);
|
|
void _rasterizer_detail_objects_rebuild_vertices(
|
|
struct detail_object_global_runtime_data *runtime_data);
|
|
void _rasterizer_detail_objects_draw(
|
|
struct detail_object_render_data *render_data);
|
|
void _rasterizer_detail_objects_end(
|
|
void);
|
|
void _rasterizer_screen_effect(
|
|
struct render_screen_effect const *effect);
|
|
void _rasterizer_debug_immediate_begin(
|
|
void);
|
|
void _rasterizer_debug_immediate_end(
|
|
void);
|
|
void _rasterizer_debug_immediate_begin_screenspace(
|
|
void);
|
|
void _rasterizer_debug_immediate_end_screenspace(
|
|
void);
|
|
void _rasterizer_hud_begin(
|
|
void);
|
|
void _rasterizer_hud_end(
|
|
void);
|
|
void _rasterizer_hud_motion_sensor_blip_begin(
|
|
void);
|
|
void _rasterizer_hud_motion_sensor_blip_draw(
|
|
real_point2d const *position,
|
|
real intensity,
|
|
real size,
|
|
real_rgb_color const *color,
|
|
boolean large_blip);
|
|
void _rasterizer_hud_motion_sensor_blip_end(
|
|
real_point2d const *center,
|
|
real scale);
|
|
void _rasterizer_model_begin(
|
|
struct rasterizer_model_begin_parameters const *parameters,
|
|
boolean is_dynamic);
|
|
void _rasterizer_model_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
long geometry_index,
|
|
long model_data,
|
|
real_rgb_color const *change_colors,
|
|
long model_effect);
|
|
void _rasterizer_model_transparent_geometry_submit(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
long geometry_index,
|
|
long model_data,
|
|
real_rgb_color const *change_colors,
|
|
long model_effect,
|
|
void const *lighting,
|
|
void const *effect);
|
|
void _rasterizer_model_end(
|
|
void);
|
|
void _rasterizer_models_end(
|
|
void);
|
|
void _rasterizer_environment_lightmap_begin(
|
|
struct bitmap_data const *lightmap_bitmap);
|
|
void _rasterizer_environment_lightmap_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_lightmaps_begin(
|
|
void);
|
|
void _rasterizer_environment_lightmap_end(
|
|
void);
|
|
void _rasterizer_environment_lightmaps_end(
|
|
void);
|
|
void _rasterizer_environment_diffuse_light_end(
|
|
void);
|
|
void _rasterizer_environment_diffuse_lights_end(
|
|
void);
|
|
void _rasterizer_environment_diffuse_lights_begin(
|
|
void);
|
|
void _rasterizer_environment_diffuse_light_begin(
|
|
long light_index);
|
|
void _rasterizer_environment_diffuse_light_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_shadows_begin(
|
|
void);
|
|
void _rasterizer_environment_shadow_begin(
|
|
long object_index,
|
|
real_matrix4x3 const *shadow_matrix,
|
|
real_point3d const *object_position,
|
|
real object_bounding_radius,
|
|
real_rgb_color const *shadow_color);
|
|
void _rasterizer_environment_shadow_model_begin(
|
|
struct rasterizer_model_begin_parameters const *parameters);
|
|
void _rasterizer_environment_shadow_model_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
real_rgb_color const *change_colors);
|
|
void _rasterizer_environment_shadow_model_end(
|
|
void);
|
|
void _rasterizer_environment_shadow_end(
|
|
void);
|
|
void _rasterizer_environment_shadow_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_shadows_end(
|
|
void);
|
|
void _rasterizer_environment_diffuse_textures_end(
|
|
void);
|
|
void _rasterizer_environment_diffuse_textures_begin(
|
|
void);
|
|
void _rasterizer_environment_diffuse_texture_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_specular_light_end(
|
|
void);
|
|
void _rasterizer_environment_specular_lights_end(
|
|
void);
|
|
void _rasterizer_environment_specular_lights_begin(
|
|
void);
|
|
void _rasterizer_environment_specular_light_begin(
|
|
long light_index);
|
|
void _rasterizer_environment_specular_light_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_specular_lightmap_end(
|
|
void);
|
|
void _rasterizer_environment_specular_lightmaps_end(
|
|
void);
|
|
void _rasterizer_environment_specular_lightmaps_begin(
|
|
void);
|
|
void _rasterizer_environment_specular_lightmap_begin(
|
|
struct bitmap_data const *lightmap_bitmap);
|
|
void _rasterizer_environment_specular_lightmap_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_reflection_lightmap_mask_end(
|
|
void);
|
|
void _rasterizer_environment_reflection_lightmap_mask_begin(
|
|
struct bitmap_data const *lightmap_bitmap);
|
|
void _rasterizer_environment_reflection_lightmap_mask_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_reflection_lightmap_masks_end(
|
|
void);
|
|
void _rasterizer_environment_reflection_lightmap_masks_begin(
|
|
void);
|
|
void _rasterizer_environment_reflection_mirrors_begin(
|
|
void);
|
|
void _rasterizer_environment_reflection_mirror_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_reflection_mirrors_end(
|
|
void);
|
|
void _rasterizer_environment_reflections_begin(
|
|
void);
|
|
void _rasterizer_environment_reflection_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_reflections_end(
|
|
void);
|
|
void _rasterizer_environment_transparent_geometry_begin(
|
|
void);
|
|
void _rasterizer_environment_transparent_geometry_submit(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
struct bitmap_data const *bitmap,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_transparent_geometry_end(
|
|
void);
|
|
void _rasterizer_environment_fog_begin(
|
|
void);
|
|
void _rasterizer_environment_fog_end(
|
|
void);
|
|
void _rasterizer_environment_fog_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_environment_fog_screen_end(
|
|
void);
|
|
void _rasterizer_environment_fog_screen_wind_get_vector(
|
|
short wind_index,
|
|
real animation_time,
|
|
real_vector3d *wind_vector);
|
|
void _rasterizer_environment_fog_screen_begin(
|
|
boolean render_fog);
|
|
void _rasterizer_environment_fog_screen_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer);
|
|
void _rasterizer_dynamic_screen_geometry_draw(
|
|
long primitive_type,
|
|
long vertex_type,
|
|
long dynamic_vertex_buffer_index,
|
|
long vertex_count);
|
|
void _rasterizer_dynamic_screen_geometry_add_multitexture_params_to_base(
|
|
struct rasterizer_dynamic_screen_geometry_parameters *base,
|
|
struct rasterizer_dynamic_screen_geometry_parameters const *multitex_params);
|
|
void _rasterizer_dynamic_unlit_geometry_draw(
|
|
struct shader const *shader,
|
|
struct bitmap_data const *bitmap,
|
|
struct render_animation const *animation,
|
|
long dynamic_triangle_buffer_index,
|
|
long dynamic_vertex_buffer_index,
|
|
long vertex_count,
|
|
real_point3d const *centroid,
|
|
unsigned long geometry_flags);
|
|
void _rasterizer_dynamic_lit_geometry_draw(
|
|
void const *vertices,
|
|
void const *parameters);
|
|
void _rasterizer_psuedo_dynamic_screen_quad_draw(
|
|
struct rasterizer_dynamic_screen_geometry_parameters *parameters,
|
|
struct dynamic_screen_vertex *vertices);
|
|
void _rasterizer_widget_submit(
|
|
long object_index,
|
|
long widget_index,
|
|
real_point3d const *centroid,
|
|
rasterizer_widget_render_proc render_proc);
|
|
void *_rasterizer_widget_begin(
|
|
long handle);
|
|
void _rasterizer_profile_enable(
|
|
boolean enable);
|
|
void _rasterizer_screen_flash(
|
|
void);
|
|
void _rasterizer_widget_set_texture(
|
|
long handle);
|
|
void _rasterizer_widget_set_tint_factor(
|
|
long handle);
|
|
long _rasterizer_widget_set_zbuffer_enable(
|
|
long handle,
|
|
long enable);
|
|
short _rasterizer_widget_draw_sprite2d(
|
|
long dynamic_vertex_buffer_index);
|
|
long _rasterizer_widget_draw_sprite3d(
|
|
long zbuffer_result);
|
|
void _rasterizer_widget_submit_occlusion_test(
|
|
long handle);
|
|
long _rasterizer_widget_get_occlusion_test_result(
|
|
long handle);
|
|
void _rasterizer_dispose(void);
|
|
void _rasterizer_frame_end(void);
|
|
void _rasterizer_window_begin(
|
|
struct rasterizer_window_begin_parameters const *parameters);
|
|
void _rasterizer_window_end(
|
|
void);
|
|
boolean _rasterizer_windows_begin(void);
|
|
void _rasterizer_windows_end(void);
|
|
void _rasterizer_models_begin(
|
|
boolean skip_obscurer_test);
|
|
|
|
/* ---------- globals */
|
|
|
|
const struct rasterizer_global_defaults rasterizer_global_defaults =
|
|
{
|
|
0.0625f,
|
|
1024.f,
|
|
0.01171875f,
|
|
1024.f
|
|
};
|
|
struct rasterizer_globals_definition rasterizer_globals =
|
|
{
|
|
FALSE,
|
|
0,
|
|
0,
|
|
{ 0 },
|
|
0,
|
|
0,
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0 },
|
|
TRUE,
|
|
{ 0 },
|
|
0.0625f,
|
|
1024.f,
|
|
0.01171875f,
|
|
1024.f,
|
|
{ 0 }
|
|
};
|
|
struct rasterizer_debug_options_definition rasterizer_debug_options =
|
|
{
|
|
{ 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, 0, 0, 1, 1, 1, 1 },
|
|
2,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
{
|
|
1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0,
|
|
0x80, 0x3F, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1,
|
|
1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0,
|
|
0, 0, 0xCD, 0xCC, 0xCC, 0x3E, 8, 0, 0, 0, 0, 0, 0x80, 0x3B,
|
|
0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0x80, 0x3F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
|
}
|
|
};
|
|
extern struct rasterizer_window_parameters global_window_parameters;
|
|
/* No PDB name survives for this target-owned BSS symbol. */
|
|
#pragma bss_seg(".bss")
|
|
long bss_004662ec;
|
|
real_argb_color *global_rasterizer_model_ambient_reflection_tint;
|
|
#pragma bss_seg()
|
|
|
|
/* ---------- public code */
|
|
|
|
boolean rasterizer_initialize(
|
|
void)
|
|
{
|
|
global_rasterizer_model_ambient_reflection_tint = game_state_malloc(
|
|
"rasterizer model ambient reflection tint",
|
|
NULL,
|
|
sizeof(*global_rasterizer_model_ambient_reflection_tint));
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
289,
|
|
global_rasterizer_model_ambient_reflection_tint);
|
|
return _rasterizer_initialize();
|
|
}
|
|
|
|
void rasterizer_reset_state(
|
|
void)
|
|
{
|
|
_rasterizer_reset_state();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_frame_begin(
|
|
struct rasterizer_frame_begin_parameters const *parameters)
|
|
{
|
|
if (rasterizer_debug_options.all <= 1)
|
|
{
|
|
rasterizer_debug_options.field_1C = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_1B = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_1A = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_19 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_18 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_17 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_16 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_15 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_14 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_12 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_13 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_11 = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.field_1D = rasterizer_debug_options.all;
|
|
rasterizer_debug_options.all = 2;
|
|
}
|
|
|
|
if (rasterizer_globals.near_clip_distance == 0.f)
|
|
rasterizer_globals.near_clip_distance = rasterizer_global_defaults.near_clip_distance;
|
|
if (rasterizer_globals.far_clip_distance == 0.f)
|
|
rasterizer_globals.far_clip_distance = rasterizer_global_defaults.far_clip_distance;
|
|
if (rasterizer_globals.first_person_weapon_near_clip_distance == 0.f)
|
|
rasterizer_globals.first_person_weapon_near_clip_distance = rasterizer_global_defaults.first_person_weapon_near_clip_distance;
|
|
if (rasterizer_globals.first_person_weapon_far_clip_distance == 0.f)
|
|
rasterizer_globals.first_person_weapon_far_clip_distance = rasterizer_global_defaults.first_person_weapon_far_clip_distance;
|
|
|
|
_rasterizer_frame_begin(parameters);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_present(
|
|
struct bitmap_data *screenshot_bitmap,
|
|
point2d const *screenshot_index)
|
|
{
|
|
_rasterizer_present(screenshot_bitmap, screenshot_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_window_get_fog(
|
|
struct render_fog *fog)
|
|
{
|
|
_rasterizer_window_get_fog(fog);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_window_set_fog(
|
|
struct render_fog const *fog)
|
|
{
|
|
_rasterizer_window_set_fog(fog);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_set_vblank_callback(
|
|
void (*callback)(unsigned long))
|
|
{
|
|
_rasterizer_set_vblank_callback(callback);
|
|
return;
|
|
}
|
|
|
|
long rasterizer_dynamic_triangles_new(
|
|
long triangle_count)
|
|
{
|
|
return _rasterizer_dynamic_triangles_new(triangle_count);
|
|
}
|
|
|
|
short *rasterizer_dynamic_triangles_lock(
|
|
long triangle_buffer_index)
|
|
{
|
|
return _rasterizer_dynamic_triangles_lock(triangle_buffer_index);
|
|
}
|
|
|
|
void rasterizer_dynamic_triangles_unlock(
|
|
long triangle_buffer_index)
|
|
{
|
|
_rasterizer_dynamic_triangles_unlock(triangle_buffer_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_triangles_delete(
|
|
long triangle_buffer_index)
|
|
{
|
|
_rasterizer_dynamic_triangles_delete(triangle_buffer_index);
|
|
return;
|
|
}
|
|
|
|
long rasterizer_dynamic_vertices_new(
|
|
short type,
|
|
long vertex_count)
|
|
{
|
|
return _rasterizer_dynamic_vertices_new(type, vertex_count);
|
|
}
|
|
|
|
short rasterizer_dynamic_vertices_get_type(
|
|
long dynamic_vertex_buffer_index)
|
|
{
|
|
return _rasterizer_dynamic_vertices_get_type(dynamic_vertex_buffer_index);
|
|
}
|
|
|
|
void *rasterizer_dynamic_vertices_lock(
|
|
long dynamic_vertex_buffer_index)
|
|
{
|
|
return _rasterizer_dynamic_vertices_lock(dynamic_vertex_buffer_index);
|
|
}
|
|
|
|
void rasterizer_dynamic_vertices_unlock(
|
|
long dynamic_vertex_buffer_index)
|
|
{
|
|
_rasterizer_dynamic_vertices_unlock(dynamic_vertex_buffer_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_vertices_delete(
|
|
long dynamic_vertex_buffer_index)
|
|
{
|
|
_rasterizer_dynamic_vertices_delete(dynamic_vertex_buffer_index);
|
|
return;
|
|
}
|
|
|
|
long rasterizer_decal_vertices_new(
|
|
long size)
|
|
{
|
|
return _rasterizer_decal_vertices_new(size);
|
|
}
|
|
|
|
void rasterizer_decal_vertices_delete(
|
|
long decal_vertex_buffer_index)
|
|
{
|
|
_rasterizer_decal_vertices_delete(decal_vertex_buffer_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_line(
|
|
real_point3d const *p0,
|
|
real_point3d const *p1,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1)
|
|
{
|
|
_rasterizer_debug_immediate_line(p0, p1, color0, color1);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_triangle(
|
|
real_point3d const *p0,
|
|
real_point3d const *p1,
|
|
real_point3d const *p2,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1,
|
|
real_rgb_color const *color2)
|
|
{
|
|
_rasterizer_debug_immediate_triangle(p0, p1, p2, color0, color1, color2);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_line_screenspace(
|
|
point2d const *p0,
|
|
point2d const *p1,
|
|
real_rgb_color const *color0,
|
|
real_rgb_color const *color1)
|
|
{
|
|
_rasterizer_debug_immediate_line_screenspace(p0, p1, color0, color1);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_linestrip_screenspace(
|
|
point2d const *points,
|
|
short point_count,
|
|
real_rgb_color const *color)
|
|
{
|
|
_rasterizer_debug_immediate_linestrip_screenspace(points, point_count, color);
|
|
return;
|
|
}
|
|
|
|
void *rasterizer_decal_vertices_lock(
|
|
short cache_index,
|
|
unsigned long cache_size)
|
|
{
|
|
return _rasterizer_decal_vertices_lock(cache_index, cache_size);
|
|
}
|
|
|
|
void rasterizer_decal_vertices_unlock(
|
|
void)
|
|
{
|
|
_rasterizer_decal_vertices_unlock();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_widget_end(
|
|
void)
|
|
{
|
|
_rasterizer_widget_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_initialize(
|
|
void)
|
|
{
|
|
_rasterizer_decals_initialize();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_update_function_pointers(void)
|
|
{
|
|
_rasterizer_decals_update_function_pointers();
|
|
}
|
|
|
|
void rasterizer_decals_initialize_for_new_map(
|
|
void)
|
|
{
|
|
_rasterizer_decals_initialize_for_new_map();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_dispose_from_old_map(
|
|
void)
|
|
{
|
|
_rasterizer_decals_dispose_from_old_map();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_dispose(
|
|
void)
|
|
{
|
|
_rasterizer_decals_dispose();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_begin(
|
|
short type)
|
|
{
|
|
_rasterizer_decals_begin(type);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_end(
|
|
void)
|
|
{
|
|
_rasterizer_decals_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_draw(
|
|
short cluster_index)
|
|
{
|
|
_rasterizer_decals_draw(cluster_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_decals_flush(
|
|
void)
|
|
{
|
|
_rasterizer_decals_flush();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_detail_objects_begin(
|
|
void)
|
|
{
|
|
_rasterizer_detail_objects_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_detail_objects_rebuild_vertices(
|
|
struct detail_object_global_runtime_data *runtime_data)
|
|
{
|
|
_rasterizer_detail_objects_rebuild_vertices(runtime_data);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_detail_objects_draw(
|
|
struct detail_object_render_data *render_data)
|
|
{
|
|
_rasterizer_detail_objects_draw(render_data);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_detail_objects_end(
|
|
void)
|
|
{
|
|
_rasterizer_detail_objects_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_screen_effect(
|
|
struct render_screen_effect const *effect)
|
|
{
|
|
_rasterizer_screen_effect(effect);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_begin(
|
|
void)
|
|
{
|
|
_rasterizer_debug_immediate_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_end(
|
|
void)
|
|
{
|
|
_rasterizer_debug_immediate_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_begin_screenspace(
|
|
void)
|
|
{
|
|
_rasterizer_debug_immediate_begin_screenspace();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_end_screenspace(
|
|
void)
|
|
{
|
|
_rasterizer_debug_immediate_end_screenspace();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_hud_begin(
|
|
void)
|
|
{
|
|
_rasterizer_hud_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_hud_end(
|
|
void)
|
|
{
|
|
_rasterizer_hud_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_hud_motion_sensor_blip_begin(
|
|
void)
|
|
{
|
|
_rasterizer_hud_motion_sensor_blip_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_hud_motion_sensor_blip_draw(
|
|
real_point2d const *position,
|
|
real intensity,
|
|
real size,
|
|
real_rgb_color const *color,
|
|
boolean large_blip)
|
|
{
|
|
_rasterizer_hud_motion_sensor_blip_draw(position, intensity, size, color, large_blip);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_hud_motion_sensor_blip_end(
|
|
real_point2d const *center,
|
|
real scale)
|
|
{
|
|
_rasterizer_hud_motion_sensor_blip_end(center, scale);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_model_begin(
|
|
struct rasterizer_model_begin_parameters const *parameters,
|
|
boolean is_dynamic)
|
|
{
|
|
_rasterizer_model_begin(parameters, is_dynamic);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_model_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
long geometry_index,
|
|
long model_data,
|
|
real_rgb_color const *change_colors,
|
|
long model_effect)
|
|
{
|
|
_rasterizer_model_draw(shader, bitmap_index, geometry, geometry_index, model_data, change_colors, model_effect);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_model_transparent_geometry_submit(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
long geometry_index,
|
|
long model_data,
|
|
real_rgb_color const *change_colors,
|
|
long model_effect,
|
|
void const *lighting,
|
|
void const *effect)
|
|
{
|
|
_rasterizer_model_transparent_geometry_submit(shader, bitmap_index, geometry, geometry_index, model_data, change_colors, model_effect, lighting, effect);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_model_end(
|
|
void)
|
|
{
|
|
_rasterizer_model_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_models_end(
|
|
void)
|
|
{
|
|
_rasterizer_models_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_lightmaps_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_lightmaps_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_lightmap_begin(
|
|
struct bitmap_data const *lightmap_bitmap)
|
|
{
|
|
_rasterizer_environment_lightmap_begin(lightmap_bitmap);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_lightmap_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_lightmap_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_lightmap_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_lightmap_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_lightmaps_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_lightmaps_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_light_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_diffuse_light_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_lights_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_diffuse_lights_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_lights_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_diffuse_lights_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_light_begin(
|
|
long light_index)
|
|
{
|
|
_rasterizer_environment_diffuse_light_begin(light_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_light_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_diffuse_light_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadows_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_shadows_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_begin(
|
|
long object_index,
|
|
real_matrix4x3 const *shadow_matrix,
|
|
real_point3d const *object_position,
|
|
real object_bounding_radius,
|
|
real_rgb_color const *shadow_color)
|
|
{
|
|
_rasterizer_environment_shadow_begin(object_index, shadow_matrix, object_position, object_bounding_radius, shadow_color);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_model_begin(
|
|
struct rasterizer_model_begin_parameters const *parameters)
|
|
{
|
|
_rasterizer_environment_shadow_model_begin(parameters);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_model_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
void const *geometry,
|
|
real_rgb_color const *change_colors)
|
|
{
|
|
_rasterizer_environment_shadow_model_draw(shader, bitmap_index, geometry, change_colors);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_model_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_shadow_model_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_shadow_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadow_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_shadow_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_shadows_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_shadows_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_textures_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_diffuse_textures_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_textures_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_diffuse_textures_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_diffuse_texture_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_diffuse_texture_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_light_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_light_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lights_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_lights_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lights_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_lights_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_light_begin(
|
|
long light_index)
|
|
{
|
|
_rasterizer_environment_specular_light_begin(light_index);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_light_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_specular_light_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lightmap_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_lightmap_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lightmaps_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_lightmaps_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lightmaps_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_specular_lightmaps_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lightmap_begin(
|
|
struct bitmap_data const *lightmap_bitmap)
|
|
{
|
|
_rasterizer_environment_specular_lightmap_begin(lightmap_bitmap);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_specular_lightmap_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_specular_lightmap_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_lightmap_mask_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflection_lightmap_mask_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_lightmap_masks_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflection_lightmap_masks_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_lightmap_masks_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflection_lightmap_masks_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_mirrors_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflection_mirrors_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_mirror_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_reflection_mirror_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_mirrors_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflection_mirrors_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflections_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflections_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_reflection_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflections_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_reflections_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_transparent_geometry_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_transparent_geometry_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_transparent_geometry_submit(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
struct bitmap_data const *bitmap,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_transparent_geometry_submit(shader, bitmap_index, bitmap, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_transparent_geometry_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_transparent_geometry_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_lightmap_mask_begin(
|
|
struct bitmap_data const *lightmap_bitmap)
|
|
{
|
|
_rasterizer_environment_reflection_lightmap_mask_begin(lightmap_bitmap);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_reflection_lightmap_mask_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_reflection_lightmap_mask_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_screen_geometry_draw(
|
|
long primitive_type,
|
|
long vertex_type,
|
|
long dynamic_vertex_buffer_index,
|
|
long vertex_count)
|
|
{
|
|
_rasterizer_dynamic_screen_geometry_draw(primitive_type, vertex_type, dynamic_vertex_buffer_index, vertex_count);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_screen_geometry_add_multitexture_params_to_base(
|
|
struct rasterizer_dynamic_screen_geometry_parameters *base,
|
|
struct rasterizer_dynamic_screen_geometry_parameters const *multitex_params)
|
|
{
|
|
_rasterizer_dynamic_screen_geometry_add_multitexture_params_to_base(base, multitex_params);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_profile_enable(
|
|
boolean enable)
|
|
{
|
|
_rasterizer_profile_enable(enable);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_screen_flash(
|
|
void)
|
|
{
|
|
_rasterizer_screen_flash();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_screen_begin(
|
|
boolean render_fog)
|
|
{
|
|
_rasterizer_environment_fog_screen_begin(render_fog);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_screen_wind_get_vector(
|
|
short wind_index,
|
|
real animation_time,
|
|
real_vector3d *wind_vector)
|
|
{
|
|
_rasterizer_environment_fog_screen_wind_get_vector(wind_index, animation_time, wind_vector);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_screen_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_fog_screen_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_lit_geometry_draw(
|
|
void const *vertices,
|
|
void const *parameters)
|
|
{
|
|
_rasterizer_dynamic_lit_geometry_draw(vertices, parameters);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dynamic_unlit_geometry_draw(
|
|
struct shader const *shader,
|
|
struct bitmap_data const *bitmap,
|
|
struct render_animation const *animation,
|
|
long dynamic_triangle_buffer_index,
|
|
long dynamic_vertex_buffer_index,
|
|
long vertex_count,
|
|
real_point3d const *centroid,
|
|
unsigned long geometry_flags)
|
|
{
|
|
_rasterizer_dynamic_unlit_geometry_draw(shader, bitmap, animation, dynamic_triangle_buffer_index, dynamic_vertex_buffer_index, vertex_count, centroid, geometry_flags);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_psuedo_dynamic_screen_quad_draw(
|
|
struct rasterizer_dynamic_screen_geometry_parameters *parameters,
|
|
struct dynamic_screen_vertex *vertices)
|
|
{
|
|
_rasterizer_psuedo_dynamic_screen_quad_draw(parameters, vertices);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_widget_submit(
|
|
long object_index,
|
|
long widget_index,
|
|
real_point3d const *centroid,
|
|
rasterizer_widget_render_proc render_proc)
|
|
{
|
|
_rasterizer_widget_submit(
|
|
object_index,
|
|
widget_index,
|
|
centroid,
|
|
render_proc);
|
|
return;
|
|
}
|
|
|
|
void *rasterizer_widget_begin(
|
|
long handle)
|
|
{
|
|
return _rasterizer_widget_begin(handle);
|
|
}
|
|
|
|
void rasterizer_widget_set_texture(
|
|
long handle)
|
|
{
|
|
_rasterizer_widget_set_texture(handle);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_widget_set_tint_factor(
|
|
long handle)
|
|
{
|
|
_rasterizer_widget_set_tint_factor(handle);
|
|
return;
|
|
}
|
|
|
|
long rasterizer_widget_set_zbuffer_enable(
|
|
long handle,
|
|
long enable)
|
|
{
|
|
return _rasterizer_widget_set_zbuffer_enable(handle, enable);
|
|
}
|
|
|
|
short rasterizer_widget_draw_sprite2d(
|
|
long dynamic_vertex_buffer_index)
|
|
{
|
|
return _rasterizer_widget_draw_sprite2d(dynamic_vertex_buffer_index);
|
|
}
|
|
|
|
long rasterizer_widget_draw_sprite3d(
|
|
long zbuffer_result)
|
|
{
|
|
return _rasterizer_widget_draw_sprite3d(zbuffer_result);
|
|
}
|
|
|
|
void rasterizer_widget_submit_occlusion_test(
|
|
long handle)
|
|
{
|
|
_rasterizer_widget_submit_occlusion_test(handle);
|
|
return;
|
|
}
|
|
|
|
long rasterizer_widget_get_occlusion_test_result(
|
|
long handle)
|
|
{
|
|
return _rasterizer_widget_get_occlusion_test_result(handle);
|
|
}
|
|
|
|
void rasterizer_environment_fog_begin(
|
|
void)
|
|
{
|
|
_rasterizer_environment_fog_begin();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_fog_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_draw(
|
|
struct shader const *shader,
|
|
short bitmap_index,
|
|
long dynamic_triangle_buffer_index,
|
|
long first_triangle_index,
|
|
long triangle_count,
|
|
struct vertex_buffer const *vertex_buffer)
|
|
{
|
|
_rasterizer_environment_fog_draw(shader, bitmap_index, dynamic_triangle_buffer_index, first_triangle_index, triangle_count, vertex_buffer);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_environment_fog_screen_end(
|
|
void)
|
|
{
|
|
_rasterizer_environment_fog_screen_end();
|
|
return;
|
|
}
|
|
|
|
void rasterizer_dispose(void)
|
|
{
|
|
_rasterizer_dispose();
|
|
}
|
|
|
|
void rasterizer_frame_end(void)
|
|
{
|
|
_rasterizer_frame_end();
|
|
}
|
|
|
|
void rasterizer_window_begin(
|
|
struct rasterizer_window_begin_parameters const *parameters)
|
|
{
|
|
_rasterizer_window_begin(parameters);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_window_end(
|
|
void)
|
|
{
|
|
_rasterizer_window_end();
|
|
return;
|
|
}
|
|
|
|
boolean rasterizer_windows_begin(void)
|
|
{
|
|
return _rasterizer_windows_begin();
|
|
}
|
|
|
|
void rasterizer_windows_end(void)
|
|
{
|
|
_rasterizer_windows_end();
|
|
}
|
|
|
|
void rasterizer_models_begin(
|
|
boolean skip_obscurer_test)
|
|
{
|
|
struct collision_result collision;
|
|
real_vector3d vector;
|
|
|
|
if (!skip_obscurer_test)
|
|
{
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
740,
|
|
global_current_collision_user_depth < MAXIMUM_COLLISION_USER_STACK_DEPTH);
|
|
global_current_collision_users[global_current_collision_user_depth++] = 21;
|
|
vector.i = global_window_parameters.camera_forward.i * 10000.f;
|
|
vector.j = global_window_parameters.camera_forward.j * 10000.f;
|
|
vector.k = global_window_parameters.camera_forward.k * 10000.f;
|
|
if (collision_test_vector(
|
|
0xFFF80,
|
|
&global_window_parameters.camera_position,
|
|
&vector,
|
|
render.local_player_index,
|
|
&collision))
|
|
{
|
|
rasterizer_model_obscurer_object_index = collision.object_index;
|
|
}
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
756,
|
|
global_current_collision_user_depth > 1);
|
|
--global_current_collision_user_depth;
|
|
}
|
|
else
|
|
{
|
|
rasterizer_model_obscurer_object_index = NONE;
|
|
}
|
|
_rasterizer_models_begin(skip_obscurer_test);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_point(
|
|
real_point3d const *point,
|
|
real radius,
|
|
real_rgb_color const *color)
|
|
{
|
|
real_point3d p0;
|
|
real_point3d p1;
|
|
|
|
radius *= 0.5f;
|
|
set_real_point3d(&p0, point->x - radius, point->y, point->z);
|
|
set_real_point3d(&p1, point->x + radius, point->y, point->z);
|
|
_rasterizer_debug_immediate_line(&p0, &p1, color, color);
|
|
set_real_point3d(&p0, point->x, point->y - radius, point->z);
|
|
set_real_point3d(&p1, point->x, point->y + radius, point->z);
|
|
_rasterizer_debug_immediate_line(&p0, &p1, color, color);
|
|
set_real_point3d(&p0, point->x, point->y, point->z - radius);
|
|
set_real_point3d(&p1, point->x, point->y, point->z + radius);
|
|
_rasterizer_debug_immediate_line(&p0, &p1, color, color);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_immediate_vector(
|
|
real_point3d const *point,
|
|
real_vector3d const *vector,
|
|
real scale,
|
|
real_rgb_color const *color)
|
|
{
|
|
real_point3d endpoint;
|
|
|
|
endpoint.x = point->x + scale * vector->i;
|
|
endpoint.y = point->y + scale * vector->j;
|
|
endpoint.z = point->z + scale * vector->k;
|
|
_rasterizer_debug_immediate_line(point, &endpoint, color, color);
|
|
return;
|
|
}
|
|
|
|
void rasterizer_debug_model_vertices(
|
|
long object_index,
|
|
struct rasterizer_model_skinning const *skinning,
|
|
struct rasterizer_model_geometry_part const *part)
|
|
{
|
|
long debug_vertex_count;
|
|
long closest_debug_vertex_index;
|
|
real closest_debug_vertex_dot;
|
|
short triangle_vertex_index;
|
|
char model_vertex_string[256];
|
|
char triangle_vertex_string[256];
|
|
struct rasterizer_debug_model_vertex debug_vertices[MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTICES];
|
|
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
830,
|
|
part);
|
|
|
|
if (rasterizer_debug_model_vertices_enabled &&
|
|
object_index == rasterizer_model_obscurer_object_index)
|
|
{
|
|
debug_vertex_count = 0;
|
|
closest_debug_vertex_index = NONE;
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
857,
|
|
part->triangle_buffer.type==_triangle_buffer_type_precompiled_strip);
|
|
|
|
for (triangle_vertex_index = 0;
|
|
triangle_vertex_index < part->triangle_buffer.count + 2;
|
|
triangle_vertex_index++)
|
|
{
|
|
word model_vertex_index = ((word const *)part->triangles.address)[triangle_vertex_index];
|
|
struct rasterizer_model_vertex_compressed const *vertex =
|
|
&((struct rasterizer_model_vertex_compressed const *)part->compressed_vertices.address)[model_vertex_index];
|
|
short node_index0;
|
|
short node_index1;
|
|
real node_weight0;
|
|
real node_weight1;
|
|
real_vector3d decompressed_normal;
|
|
real_vector3d *decompressed_normal_result;
|
|
real_vector3d vertex_normal;
|
|
real_point3d point;
|
|
real_vector3d normal;
|
|
|
|
node_index0 = vertex->node_indices[0] / 3;
|
|
node_weight0 = (real)vertex->node_weight * (1.f / 32767.f);
|
|
node_weight1 = 1.f - node_weight0;
|
|
node_index1 = vertex->node_indices[1] / 3;
|
|
{
|
|
real_point3d node_point0 = { 0.f, 0.f, 0.f };
|
|
real_vector3d node_normal0 = { 0.f, 0.f, 0.f };
|
|
real_point3d node_point1 = { 0.f, 0.f, 0.f };
|
|
real_vector3d node_normal1 = { 0.f, 0.f, 0.f };
|
|
long debug_vertex_index;
|
|
|
|
decompressed_normal_result = uncompress_int32_to_real_vector3d(&decompressed_normal, vertex->normal);
|
|
vertex_normal = *decompressed_normal_result;
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
878,
|
|
node_index0<skinning->node_matrix_count);
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
879,
|
|
node_index1<skinning->node_matrix_count);
|
|
match_assert(
|
|
"c:\\halo\\SOURCE\\rasterizer\\rasterizer.c",
|
|
880,
|
|
node_weight0>=0.0f && node_weight0<=1.0f);
|
|
|
|
if (node_index0 >= 0)
|
|
{
|
|
matrix4x3_transform_point(&skinning->node_matrices[node_index0], &vertex->position, &node_point0);
|
|
matrix4x3_transform_vector(&skinning->node_matrices[node_index0], &vertex_normal, &node_normal0);
|
|
}
|
|
if (node_index1 >= 0)
|
|
{
|
|
matrix4x3_transform_point(&skinning->node_matrices[node_index1], &vertex->position, &node_point1);
|
|
matrix4x3_transform_vector(&skinning->node_matrices[node_index1], &vertex_normal, &node_normal1);
|
|
}
|
|
|
|
point.x = node_point0.x * node_weight0 + node_point1.x * node_weight1;
|
|
point.y = node_point0.y * node_weight0 + node_point1.y * node_weight1;
|
|
point.z = node_point0.z * node_weight0 + node_point1.z * node_weight1;
|
|
normal.i = node_normal0.i * node_weight0 + node_normal1.i * node_weight1;
|
|
normal.j = node_normal0.j * node_weight0 + node_normal1.j * node_weight1;
|
|
normal.k = node_normal0.k * node_weight0 + node_normal1.k * node_weight1;
|
|
/* Preserve January VC7 scheduling: this inline self-copy is eliminated,
|
|
* but keeps the x87 result pop ahead of the loop-bound reload. */
|
|
normalize3d(set_real_vector3d(
|
|
&normal,
|
|
normal.i,
|
|
normal.j,
|
|
normal.k));
|
|
|
|
for (debug_vertex_index = 0; debug_vertex_index < debug_vertex_count; debug_vertex_index++)
|
|
{
|
|
struct rasterizer_debug_model_vertex *debug_vertex = &debug_vertices[debug_vertex_index];
|
|
if (point.x == debug_vertex->position.x &&
|
|
point.y == debug_vertex->position.y &&
|
|
point.z == debug_vertex->position.z)
|
|
{
|
|
short reference_index;
|
|
|
|
if (debug_vertex->triangle_vertex_index_count < MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTEX_REFERENCES)
|
|
{
|
|
for (reference_index = 0;
|
|
reference_index < debug_vertex->triangle_vertex_index_count &&
|
|
debug_vertex->triangle_vertex_indices[reference_index] != triangle_vertex_index;
|
|
reference_index++)
|
|
{
|
|
}
|
|
if (reference_index == debug_vertex->triangle_vertex_index_count)
|
|
{
|
|
debug_vertex->triangle_vertex_indices[debug_vertex->triangle_vertex_index_count++] = triangle_vertex_index;
|
|
}
|
|
}
|
|
|
|
if (debug_vertex->model_vertex_index_count < MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTEX_REFERENCES)
|
|
{
|
|
for (reference_index = 0;
|
|
reference_index < debug_vertex->model_vertex_index_count &&
|
|
debug_vertex->model_vertex_indices[reference_index] != model_vertex_index;
|
|
reference_index++)
|
|
{
|
|
}
|
|
if (reference_index == debug_vertex->model_vertex_index_count)
|
|
{
|
|
debug_vertex->model_vertex_indices[debug_vertex->model_vertex_index_count++] = model_vertex_index;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (debug_vertex_index == debug_vertex_count &&
|
|
debug_vertex_count < MAXIMUM_RASTERIZER_DEBUG_MODEL_VERTICES)
|
|
{
|
|
struct rasterizer_debug_model_vertex *debug_vertex = &debug_vertices[debug_vertex_count];
|
|
real_vector3d camera_to_vertex;
|
|
real camera_dot;
|
|
|
|
debug_vertex->position = point;
|
|
debug_vertex->triangle_vertex_indices[0] = triangle_vertex_index;
|
|
debug_vertex->model_vertex_indices[0] = model_vertex_index;
|
|
debug_vertex->triangle_vertex_index_count = 1;
|
|
debug_vertex->model_vertex_index_count = 1;
|
|
|
|
vector_from_points3d(
|
|
&global_window_parameters.camera_position,
|
|
&point,
|
|
&camera_to_vertex);
|
|
normalize3d(&camera_to_vertex);
|
|
camera_dot = dot_product3d(
|
|
&camera_to_vertex,
|
|
&global_window_parameters.camera_forward);
|
|
if ((dot_product3d(&camera_to_vertex, &normal) < 0.f &&
|
|
closest_debug_vertex_dot < camera_dot) ||
|
|
closest_debug_vertex_dot == -1.f)
|
|
{
|
|
closest_debug_vertex_index = debug_vertex_index;
|
|
closest_debug_vertex_dot = camera_dot;
|
|
}
|
|
debug_vertex_count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
long debug_vertex_index;
|
|
for (debug_vertex_index = 0; debug_vertex_index < debug_vertex_count; debug_vertex_index++)
|
|
{
|
|
struct rasterizer_debug_model_vertex *debug_vertex = &debug_vertices[debug_vertex_index];
|
|
if (debug_vertex_index == closest_debug_vertex_index)
|
|
{
|
|
short reference_index;
|
|
|
|
csstrcpy(temporary, "I=");
|
|
for (reference_index = 0; reference_index < debug_vertex->triangle_vertex_index_count; reference_index++)
|
|
{
|
|
sprintf(
|
|
triangle_vertex_string,
|
|
"%d%c",
|
|
debug_vertex->triangle_vertex_indices[reference_index],
|
|
reference_index == debug_vertex->triangle_vertex_index_count - 1 ? ' ' : ',');
|
|
csstrcat(temporary, triangle_vertex_string);
|
|
}
|
|
csstrcat(temporary, "\nV=");
|
|
for (reference_index = 0; reference_index < debug_vertex->model_vertex_index_count; reference_index++)
|
|
{
|
|
sprintf(
|
|
model_vertex_string,
|
|
"%d%c",
|
|
debug_vertex->model_vertex_indices[reference_index],
|
|
reference_index == debug_vertex->model_vertex_index_count - 1 ? ' ' : ',');
|
|
csstrcat(temporary, model_vertex_string);
|
|
}
|
|
render_debug_point(FALSE, &debug_vertex->position, 0.03125f, global_real_argb_red);
|
|
render_debug_string_at_point(FALSE, &debug_vertex->position, temporary, global_real_argb_yellow);
|
|
}
|
|
else
|
|
{
|
|
render_debug_point(FALSE, &debug_vertex->position, 0.03125f, global_real_argb_white);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
/* ---------- private code */
|