]> icculus.org git repositories - btb/d2x.git/blob - main/gameseg.h
use the orientation parameter of g3_draw_bitmap
[btb/d2x.git] / main / gameseg.h
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 /*
15  *
16  * Header file for stuff moved from segment.c to gameseg.c.
17  *
18  */
19
20
21 #ifndef _GAMESEG_H
22 #define _GAMESEG_H
23
24 #include "pstypes.h"
25 #include "fix.h"
26 #include "vecmat.h"
27 #include "segment.h"
28
29 //figure out what seg the given point is in, tracing through segments
30 int get_new_seg(vms_vector *p0,int startseg);
31
32 typedef struct segmasks {
33    short facemask;     //which faces sphere pokes through (12 bits)
34    sbyte sidemask;     //which sides sphere pokes through (6 bits)
35    sbyte centermask;   //which sides center point is on back of (6 bits)
36 } segmasks;
37
38 extern int      Highest_vertex_index;                   // Highest index in Vertices and Vertex_active, an efficiency hack
39 extern int      Highest_segment_index;          // Highest index in Segments, an efficiency hack
40
41 extern void compute_center_point_on_side(vms_vector *vp,segment *sp,int side);
42 extern void compute_segment_center(vms_vector *vp,segment *sp);
43 extern int find_connect_side(segment *base_seg, segment *con_seg);
44
45 // Fill in array with four absolute point numbers for a given side
46 void get_side_verts(short *vertlist,int segnum,int sidenum);
47
48 //      Create all vertex lists (1 or 2) for faces on a side.
49 //      Sets:
50 //              num_faces               number of lists
51 //              vertices                        vertices in all (1 or 2) faces
52 //      If there is one face, it has 4 vertices.
53 //      If there are two faces, they both have three vertices, so face #0 is stored in vertices 0,1,2,
54 //      face #1 is stored in vertices 3,4,5.
55 // Note: these are not absolute vertex numbers, but are relative to the segment
56 // Note:  for triagulated sides, the middle vertex of each trianle is the one NOT
57 //   adjacent on the diagonal edge
58 extern void create_all_vertex_lists(int *num_faces, int *vertices, int segnum, int sidenum);
59
60 //like create_all_vertex_lists(), but generate absolute point numbers
61 extern void create_abs_vertex_lists(int *num_faces, int *vertices, int segnum, int sidenum, char *calling_file, int calling_linenum);
62
63 // -----------------------------------------------------------------------------------
64 // Like create all vertex lists, but returns the vertnums (relative to
65 // the side) for each of the faces that make up the side.
66 //      If there is one face, it has 4 vertices.
67 //      If there are two faces, they both have three vertices, so face #0 is stored in vertices 0,1,2,
68 //      face #1 is stored in vertices 3,4,5.
69 void create_all_vertnum_lists(int *num_faces, int *vertnums, int segnum, int sidenum);
70
71 //      Given a side, return the number of faces
72 extern int get_num_faces(side *sidep);
73
74 //returns 3 different bitmasks with info telling if this sphere is in
75 //this segment.  See segmasks structure for info on fields
76 segmasks get_seg_masks(vms_vector *checkp, int segnum, fix rad, char *calling_file, int calling_linenum);
77
78 //this macro returns true if the segnum for an object is correct
79 #define check_obj_seg(obj) (get_seg_masks(&(obj)->pos, (obj)->segnum, 0, __FILE__, __LINE__).centermask == 0)
80
81 //Tries to find a segment for a point, in the following way:
82 // 1. Check the given segment
83 // 2. Recursively trace through attached segments
84 // 3. Check all the segmentns
85 //Returns segnum if found, or -1
86 int find_point_seg(vms_vector *p,int segnum);
87
88 //--repair-- // Create data specific to segments which does not need to get written to disk.
89 //--repair-- extern void create_local_segment_data(void);
90
91 //      Sort of makes sure create_local_segment_data has been called for the currently executing mine.
92 //      Returns 1 if Lsegments appears valid, 0 if not.
93 int check_lsegments_validity(void);
94
95 //      ----------------------------------------------------------------------------------------------------------
96 //      Determine whether seg0 and seg1 are reachable using wid_flag to go through walls.
97 //      For example, set to WID_RENDPAST_FLAG to see if sound can get from one segment to the other.
98 //      set to WID_FLY_FLAG to see if a robot could fly from one to the other.
99 //      Search up to a maximum depth of max_depth.
100 //      Return the distance.
101 extern fix find_connected_distance(vms_vector *p0, int seg0, vms_vector *p1, int seg1, int max_depth, int wid_flag);
102
103 //create a matrix that describes the orientation of the given segment
104 extern void extract_orient_from_segment(vms_matrix *m,segment *seg);
105
106 //      In segment.c
107 //      Make a just-modified segment valid.
108 //              check all sides to see how many faces they each should have (0,1,2)
109 //              create new vector normals
110 extern void validate_segment(segment *sp);
111
112 extern void validate_segment_all(void);
113
114 //      Extract the forward vector from segment *sp, return in *vp.
115 //      The forward vector is defined to be the vector from the the center of the front face of the segment
116 // to the center of the back face of the segment.
117 extern  void extract_forward_vector_from_segment(segment *sp,vms_vector *vp);
118
119 //      Extract the right vector from segment *sp, return in *vp.
120 //      The forward vector is defined to be the vector from the the center of the left face of the segment
121 // to the center of the right face of the segment.
122 extern  void extract_right_vector_from_segment(segment *sp,vms_vector *vp);
123
124 //      Extract the up vector from segment *sp, return in *vp.
125 //      The forward vector is defined to be the vector from the the center of the bottom face of the segment
126 // to the center of the top face of the segment.
127 extern  void extract_up_vector_from_segment(segment *sp,vms_vector *vp);
128
129 extern void create_walls_on_side(segment *sp, int sidenum);
130
131 extern void pick_random_point_in_seg(vms_vector *new_pos, int segnum);
132
133 #endif
134
135