From cd76870ecc3476b3c888dce6ba6e05c011c338cc Mon Sep 17 00:00:00 2001 From: Kp Date: Thu, 29 Jan 2015 04:27:36 +0000 Subject: [PATCH] Return find_hitpoint_uv u,v by value --- common/main/fvi.h | 9 ++++++++- similar/main/collide.cpp | 5 +++-- similar/main/fvi.cpp | 21 +++++++++------------ 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/common/main/fvi.h b/common/main/fvi.h index 100edd943..57100f29d 100644 --- a/common/main/fvi.h +++ b/common/main/fvi.h @@ -28,6 +28,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED. #include "vecmat.h" #ifdef __cplusplus +#include "dxxsconf.h" #include "fwdobject.h" #include "pack.h" #include "countarray.h" @@ -72,6 +73,11 @@ struct fvi_query : prohibit_void_ptr int flags; }; +struct fvi_hitpoint +{ + fix u, v; +}; + //Find out if a vector intersects with anything. //Fills in hit_data, an fvi_info structure (see above). //Parms: @@ -86,7 +92,8 @@ int find_vector_intersection(const fvi_query &fq, fvi_info &hit_data); //finds the uv coords of the given point on the given seg & side //fills in u & v. if l is non-NULL fills it in also -void find_hitpoint_uv(fix *u,fix *v, const vms_vector &pnt,vcsegptridx_t seg,int sidenum,int facenum); +__attribute_warn_unused_result +fvi_hitpoint find_hitpoint_uv(const vms_vector &pnt, vcsegptridx_t seg, uint_fast32_t sidenum, uint_fast32_t facenum); //Returns true if the object is through any walls int object_intersects_wall(vobjptr_t objp); diff --git a/similar/main/collide.cpp b/similar/main/collide.cpp index 26e84b723..60de71c03 100644 --- a/similar/main/collide.cpp +++ b/similar/main/collide.cpp @@ -566,7 +566,6 @@ int check_effect_blowup(const vsegptridx_t seg,int side,const vms_vector &pnt, _ if ((ec!=-1 && ((db=Effects[ec].dest_bm_num)!=-1 && !(Effects[ec].flags&EF_ONE_SHOT))) || (ec==-1 && (TmapInfo[tm].destroyed!=-1))) #endif { - fix u,v; const grs_bitmap *bm = &GameBitmaps[Textures[tm].index]; int x=0,y=0,t; @@ -575,7 +574,9 @@ int check_effect_blowup(const vsegptridx_t seg,int side,const vms_vector &pnt, _ //this can be blown up...did we hit it? if (!force_blowup_flag) { - find_hitpoint_uv(&u,&v,pnt,seg,side,0); //evil: always say face zero + const auto hitpoint = find_hitpoint_uv(pnt,seg,side,0); //evil: always say face zero + auto &u = hitpoint.u; + auto &v = hitpoint.v; x = ((unsigned) f2i(u*bm->bm_w)) % bm->bm_w; y = ((unsigned) f2i(v*bm->bm_h)) % bm->bm_h; diff --git a/similar/main/fvi.cpp b/similar/main/fvi.cpp index ab6040f1b..a7646e320 100644 --- a/similar/main/fvi.cpp +++ b/similar/main/fvi.cpp @@ -1090,10 +1090,9 @@ quit_looking: //finds the uv coords of the given point on the given seg & side //fills in u & v. if l is non-NULL fills it in also -void find_hitpoint_uv(fix *u,fix *v,const vms_vector &pnt,const vcsegptridx_t seg,int sidenum,int facenum) +fvi_hitpoint find_hitpoint_uv(const vms_vector &pnt, const vcsegptridx_t seg, const uint_fast32_t sidenum, const uint_fast32_t facenum) { const side *side = &seg->sides[sidenum]; - uvl uvls[3]; fix k0,k1; int i; @@ -1101,12 +1100,6 @@ void find_hitpoint_uv(fix *u,fix *v,const vms_vector &pnt,const vcsegptridx_t se //when do I return 0 & 1 for non-transparent walls? - segnum_t segnum = seg; - if (segnum < 0 || segnum > Highest_segment_index) { - *u = *v = 0; - return; - } - const auto vx = create_abs_vertex_lists(seg, sidenum); const auto &vertex_list = vx.second; const auto vn = create_all_vertnum_lists(seg, sidenum); @@ -1152,14 +1145,17 @@ void find_hitpoint_uv(fix *u,fix *v,const vms_vector &pnt,const vcsegptridx_t se else k0 = fixdiv(fixmul(-k1,vec1.j) + checkp.j - p1.j,vec0.j); + array uvls; for (i=0;i<3;i++) uvls[i] = side->uvls[vertnum_list[facenum*3+i]]; auto p = [&uvls, k0, k1](fix uvl::*p) { return uvls[1].*p + fixmul(k0,uvls[0].*p - uvls[1].*p) + fixmul(k1,uvls[2].*p - uvls[1].*p); }; - *u = p(&uvl::u); - *v = p(&uvl::v); + return { + p(&uvl::u), + p(&uvl::v) + }; } //check if a particular point on a wall is a transparent pixel @@ -1168,13 +1164,14 @@ int check_trans_wall(const vms_vector &pnt,const vcsegptridx_t seg,int sidenum,i { auto *side = &seg->sides[sidenum]; int bmx,bmy; - fix u,v; #if defined(DXX_BUILD_DESCENT_I) Assert(WALL_IS_DOORWAY(seg,sidenum) == WID_TRANSPARENT_WALL); #endif - find_hitpoint_uv(&u,&v,pnt,seg,sidenum,facenum); // Don't compute light value. + const auto hitpoint = find_hitpoint_uv(pnt,seg,sidenum,facenum); // Don't compute light value. + auto &u = hitpoint.u; + auto &v = hitpoint.v; const grs_bitmap &rbm = (side->tmap_num2 != 0) ? texmerge_get_cached_bitmap( side->tmap_num, side->tmap_num2 ) : GameBitmaps[Textures[PIGGY_PAGE_IN(Textures[side->tmap_num]), side->tmap_num].index];