39 for(
trail *trailp = Trails.
next; trailp != &Trails; trailp = nextp)
120 static vertex *Trail_v_list = NULL;
121 static int Trail_verts_allocated = 0;
123 static void deallocate_trail_verts()
125 if (Trail_v_list != NULL) {
131 static void allocate_trail_verts(
int num_verts)
136 if (num_verts <= Trail_verts_allocated)
139 if (Trail_v_list != NULL) {
146 memset( Trail_v_list, 0,
sizeof(
vertex) * Trail_verts_allocated );
148 Trail_verts_allocated = num_verts;
151 static bool will_free_at_exit =
false;
153 if ( !will_free_at_exit ) {
154 atexit(deallocate_trail_verts);
155 will_free_at_exit =
true;
162 int num_sections = 0;
164 vec3d topv, botv, *fvec, last_pos, tmp_fvec;
182 int n = trailp->
tail;
190 if (trailp->
val[n] > 1.0f)
193 sections[num_sections++] =
n;
194 }
while (n != trailp->
head);
196 if (num_sections <= 0)
201 memset(&top, 0,
sizeof(
vertex));
202 memset(&bot, 0,
sizeof(
vertex));
203 memset(&top_prev, 0,
sizeof(
vertex));
204 memset(&bot_prev, 0,
sizeof(
vertex));
210 for (i = 0; i < num_sections; i++) {
212 float init_fade_out = 1.0f;
214 if ((num_faded_sections > 0) && (i < num_faded_sections)) {
215 init_fade_out = ((
float)i) / (
float)num_faded_sections;
219 if (init_fade_out != 1.0
f) {
220 l = (
ubyte)
fl2i((trailp->
val[n] * a_size + ti->
a_start) * 255.0f * init_fade_out * init_fade_out);
227 if (num_sections > 1) {
256 top.
r = top.
g = top.
b = l;
257 bot.
r = bot.
g = bot.
b = l;
269 if (i == num_sections - 1) {
282 center_vert.
a = center_vert.
r = center_vert.
g = center_vert.
b = l;
288 tri[0] = center_vert;
313 last_pos = trailp->
pos[
n];
322 int num_sections = 0;
324 vec3d topv, botv, *fvec, last_pos, tmp_fvec;
343 int n = trailp->
tail;
351 if (trailp->
val[n] > 1.0f)
354 sections[num_sections++] =
n;
355 }
while ( n != trailp->
head );
357 if (num_sections <= 0)
362 memset( &top, 0,
sizeof(
vertex) );
363 memset( &bot, 0,
sizeof(
vertex) );
366 allocate_trail_verts((num_sections * 2) + 1);
372 for (i = 0; i < num_sections; i++) {
374 float init_fade_out = 1.0f;
376 if ((num_faded_sections > 0) && (i < num_faded_sections)) {
377 init_fade_out = ((
float) i) / (
float) num_faded_sections;
381 if (init_fade_out != 1.0
f) {
382 l = (
ubyte)
fl2i((trailp->
val[n] * a_size + ti->
a_start) * 255.0f * init_fade_out * init_fade_out);
388 if ( num_sections > 1 ) {
419 if (i == num_sections-1) {
428 Trail_v_list[nv].
a = l;
432 Trail_v_list[nv].
r = Trail_v_list[nv].
g = Trail_v_list[nv].
b = l;
437 Trail_v_list[nv].
r = Trail_v_list[nv].
g = Trail_v_list[nv].
b = l;
442 Trail_v_list[nv].
r = Trail_v_list[nv].
g = Trail_v_list[nv].
b = 0;
447 Trail_v_list[nv].
r = Trail_v_list[nv].
g = Trail_v_list[nv].
b = l;
452 Trail_v_list[nv].
r = Trail_v_list[nv].
g = Trail_v_list[nv].
b = l;
457 last_pos = trailp->
pos[
n];
458 Trail_v_list[nv] =
top;
459 Trail_v_list[nv+1] = bot;
482 int next = trailp->
tail;
487 if ( trailp->
head == trailp->
tail ) {
495 trailp->
val[next] = 0.0f;
500 int next = trailp->
tail-1;
510 int num_alive_segments,
n;
515 for (
trail *trailp = Trails.
next; trailp != &Trails; trailp = next_trail) {
516 next_trail = trailp->
next;
518 num_alive_segments = 0;
520 if ( trailp->tail != trailp->head ) {
522 time_delta = frametime / trailp->info.max_life;
527 trailp->val[
n] += time_delta;
529 if ( trailp->val[n] <= 1.0f ) {
530 num_alive_segments++;
533 }
while ( n != trailp->head );
536 if ( (num_alive_segments < 1) && trailp->object_died)
562 for(
trail *trailp = Trails.
next; trailp!=&Trails; trailp = trailp->
next )
int timestamp(int delta_ms)
int batch_add_quad(int texture, int tmap_flags, vertex *verts, float alpha)
void vm_vec_scale_add(vec3d *dest, const vec3d *src1, const vec3d *src2, float k)
int trail_stamp_elapsed(trail *trailp)
ubyte g3_transfer_vertex(vertex *dest, const vec3d *src)
void _cdecl void void _cdecl void _cdecl Warning(char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
struct vec3d::@225::@227 xyz
void trail_object_died(trail *trailp)
#define TMAP_HTL_3D_UNLIT
#define Assertion(expr, msg,...)
void profile_begin(const char *name)
void gr_set_bitmap(int bitmap_num, int alphablend_mode, int bitblt_mode, float alpha)
#define GR_ALPHABLEND_FILTER
#define NUM_TRAIL_SECTIONS
#define TMAP_FLAG_GOURAUD
ubyte g3_rotate_vertex(vertex *dest, const vec3d *src)
float vm_vec_normalize_safe(vec3d *v)
trail * trail_ptr[MAX_SHIP_CONTRAILS]
void trail_add_segment(trail *trailp, vec3d *pos)
vec3d pos[NUM_TRAIL_SECTIONS]
void trail_add_batch(trail *trailp)
void _cdecl void void _cdecl Error(const char *filename, int line, SCP_FORMAT_STRING const char *format,...) SCP_FORMAT_STRING_ARGS(3
#define GM_STANDALONE_SERVER
int trail_is_on_ship(trail *trailp, ship *shipp)
trail * trail_create(trail_info *info)
void vm_vec_sub(vec3d *dest, const vec3d *src0, const vec3d *src1)
void trail_render(trail *trailp)
void trail_move_all(float frametime)
void profile_end(const char *name)
typedef float(SCP_EXT_CALLCONV *SCPTRACKIR_PFFLOATVOID)()
float val[NUM_TRAIL_SECTIONS]
GLubyte GLubyte GLubyte GLubyte w
void trail_set_stamp(trail *trailp)
vec3d * vm_vec_avg(vec3d *dest, const vec3d *src0, const vec3d *src1)
#define TMAP_FLAG_TEXTURED
#define timestamp_elapsed(stamp)
int batch_add_tri(int texture, int tmap_flags, vertex *verts, float alpha)
void trail_calc_facing_pts(vec3d *top, vec3d *bot, vec3d *fvec, vec3d *pos, float w)
void trail_set_segment(trail *trailp, vec3d *pos)
#define TMAP_FLAG_TRISTRIP
#define MAX_SHIP_CONTRAILS
#define GR_BITBLT_MODE_NORMAL
#define gr_create_stream_buffer
char filename[MAX_FILENAME_LEN]
vec3d * vm_vec_cross(vec3d *dest, const vec3d *src0, const vec3d *src1)
GLdouble GLdouble GLdouble GLdouble top
float vm_vec_normalize(vec3d *v)