1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405
|
/*
* Copyright (C) Freespace Open 2013. All rights reserved.
*
* All source code herein is the property of Freespace Open. You may not sell
* or otherwise commercially exploit the source or things you created based on the
* source.
*
*/
#ifndef _MODELRENDER_H
#define _MODELRENDER_H
#include "graphics/gropengltnl.h"
#include "lighting/lighting.h"
#include "math/vecmat.h"
#include "model/model.h"
extern light Lights[MAX_LIGHTS];
extern int Num_lights;
extern bool Rendering_to_shadow_map;
extern matrix Object_matrix;
extern vec3d Object_position;
extern team_color* Current_team_color;
inline int in_box(vec3d *min, vec3d *max, vec3d *pos, vec3d *view_pos)
{
vec3d point;
vm_vec_sub(&point, view_pos, pos);
if ( (point.xyz.x >= min->xyz.x) && (point.xyz.x <= max->xyz.x)
&& (point.xyz.y >= min->xyz.y) && (point.xyz.y <= max->xyz.y)
&& (point.xyz.z >= min->xyz.z) && (point.xyz.z <= max->xyz.z) )
{
return 1;
}
return -1;
}
inline int in_sphere(vec3d *pos, float radius, vec3d *view_pos)
{
if ( vm_vec_dist(view_pos, pos) <= radius )
return 1;
else
return -1;
}
extern int model_interp_get_texture(texture_info *tinfo, fix base_frametime);
struct transform
{
matrix basis;
vec3d origin;
transform(): basis(vmd_identity_matrix), origin(vmd_zero_vector) {}
transform(matrix *m, vec3d *v): basis(*m), origin(*v) {}
};
class model_render_params
{
uint Model_flags;
uint Debug_flags;
int Objnum;
int Detail_level_locked;
float Depth_scale;
int Warp_bitmap;
float Warp_alpha;
vec3d Warp_scale;
color Color;
float Xparent_alpha;
int Forced_bitmap;
int Insignia_bitmap;
int *Replacement_textures;
bool Team_color_set;
team_color Current_team_color;
bool Clip_plane_set;
vec3d Clip_normal;
vec3d Clip_pos;
int Animated_effect;
float Animated_timer;
mst_info Thruster_info;
public:
model_render_params();
void set_flags(uint flags);
void set_debug_flags(uint flags);
void set_object_number(int num);
void set_detail_level_lock(int detail_level_lock);
void set_depth_scale(float scale);
void set_warp_params(int bitmap, float alpha, vec3d &scale);
void set_color(color &clr);
void set_color(int r, int g, int b);
void set_alpha(float alpha);
void set_forced_bitmap(int bitmap);
void set_insignia_bitmap(int bitmap);
void set_replacement_textures(int *textures);
void set_team_color(team_color &clr);
void set_team_color(const SCP_string &team, const SCP_string &secondaryteam, fix timestamp, int fadetime);
void set_clip_plane(vec3d &pos, vec3d &normal);
void set_animated_effect(int effect_num, float timer);
void set_thruster_info(mst_info &info);
bool is_clip_plane_set();
bool is_team_color_set();
uint get_model_flags();
uint get_debug_flags();
int get_object_number();
int get_detail_level_lock();
float get_depth_scale();
int get_warp_bitmap();
float get_warp_alpha();
const vec3d& get_warp_scale();
const color& get_color();
float get_alpha();
int get_forced_bitmap();
int get_insignia_bitmap();
const int* get_replacement_textures();
const team_color& get_team_color();
const vec3d& get_clip_plane_pos();
const vec3d& get_clip_plane_normal();
int get_animated_effect_num();
float get_animated_effect_timer();
const mst_info& get_thruster_info();
};
struct clip_plane_state
{
vec3d normal;
vec3d point;
};
struct arc_effect
{
transform transformation;
vec3d v1;
vec3d v2;
color primary;
color secondary;
float width;
};
struct insignia_draw_data
{
transform transformation;
polymodel *pm;
int detail_level;
int bitmap_num;
// if there's a clip plane
int clip_plane;
};
struct render_state
{
int clip_plane_handle;
int texture_addressing;
int fill_mode;
int cull_mode;
int center_alpha;
int zbias;
int buffer_id;
float animated_timer;
int animated_effect;
bool lighting;
light_indexing_info lights;
float light_factor;
float thrust_scale;
bool using_team_color;
team_color tm_color;
color clr;
// fog state maybe shouldn't belong here. if we have fog, then it's probably occurring for all objects in scene.
int fog_mode;
int r;
int g;
int b;
float fog_near;
float fog_far;
render_state()
{
clip_plane_handle = -1;
texture_addressing = TMAP_ADDRESS_WRAP;
fill_mode = GR_FILL_MODE_SOLID;
buffer_id = -1;
lighting = false;
fog_mode = GR_FOGMODE_NONE;
r = 0;
g = 0;
b = 0;
fog_near = -1.0f;
fog_far = -1.0f;
lights.index_start = 0;
lights.num_lights = 0;
light_factor = 1.0f;
animated_timer = 0.0f;
animated_effect = 0;
thrust_scale = -1.0f;
gr_init_color(&clr, 255, 255, 255);
}
};
struct queued_buffer_draw
{
int render_state_handle;
int texture_maps[TM_NUM_TYPES];
int transform_buffer_offset;
color clr;
int blend_filter;
float alpha;
int depth_mode;
transform transformation;
vec3d scale;
vertex_buffer *buffer;
int texi;
int flags;
int sdr_flags;
float thrust_scale;
queued_buffer_draw()
{
depth_mode = GR_ZBUFF_FULL;
texture_maps[TM_BASE_TYPE] = -1;
texture_maps[TM_GLOW_TYPE] = -1;
texture_maps[TM_HEIGHT_TYPE] = -1;
texture_maps[TM_MISC_TYPE] = -1;
texture_maps[TM_NORMAL_TYPE] = -1;
texture_maps[TM_SPECULAR_TYPE] = -1;
}
};
struct outline_draw
{
vertex* vert_array;
int n_verts;
transform transformation;
color clr;
};
class model_batch_buffer
{
SCP_vector<matrix4> Submodel_matrices;
void* Mem_alloc;
uint Mem_alloc_size;
int Current_offset;
void allocate_memory();
public:
model_batch_buffer() : Mem_alloc(NULL), Mem_alloc_size(0), Current_offset(0) {};
void reset();
int get_buffer_offset();
void set_num_models(int n_models);
void set_model_transform(matrix4 &transform, int model_id);
void submit_buffer_data();
void add_matrix(matrix4 &mat);
};
class draw_list
{
transform Current_transform;
vec3d Current_scale;
SCP_vector<transform> Transform_stack;
render_state Current_render_state;
bool Dirty_render_state;
scene_lights Scene_light_handler;
int Current_textures[TM_NUM_TYPES];
int Current_blend_filter;
float Current_alpha;
int Current_depth_mode;
int Current_set_clip_plane;
light_indexing_info Current_lights_set;
void render_arc(arc_effect &arc);
void render_insignia(insignia_draw_data &insignia_info);
void render_outline(outline_draw &outline_info);
void render_buffer(queued_buffer_draw &render_elements);
uint determine_shader_flags(render_state *state, queued_buffer_draw *draw_info, vertex_buffer *buffer, int tmap_flags);
SCP_vector<clip_plane_state> Clip_planes;
SCP_vector<render_state> Render_states;
SCP_vector<queued_buffer_draw> Render_elements;
SCP_vector<int> Render_keys;
SCP_vector<arc_effect> Arcs;
SCP_vector<insignia_draw_data> Insignias;
SCP_vector<outline_draw> Outlines;
static draw_list *Target;
static bool sort_draw_pair(const int a, const int b);
void sort_draws();
public:
draw_list();
void init();
void reset_state();
void set_clip_plane(const vec3d &position, const vec3d &normal);
void set_clip_plane();
void set_thrust_scale(float scale = -1.0f);
void set_texture(int texture_type, int texture_handle);
void set_depth_mode(int depth_set);
void set_blend_filter(int filter, float alpha);
void set_texture_addressing(int addressing);
void set_fog(int fog_mode, int r, int g, int b, float fog_near = -1.0f, float fog_far = -1.0f);
void set_fill_mode(int mode);
void set_cull_mode(int mode);
void set_zbias(int bias);
void set_center_alpha(int center_alpha);
void set_lighting(bool mode);
void set_buffer(int buffer);
void set_team_color(const team_color &clr);
void set_team_color();
void set_color(const color &clr);
void set_animated_timer(float time);
void set_animated_effect(int effect);
void add_submodel_to_batch(int model_num);
void start_model_batch(int n_models);
void add_buffer_draw(vertex_buffer *buffer, int texi, uint tmap_flags, model_render_params *interp);
vec3d get_view_position();
void clear_transforms();
void push_transform(vec3d* pos, matrix* orient);
void pop_transform();
void set_scale(vec3d *scale = NULL);
void add_arc(vec3d *v1, vec3d *v2, color *primary, color *secondary, float arc_width);
void render_arcs();
void add_insignia(polymodel *pm, int detail_level, int bitmap_num);
void render_insignias();
void add_outline(vertex* vert_array, int n_verts, color *clr);
void render_outlines();
void set_light_filter(int objnum, vec3d *pos, float rad);
void set_light_factor(float factor);
void init_render(bool sort = true);
void render_all(int depth_mode = -1);
void reset();
};
class DrawListSorter
{
static draw_list *Target;
public:
static void sort(draw_list *target);
static int sortDrawPair(const void* a, const void* b);
};
void model_render_immediate(model_render_params *render_info, int model_num, matrix *orient, vec3d * pos, int render = MODEL_RENDER_ALL, bool sort = true);
void model_render_queue(model_render_params *render_info, draw_list* scene, int model_num, matrix *orient, vec3d *pos);
void submodel_render_immediate(model_render_params *render_info, int model_num, int submodel_num, matrix *orient, vec3d * pos);
void submodel_render_queue(model_render_params *render_info, draw_list *scene, int model_num, int submodel_num, matrix *orient, vec3d * pos);
void model_render_buffers(draw_list* scene, model_render_params* interp, vertex_buffer *buffer, polymodel *pm, int mn, int detail_level, uint tmap_flags);
void model_render_set_thrust(model_render_params *interp, int model_num, mst_info *mst);
void model_render_set_clip_plane(model_render_params *interp, vec3d *pos = NULL, vec3d *normal = NULL);
fix model_render_determine_base_frametime(int objnum, uint flags);
bool model_render_check_detail_box(vec3d *view_pos, polymodel *pm, int submodel_num, uint flags);
#endif
|