File: Intersect.h

package info (click to toggle)
bzflag 2.4.30-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 26,488 kB
  • sloc: cpp: 150,376; ansic: 3,463; sh: 2,535; makefile: 2,194; perl: 486; python: 260; objc: 246; php: 206
file content (138 lines) | stat: -rw-r--r-- 4,935 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/* bzflag
 * Copyright (c) 1993-2025 Tim Riker
 *
 * This package is free software;  you can redistribute it and/or
 * modify it under the terms of the license found in the file
 * named COPYING that should have accompanied this file.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */

/*
 * Utilities for doing intersection calculations.
 */

#ifndef BZF_INTERSECT_H
#define BZF_INTERSECT_H

#include "common.h"
#include "Ray.h"
#include "Frustum.h"

class Extents;

enum IntersectLevel
{
    Outside,
    Partial,
    Contained
};

// returns normal to 2d rect (size 2dx x 2dy) by point p
void getNormalRect(const float* p, const float* boxPos,
                   float boxAngle, float dx,
                   float dy, float* n);

// true iff 2d rect (size 2dx x 2dy) intersects circle (in z = const plane)
bool testRectCircle(const float* boxPos, float boxAngle,
                    float dx, float dy,
                    const float* circPos, float circRadius);

// ray r1 started at time t1 minus ray r2 started at time t2
Ray rayMinusRay(const Ray& r1, float t1,
                const Ray& r2, float t2);

// return t at which ray passes through sphere at origin of given radius
float rayAtDistanceFromOrigin(const Ray& r, float radius);

// return t at which ray intersects box (size 2dx x 2dy x dz)
// (-1 if never, 0 if starts inside).
float timeRayHitsBlock(const Ray& r, const float* boxPos,
                       float boxAngle, float dx,
                       float dy, float dz);

// return t at which ray intersects pyramid (size 2dx x 2dy x dz)
// (-1 if never, 0 if starts inside).
float timeRayHitsPyramids(const Ray& r,
                          const float* pyrPos,
                          float pyrAngle,
                          float dx, float dy, float dz,
                          bool flipZ);

// return t at which ray intersects tetra (size 2dx x 2dy x dz)
// (-1 if never, 0 if starts inside).
float timeRayHitsTetra(const Ray& r,
                       const float (*vertices)[4][3],
                       const float (*planes)[4][4],
                       const float* mins, const float *maxs);

// true if rectangles intersect (in z = const plane)
bool testRectRect(const float* p1, float angle1,
                  float dx1, float dy1,
                  const float* p2, float angle2,
                  float dx2, float dy2);

// true if first rectangle contains second intersect (in z = const plane)
bool testRectInRect(const float* bigPos, float angle1,
                    float dx1, float dy1,
                    const float* smallPos, float angle2,
                    float dx2, float dy2);

// return t at which ray intersects 2d rect (size 2dx x 2dy) and side
// of intersection.  0,1,2,3 for east, north, west, south;  -1 if never;
// -2 if starts inside.
float timeAndSideRayHitsOrigRect(
    const float* rayOrigin,
    const float* rayDir,
    float dx, float dy, int& side);
float timeAndSideRayHitsRect(const Ray& r,
                             const float* boxPos, float boxAngle,
                             float dx, float dy, int& side);

// return true if polygon touches the axis aligned box
bool testPolygonInAxisBox(int pointCount, const float (*points)[3],
                          const float* plane, const Extents& extents);

// return level of axis box intersection with Frumstum
// possible values are Outside, Partial, and Contained.
// the frustum plane normals point inwards
IntersectLevel testAxisBoxInFrustum(const Extents& extents,
                                    const Frustum* frustum);

// return true if the axis aligned bounding box
// is contained within all of the planes.
// the occluder plane normals point inwards
IntersectLevel testAxisBoxOcclusion(const Extents& extents,
                                    const float (*planes)[4],
                                    int planeCount);

// return true if the ray will intersect with the
// axis aligned bounding box defined by the mins
// and maxs. it will also fill in enterTime and
// leaveTime if there is an intersection.
bool textRayInAxisBox(const Ray& ray, const Extents& extents,
                      float& enterTime, float& leaveTime);


// return true if the ray hits the box
// if it does hit, set the inTime value
bool testRayHitsAxisBox(const Ray* ray, const Extents& extents,
                        float* inTime);

// return true if the ray hits the box
// if it does hit, set the inTime and outTime values
bool testRayHitsAxisBox(const Ray* ray, const Extents& extents,
                        float* inTime, float* outTime);


#endif // BZF_INTERSECT_H

// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4