dxx-rebirth/common/main/gameseg.h
Kp 6a3ded191f Move EDITOR to dxxsconf.h; rename to DXX_USE_EDITOR
Rename symbol EDITOR to DXX_USE_EDITOR to show that it is a DXX
symbol, not one inherited from a library.  Move it to dxxsconf.h to
shorten the command line.

This is a mostly automated transform, but the changes to SConstruct were
manual.

git grep -wl EDITOR -- '*.h' '*.cpp' | xargs sed -i -e 's/^\s*#ifdef \(EDITOR\)\>/#if DXX_USE_\1/' -e 's/\s*#\(el\)\?if \(.*\)defined(\(EDITOR\))/#\1if \2DXX_USE_\3/' -e 's/^\s*#ifndef \(EDITOR\)\>/#if !DXX_USE_\1/'
2016-09-11 18:49:16 +00:00

217 lines
8.6 KiB
C++

/*
* Portions of this file are copyright Rebirth contributors and licensed as
* described in COPYING.txt.
* Portions of this file are copyright Parallax Software and licensed
* according to the Parallax license below.
* See COPYING.txt for license details.
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
*/
/*
*
* Header file for stuff moved from segment.c to gameseg.c.
*
*/
#pragma once
#include "pstypes.h"
#include "maths.h"
#include "vecmat.h"
#include "segment.h"
#ifdef __cplusplus
#include <utility>
#include "dxxsconf.h"
#include "dsx-ns.h"
#include "compiler-array.h"
namespace dcx {
struct segmasks
{
short facemask; //which faces sphere pokes through (12 bits)
sbyte sidemask; //which sides sphere pokes through (6 bits)
sbyte centermask; //which sides center point is on back of (6 bits)
};
struct segment_depth_array_t : public array<ubyte, MAX_SEGMENTS> {};
extern unsigned Highest_vertex_index; // Highest index in Vertices and Vertex_active, an efficiency hack
struct side_vertnum_list_t : array<int, 4> {};
struct vertex_array_list_t : array<int, 6> {};
struct vertex_vertnum_pair
{
int vertex, vertnum;
};
using vertex_vertnum_array_list = array<vertex_vertnum_pair, 6>;
}
#ifdef dsx
namespace dsx {
extern int Doing_lighting_hack_flag;
void compute_center_point_on_side(vms_vector &vp,vcsegptr_t sp,int side);
static inline vms_vector compute_center_point_on_side(const vcsegptr_t sp,int side)
{
vms_vector v;
return compute_center_point_on_side(v, sp, side), v;
}
void compute_segment_center(vms_vector &vp,vcsegptr_t sp);
static inline vms_vector compute_segment_center(vcsegptr_t sp)
{
vms_vector v;
compute_segment_center(v, sp);
return v;
}
int_fast32_t find_connect_side(vcsegptridx_t base_seg, vcsegptr_t con_seg) __attribute_warn_unused_result;
// Fill in array with four absolute point numbers for a given side
void get_side_verts(side_vertnum_list_t &vertlist,vcsegptr_t segnum,int sidenum);
static inline side_vertnum_list_t get_side_verts(vcsegptr_t segnum,int sidenum)
{
side_vertnum_list_t r;
return get_side_verts(r, segnum, sidenum), r;
}
#if DXX_USE_EDITOR
// Create all vertex lists (1 or 2) for faces on a side.
// Sets:
// num_faces number of lists
// vertices vertices in all (1 or 2) faces
// If there is one face, it has 4 vertices.
// If there are two faces, they both have three vertices, so face #0 is stored in vertices 0,1,2,
// face #1 is stored in vertices 3,4,5.
// Note: these are not absolute vertex numbers, but are relative to the segment
// Note: for triagulated sides, the middle vertex of each trianle is the one NOT
// adjacent on the diagonal edge
uint_fast32_t create_all_vertex_lists(vertex_array_list_t &vertices, vcsegptr_t segnum, const side *sidep, uint_fast32_t sidenum);
__attribute_warn_unused_result
static inline std::pair<uint_fast32_t, vertex_array_list_t> create_all_vertex_lists(vcsegptr_t segnum, const side *sidep, uint_fast32_t sidenum)
{
vertex_array_list_t r;
auto n = create_all_vertex_lists(r, segnum, sidep, sidenum);
return {n, r};
}
#endif
//like create_all_vertex_lists(), but generate absolute point numbers
uint_fast32_t create_abs_vertex_lists(vertex_array_list_t &vertices, vcsegptr_t segnum, const side *sidep, uint_fast32_t sidenum);
__attribute_warn_unused_result
static inline std::pair<uint_fast32_t, vertex_array_list_t> create_abs_vertex_lists(vcsegptr_t segnum, const side *sidep, uint_fast32_t sidenum)
{
vertex_array_list_t r;
auto n = create_abs_vertex_lists(r, segnum, sidep, sidenum);
return {n, r};
}
__attribute_warn_unused_result
static inline std::pair<uint_fast32_t, vertex_array_list_t> create_abs_vertex_lists(vcsegptr_t segp, uint_fast32_t sidenum)
{
return create_abs_vertex_lists(segp, &segp->sides[sidenum], sidenum);
}
// -----------------------------------------------------------------------------------
// Like create all vertex lists, but returns the vertnums (relative to
// the side) for each of the faces that make up the side.
// If there is one face, it has 4 vertices.
// If there are two faces, they both have three vertices, so face #0 is stored in vertices 0,1,2,
// face #1 is stored in vertices 3,4,5.
void create_all_vertnum_lists(vertex_vertnum_array_list &vertnums, vcsegptr_t segnum, const side *const sidep, uint_fast32_t sidenum);
__attribute_warn_unused_result
static inline vertex_vertnum_array_list create_all_vertnum_lists(vcsegptr_t segnum, const side *const sidep, uint_fast32_t sidenum)
{
vertex_vertnum_array_list r;
return create_all_vertnum_lists(r, segnum, sidep, sidenum), r;
}
}
namespace dcx {
// Given a side, return the number of faces
int get_num_faces(const side *sidep);
struct WALL_IS_DOORWAY_mask_t;
}
namespace dsx {
//returns 3 different bitmasks with info telling if this sphere is in
//this segment. See segmasks structure for info on fields
segmasks get_seg_masks(const vms_vector &checkp, vcsegptr_t segnum, fix rad);
//this macro returns true if the segnum for an object is correct
#define check_obj_seg(obj) (get_seg_masks((obj)->pos, vcsegptr((obj)->segnum), 0).centermask == 0)
//Tries to find a segment for a point, in the following way:
// 1. Check the given segment
// 2. Recursively trace through attached segments
// 3. Check all the segmentns
//Returns segnum if found, or -1
segptridx_t find_point_seg(const vms_vector &p,segptridx_t segnum);
// ----------------------------------------------------------------------------------------------------------
// Determine whether seg0 and seg1 are reachable using wid_flag to go through walls.
// For example, set to WID_RENDPAST_FLAG to see if sound can get from one segment to the other.
// set to WID_FLY_FLAG to see if a robot could fly from one to the other.
// Search up to a maximum depth of max_depth.
// Return the distance.
vm_distance find_connected_distance(const vms_vector &p0, vcsegptridx_t seg0, const vms_vector &p1, vcsegptridx_t seg1, int max_depth, WALL_IS_DOORWAY_mask_t wid_flag);
//create a matrix that describes the orientation of the given segment
void extract_orient_from_segment(vms_matrix *m,vcsegptr_t seg);
// In segment.c
// Make a just-modified segment valid.
// check all sides to see how many faces they each should have (0,1,2)
// create new vector normals
void validate_segment(vsegptridx_t sp);
extern void validate_segment_all(void);
// Extract the forward vector from segment *sp, return in *vp.
// The forward vector is defined to be the vector from the the center of the front face of the segment
// to the center of the back face of the segment.
void extract_forward_vector_from_segment(vcsegptr_t sp,vms_vector &vp);
// Extract the right vector from segment *sp, return in *vp.
// The forward vector is defined to be the vector from the the center of the left face of the segment
// to the center of the right face of the segment.
void extract_right_vector_from_segment(vcsegptr_t sp,vms_vector &vp);
// Extract the up vector from segment *sp, return in *vp.
// The forward vector is defined to be the vector from the the center of the bottom face of the segment
// to the center of the top face of the segment.
void extract_up_vector_from_segment(vcsegptr_t sp,vms_vector &vp);
void create_walls_on_side(vsegptridx_t sp, int sidenum);
void pick_random_point_in_seg(vms_vector &new_pos, vcsegptr_t sp);
static inline vms_vector pick_random_point_in_seg(vcsegptr_t sp)
{
vms_vector v;
return pick_random_point_in_seg(v, sp), v;
}
void validate_segment_side(vsegptridx_t sp, int sidenum);
int check_segment_connections(void);
unsigned set_segment_depths(int start_seg, array<ubyte, MAX_SEGMENTS> *limit, segment_depth_array_t &depths);
#if defined(DXX_BUILD_DESCENT_I)
static inline void flush_fcd_cache() {}
#elif defined(DXX_BUILD_DESCENT_II)
void flush_fcd_cache();
void apply_all_changed_light(void);
void set_ambient_sound_flags(void);
#endif
}
#endif
#endif