Return find_hitpoint_uv u,v by value
This commit is contained in:
parent
46252fae4d
commit
cd76870ecc
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Reference in a new issue