X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=collision.h;h=3093f30b8c7660798620d560c3617154e6960f45;hp=dfc02ff1c41dbdca7d6038009e17e5d77408fadd;hb=e24d834dcbcc61f28fdf0e2c1ba75693d9e23ed1;hpb=5f9da8b90dfd4f0c86120ed01ca3e16c2dbb58e1 diff --git a/collision.h b/collision.h index dfc02ff1..3093f30b 100644 --- a/collision.h +++ b/collision.h @@ -11,33 +11,39 @@ plane_t; typedef struct trace_s { - // if true, the entire trace was in solid + // if true, the entire trace was in solid (see hitsupercontentsmask) int allsolid; - // if true, the initial point was in solid + // if true, the initial point was in solid (see hitsupercontentsmask) int startsolid; // if true, the trace passed through empty somewhere + // (set only by Q1BSP tracing) int inopen; - // if true, the trace passed through water somewhere + // if true, the trace passed through water/slime/lava somewhere + // (set only by Q1BSP tracing) int inwater; // fraction of the total distance that was traveled before impact // (1.0 = did not hit anything) double fraction; - // final position + // final position of the trace (simply a point between start and end) double endpos[3]; - // surface normal at impact + // surface normal at impact (not really correct for edge collisions) plane_t plane; // entity the surface is on + // (not set by trace functions, only by physics) void *ent; - // if not zero, treats this value as empty, and all others as solid (impact - // on content change) - int thiscontents; - // the contents at the impact or end point - int endcontents; + // which SUPERCONTENTS bits to collide with, I.E. to consider solid + // (this also affects startsolid/allsolid) + int hitsupercontentsmask; + // the supercontents mask at the start point + int startsupercontents; + // initially false, set when the start leaf is found + // (set only by Q1BSP tracing and entity box tracing) + int startfound; } trace_t; void Collision_Init(void); -void Collision_ClipTrace_Box(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end); +void Collision_ClipTrace_Box(trace_t *trace, const vec3_t cmins, const vec3_t cmaxs, const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int hitsupercontentsmask, int boxsupercontents); typedef struct colpointf_s { @@ -54,16 +60,27 @@ colplanef_t; typedef struct colbrushf_s { + // the content flags of this brush + int supercontents; + // the number of bounding planes on this brush int numplanes; + // the number of corner points on this brush int numpoints; + // the number of renderable triangles on this brush + int numtriangles; + // array of bounding planes on this brush colplanef_t *planes; + // array of corner points on this brush colpointf_t *points; + // renderable triangles, as int[3] elements indexing the points + int *elements; } colbrushf_t; -colbrushf_t *Collision_AllocBrushFloat(mempool_t *mempool, int numpoints, int numplanes); +colbrushf_t *Collision_AllocBrushFloat(mempool_t *mempool, int numpoints, int numplanes, int numtriangles, int supercontents); void Collision_CalcPlanesForPolygonBrushFloat(colbrushf_t *brush); -colbrushf_t *Collision_AllocBrushFromPermanentPolygonFloat(mempool_t *mempool, int numpoints, float *points); +colbrushf_t *Collision_AllocBrushFromPermanentPolygonFloat(mempool_t *mempool, int numpoints, float *points, int supercontents); +colbrushf_t *Collision_NewBrushFromPlanes(mempool_t *mempool, int numoriginalplanes, const mplane_t *originalplanes, int supercontents); void Collision_TraceBrushBrushFloat(trace_t *trace, const colbrushf_t *thisbrush_start, const colbrushf_t *thisbrush_end, const colbrushf_t *thatbrush_start, const colbrushf_t *thatbrush_end); void Collision_TraceBrushPolygonFloat(trace_t *trace, const colbrushf_t *thisbrush_start, const colbrushf_t *thisbrush_end, int numpoints, const float *points); void Collision_TraceBrushPolygonTransformFloat(trace_t *trace, const colbrushf_t *thisbrush_start, const colbrushf_t *thisbrush_end, int numpoints, const float *points, const matrix4x4_t *polygonmatrixstart, const matrix4x4_t *polygonmatrixend);