@@ -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 ) {
@@ -1162,7 +1168,7 @@ void calc_debris_physics_properties( physics_info *pi, vec3d *mins, vec3d *maxs,
11621168*/
11631169void debris_render (object * obj, model_draw_list *scene)
11641170{
1165- int i, num, swapped;
1171+ int num, swapped;
11661172 debris *db;
11671173
11681174 swapped = -1 ;
@@ -1197,9 +1203,9 @@ void debris_render(object * obj, model_draw_list *scene)
11971203
11981204 // Only render electrical arcs if within 500m of the eye (for a 10m piece)
11991205 if ( vm_vec_dist_quick ( &obj->pos , &Eye_position ) < obj->radius *50 .0f ) {
1200- for (i= 0 ; i< MAX_DEBRIS_ARCS ; i++ ) {
1201- if ( db-> arc_timestamp [i] .isValid () ) {
1202- model_instance_add_arc ( pm, pmi, db->submodel_num , &db-> arc_pts [i][ 0 ] , &db-> arc_pts [i][ 1 ] , MARC_TYPE_DAMAGED );
1206+ for (auto &arc: db-> electrical_arcs ) {
1207+ if ( arc. timestamp .isValid () ) {
1208+ model_instance_add_arc ( pm, pmi, db->submodel_num , &arc. endpoint_1 , &arc. endpoint_2 , MARC_TYPE_DAMAGED );
12031209 }
12041210 }
12051211 }
@@ -1250,3 +1256,19 @@ void create_generic_debris(object* ship_objp, const vec3d* pos, float min_num_de
12501256 debris_create (ship_objp, model_num, -1 , &create_pos, pos, 0 , speed_mult);
12511257 }
12521258}
1259+
1260+ debris_electrical_arc *debris_find_electrical_arc_slot (debris *db)
1261+ {
1262+ size_t i = 0 ;
1263+ for (auto & ii : db->electrical_arcs )
1264+ {
1265+ if (!ii.timestamp .isValid ())
1266+ break ;
1267+ i++;
1268+ }
1269+
1270+ if (i == MAX_DEBRIS_ARCS )
1271+ return nullptr ;
1272+
1273+ return &db->electrical_arcs [i];
1274+ }
0 commit comments