]> icculus.org git repositories - btb/d2x.git/blob - main/fvi.h
fix endless loop in some levels with a certain (complicated) structure
[btb/d2x.git] / main / fvi.h
1 /* $Id: fvi.h,v 1.2 2003-10-10 09:36:35 btb Exp $ */
2 /*
3 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
4 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
5 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
6 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
7 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
8 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
9 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
10 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
11 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
12 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
13 */
14
15 /*
16  *
17  * Header for fvi.c
18  *
19  * Old Log:
20  * Revision 1.2  1995/08/23  21:34:29  allender
21  * fix mcc compiler warning
22  *
23  * Revision 1.1  1995/05/16  15:56:38  allender
24  * Initial revision
25  *
26  * Revision 2.1  1995/03/20  18:15:58  john
27  * Added code to not store the normals in the segment structure.
28  *
29  * Revision 2.0  1995/02/27  11:32:02  john
30  * New version 2.0, which has no anonymous unions, builds with
31  * Watcom 10.0, and doesn't require parsing BITMAPS.TBL.
32  *
33  * Revision 1.10  1995/02/02  14:07:58  matt
34  * Fixed confusion about which segment you are touching when you're
35  * touching a wall.  This manifested itself in spurious lava burns.
36  *
37  * Revision 1.9  1994/12/04  22:48:04  matt
38  * Physics & FVI now only build seglist for player objects, and they
39  * responsilby deal with buffer full conditions
40  *
41  * Revision 1.8  1994/10/31  12:28:01  matt
42  * Added new function object_intersects_wall()
43  *
44  * Revision 1.7  1994/10/10  13:10:00  matt
45  * Increased max_fvi_segs
46  *
47  * Revision 1.6  1994/09/25  00:38:29  matt
48  * Made the 'find the point in the bitmap where something hit' system
49  * publicly accessible.
50  *
51  * Revision 1.5  1994/08/01  13:30:35  matt
52  * Made fvi() check holes in transparent walls, and changed fvi() calling
53  * parms to take all input data in query structure.
54  *
55  * Revision 1.4  1994/07/13  21:47:59  matt
56  * FVI() and physics now keep lists of segments passed through which the
57  * trigger code uses.
58  *
59  * Revision 1.3  1994/07/08  14:27:26  matt
60  * Non-needed powerups don't get picked up now; this required changing FVI to
61  * take a list of ingore objects rather than just one ignore object.
62  *
63  * Revision 1.2  1994/06/09  09:58:39  matt
64  * Moved find_vector_intersection() from physics.c to new file fvi.c
65  *
66  * Revision 1.1  1994/06/09  09:26:14  matt
67  * Initial revision
68  *
69  *
70  */
71
72
73 #ifndef _FVI_H
74 #define _FVI_H
75
76 #include "vecmat.h"
77 #include "segment.h"
78 #include "object.h"
79
80 //return values for find_vector_intersection() - what did we hit?
81 #define HIT_NONE                0               //we hit nothing
82 #define HIT_WALL                1               //we hit - guess - a wall
83 #define HIT_OBJECT      2               //we hit an object - which one?  no way to tell...
84 #define HIT_BAD_P0      3               //start point not is specified segment
85
86 #define MAX_FVI_SEGS 100
87
88 //this data structure gets filled in by find_vector_intersection()
89 typedef struct fvi_info {
90         int hit_type;                                   //what sort of intersection
91         vms_vector hit_pnt;                     //where we hit
92         int hit_seg;                                    //what segment hit_pnt is in
93         int hit_side;                                   //if hit wall, which side
94         int hit_side_seg;                               //what segment the hit side is in
95         int hit_object;                         //if object hit, which object
96         vms_vector hit_wallnorm;        //if hit wall, ptr to its surface normal
97         int n_segs;                                             //how many segs we went through
98         int seglist[MAX_FVI_SEGS];      //list of segs vector went through
99 } fvi_info;
100
101 //flags for fvi query
102 #define FQ_CHECK_OBJS   1               //check against objects?
103 #define FQ_TRANSWALL            2               //go through transparent walls
104 #define FQ_TRANSPOINT   4               //go through trans wall if hit point is transparent
105 #define FQ_GET_SEGLIST  8               //build a list of segments
106 #define FQ_IGNORE_POWERUPS      16              //ignore powerups
107
108 //this data contains the parms to fvi()
109 typedef struct fvi_query {
110         vms_vector *p0,*p1;
111         int startseg;
112         fix rad;
113         short thisobjnum;
114         int *ignore_obj_list;
115         int flags;
116 } fvi_query;
117
118 //Find out if a vector intersects with anything.
119 //Fills in hit_data, an fvi_info structure (see above).
120 //Parms:
121 //  p0 & startseg       describe the start of the vector
122 //  p1                                  the end of the vector
123 //  rad                                         the radius of the cylinder
124 //  thisobjnum          used to prevent an object with colliding with itself
125 //  ingore_obj_list     NULL, or ptr to a list of objnums to ignore, terminated with -1
126 //  check_obj_flag      determines whether collisions with objects are checked
127 //Returns the hit_data->hit_type
128 int find_vector_intersection(fvi_query *fq,fvi_info *hit_data);
129
130 //finds the uv coords of the given point on the given seg & side
131 //fills in u & v. if l is non-NULL fills it in also
132 void find_hitpoint_uv(fix *u,fix *v,fix *l, vms_vector *pnt,segment *seg,int sidenum,int facenum);
133
134 //Returns true if the object is through any walls
135 int object_intersects_wall(object *objp);
136
137 #endif
138