Descent3/editor/HRoom.h
2024-06-15 20:12:48 +02:00

289 lines
10 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/editor/HRoom.h $
* $Revision: 1.1.1.1 $
* $Date: 2003-08-26 03:57:38 $
* $Author: kevinb $
*
* Header for HRoom.cpp
*
* $Log: not supported by cvs2svn $
*
* 31 9/15/99 1:56p Matt
* Added the option to allow rooms or groups placed on the terrain to
* either align with the terrain or with gravity.
*
* 30 5/08/99 6:39p Matt
* Added a function to delete a face and all faces connected to it.
*
* 29 4/30/99 6:52p Matt
* Added a function to merge an object's geometry into a room.
*
* 28 4/19/99 12:10a Matt
* Added a menu item to delete a vertex from a face.
*
* 27 4/06/99 10:23a Matt
*
* 26 3/31/99 12:58p Matt
* Added snap-point-to-face
*
* 25 3/23/99 5:12p Matt
* Added function to combine rooms.
*
* 24 12/23/98 10:53a Matt
* Added functions to create a face
*
* 23 10/03/98 8:31p Matt
* Added Join Rooms Exact function.
*
* 22 9/09/98 4:07p Matt
* Added Smooth Bridge function
*
* 21 9/07/98 10:58p Matt
* Added snap point to point.
*
* 20 9/04/98 3:34p Matt
* Added groovy vertex snap code
*
* 19 9/03/98 5:29p Matt
* Added code to fix cracks in levels.
*
* 18 9/02/98 5:57p Matt
* Added code to make faces match exactly when forming a portal. This
* should get rid of all remaining cracking problems.
*
* 17 8/28/98 6:21p Matt
* Added a function to flip a face.
*
* 16 6/25/98 7:15p Matt
* Added a function to delete a pair of portals.
*
* 15 6/23/98 2:45p Matt
* Added option when propagating to all faces in a room to only do so to
* ones with the same texture.
*
* 14 6/08/98 12:28p Matt
* Added a function to triangulate a face
*
* 13 5/22/98 4:47p Matt
* Added menu item to propagate a texture to all the faces in a room.
*
* 12 4/27/98 6:41p Matt
* Added code to join all adjacent faces between two rooms
*
* 11 2/16/98 1:27p Matt
* Added function to snap the placed room to a vertex/edge on the base
* room/face
*
* 10 11/05/97 7:13p Matt
* Added join rooms function
*
* 9 10/03/97 3:38p Matt
* Added place and attach code for rooms on the terrain
*
* 8 9/24/97 3:22p Matt
* Added Drop Room function
*
* 7 9/11/97 5:38p Jason
* initial door coding for room engine
*
* 6 8/21/97 6:01p Matt
* Added combine faces & delete room functions
*
* 5 8/18/97 6:59p Matt
* Implemented Place Room/Attach room system
*
* 4 8/04/97 12:46p Matt
* Added BuildBridge() and SetMarkedRoom()
*
*
* 3 8/01/97 6:15p Matt
* Added code to attach rooms
*
* 2 7/22/97 10:33a Matt
* Added AddRoom()
*
* 1 7/21/97 4:48p Matt
*
* $NoKeywords: $
*/
#ifndef _HROOM_H
#define _HROOM_H
#include "room.h"
// Make the Marked room/face the current room/face
void SetMarkedRoom();
// Select next face on current room
void SelectNextFace();
// Select previous face on current room
void SelectPrevFace();
// Adds a room at the current room/face. The room is created by extuding out from the current face
void AddRoom();
// Recomputes the rotation matrix for the placed room (called when the room rotated)
void ComputePlacedRoomMatrix();
// Place a room for orientation before attachment
// Parameters: baseroomp - pointer to the room in the mine to which the new room will be attached
// baseface - the face on baseroomp to attach to
// placed_room - the number of the room to be attached
// placed_room_face the face on placed_room that's attached
void PlaceRoom(room *baseroomp, int baseface, int placed_room, int placed_room_face, int placed_room_door);
// Lined up a placed room. Moves the placed room so the closest vert to basevert lines up exactly,
// and the edge from basevert to basevert+1 lines up with the corresponding edge on the placed room.
void SnapRoom(int basevert);
// Attach an already-placed room
void AttachRoom();
// Creates a new bridge room connecting two rooms
// Parameters: attroomp,attface - one end of the new room
// baseroom,baseface - the other end of the new room
// The new room is created by extruding from attroom/attface
void BuildBridge(room *attroomp, int attface, room *baseroomp, int baseface);
// Connects two rooms by changing the shape of one room to attach to the other
// Pretty similar to BuildBride(), but doesn't create a new room
// Parameters: attroomp,attface - one end of the new room
// baseroom,baseface - the other end of the new room
void JoinRooms(room *attroomp, int attface, room *baseroomp, int baseface);
// Connects two rooms if they already match up exactly
// Parameters: attroomp,attface - one end of the new room
// baseroom,baseface - the other end of the new room
void JoinRoomsExact(room *attroomp, int attface, room *baseroomp, int baseface);
// Combine two faces, if they can be combined
// Parameters: rp - the room the faces are in
// face0,face1 - the two faces
// Returns: true if the faces were combined, else false
// Note: The UV coordinates of the new face are derrived from face0
bool CombineFaces(room *rp, int face0, int face1);
// Deletes the given room from the mine
void DeleteRoomFromMine(room *rp);
// Places a room a short distance from the specified room & face
// The new room is not attached to anything
// Parameters: baseroomp,baseface - the new room is dropped off of this face
// droproom_num - the room to be dropped
void DropRoom(room *baseroomp, int baseface, int droproom_num);
// Place a room on the terrain for orientation before attachment
// Parameters: cellnum - the cell where the room is being placed
// placed_room - the number of the room to be attached
// placed_room_face the face on placed_room that's attached
void PlaceExternalRoom(int cellnum, int placed_room, int placed_room_face, bool align_to_terrain);
// Find all the adjacent faces between two rooms and join them
void JoinAllAdjacentFaces(room *rp0, room *rp1);
// Propagate a texture from one face to all the faces in the room
// If matching_faces_only is set, only propagate if the face has the same texture
void PropagateToAllFaces(room *rp, int facenum, bool matching_faces_only);
// Splits a face unto triangles, by fanning
// Parameters: rp,facenum - the face to triangulate
// vertnum - the vert that is the base of the fan
void TriangulateFace(room *rp, int facenum, int vertnum);
// Deletes the connection between two rooms. Deletes both portals.
void DeletePortalPair(room *rp, int portalnum);
// Flips a face
void FlipFace(room *rp, int facenum);
// Clips a pair of faces against each other.
// Produces one polygon in each face that is the intersection of the two input faces,
// and zero or more extra polygons, which are parts of the input faces outside the clipping faces.
// The input faces are replaced by the clipped faces, and new faces (formed by the parts of the input
// face outside the clip-against face) are added to the end of the room's facelist.
// This routine assumes that part or all of the being-clipped face is inside the clip-against face
// Parameters: rp0,face0 - the first room:face
// rp1,face1 - the second room:face
// Returns: true if the clip was ok, false if there was an error
bool ClipFacePair(room *rp0, int face0, room *rp1, int face1);
// Takes two faces which are going to be made into a portal and makes them match exactly
// Alternatively, checks if the two faces can be matched
// After this function the two faces will have exactly the same vertices
// Parameters: rp0,facenum0 - one of the faces
// rp1,facenum1 - the other face
// check_only - if set, doesn't change anything; just checks the faces
// Returns the number of points added to the faces
// If just_checking set, returns true if faces match, else false
int MatchPortalFaces(room *rp0, int facenum0, room *rp1, int facenum1, bool check_only = 0);
// Attempt to fix the cracks in a level
void FixCracks();
// Moves a vertex to lie on a specified edge
void SnapPointToEdge(room *rp, int vertnum, vector *v0, vector *v1);
// Moves a vertex to lie on a specified plane
void SnapPointToFace(room *rp, int vertnum, vector *v0, vector *normal);
// If this is not equal to -1, there's a snap that can maybe be undone
extern int Snap_roomnum;
// Moves a vertex to be conincident with another vertex
void SnapPointToPoint(room *rp, int vertnum, room *snapto_rp, int snapto_vertnum);
// Undoes the most recently-performed snap
void UndoSnap();
// Connects two rooms in a pleasing way
void BuildSmoothBridge(room *rp0, int facenum0, room *rp1, int facenum1);
// Functions for building a new face
void AddNewFaceVert();
void StartNewFace();
void EndNewFace();
// Combine the two rooms. base_rp stays, att_rp goes away
// Returns true if combine sucessful, false if can't join
bool CombineRooms(room *base_rp, room *att_rp);
// Creates a an external room and links the specified faces to it
// Parameters: rp - the room to connect to the new room
// nfaces - how many faces connect to the new room (this becomes the number of
//portals) facenums - the list of faces to connect
void LinkToExternalRoom(room *rp, int nfaces, int *facenums);
// Deletes a point from a face
// Parameters: rp,facenum - the face we're deleting the point from
// vertindex - the vertex to delete
void DeletePointFromFace(room *rp, int facenum, int vertindex);
// Incorporates the geometry from the specified object into the specified room. Deletes the object.
// Returns true if worked, false if some error
bool MergeObjectIntoRoom(room *rp, int objnum);
// Delete all the faces connected to the specified face
void DeleteAllConnectedFaces(room *rp, int facenum);
#endif // ifndef _HROOM_H