mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
602 lines
17 KiB
C
602 lines
17 KiB
C
/*
|
|
* 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/room.h $
|
|
* $Revision: 104 $
|
|
* $Date: 5/05/99 5:03a $
|
|
* $Author: Gwar $
|
|
*
|
|
* Room structures & functions
|
|
*
|
|
* $Log: /DescentIII/main/room.h $
|
|
*
|
|
* 104 5/05/99 5:03a Gwar
|
|
* renamed ned_GameTextures array to GameTextures in new editor to make
|
|
* game code happy; 3D texture view still does not display textures
|
|
*
|
|
* 103 4/30/99 12:56p Kevin
|
|
* Lowered values for MAX_SOUNDS, MAX_ROOMS, MAX_TEXTURES and MAX_OBJIDS.
|
|
* Talk to me before changing any of these again.
|
|
*
|
|
* 102 4/21/99 5:33a Gwar
|
|
* added a NEWEDITOR #define
|
|
*
|
|
* 101 3/24/99 3:27p Matt
|
|
* Increased the max number of room changes from 20 to 100.
|
|
*
|
|
* 100 2/09/99 9:59a Chris
|
|
* Massive BOA update :) Terrain happy now. Vis happy now. Sound happy
|
|
* now.
|
|
*
|
|
* 99 1/21/99 11:15p Jeff
|
|
* pulled out some structs and defines from header files and moved them
|
|
* into separate header files so that multiplayer dlls don't require major
|
|
* game headers, just those new headers. Side effect is a shorter build
|
|
* time. Also cleaned up some header file #includes that weren't needed.
|
|
* This affected polymodel.h, object.h, player.h, vecmat.h, room.h,
|
|
* manage.h and multi.h
|
|
*
|
|
* 98 1/21/99 11:34a Matt
|
|
* Got rid of portal triggers. Since we don't have multi-face portals, a
|
|
* face trigger works fine for a portal. Also fixed a few editor/trigger
|
|
* bugs.
|
|
*
|
|
* 97 1/21/99 11:20a Jason
|
|
* added a two new flags: strobe and flicker
|
|
*
|
|
* 96 1/20/99 6:11p Matt
|
|
* Fixed a couple bugs in the room wind/fog change system, and make the
|
|
* values change from current -> new instead of start -> end.
|
|
*
|
|
* 95 1/19/99 11:25a Jason
|
|
* added room (fog and wind) changing functions
|
|
*
|
|
* 94 1/15/99 3:14p Jason
|
|
* added combinable portals
|
|
*
|
|
* 93 1/11/99 11:17a Jason
|
|
* made fog not have that stupid telltale z problem
|
|
*
|
|
* 92 1/08/99 5:37p Samir
|
|
* reverb values per room.
|
|
*
|
|
* 91 12/22/98 2:03p Matt
|
|
* Added room names, and made rooms not compress so that room numbers are
|
|
* suitable for persistant uses.
|
|
*
|
|
* 90 11/30/98 3:59p Jason
|
|
* changed dynamic lighting to be better
|
|
*
|
|
* 89 11/02/98 6:15p Chris
|
|
* Room AABBs get saved with the level and the sort_face and dec_sort_face
|
|
* list s have been removed
|
|
*
|
|
* 88 10/06/98 6:08p Jason
|
|
* added RF_TRIANGULATE so that special rooms (with non-planar UVS) can be
|
|
* drawn correctly
|
|
*
|
|
* 87 10/01/98 10:33a Jason
|
|
* added room_change_flags
|
|
*
|
|
* 86 9/22/98 6:58p Samir
|
|
* Render_floating_triggers is _DEBUG code, so make it so.
|
|
*
|
|
* 85 9/22/98 3:55p Samir
|
|
* ifdef out stuff for non-debug version.
|
|
*
|
|
* 84 9/08/98 12:05p Jason
|
|
* moved doorway.h out of room.h
|
|
*
|
|
* 83 9/01/98 12:04p Matt
|
|
* Ripped out multi-face portal code
|
|
*
|
|
* 82 8/28/98 4:44p Jason
|
|
* optimized mirror rendering
|
|
*
|
|
* 81 8/27/98 5:19p Jason
|
|
* added first rev of reflected surfaces
|
|
*
|
|
* 80 8/19/98 2:17p Jeff
|
|
* made a function to change the texture on a face
|
|
*
|
|
* 79 8/17/98 6:40p Matt
|
|
* Added ambient sound system
|
|
*
|
|
* 78 7/21/98 2:14p Chris
|
|
* Some FVI speedups - not done
|
|
*
|
|
* 77 7/17/98 9:56a Chris
|
|
* Intermediate checkin
|
|
*
|
|
* 76 7/16/98 8:29p Chris
|
|
* Partial implementation of the new collide code
|
|
*
|
|
* 75 7/16/98 12:06p Jason
|
|
* added special flags to room structure
|
|
*
|
|
* 74 6/08/98 12:28p Matt
|
|
* Removed unused face flag, and changed some commenting.
|
|
*
|
|
* 73 6/05/98 5:22p Jason
|
|
* added volumetric fog
|
|
*
|
|
* 72 6/02/98 6:03p Jason
|
|
* added specular lightmaps
|
|
*
|
|
* 71 5/26/98 5:56p Jason
|
|
* only render coronas which are flagged
|
|
*
|
|
* 70 5/25/98 3:46p Jason
|
|
* added better light glows
|
|
*
|
|
* 69 5/22/98 3:26p Jason
|
|
* added better memory management for specular lighting
|
|
*
|
|
* 68 5/22/98 12:34p Matt
|
|
* Added scorch mark/bullet hole system.
|
|
*
|
|
* 67 5/15/98 5:41p Jason
|
|
* implemented volume lighting system
|
|
*
|
|
* 66 5/06/98 12:55p Jason
|
|
* did some vis effect optimizations
|
|
*
|
|
* 65 4/30/98 5:50p Jason
|
|
* more framerate optimizations
|
|
*
|
|
* 64 4/30/98 12:37p Jason
|
|
* added FF_FACING for non-backfaces
|
|
*
|
|
* 63 4/22/98 12:38p Chris
|
|
* Added path points to portals and rooms. Improved BOA auto-making
|
|
* process.
|
|
*
|
|
* 62 4/02/98 12:24p Jason
|
|
* trimmed some fat from our structures
|
|
*
|
|
* 61 3/18/98 4:31p Chris
|
|
* Speed up fvi and fixed some bugs
|
|
*
|
|
* 60 3/16/98 6:41p Jason
|
|
* added goal room stuff
|
|
*
|
|
* 59 3/16/98 5:50p Chris
|
|
* Added sorted face lists for fvi
|
|
*
|
|
* 58 3/13/98 12:05p Matt
|
|
* Changed the way we determine whether to render past a closed door to
|
|
* fix a render bug when the viewer is in a door room.
|
|
* Moved FaceIsRenderabl(), GetFaceAlpha(), and RenderPastPortal() from
|
|
* room.h to render.cpp.
|
|
*
|
|
* 57 3/06/98 3:23p Jason
|
|
* added lighting from satellites to indoor rooms
|
|
*
|
|
* 56 2/23/98 6:50p Jason
|
|
* changes to help facilitate fast lighting with shadow volumes
|
|
*
|
|
*
|
|
* 55 2/18/98 1:21p Jason
|
|
* upped max lightmap count
|
|
*
|
|
* 54 2/11/98 7:01p Chris
|
|
* Started to add wind
|
|
*
|
|
* 53 2/11/98 11:48a Matt
|
|
* Fixed alignment in room struct.
|
|
*
|
|
* 52 2/10/98 7:45p Matt
|
|
* Added (probably temporary) flags for goals
|
|
*
|
|
* 51 2/10/98 3:49p Jason
|
|
* added pulsing walls
|
|
*
|
|
* 50 2/10/98 1:12p Jason
|
|
* added forcefields and saturating walls
|
|
*
|
|
* 49 2/04/98 8:25p Jason
|
|
* added light multiplier for faces
|
|
*
|
|
* 48 2/02/98 7:07p Matt
|
|
* Added support for doors that can be seen through even when closed
|
|
*
|
|
* 47 2/02/98 5:13p Matt
|
|
* Added more generic function to compute a surface normal for a face
|
|
*
|
|
* 46 1/20/98 12:10p Jason
|
|
* implemented vis effect system
|
|
*
|
|
* 45 1/15/98 7:34p Matt
|
|
* Revamped error checking when computing face normals
|
|
*
|
|
* 44 1/15/98 3:47p Jason
|
|
* sped up room rendering on the terrain
|
|
*
|
|
* 43 1/12/98 3:34p Jason
|
|
* sped up indoor rendering by clipping faces against portals
|
|
*
|
|
* 42 11/24/97 1:30a Jason
|
|
* first attempt at adding shadows
|
|
*
|
|
* 41 11/14/97 9:02p Mark
|
|
* Increased the number of rooms from 100 to 500 (Matt on Mark's machine)
|
|
*
|
|
* 40 11/14/97 6:39p Jason
|
|
* added ability to do lighting on a single room
|
|
*
|
|
* 39 10/13/97 5:08p Matt
|
|
* Moved ComputeRoomBoundingSphere() & CreateRoomObjects() from editor to
|
|
* main
|
|
*
|
|
*
|
|
* 38 10/10/97 11:38a Jason
|
|
* put in better volumetric support
|
|
*
|
|
* 37 10/08/97 2:28p Jason
|
|
* got external rooms working with terrain lighting
|
|
*
|
|
* 36 10/01/97 7:51p Matt
|
|
* Added code for external rooms
|
|
*
|
|
* 35 9/19/97 8:09p Jason
|
|
* optimizations for dynamic lighting
|
|
*
|
|
* 34 9/19/97 2:52p Jason
|
|
* changes to fix lightmap seam problem
|
|
*
|
|
* 33 9/17/97 6:14p Jason
|
|
* did some optimizations due to running vtune
|
|
*
|
|
* 32 9/16/97 4:27p Matt
|
|
* Got rid of static_light & changed fields in the room struct
|
|
*
|
|
* 31 9/16/97 1:07a Matt
|
|
* Fixed rendering past open doors
|
|
*
|
|
* 30 9/15/97 5:33p Jason
|
|
* made portals check for doors
|
|
*
|
|
* 29 9/12/97 5:38p Jason
|
|
* got doors working
|
|
*
|
|
* 28 9/12/97 2:35p Matt
|
|
* Changed face flags to a word, and added destroyed flag
|
|
*
|
|
* 27 9/11/97 3:13p Matt
|
|
* Several more-or-less small changes, mostly with portal triggers
|
|
*
|
|
* 26 9/10/97 5:13p Matt
|
|
* Changed some flags & added a few functions
|
|
*
|
|
* 25 9/09/97 12:21p Matt
|
|
* Added new flags, deleted old ones, renamed others
|
|
* Added new functions
|
|
* Cleaned up structs, fixing alignment
|
|
*
|
|
* 24 9/06/97 10:53p Matt
|
|
* Added portal and face flags
|
|
*
|
|
* 23 9/04/97 11:23a Jason
|
|
* sped up dynamic light computation a bit
|
|
*
|
|
* 22 9/02/97 5:17p Jason
|
|
* changes for dynamic lighting
|
|
*
|
|
* 21 9/02/97 12:55p Jason
|
|
* classify faces as alphaed or not
|
|
*
|
|
* 20 8/28/97 12:31p Jason
|
|
* added hi-res lightmaps for radiosity
|
|
*
|
|
* 19 8/19/97 1:13p Jason
|
|
* added GetAreaForFace function
|
|
*
|
|
* 18 8/13/97 11:53a Jason
|
|
* moved ClearAllRoomLightmaps into room.cpp where it belongs
|
|
*
|
|
* 17 8/12/97 3:51p Jason
|
|
* tweaked lightmaps with radiosity
|
|
*
|
|
* 16 8/12/97 1:13p Chris
|
|
* Added AABBs.
|
|
*
|
|
* 15 8/12/97 1:10a Jason
|
|
* added code to support radiosity lighting
|
|
*
|
|
* 14 8/11/97 3:55p Chris
|
|
* Added a function to compute the rough center of a portal
|
|
*
|
|
* 13 8/04/97 5:35p Chris
|
|
*
|
|
* 12 8/01/97 4:38p Chris
|
|
*
|
|
* 11 7/18/97 5:36p Jason
|
|
* save changed paletted rooms on exit
|
|
*
|
|
* 10 7/17/97 11:50a Jason
|
|
* Upped max_Verts_per_face to 64
|
|
*
|
|
* 9 7/16/97 1:50p Sean
|
|
* from JASON: upped max face limit to 3000
|
|
*
|
|
* 8 6/30/97 1:30p Jason
|
|
* added netherspace stuff
|
|
*
|
|
* 7 6/27/97 4:15p Jason
|
|
* added more room functions
|
|
*
|
|
* 6 6/27/97 3:04p Jason
|
|
* added cool room stuff
|
|
*
|
|
* 5 6/26/97 2:37p Jason
|
|
* added combine_faces function and texturing to rooms
|
|
*
|
|
* 4 6/25/97 5:29p Jason
|
|
* added/modified code to display a room
|
|
*
|
|
* 3 6/24/97 1:51p Jason
|
|
*
|
|
* 2 6/18/97 12:40p Jason
|
|
* added include files
|
|
*
|
|
* 1 6/18/97 12:39p Jason
|
|
*
|
|
* $NoKeywords: $
|
|
*/
|
|
|
|
#ifndef _ROOM_H
|
|
#define _ROOM_H
|
|
|
|
#include "pstypes.h"
|
|
#include "vecmat_external.h"
|
|
#include "gametexture.h"
|
|
|
|
#ifdef NEWEDITOR
|
|
#include "..\neweditor\ned_GameTexture.h"
|
|
#endif
|
|
|
|
#include "room_external.h"
|
|
|
|
// Sizes for some global arrays
|
|
#define MAX_ROOMS 400 // max number of rooms in the world
|
|
|
|
// Constants for room palette (editor-specific)
|
|
#if (defined(EDITOR) || defined(NEWEDITOR))
|
|
#define FIRST_PALETTE_ROOM MAX_ROOMS // start of rooms for palette
|
|
#define MAX_PALETTE_ROOMS 50 // max number of loaded rooms
|
|
#else
|
|
#define MAX_PALETTE_ROOMS 0 // max number of loaded rooms
|
|
#endif
|
|
|
|
// Room change stuff
|
|
#define MAX_ROOM_CHANGES 100
|
|
struct room_changes {
|
|
int roomnum;
|
|
bool fog;
|
|
vector start_vector, end_vector;
|
|
float start_depth, end_depth;
|
|
float start_time;
|
|
float total_time;
|
|
uint8_t used;
|
|
};
|
|
|
|
//
|
|
// Globals
|
|
//
|
|
|
|
extern room Rooms[]; // global sparse array of rooms
|
|
extern int Highest_room_index; // index of highest-numbered room
|
|
|
|
//
|
|
// Macros
|
|
//
|
|
|
|
// Handy macro to convert a room ptr to a room number
|
|
#define ROOMNUM(r) (r - Rooms)
|
|
|
|
// See above from RF_MINE_MASK
|
|
#define MINE_INDEX(x) ((Rooms[x].flags & RFM_MINE) >> 20)
|
|
|
|
//
|
|
// Functions
|
|
//
|
|
|
|
// Zeroes out the rooms array
|
|
void InitRooms();
|
|
|
|
#if (defined(_DEBUG) || defined(EDITOR))
|
|
// Allows a spew'er to find out if he is in a room or external to the mine
|
|
// NOTE: THIS FUNCTION IS NOT FOR IN GAME STUFF. It is REALLY SLOW and accurate.
|
|
// Talk to Chris if you need something like this function.
|
|
int FindPointRoom(vector *pnt);
|
|
|
|
// Put this here so we don't need to include render.h
|
|
extern bool Render_floating_triggers;
|
|
|
|
#endif
|
|
|
|
// Initalize a room, allocating memory and filling in fields
|
|
// Parameters: rp - the room to be initialized
|
|
// nverts - how many vertices this room will have
|
|
// nfaces - how many faces this room wil have
|
|
// nfaces - how many portals this room wil have
|
|
void InitRoom(room *rp, int nverts, int nfaces, int nportals);
|
|
|
|
// Initialize a room face structure, allocating memory for vertlist and uvls
|
|
void InitRoomFace(face *fp, int nverts);
|
|
|
|
// Frees a room, deallocating its memory and marking it as unused
|
|
void FreeRoom(room *rp);
|
|
|
|
// Frees all the rooms currently in use, deallocating their memory and marking them as unused
|
|
void FreeAllRooms();
|
|
|
|
// Finds the center point of a room
|
|
// Parameters: vp - filled in with the center point
|
|
// rp - the room whose center to find
|
|
void ComputeRoomCenter(vector *vp, room *rp);
|
|
|
|
// Computes (fills in) the surface normal of a face.
|
|
// Finds the best normal on this face by checking all sets of three vertices
|
|
// IMPORTANT: The caller should really check the return value of this function
|
|
// Parameters: rp,facenum - the room and face to calculate the normal for
|
|
// Returns: true if the normal is ok
|
|
// false if the normal has a very small (pre-normalization) magnitude
|
|
bool ComputeFaceNormal(room *rp, int facenum);
|
|
|
|
// Compute the surface normal from a list of vertices that determine a face
|
|
// Finds the best normal on this face by checking all sets of three vertices
|
|
// IMPORTANT: The caller should really check the return value of this function
|
|
// Parameters: normal - this is filled in with the normal
|
|
// num_verts - how many vertices in the face
|
|
// vertnum_list - a list of vertex numbers for this face. these index into verts
|
|
// verts - the array of vertices into which the elements of vertnum_list index
|
|
// Returns: true if the normal is ok
|
|
// false if the normal has a very small (pre-normalization) magnitude
|
|
bool ComputeNormal(vector *normal, int num_verts, short *vertnum_list, vector *verts);
|
|
|
|
// Finds the center point of a portal by averaging the points in the portal
|
|
// Parameters: vp - filled in with the center point
|
|
// rp - the room
|
|
// portal_index - the index of the portal whose center to find
|
|
void ComputePortalCenter(vector *vp, room *rp, int portal_index);
|
|
|
|
// Computes the center point on a face by averaging the points in the face
|
|
void ComputeCenterPointOnFace(vector *vp, room *rp, int facenum);
|
|
|
|
// Free the memory used by a room face structure
|
|
void FreeRoomFace(face *fp);
|
|
|
|
// Removes all room lightmaps from memory and sets indoor faces accordingly
|
|
void ClearAllRoomLightmaps(int external);
|
|
|
|
// Removes all room volume lights from memory
|
|
void ClearAllVolumeLights();
|
|
|
|
// Returns the area taken up by a face
|
|
float GetAreaForFace(room *rp, int facenum);
|
|
|
|
// Check if a particular point on a wall is a transparent pixel
|
|
// Parameters: pnt - the point we're checking
|
|
// rp - pointer to the room that pnt is in
|
|
// facenum - the face that pnt is on
|
|
// Returns: true if can pass through the given point, else 0
|
|
int CheckTransparentPoint(const vector *pnt, const room *rp, const int facenum);
|
|
|
|
// Face physics flags returned by GetFacePhysicsFlags()
|
|
// Note that:
|
|
// it is illegal for a face to have both SOLID and TRANSPARENT
|
|
// it is legal, but probably not of interest, for a face to have SOLID & PORTAL
|
|
#define FPF_SOLID 1 // nothing passes through this face
|
|
#define FPF_TRANSPARENT 2 // face has transparency, so some things may be able to fly through it
|
|
#define FPF_PORTAL 4 // this face is in a portal.
|
|
#define FPF_RECORD 8 // take note of when an object passes through this face
|
|
|
|
// Face physics types. These are combinations of the above flags
|
|
#define FPT_IGNORE 0 // completey ignore this face
|
|
|
|
// Figure out how the physics should deal with a given face
|
|
// Parameters: rp - pointer to the room the face is in
|
|
// fp - the face we're interested in
|
|
// Returns: bitmask of flags (see above).
|
|
static inline int GetFacePhysicsFlags(const room *rp, const face *fp) {
|
|
int ret = 0;
|
|
|
|
// If face is a trigger, must record
|
|
if (fp->flags & FF_HAS_TRIGGER)
|
|
ret |= FPF_RECORD;
|
|
|
|
// If it's a floating trigger, then we're done
|
|
if (fp->flags & FF_FLOATING_TRIG)
|
|
return ret;
|
|
|
|
if (fp->flags & FF_VOLUMETRIC)
|
|
return ret;
|
|
|
|
// Deal with faces that are part of a portal
|
|
if (fp->portal_num != -1) {
|
|
portal *pp = &rp->portals[fp->portal_num];
|
|
|
|
// Mark as portal
|
|
ret |= FPF_PORTAL;
|
|
|
|
// Face is flythrough if we don't render the portal faces, or it's marked rendered flythrough
|
|
if (!(pp->flags & PF_RENDER_FACES) || (pp->flags & PF_RENDERED_FLYTHROUGH))
|
|
return ret;
|
|
}
|
|
|
|
// If we're here, it's either a non-portal face, or portal face that gets rendered
|
|
|
|
// Check if the face is marked fly-through
|
|
if (GameTextures[fp->tmap].flags & TF_FLY_THRU)
|
|
return ret;
|
|
|
|
// Check if the face is solid or transparent
|
|
int bm_handle = GetTextureBitmap(fp->tmap, 0);
|
|
if (GameBitmaps[bm_handle].flags & BF_TRANSPARENT)
|
|
ret |= FPF_TRANSPARENT;
|
|
else
|
|
ret |= FPF_SOLID;
|
|
|
|
// We're done
|
|
return ret;
|
|
}
|
|
|
|
// Computes a bounding sphere for the current room
|
|
// Parameters: center - filled in with the center point of the sphere
|
|
// rp - the room we're bounding
|
|
// Returns: the radius of the bounding sphere
|
|
float ComputeRoomBoundingSphere(vector *center, room *rp);
|
|
|
|
// Create objects for the external rooms
|
|
void CreateRoomObjects();
|
|
|
|
// Clears lightmaps for a single room
|
|
void ClearRoomLightmaps(int roomnum);
|
|
|
|
// returns the index of the first room that is being used. Returns -1 if there are none
|
|
int FindFirstUsedRoom();
|
|
|
|
// Clears specmaps for a single room
|
|
void ClearRoomSpecmaps(int roomnum);
|
|
|
|
// Removes all room specularity maps from memory and sets indoor faces accordingly
|
|
// External=1 means to perform the operation on external rooms only, 0 means indoor rooms only
|
|
void ClearAllRoomSpecmaps(int external);
|
|
|
|
extern void GetIJ(const vector *normal, int *ii, int *jj);
|
|
|
|
// Changes a face's texture within a room
|
|
// returns true on successs
|
|
bool ChangeRoomFaceTexture(int room_num, int face_num, int texture);
|
|
|
|
// Clears the data for room changes
|
|
void ClearRoomChanges();
|
|
|
|
// Returns index of room change allocatd, else -1 on error
|
|
int AllocRoomChange();
|
|
|
|
// Does whatever fading/changing of room stuff that needs to be done this frame
|
|
void DoRoomChangeFrame();
|
|
|
|
// Sets up a room to change its fog or wind over time
|
|
int SetRoomChangeOverTime(int roomnum, bool fog, vector *end, float depth_end, float time);
|
|
|
|
#endif
|