Return find_hitpoint_uv u,v by value

This commit is contained in:
Kp 2015-01-29 04:27:36 +00:00
parent 46252fae4d
commit cd76870ecc
3 changed files with 20 additions and 15 deletions

View file

@ -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<fvi_query>
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);

View file

@ -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;

View file

@ -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<uvl, 3> 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];