64 float near_height = tanf(fov * 0.5
f) * z_near;
65 float near_width = near_height * aspect;
67 float far_height = tanf(fov * 0.5f) * z_far;
68 float far_width = far_height * aspect;
72 vec3d forward_scale_near = orient->
vec.fvec;
73 vec3d forward_scale_far = orient->
vec.fvec;
85 up_scale = orient->
vec.uvec;
88 right_scale = orient->
vec.rvec;
91 vm_vec_add(&near_top_left, &up_scale, &right_scale);
95 up_scale = orient->
vec.uvec;
98 right_scale = orient->
vec.rvec;
101 vm_vec_add(&near_top_right, &up_scale, &right_scale);
105 up_scale = orient->
vec.uvec;
108 right_scale = orient->
vec.rvec;
111 vm_vec_add(&near_bottom_left, &up_scale, &right_scale);
112 vm_vec_add2(&near_bottom_left, &forward_scale_near);
115 up_scale = orient->
vec.uvec;
118 right_scale = orient->
vec.rvec;
121 vm_vec_add(&near_bottom_right, &up_scale, &right_scale);
122 vm_vec_add2(&near_bottom_right, &forward_scale_near);
130 up_scale = orient->
vec.uvec;
133 right_scale = orient->
vec.rvec;
136 vm_vec_add(&far_top_left, &up_scale, &right_scale);
140 up_scale = orient->
vec.uvec;
143 right_scale = orient->
vec.rvec;
146 vm_vec_add(&far_top_right, &up_scale, &right_scale);
150 up_scale = orient->
vec.uvec;
153 right_scale = orient->
vec.rvec;
156 vm_vec_add(&far_bottom_left, &up_scale, &right_scale);
160 up_scale = orient->
vec.uvec;
163 right_scale = orient->
vec.rvec;
166 vm_vec_add(&far_bottom_right, &up_scale, &right_scale);
167 vm_vec_add2(&far_bottom_right, &forward_scale_far);
193 float near_height = tanf(fov * 0.5
f) * z_near;
194 float near_width = near_height * aspect;
196 float far_height = tanf(fov * 0.5f) * z_far;
197 float far_width = far_height * aspect;
201 vec3d forward_scale_near = orient->
vec.fvec;
202 vec3d forward_scale_far = orient->
vec.fvec;
214 up_scale = orient->
vec.uvec;
217 right_scale = orient->
vec.rvec;
220 vm_vec_add(&near_top_left, &up_scale, &right_scale);
224 up_scale = orient->
vec.uvec;
227 right_scale = orient->
vec.rvec;
230 vm_vec_add(&near_top_right, &up_scale, &right_scale);
234 up_scale = orient->
vec.uvec;
237 right_scale = orient->
vec.rvec;
240 vm_vec_add(&near_bottom_left, &up_scale, &right_scale);
241 vm_vec_add2(&near_bottom_left, &forward_scale_near);
244 up_scale = orient->
vec.uvec;
247 right_scale = orient->
vec.rvec;
250 vm_vec_add(&near_bottom_right, &up_scale, &right_scale);
251 vm_vec_add2(&near_bottom_right, &forward_scale_near);
259 up_scale = orient->
vec.uvec;
262 right_scale = orient->
vec.rvec;
265 vm_vec_add(&far_top_left, &up_scale, &right_scale);
269 up_scale = orient->
vec.uvec;
272 right_scale = orient->
vec.rvec;
275 vm_vec_add(&far_top_right, &up_scale, &right_scale);
279 up_scale = orient->
vec.uvec;
282 right_scale = orient->
vec.rvec;
285 vm_vec_add(&far_bottom_left, &up_scale, &right_scale);
289 up_scale = orient->
vec.uvec;
292 right_scale = orient->
vec.rvec;
295 vm_vec_add(&far_bottom_right, &up_scale, &right_scale);
296 vm_vec_add2(&far_bottom_right, &forward_scale_far);
298 vec3d frustum_pts[8];
301 vm_vec_rotate(&frustum_pts[0], &near_bottom_left, light_matrix);
302 vm_vec_rotate(&frustum_pts[1], &near_bottom_right, light_matrix);
303 vm_vec_rotate(&frustum_pts[2], &near_top_right, light_matrix);
304 vm_vec_rotate(&frustum_pts[3], &near_top_left, light_matrix);
306 vm_vec_rotate(&frustum_pts[5], &far_top_right, light_matrix);
307 vm_vec_rotate(&frustum_pts[6], &far_bottom_right, light_matrix);
308 vm_vec_rotate(&frustum_pts[7], &far_bottom_left, light_matrix);
313 min = frustum_pts[0];
314 max = frustum_pts[0];
317 for (
int i = 0;
i < 8; ++
i) {
318 if ( frustum_pts[
i].xyz.
x < min.
xyz.x ) {
319 min.
xyz.x = frustum_pts[
i].
xyz.x;
322 if ( frustum_pts[
i].xyz.
x > max.
xyz.x ) {
323 max.
xyz.x = frustum_pts[
i].
xyz.x;
326 if ( frustum_pts[
i].xyz.
y < min.
xyz.y ) {
327 min.
xyz.y = frustum_pts[
i].
xyz.y;
330 if ( frustum_pts[
i].xyz.
y > max.
xyz.y ) {
331 max.
xyz.y = frustum_pts[
i].
xyz.y;
334 if ( frustum_pts[
i].xyz.
z < min.
xyz.z ) {
335 min.
xyz.z = frustum_pts[
i].
xyz.z;
338 if ( frustum_pts[
i].xyz.
z > max.
xyz.z ) {
339 max.
xyz.z = frustum_pts[
i].
xyz.z;
343 shadow_data->
min = min;
344 shadow_data->
max = max;
368 shadows_construct_light_frustum(&Shadow_frustums[2], &light_matrix, eye_orient, eye_pos, fov, aspect, neardist - (neardist - veryneardist) * 0.2f, middist);
376 Shadow_proj_matrix[0] = Shadow_frustums[0].
proj_matrix;
377 Shadow_proj_matrix[1] = Shadow_frustums[1].
proj_matrix;
378 Shadow_proj_matrix[2] = Shadow_frustums[2].
proj_matrix;
379 Shadow_proj_matrix[3] = Shadow_frustums[3].
proj_matrix;
#define MAX_SHADOW_CASCADES
matrix4 Shadow_view_matrix
#define gr_end_view_matrix
asteroid Asteroids[MAX_ASTEROIDS]
bool shadows_obj_in_frustum(object *objp, matrix *light_orient, vec3d *min, vec3d *max)
void set_flags(uint flags)
struct vec3d::@225::@227 xyz
light_frustum_info Shadow_frustums[MAX_SHADOW_CASCADES]
vec3d * vm_vec_rotate(vec3d *dest, const vec3d *src, const matrix *m)
void shadows_debug_show_frustum(matrix *orient, vec3d *pos, float fov, float aspect, float z_near, float z_far)
opengl_texture_state Texture
#define gr_end_proj_matrix
void shadows_end_render()
SCP_vector< light * > Static_light
void gr_set_color(int r, int g, int b)
#define gr_set_view_matrix
void model_render_queue(model_render_params *interp, draw_list *scene, int model_num, matrix *orient, vec3d *pos)
matrix shadows_start_render(matrix *eye_orient, vec3d *eye_pos, float fov, float aspect, float veryneardist, float neardist, float middist, float fardist)
matrix * vm_vector_2_matrix(matrix *m, const vec3d *fvec, const vec3d *uvec, const vec3d *rvec)
void vm_vec_add2(vec3d *dest, const vec3d *src)
#define gr_set_proj_matrix
struct matrix::@228::@230 vec
void vm_vec_scale(vec3d *dest, float s)
void model_clear_instance(int model_num)
void submodel_render_queue(model_render_params *render_info, draw_list *scene, int model_num, int submodel_num, matrix *orient, vec3d *pos)
void shadows_render_all(float fov, matrix *eye_orient, vec3d *eye_pos)
void init_render(bool sort=true)
float Shadow_cascade_distances[MAX_SHADOW_CASCADES]
debris Debris[MAX_DEBRIS_PIECES]
int Cmdline_shadow_quality
object Objects[MAX_OBJECTS]
matrix4 Shadow_proj_matrix[MAX_SHADOW_CASCADES]
#define gr_shadow_map_start
void shadows_construct_light_frustum(light_frustum_info *shadow_data, matrix *light_matrix, matrix *orient, vec3d *pos, float fov, float aspect, float z_near, float z_far)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
void shadows_construct_light_proj(light_frustum_info *shadow_data)
float vm_vec_copy_normalize(vec3d *dest, const vec3d *src)
void render_all(int depth_mode=-1)
#define gr_shadow_map_end
void set_object_number(int num)
void obj_queue_render(object *obj, draw_list *scene)
SCP_vector< asteroid_info > Asteroid_info
void vm_vec_add(vec3d *dest, const vec3d *src0, const vec3d *src1)
matrix vmd_identity_matrix
void g3_draw_htl_line(const vec3d *start, const vec3d *end)