@@ -59,6 +59,8 @@ particle::ParticleEffectHandle Debris_hit_particle;
5959
6060#define DEBRIS_INDEX (dp ) (int )(dp-Debris.data())
6161
62+ // Find the first available arc slot.
63+ debris_electrical_arc *debris_find_electrical_arc_slot (debris *db);
6264
6365/* *
6466 * Start the sequence of a piece of debris writhing in unholy agony!!!
@@ -286,36 +288,36 @@ void debris_process_post(object * obj, float frame_time)
286288
287289 // Create the spark effects
288290 for (int i=0 ; i<MAX_DEBRIS_ARCS; ++i) {
289- if ( !db->arc_timestamp [i].isValid () ) {
291+ auto arc = &db->electrical_arcs [i];
292+ if ( !arc->timestamp .isValid () ) {
290293
291- db-> arc_timestamp [i] = _timestamp (lifetime); // live up to a second
294+ arc-> timestamp = _timestamp (lifetime); // live up to a second
292295
293296 switch ( n ) {
294297 case 0 :
295- db-> arc_pts [i][ 0 ] = v1;
296- db-> arc_pts [i][ 1 ] = v2;
298+ arc-> endpoint_1 = v1;
299+ arc-> endpoint_2 = v2;
297300 break ;
298301 case 1 :
299- db-> arc_pts [i][ 0 ] = v2;
300- db-> arc_pts [i][ 1 ] = v3;
302+ arc-> endpoint_1 = v2;
303+ arc-> endpoint_2 = v3;
301304 break ;
302305
303306 case 2 :
304- db-> arc_pts [i][ 0 ] = v2;
305- db-> arc_pts [i][ 1 ] = v4;
307+ arc-> endpoint_1 = v2;
308+ arc-> endpoint_2 = v4;
306309 break ;
307310
308311 default :
309312 Int3 ();
310313 }
311-
314+
312315 n++;
313316 if ( n == n_arcs )
314317 break ; // Don't need to create anymore
315318 }
316319 }
317320
318-
319321 // rotate v2 out of local coordinates into world.
320322 // Use v2 since it is used in every bolt. See above switch().
321323 vec3d snd_pos;
@@ -342,16 +344,20 @@ void debris_process_post(object * obj, float frame_time)
342344 }
343345 }
344346
345- for (int i= 0 ; i<MAX_DEBRIS_ARCS; ++i) {
346- if ( db-> arc_timestamp [i]. isValid () ) {
347- if ( timestamp_elapsed ( db-> arc_timestamp [i] ) ) {
347+ for (auto &arc: db-> electrical_arcs ) {
348+ if (arc. timestamp . isValid ()) {
349+ if (timestamp_elapsed (arc. timestamp )) {
348350 // Kill off the spark
349- db-> arc_timestamp [i] = TIMESTAMP::invalid ();
351+ arc. timestamp = TIMESTAMP::invalid ();
350352 } else {
351353 // Maybe move a vertex.... 20% of the time maybe?
352354 int mr = Random::next ();
353355 if ( mr < Random::MAX_VALUE/5 ) {
354- db->arc_pts [i][mr % 2 ] = submodel_get_random_point (db->model_num , db->submodel_num );
356+ auto pt = submodel_get_random_point (db->model_num , db->submodel_num );
357+ if (mr % 2 == 0 )
358+ arc.endpoint_1 = pt;
359+ else
360+ arc.endpoint_2 = pt;
355361 }
356362 }
357363 }
@@ -602,7 +608,7 @@ object *debris_create_only(int parent_objnum, int parent_ship_class, int alt_typ
602608 db->damage_mult = 1 .0f ;
603609
604610 for (int i=0 ; i<MAX_DEBRIS_ARCS; ++i) { // NOLINT
605- db->arc_timestamp [i] = TIMESTAMP::invalid ();
611+ db->electrical_arcs [i]. timestamp = TIMESTAMP::invalid ();
606612 }
607613
608614 if ( db->is_hull ) {
@@ -1168,7 +1174,7 @@ void calc_debris_physics_properties( physics_info *pi, vec3d *mins, vec3d *maxs,
11681174*/
11691175void debris_render (object * obj, model_draw_list *scene)
11701176{
1171- int i, num, swapped;
1177+ int num, swapped;
11721178 debris *db;
11731179
11741180 swapped = -1 ;
@@ -1203,9 +1209,9 @@ void debris_render(object * obj, model_draw_list *scene)
12031209
12041210 // Only render electrical arcs if within 500m of the eye (for a 10m piece)
12051211 if ( vm_vec_dist_quick ( &obj->pos , &Eye_position ) < obj->radius *50 .0f ) {
1206- for (i= 0 ; i<MAX_DEBRIS_ARCS; i++ ) {
1207- if ( db-> arc_timestamp [i] .isValid () ) {
1208- model_instance_add_arc ( pm, pmi, db->submodel_num , &db-> arc_pts [i][ 0 ] , &db-> arc_pts [i][ 1 ] , MARC_TYPE_DAMAGED );
1212+ for (auto &arc: db-> electrical_arcs ) {
1213+ if ( arc. timestamp .isValid () ) {
1214+ model_instance_add_arc ( pm, pmi, db->submodel_num , &arc. endpoint_1 , &arc. endpoint_2 , MARC_TYPE_DAMAGED );
12091215 }
12101216 }
12111217 }
@@ -1256,3 +1262,19 @@ void create_generic_debris(object* ship_objp, const vec3d* pos, float min_num_de
12561262 debris_create (ship_objp, model_num, -1 , &create_pos, pos, 0 , speed_mult);
12571263 }
12581264}
1265+
1266+ debris_electrical_arc *debris_find_electrical_arc_slot (debris *db)
1267+ {
1268+ size_t i = 0 ;
1269+ for (auto & ii : db->electrical_arcs )
1270+ {
1271+ if (!ii.timestamp .isValid ())
1272+ break ;
1273+ i++;
1274+ }
1275+
1276+ if (i == MAX_DEBRIS_ARCS)
1277+ return nullptr ;
1278+
1279+ return &db->electrical_arcs [i];
1280+ }
0 commit comments