Files
FC1/CryCommon/primitives.h
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

153 lines
3.2 KiB
C++

#ifndef primitives_h
#define primitives_h
namespace primitives {
////////////////////////// primitives //////////////////////
struct primitive {
};
struct box : primitive {
enum entype { type=0 };
matrix3x3f Basis;
int bOriented;
vectorf center;
vectorf size;
};
struct triangle : primitive {
enum entype { type=1 };
vectorf pt[3];
vectorf n;
};
struct indexed_triangle : triangle {
int idx;
};
struct grid : primitive {
matrix3x3f Basis;
int bOriented;
vectorf origin;
vector2df step,stepr;
vector2di size;
vector2di stride;
int inrange(int ix, int iy) { return isneg(ix-size.x) & isnonneg(ix) & isneg(iy-size.y) & isnonneg(iy); }
int getcell_safe(int ix,int iy) { int mask=-inrange(ix,iy); return iy*stride.y+ix*stride.x&mask | size.x*size.y&~mask; }
};
struct heightfield : grid {
enum entype { type=2 };
heightfield& operator=(const heightfield &src) {
step = src.step; stepr = src.stepr;
size = src.size; stride = src.stride;
pdata = src.pdata; heightscale = src.heightscale;
pflags = src.pflags; typemask = src.typemask;
typehole = src.typehole; typepower = src.typepower;
return *this;
}
float getheight(int ix,int iy) const { return getheight(ix*stride.x+iy*stride.y); }
int gettype(int ix,int iy) const { return gettype(ix*stride.x+iy*stride.y); }
float getheight(int icell) const { return pdata[icell]*heightscale; }
int gettype(int icell) const {
int itype=pflags[icell]>>typepower & typemask, idelta=itype-typehole;
return itype | ((idelta-1)>>31 ^ idelta>>31);
}
unsigned short *pdata;
float heightscale;
unsigned short *pflags;
unsigned short typemask;
int typehole;
int typepower;
};
struct ray : primitive {
enum entype { type=3 };
vectorf origin;
vectorf dir;
};
struct sphere : primitive {
enum entype { type=4 };
vectorf center;
float r;
};
struct cylinder : primitive {
enum entype { type=5 };
vectorf center;
vectorf axis;
float r,hh;
};
struct plane : primitive {
enum entype { type=6 };
vectorf n;
vectorf origin;
};
struct coord_plane : plane {
vectorf axes[2];
};
}
struct prim_inters {
prim_inters() { minPtDist2=0.0f; }
vectorf pt[2];
vectorf n;
unsigned char iFeature[2][2];
float minPtDist2;
short id[2];
int iNode[2];
vectorf *ptborder;
int nborderpt,nbordersz;
vectorf ptbest;
int nBestPtVal;
};
struct contact {
real t,taux;
vectorf pt;
vectorf n;
unsigned int iFeature[2];
};
const int NPRIMS = 8;
///////////////////// geometry contact structures ///////////////////
struct geom_contact_area {
enum entype { polygon,polyline };
int type;
int npt;
int nmaxpt;
float minedge;
int *piPrim[2];
int *piFeature[2];
vectorf *pt;
vectorf n1; // normal of other object surface (or edge)
};
struct geom_contact {
real t;
vectorf pt;
vectorf n;
vectorf dir; // unprojection direction
int iUnprojMode;
float vel; // original velocity along this direction, <0 if least squares normal was used
int id[2]; // external ids for colliding geometry parts
int iPrim[2];
int iFeature[2];
int iNode[2]; // BV-tree nodes of contacting primitives
vectorf *ptborder; // intersection border
int nborderpt;
vectorf center;
bool bBorderConsecutive;
geom_contact_area *parea;
};
#endif