-
Notifications
You must be signed in to change notification settings - Fork 255
/
Copy pathErooms.h
484 lines (414 loc) · 17.1 KB
/
Erooms.h
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
/*
* Descent 3
* Copyright (C) 2024 Parallax Software
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
--- HISTORICAL COMMENTS FOLLOW ---
* $Logfile: /DescentIII/Main/editor/Erooms.h $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:57:38 $
* $Author: kevinb $
*
* Header for ERooms.cpp
*
* $Log: not supported by cvs2svn $
*
* 50 10/14/99 4:21p Matt
* Added code to remove duplicate faces from a room.
*
* 49 7/14/99 9:07a Gwar
* added a parameter to AllocLoadRoom
*
* 48 7/02/99 2:17p Gwar
* added a parameter to AllocLoadRoom to disable centering on origin
*
* 47 6/17/99 7:34a Gwar
* added some function prototypes
*
* 46 5/05/99 3:02a Gwar
* added a parameter to DeleteRoomFace (by permission)
*
* 45 4/06/99 5:10p Matt
* Base room shell on all portals in the room, not just the first one.
*
* 44 4/01/99 9:42a Matt
* Added code to compute room shells, and made verify level do it.
*
* 43 3/30/99 7:57p Matt
* Added prototype and moved a function to be inline in the header.
*
* 42 3/30/99 7:20p Matt
* Deleted PointsAreColinear(), since it was never used and worked the
* wrong way.
*
* 41 2/03/99 1:10p Matt
* Changed the paletted room current faces to be stored in a separate
* array, instead of in the room structure.
*
* 40 10/03/98 8:05p Matt
* Changed the way CheckIfFaceIsPlanar() works (& renamed it to
* FaceIsPlanar()) and added planar check to VerifyMine() & VerifyRoom()
*
* 39 9/09/98 4:02p Matt
* Added default value for parm to CreateNewRoom()
*
* 38 9/08/98 6:12p Matt
* Added code to check for and fix duplicate and unused points.
*
* 37 9/02/98 4:20p Matt
* Cleaned up some linking code now that we don't have multi-face portals.
*
* 36 9/02/98 2:28p Matt
* New function to add a vertex to a face.
*
* 35 8/31/98 4:37p Matt
* Added improved room & mine error checking.
*
* 34 6/08/98 12:27p Matt
* Added function to copy from one face to another the flags that should
* be inherited.
*
* 33 4/27/98 6:43p Matt
* Cleaned up epsilons some more, and moved some code here from hroom.cpp.
*
* 32 4/16/98 10:41a Matt
* Added FindSharedEdgeAcrossRooms()
*
* 31 4/02/98 12:23p Jason
* trimmed some fat from our structures
*
* 30 4/01/98 3:26p Matt
* Changed NORMALS_SAME_VALUE to have a more reasonable value (was
* 0.99999999, changed to 0.999f)
*
* 29 2/24/98 2:57p Jason
* adjust planar tolerance (again)
*
* 28 2/24/98 1:54p Jason
* added much stricter concavity testing
*
* 27 1/20/98 4:05p Matt
* Move BuildListOfPortalVerts() from roomkeypaddialog.cpp to erooms.cpp
*
* 26 1/15/98 7:34p Matt
* Revamped error checking when computing face normals
*
* 25 10/13/97 5:08p Matt
* Moved ComputeRoomBoundingSphere() & CreateRoomObjects() from editor to
* main
*
*
* 24 10/01/97 7:51p Matt
* Added code for external rooms
*
* 23 9/24/97 3:20p Matt
* Added ComputeRoomMinMax()
*
* 22 9/22/97 2:29p Matt
* Added comment
*
* 21 9/19/97 2:52p Jason
* changes to fix lightmap seam problem
*
* 20 9/17/97 11:50a Jason
* ripped out segment engine
*
* 19 9/12/97 1:25p Matt
* Added ifdef around body to prevent errors when included twice
*
* 18 9/02/97 5:17p Jason
* changes for dynamic lighting
*
* 17 9/02/97 2:28p Matt
* Changed PointOutsideEdge() to the more generally-useful
* CheckPointAgainstEdge()
* Made CopyFace() clear the portal number
*
* 16 8/29/97 5:44p Matt
* Moved a couple functions from hroom.cpp, and added a couple more useful
* functions.
*
* 15 8/26/97 10:24a Matt
* Removed debugging mprintf()
*
* 14 8/22/97 1:02p Matt
* Got CompressMine() working for rooms
*
* 13 8/21/97 5:56p Matt
* Added a bunch of useful functions, and make CheckFaceConcavity() more
* generally useful.
*
* 12 8/04/97 6:46p Jason
* added code for a lightmap system
*
* 11 8/01/97 6:11p Matt
* Added several functions that I needed for attach room code
*
* 10 8/01/97 12:50p Jason
* added code to support scaling of rooms/faces/edges
*
* 9 7/31/97 3:31p Jason
* added functions to rotate portal rooms
*
* 8 7/29/97 1:55p Matt
* Added some generally useful room/face functions
*
* 7 7/20/97 3:41p Jason
* got room/terrain links working (at least in the terrain)
*
* 6 7/18/97 4:37p Matt
* Added function CheckFaceConcavity()
*
*
*
* $NoKeywords: $
*/
#ifndef _EROOMS_H
#define _EROOMS_H
#include "room.h"
#define DEFAULT_ROOM_SIZE 20.0
// Values to determine if two points are the same, if a point is on a plane, & if a point is on an edge
#define POINT_TO_POINT_EPSILON 0.1
#define POINT_TO_PLANE_EPSILON 0.1
#define POINT_TO_EDGE_EPSILON 0.1
// List of current faces for the palette rooms
extern int Current_faces[];
// Called at startup to mark all rooms as unused
void InitRooms();
// Returns a free room number, & marks it no longer free. Returns -1 if none free.
// If palette_room is true, allocate out of the part of the array for the room palette
int GetFreeRoom(bool palette_room);
// Allocates a room & initializes it.
// All fields except the 3d points and the side types are set to default values.
// Memory is allocated for faces & verts arrays, but the elements are *not* initialized
// If palette_room is true, allocate out of the part of the array for the room palette
// Returns: pointer to new room, or NULL if no free rooms
room *CreateNewRoom(int nverts, int nfaces, bool palette_room = 0);
// Searches thru all rooms for a specific name, returns -1 if not found
// or index of room with name
int FindRoomName(char *name);
// saves a room in our ORF (Outrage room file) format
void SaveRoom(int n, char *filename);
// Allocates a room and then tries to load it
// Returns index into Rooms[] array on success
// -1 on fail
int AllocLoadRoom(char *filename, bool bCenter = true, bool palette_room = 1);
// Gets next room from n that has actually been alloced
int GetNextRoom(int n);
// Deterimines whether a face is concave or convex
// Parameters: num_verts - the number of vertices in the face to be tested
// face_verts - list of vertex numbers in this face
// normal - the surface normal of this face
// verts - array of vertices into which face_verts elements index
// Returns: If the face is concave, returns the number of the vertex that makes the concavity.
// If the face is convex, returns -1
// NOTE: A face could have multiple concavities, and this will only find the one with the
// lowest-numbered vertex
int CheckFaceConcavity(int num_verts, int16_t *face_verts, vector *normal, vector *verts);
// Goes through each face of the passed room and sets the default uvs
void AssignDefaultUVsToRoom(room *rp);
// Computes the center point on a face by averaging the points in the face
void ComputeCenterPointOnFace(vector *vp, room *rp, int facenum);
// Computes the center point on a face by averaging the points in the portal
void ComputeCenterPointOnPortal(vector *vp, room *rp, int portalnum);
// Recompute the surface normals for all the faces in a room
// Parameters: rp - pointer to the room
// Returns: true if normals computed ok, false if some normals were bad
bool ResetRoomFaceNormals(room *rp);
// Copies the contents of one face to another.
// Parameters: dfp - pointer to the destination face. This face should be uninitialized.
// sfp - pointer to the source face
void CopyFace(face *dfp, face *sfp);
// Fixes all the concave/nonplanar faces of facelist of room rp
void FixConcaveFaces(room *rp, int *facelist, int facecount);
void AssignDefaultUVsToRoomFace(room *rp, int facenum);
// Changes the number of verts in a face. Frees and reallocates the face_verts & face_uvls arrays.
// Leaves all other fields the same
void ReInitRoomFace(face *fp, int nverts);
// Determines if two points are close enough together to be considered the same
// Parameters: v0,v1 - the two points
// Returns: true if the points are the same or very close; else false
bool PointsAreSame(vector *v0, vector *v1);
// Check to see if a point is in, in front of, or behind a plane
// Parameters: checkpoint - the point to check
// planepoint,normal - the plane we're checking against
// Returns: 0 if on the plane, -1 if behind, 1 if in front
int CheckPointToPlane(vector *checkpoint, vector *planepoint, vector *normal);
// Check to see if all the points on a face are in front of a plane
// Parameters: rp,facenum - the face to check
// planepoint,normal - define the plane we're checking against
// Returns: the number of the first point found on the back of the plane, or -1 of all on front
int CheckFaceToPlane(room *rp, int facenum, vector *planepoint, vector *normal);
// Check if a point is inside, outside, or on an edge of a polygon
// Parameters: checkv - the point to be checked
// v1,v0 - the edge to check against. Two sequential verts in a clockwise polygon.
// normal - the surface normal of the polygon
// Returns: 1 if the point in inside the edge
// 0 if the point is on the edge
// -1 if the point is outside the edge
int CheckPointAgainstEdge(vector *checkv, vector *v0, vector *v1, vector *normal);
// Create space for additional vertices in a room.
// Allocates a new array of vertices, copies from the old list, and frees the old list
// The new vertices are at the end of the list, so none of the old vertices change number
// Parameters: rp - the room
// n_new_verts - how many vertices are being added to the room
// Returns: the number of the first new vertex
int RoomAddVertices(room *rp, int num_new_verts);
// Create space for additional faces in a room.
// Allocates a new faces array, copies from the old list, and frees the old list
// The new faces are at the end of the list, so none of the old faces change number
// Parameters: rp - the room
// num_new_faces - how many faces are being added to the room
// Returns: the number of the first new face
int RoomAddFaces(room *rp, int num_new_faces);
// Structure to hold vector and uvl data for clipping
struct vertex {
vector vec;
roomUVL uvl;
};
// Clips on edge of a polygon against another edge
// Parameters: normal - defines the plane in which these edgs lie
// v0,v1 - the edge to be clipped
// v2,v3 - is the edge clipped against
// newv - filled in with the intersection point
void ClipEdge(vector *normal, vertex *v0, vertex *v1, vector *v2, vector *v3, vertex *newv);
// Finds a shared edge, if one exists, between two faces in the same room
// Parameters: fp0,fp1 - pointers to the two faces
// vn0,vn1 - filled in with the vertex numbers of the edge. These vert numbers are
// relative to their own faces. The shared edge is
//verts <vn0,vn0+1> on face 0, and <vn1+1,vn1> on face 1 Returns: true if a shared edge was found, else
// false
bool FindSharedEdge(face *fp0, face *fp1, int *vn0, int *vn1);
// Finds a shared edge, if one exists, between two faces in different rooms
// Parameters: rp0,rp1 - pointers to the two rooms
// face0,face1 - the face numbers in rp0 & rp1, respectively
// vn0,vn1 - filled in with the vertex numbers of the edge. These vert numbers are
// relative to their own faces. The shared edge is
//verts <vn0,vn0+1> on face 0, and <vn1+1,vn1> on face 1 Returns: true if a shared edge was found, else
// false
bool FindSharedEdgeAcrossRooms(room *rp0, int face0, room *rp1, int face1, int *vn0, int *vn1);
// If two surface normals have a dot product greater than or equal to this value, they are the same
#define NORMALS_SAME_VALUE .999f
// Determines if two normals are the same (or very very close)
// Parameters: n0,n1 - the two normals
// Returns: true if they are more-or-less the same, else false
inline bool NormalsAreSame(vector *n0, vector *n1) {
float d = *n0 * *n1;
return (d > NORMALS_SAME_VALUE);
}
// Delete a face from a room
// Parameters: rp - the room the face is in
// facenum - the face to be deleted
void DeleteRoomFace(room *rp, int facenum, bool delete_unused_verts = true);
// Deletes a portal from a room. Does not delete this portal this connects to
// Parameters: rp - the room the portal is in
// portalnum - the portal to be deleted
void DeleteRoomPortal(room *rp, int portalnum);
// Remove holes in the room list
void CompressRooms(void);
// Compress mine by getting rid of holes the the room array
void CompressMine(void);
// Copies the data from one room into another
// Note: Portals are not copied, and the new room will have zero portals
// The destination room is assumed to be uninitialized
// Parameters: destp - the destination room of the copy
// srcp - the source room for the copy
void CopyRoom(room *destp, room *srcp);
// Links two rooms, creating portals in each room
// Parameters: roomlist - pointer to the array of rooms
// room0,face0 - the room & face numbers of the first room
// room1,face1 - the room & face numbers of the second room
void LinkRooms(room *roomlist, int room0, int face0, int room1, int face1);
// Back when we had multi-face portals, LinkRoomsSimple() created a pair of 1-face portals
#define LinkRoomsSimple LinkRooms
// Finds the min and max x,y,z values of the vertices in a room
// Parameters: min,max - filled in with the minimum and maximum x,y, & z values, respectively
// rp = the room
void ComputeRoomMinMax(vector *min, vector *max, room *rp);
// Builds a list of all the vertices in a room that are part of a portal
// Parameters: rp - the room to check
// list - filled in with the list of vert numbers. List should be
//MAX_VERTS_PER_ROOM big Returns: the number of verts in the list
int BuildListOfPortalVerts(room *rp, int *list);
// Copy the flags from one face to another derrived from the first (by clipping or splitting)
// Only those flags which are safe to copy are copied
// Parameters: dfp - pointer to the destination face
// sfp - pointer to the source face
void CopyFaceFlags(face *dfp, face *sfp);
// Test the mine for validity
void VerifyMine();
// Test the given room for validity
void VerifyRoom(room *rp);
// Inserts a vertex into a face
// Parameters: rp - the room for this face
// facenum - the face to which to add the vertex
// new_v - the number of the vertex to add
// after_v - the new vert is added *after* this vert (index into face verts)
void AddVertToFace(room *rp, int facenum, int new_v, int after_v);
// Removes all the duplicate points in a level
void RemoveAllDuplicateAndUnusedPoints();
// Checks to see if a face is planar.
// See if all the points are within a certain distance of an average point
// Returns 1 if face is planar, 0 if not
bool FaceIsPlanar(int nv, int16_t *face_verts, vector *normal, vector *verts);
// Checks to see if a face is planar.
// See if all the points are within a certain distance of an average point
// Returns 1 if face is planar, 0 if not
inline bool FaceIsPlanar(room *rp, int facenum) {
face *fp = &rp->faces[facenum];
return FaceIsPlanar(fp->num_verts, fp->face_verts, &fp->normal, rp->verts);
}
// Finds the shell for the specified room. If the shell is found with no errors, sets
// the non-shell flag for those faces not in the shell. If there are errors finding the
// shell, all faces have the non-shell flag cleared.
// Returns the number of shell errors (unconnected edges) in the room.
// Writes errors to the error buffer
int ComputeRoomShell(room *rp);
// Finds shells for all rooms.
// Returns the number of rooms with bad shells
int ComputeAllRoomShells();
// Log an error in the room check process
void CheckError(const char *str, ...);
// Checks the normals in a room
// Returns the number of bad normals
int CheckNormals(room *rp);
// Checks for concave faces
// Returns the number of concave faces
int CheckConcaveFaces(room *rp);
int CheckDegenerateFaces(room *rp);
// Checks for bad portal connections
// Returns the number of bad portals
int CheckPortals(room *rp);
// Checks for duplicate faces
// Returns the number of duplicate faces
int CheckDuplicateFaces(room *rp);
// Checks for non-planar faces
// Returns the number of non-planar faces
int CheckNonPlanarFaces(room *rp);
// Checks for duplicate points
// Returns the number of duplicate points
int CheckDuplicatePoints(room *rp);
// Find any unused points in a room
int CheckUnusedPoints(room *rp);
// Checks for duplicate points in faces
// Returns the number of duplicate face points
int CheckDuplicateFacePoints(room *rp);
int CheckRoomPortalFaces(room *rp);
// Find t-joints in this room
int FindTJoints(room *rp);
// Counts the number of unique textures in a level, plus gives names of textures used
void CountUniqueTextures();
// Removes all the duplicate faces in a room
void RemoveDuplicateFaces(room *rp);
#endif // ifndef _EROOMS_H