Descent3/legacy/editor/HRoom.h
JeodC a4ab78192c Join license header with historical commentrs
Join the license header with historical comments using a separator so IDEs can correctly parse the initial header.

Also use .gitattributes to ensure all files are LF.
2024-05-08 14:41:19 -04: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