Pass vertex factory to compute_center_point_on_side

This commit is contained in:
Kp 2018-03-12 03:43:47 +00:00
parent 53a1d5f9ce
commit e8645b2062
15 changed files with 41 additions and 41 deletions

View file

@ -59,11 +59,11 @@ using vertex_vertnum_array_list = array<vertex_vertnum_pair, 6>;
#ifdef dsx
namespace dsx {
extern int Doing_lighting_hack_flag;
void compute_center_point_on_side(vms_vector &vp, const segment &sp, unsigned side);
static inline vms_vector compute_center_point_on_side(const segment &sp, const unsigned side)
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const segment &sp, unsigned side);
static inline vms_vector compute_center_point_on_side(fvcvertptr &vcvertptr, const segment &sp, const unsigned side)
{
vms_vector v;
return compute_center_point_on_side(v, sp, side), v;
return compute_center_point_on_side(vcvertptr, v, sp, side), v;
}
void compute_segment_center(fvcvertptr &vcvertptr, vms_vector &vp, const segment &sp);
static inline vms_vector compute_segment_center(fvcvertptr &vcvertptr, const segment &sp)

View file

@ -142,7 +142,7 @@ int generate_curve( fix r1scale, fix r4scale ) {
fixang rangle, uangle;
const vcsegptr_t cursegp = Cursegp;
compute_center_point_on_side(p1, cursegp, Curside);
compute_center_point_on_side(vcvertptr, p1, cursegp, Curside);
switch( Curside ) {
case WLEFT:
@ -169,7 +169,7 @@ int generate_curve( fix r1scale, fix r4scale ) {
}
const vcsegptr_t markedsegp = Markedsegp;
compute_center_point_on_side(p4, markedsegp, Markedside);
compute_center_point_on_side(vcvertptr, p4, markedsegp, Markedside);
switch( Markedside ) {
case WLEFT:

View file

@ -366,7 +366,7 @@ static inline vms_matrix med_create_group_rotation_matrix(int delta_flag, const
static void med_rotate_group(const vms_matrix &rotmat, group::segment_array_type_t &group_seglist, const vcsegptr_t first_seg, int first_side)
{
array<int8_t, MAX_VERTICES> vertex_list;
const auto rotate_center = compute_center_point_on_side(first_seg, first_side);
const auto &&rotate_center = compute_center_point_on_side(vcvertptr, first_seg, first_side);
// Create list of points to rotate.
vertex_list = {};
@ -600,7 +600,7 @@ static int med_copy_group(int delta_flag, const vmsegptridx_t base_seg, int base
// Now do the copy
// First, xlate all vertices so center of group_seg:group_side is at origin
const auto srcv = compute_center_point_on_side(group_seg,group_side);
const auto &&srcv = compute_center_point_on_side(vcvertptr, group_seg, group_side);
range_for (auto &&v, vmvertptridx)
if (in_vertex_list[v])
vm_vec_sub2(*v, srcv);
@ -617,7 +617,7 @@ static int med_copy_group(int delta_flag, const vmsegptridx_t base_seg, int base
med_rotate_group(rotmat, GroupList[new_current_group].segments, group_seg, group_side);
// Now xlate all vertices so group_seg:group_side shares center point with base_seg:base_side
const auto destv = compute_center_point_on_side(base_seg,base_side);
const auto &&destv = compute_center_point_on_side(vcvertptr, base_seg, base_side);
range_for (auto &&v, vmvertptridx)
if (in_vertex_list[v])
vm_vec_add2(*v, destv);
@ -741,7 +741,7 @@ static int med_move_group(int delta_flag, const vmsegptridx_t base_seg, int base
// Now do the move
// First, xlate all vertices so center of group_seg:group_side is at origin
const auto srcv = compute_center_point_on_side(group_seg,group_side);
const auto &&srcv = compute_center_point_on_side(vcvertptr, group_seg, group_side);
range_for (auto &&v, vmvertptridx)
if (in_vertex_list[v])
vm_vec_sub2(*v, srcv);
@ -758,7 +758,7 @@ static int med_move_group(int delta_flag, const vmsegptridx_t base_seg, int base
med_rotate_group(rotmat, GroupList[current_group].segments, group_seg, group_side);
// Now xlate all vertices so group_seg:group_side shares center point with base_seg:base_side
const auto destv = compute_center_point_on_side(base_seg,base_side);
const auto &&destv = compute_center_point_on_side(vcvertptr, base_seg, base_side);
range_for (auto &&v, vmvertptridx)
if (in_vertex_list[v])
vm_vec_add2(*v, destv);

View file

@ -559,7 +559,7 @@ static void move_player_2_segment_and_rotate(const vmsegptridx_t seg, const unsi
static int edgenum=0;
compute_segment_center(vcvertptr, ConsoleObject->pos,seg);
auto vp = compute_center_point_on_side(seg,side);
auto vp = compute_center_point_on_side(vcvertptr, seg, side);
vm_vec_sub2(vp,ConsoleObject->pos);
auto &sv = Side_to_verts[Curside];
@ -590,7 +590,7 @@ int SetPlayerFromCursegMinusOne()
static int edgenum=0;
const auto view_vec = vm_vec_negated(Cursegp->sides[Curside].normals[0]);
const auto side_center = compute_center_point_on_side(Cursegp,Curside);
const auto &&side_center = compute_center_point_on_side(vcvertptr, Cursegp, Curside);
const auto view_vec2 = vm_vec_copy_scale(view_vec,view_dist);
vm_vec_sub(ConsoleObject->pos,side_center,view_vec2);

View file

@ -829,7 +829,7 @@ static int med_attach_segment_rotated(const vmsegptridx_t destseg, const vmsegpt
vm_transpose_matrix(rotmat2); // added 12:33 pm, 10/01/93
// Compute and rotate the center point of the attaching face.
const auto vc0 = compute_center_point_on_side(newseg,newside);
const auto &&vc0 = compute_center_point_on_side(vcvertptr, newseg, newside);
const auto vr = vm_vec_rotate(vc0,rotmat2);
// Now rotate the free vertices in the segment
@ -838,7 +838,7 @@ static int med_attach_segment_rotated(const vmsegptridx_t destseg, const vmsegpt
vm_vec_rotate(tvs[v], vcvertptr(newseg->verts[v + 4]), rotmat2);
// Now translate the new segment so that the center point of the attaching faces are the same.
const auto vc1 = compute_center_point_on_side(destseg,destside);
const auto &&vc1 = compute_center_point_on_side(vcvertptr, destseg, destside);
const auto xlate_vec = vm_vec_sub(vc1,vr);
// Create and add the 4 new vertices.
@ -1649,7 +1649,7 @@ int med_find_closest_threshold_segment_side(const vmsegptridx_t sp, int side, im
if (IS_CHILD(sp->children[side]))
return 0;
const auto vsc = compute_center_point_on_side(sp, side);
const auto &&vsc = compute_center_point_on_side(vcvertptr, sp, side);
closest_seg_dist = JOINT_THRESHOLD;
@ -1659,7 +1659,7 @@ int med_find_closest_threshold_segment_side(const vmsegptridx_t sp, int side, im
if (segp != sp)
for (s=0;s<MAX_SIDES_PER_SEGMENT;s++) {
if (!IS_CHILD(segp->children[s])) {
const auto vtc = compute_center_point_on_side(segp, s);
const auto &&vtc = compute_center_point_on_side(vcvertptr, segp, s);
current_dist = vm_vec_dist( vsc, vtc );
if (current_dist < closest_seg_dist) {
adj_sp = segp;

View file

@ -3817,7 +3817,7 @@ _exit_cheat:
if (!ai_multiplayer_awareness(obj, 62))
return;
const auto &&center_point = compute_center_point_on_side(vcsegptr(obj->segnum), aip->GOALSIDE);
const auto &&center_point = compute_center_point_on_side(vcvertptr, vcsegptr(obj->segnum), aip->GOALSIDE);
const auto goal_vector = vm_vec_normalized_quick(vm_vec_sub(center_point, obj->pos));
ai_turn_towards_vector(goal_vector, obj, robptr.turn_time[Difficulty_level]);
move_towards_vector(obj, goal_vector, 0);

View file

@ -109,7 +109,7 @@ static uint_fast32_t insert_center_points(segment_array &segments, point_seg *ps
Assert(connect_side != side_none); // Impossible! These two segments must be connected, they were created by create_path_points (which was created by mk!)
if (connect_side == side_none) // Try to blow past the assert, this should at least prevent a hang.
connect_side = 0;
const auto &&center_point = compute_center_point_on_side(seg1, connect_side);
const auto &&center_point = compute_center_point_on_side(vcvertptr, seg1, connect_side);
auto new_point = vm_vec_sub(psegs[i-1].point, center_point);
new_point.x /= 16;
new_point.y /= 16;
@ -356,7 +356,7 @@ if ((objp->type == OBJ_ROBOT) && (objp->ctype.ai_info.behavior == ai_behavior::A
fvi_info hit_data;
int hit_type;
const auto center_point = compute_center_point_on_side(segp, snum);
const auto &&center_point = compute_center_point_on_side(vcvertptr, segp, snum);
fq.p0 = &objp->pos;
fq.startseg = objp->segnum;

View file

@ -2214,7 +2214,7 @@ static vms_vector find_exit_direction(vms_vector result, const vcobjptr_t objp,
{
for (unsigned side = MAX_SIDES_PER_SEGMENT; side --;)
if (WALL_IS_DOORWAY(segp, side) & WID_FLY_FLAG) {
const auto exit_point = compute_center_point_on_side(segp, side);
const auto &&exit_point = compute_center_point_on_side(vcvertptr, segp, side);
vm_vec_add2(result, vm_vec_normalized_quick(vm_vec_sub(exit_point, objp->pos)));
break;
}

View file

@ -874,7 +874,7 @@ static int find_exit_side(const object_base &obj)
fix d;
if (pseg->children[i]!=segment_none) {
auto sidevec = compute_center_point_on_side(pseg,i);
auto sidevec = compute_center_point_on_side(vcvertptr, pseg, i);
vm_vec_normalized_dir_quick(sidevec,sidevec,segcenter);
d = vm_vec_dot(sidevec,prefvec);
@ -1181,7 +1181,7 @@ void do_endlevel_flythrough(flythrough_data *flydata)
//update target point & angles
//where we are heading (center of exit_side)
auto dest_point = compute_center_point_on_side(pseg,exit_side);
auto dest_point = compute_center_point_on_side(vcvertptr, pseg, exit_side);
const vms_vector nextcenter = (pseg->children[exit_side] == segment_exit)
? dest_point
: compute_segment_center(vcvertptr, vcsegptr(pseg->children[exit_side]));
@ -1202,8 +1202,8 @@ void do_endlevel_flythrough(flythrough_data *flydata)
s1 = i;
}
const auto s0p = compute_center_point_on_side(pseg,s0);
const auto s1p = compute_center_point_on_side(pseg,s1);
const auto &&s0p = compute_center_point_on_side(vcvertptr, pseg, s0);
const auto &&s1p = compute_center_point_on_side(vcvertptr, pseg, s1);
dist = fixmul(vm_vec_dist(s0p,s1p),flydata->offset_frac);
if (dist-flydata->offset_dist > MAX_SLIDE_PER_SEGMENT)
@ -1463,7 +1463,7 @@ try_again:
const auto &&exit_seg = vmsegptr(exit_segnum);
compute_segment_center(vcvertptr, mine_exit_point, exit_seg);
extract_orient_from_segment(&mine_exit_orient, exit_seg);
compute_center_point_on_side(mine_side_exit_point, exit_seg, exit_side);
compute_center_point_on_side(vcvertptr, mine_side_exit_point, exit_seg, exit_side);
vm_vec_scale_add(mine_ground_exit_point,mine_exit_point,mine_exit_orient.uvec,-i2f(20));

View file

@ -1320,7 +1320,7 @@ void explode_wall(const vmsegptridx_t segnum,int sidenum)
w.time = 0;
//play one long sound for whole door wall explosion
const auto pos = compute_center_point_on_side(segnum,sidenum);
const auto &&pos = compute_center_point_on_side(vcvertptr, segnum, sidenum);
digi_link_sound_to_pos( SOUND_EXPLODING_WALL,segnum, sidenum, pos, 0, F1_0 );
}

View file

@ -507,7 +507,7 @@ void move_player_2_segment(const vmsegptridx_t seg,int side)
{
const auto &&console = vmobjptridx(ConsoleObject);
compute_segment_center(vcvertptr, console->pos, seg);
auto vp = compute_center_point_on_side(seg,side);
auto vp = compute_center_point_on_side(vcvertptr, seg, side);
vm_vec_sub2(vp, console->pos);
vm_vector_2_matrix(console->orient, vp, nullptr, nullptr);
obj_relink(vmobjptr, vmsegptr, console, seg);

View file

@ -103,7 +103,7 @@ static uint_fast32_t find_connect_child(const vcsegidx_t base_seg, const array<s
return std::distance(b, std::find(b, end(children), base_seg));
}
static void compute_center_point_on_side(vms_vector &r, const array<unsigned, MAX_VERTICES_PER_SEGMENT> &verts, const unsigned side)
static void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &r, const array<unsigned, MAX_VERTICES_PER_SEGMENT> &verts, const unsigned side)
{
vms_vector vp;
vm_vec_zero(vp);
@ -133,9 +133,9 @@ unsigned Num_static_lights;
// ------------------------------------------------------------------------------------------
// Compute the center point of a side of a segment.
// The center point is defined to be the average of the 4 points defining the side.
void compute_center_point_on_side(vms_vector &vp, const segment &sp, const unsigned side)
void compute_center_point_on_side(fvcvertptr &vcvertptr, vms_vector &vp, const segment &sp, const unsigned side)
{
compute_center_point_on_side(vp, sp.verts, side);
compute_center_point_on_side(vcvertptr, vp, sp.verts, side);
}
// ------------------------------------------------------------------------------------------
@ -1185,7 +1185,7 @@ static int check_for_degenerate_side(const vcsegptr_t sp, int sidenum)
int degeneracy_flag = 0;
const auto segc = compute_segment_center(vcvertptr, sp);
const auto sidec = compute_center_point_on_side(sp, sidenum);
const auto &&sidec = compute_center_point_on_side(vcvertptr, sp, sidenum);
const auto vec_to_center = vm_vec_sub(segc, sidec);
//vm_vec_sub(&vec1, &Vertices[sp->verts[vp[1]]], &Vertices[sp->verts[vp[0]]]);

View file

@ -615,7 +615,7 @@ static void set_sound_sources(fvcsegptridx &vcsegptridx)
}
#endif
const auto pnt = compute_center_point_on_side(seg,sidenum);
const auto &&pnt = compute_center_point_on_side(vcvertptr, seg, sidenum);
digi_link_sound_to_pos(sn, seg, sidenum, pnt, 1, F1_0/2);
}
}

View file

@ -196,7 +196,7 @@ static int do_change_walls(const trigger &t, const uint8_t new_wall_type)
case TT_OPEN_WALL:
if ((TmapInfo[segp->sides[side].tmap_num].flags & TMI_FORCE_FIELD)) {
ret |= 2;
const auto pos = compute_center_point_on_side(segp, side );
const auto &&pos = compute_center_point_on_side(vcvertptr, segp, side);
digi_link_sound_to_pos( SOUND_FORCEFIELD_OFF, segp, side, pos, 0, F1_0 );
digi_kill_sound_linked_to_segment(segp,side,SOUND_FORCEFIELD_HUM);
wall0.type = new_wall_type;
@ -214,7 +214,7 @@ static int do_change_walls(const trigger &t, const uint8_t new_wall_type)
if ((TmapInfo[segp->sides[side].tmap_num].flags & TMI_FORCE_FIELD)) {
ret |= 2;
{
const auto pos = compute_center_point_on_side(segp, side );
const auto &&pos = compute_center_point_on_side(vcvertptr, segp, side);
digi_link_sound_to_pos(SOUND_FORCEFIELD_HUM,segp,side,pos,1, F1_0/2);
}
case TT_ILLUSORY_WALL:
@ -270,7 +270,7 @@ static void do_il_off(const trigger &t)
#elif defined(DXX_BUILD_DESCENT_II)
const auto op = [](const vmsegptridx_t &seg, unsigned side) {
wall_illusion_off(seg, side);
const auto &&cp = compute_center_point_on_side(seg, side);
const auto &&cp = compute_center_point_on_side(vcvertptr, seg, side);
digi_link_sound_to_pos(SOUND_WALL_REMOVED, seg, side, cp, 0, F1_0);
};
#endif

View file

@ -441,7 +441,7 @@ void wall_open_door(const vmsegptridx_t seg, int side)
if ( Newdemo_state != ND_STATE_PLAYBACK )
{
// NOTE THE LINK TO ABOVE!!!!
const auto cp = compute_center_point_on_side(seg, side );
const auto &&cp = compute_center_point_on_side(vcvertptr, seg, side);
if (WallAnims[w->clip_num].open_sound > -1 )
digi_link_sound_to_pos( WallAnims[w->clip_num].open_sound, seg, side, cp, 0, F1_0 );
@ -507,7 +507,7 @@ void start_wall_cloak(const vmsegptridx_t seg, int side)
Assert(w->linked_wall == wall_none);
if ( Newdemo_state != ND_STATE_PLAYBACK ) {
const auto cp = compute_center_point_on_side(seg, side );
const auto &&cp = compute_center_point_on_side(vcvertptr, seg, side);
digi_link_sound_to_pos( SOUND_WALL_CLOAK_ON, seg, side, cp, 0, F1_0 );
}
@ -583,7 +583,7 @@ void start_wall_decloak(const vmsegptridx_t seg, int side)
Assert(w->linked_wall == wall_none);
if ( Newdemo_state != ND_STATE_PLAYBACK ) {
const auto cp = compute_center_point_on_side(seg, side );
const auto &&cp = compute_center_point_on_side(vcvertptr, seg, side);
digi_link_sound_to_pos( SOUND_WALL_CLOAK_OFF, seg, side, cp, 0, F1_0 );
}
@ -733,7 +733,7 @@ void wall_close_door(const vmsegptridx_t seg, int side)
if ( Newdemo_state != ND_STATE_PLAYBACK )
{
// NOTE THE LINK TO ABOVE!!!!
const auto cp = compute_center_point_on_side(seg, side );
const auto &&cp = compute_center_point_on_side(vcvertptr, seg, side);
if (WallAnims[w->clip_num].open_sound > -1 )
digi_link_sound_to_pos( WallAnims[w->clip_num].open_sound, seg, side, cp, 0, F1_0 );
@ -872,7 +872,7 @@ static bool do_door_close(active_door &d)
{ //first time
if (WallAnims[wp.clip_num].close_sound > -1 )
{
digi_link_sound_to_pos(WallAnims[wp.clip_num].close_sound, seg, side, compute_center_point_on_side(seg, side), 0, F1_0);
digi_link_sound_to_pos(WallAnims[wp.clip_num].close_sound, seg, side, compute_center_point_on_side(vcvertptr, seg, side), 0, F1_0);
}
}
}
@ -1392,7 +1392,7 @@ static void bng_process_segment(const object &objp, fix damage, const vmsegptrid
tm &= 0x3fff; //tm without flags
if ((((ec=TmapInfo[tm].eclip_num)!=-1) && ((db=Effects[ec].dest_bm_num)!=-1 && !(Effects[ec].flags&EF_ONE_SHOT))) || (ec==-1 && (TmapInfo[tm].destroyed!=-1))) {
const auto pnt = compute_center_point_on_side(segp, sidenum);
const auto &&pnt = compute_center_point_on_side(vcvertptr, segp, sidenum);
dist = vm_vec_dist_quick(pnt, objp.pos);
if (dist < damage/2) {
dist = find_connected_distance(pnt, segp, objp.pos, segp.absolute_sibling(objp.segnum), MAX_BLAST_GLASS_DEPTH, WID_RENDPAST_FLAG);