2001-02-19 21:15:25 +00:00
/*
world . h
@ description @
Copyright ( C ) 1996 - 1997 Id Software , Inc .
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 2
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 , write to :
Free Software Foundation , Inc .
59 Temple Place - Suite 330
Boston , MA 02111 - 1307 , USA
*/
# ifndef __world_h
# define __world_h
2001-08-27 22:16:11 +00:00
# include "QF/link.h"
# include "QF/mathlib.h"
# include "QF/model.h"
2001-02-19 21:15:25 +00:00
2012-06-28 07:03:56 +00:00
typedef struct {
qboolean present ;
vec3_t laggedpos ;
} laggedentinfo_t ;
2011-10-06 11:09:10 +00:00
typedef enum {
tr_point ,
tr_box ,
tr_ellipsoid ,
} trace_e ;
2006-12-24 03:13:29 +00:00
typedef struct trace_s {
2001-02-19 21:15:25 +00:00
qboolean allsolid ; // if true, plane is not valid
qboolean startsolid ; // if true, the initial point was in a solid area
qboolean inopen , inwater ;
2001-08-27 22:16:11 +00:00
float fraction ; // time completed, 1.0 = didn't hit anything
2006-12-24 03:13:29 +00:00
vec3_t extents ; // 1/2 size of traced box
2011-10-06 11:09:10 +00:00
trace_e type ; // type of trace to perform
2001-08-27 22:16:11 +00:00
vec3_t endpos ; // final position
plane_t plane ; // surface normal at impact
2006-12-24 03:13:29 +00:00
struct edict_s * ent ; // entity the surface is on
2011-12-01 03:26:33 +00:00
unsigned contents ; // contents of leafs touched by trace
2001-02-19 21:15:25 +00:00
} trace_t ;
# define MOVE_NORMAL 0
# define MOVE_NOMONSTERS 1
# define MOVE_MISSILE 2
2012-06-28 06:09:49 +00:00
# define MOVE_HITMODEL 4
# define MOVE_RESERVED 8
# define MOVE_TRIGGERS 16 //triggers must be marked with FINDABLE_NONSOLID (an alternative to solid-corpse)
# define MOVE_EVERYTHING 32 //can return triggers and non-solid items if they're marked with FINDABLE_NONSOLID (works even if the items are not properly linked)
# define MOVE_LAGGED 64 //trace touches current last-known-state, instead of actual ents (just affects players for now)
# define MOVE_ENTCHAIN 128 //chain of impacted ents, otherwise result shows only world
2001-02-19 21:15:25 +00:00
2004-11-02 08:40:00 +00:00
typedef struct areanode_s {
2001-08-27 22:16:11 +00:00
int axis ; // -1 = leaf node
float dist ;
struct areanode_s * children [ 2 ] ;
link_t trigger_edicts ;
link_t solid_edicts ;
} areanode_t ;
# define AREA_DEPTH 4
# define AREA_NODES 32
extern areanode_t sv_areanodes [ AREA_NODES ] ;
2010-12-08 00:20:43 +00:00
void SV_FreeAllEdictLeafs ( void ) ;
2011-11-14 02:18:22 +00:00
void SV_InitHull ( hull_t * hull , mclipnode_t * clipnodes , plane_t * planes ) ;
2001-02-19 21:15:25 +00:00
void SV_ClearWorld ( void ) ;
// called after the world model has been loaded, before linking any entities
2001-08-27 22:16:11 +00:00
void SV_UnlinkEdict ( struct edict_s * ent ) ;
2001-02-19 21:15:25 +00:00
// call before removing an entity, and before trying to move one,
// so it doesn't clip against itself
// flags ent->v.modified
2001-08-27 22:16:11 +00:00
void SV_LinkEdict ( struct edict_s * ent , qboolean touch_triggers ) ;
2001-02-19 21:15:25 +00:00
// Needs to be called any time an entity changes origin, mins, maxs, or solid
// flags ent->v.modified
// sets ent->v.absmin and ent->v.absmax
// if touchtriggers, calls prog functions for the intersected triggers
2018-10-09 03:35:01 +00:00
int SV_PointContents ( const vec3_t p ) __attribute__ ( ( pure ) ) ;
int SV_TruePointContents ( const vec3_t p ) __attribute__ ( ( pure ) ) ;
2001-02-19 21:15:25 +00:00
// returns the CONTENTS_* value from the world at the given point.
// does not check any entities at all
// the non-true version remaps the water current contents to content_water
2001-08-27 22:16:11 +00:00
struct edict_s * SV_TestEntityPosition ( struct edict_s * ent ) ;
2001-02-19 21:15:25 +00:00
2002-01-03 05:29:38 +00:00
trace_t SV_Move ( const vec3_t start , const vec3_t mins , const vec3_t maxs ,
const vec3_t end , int type , struct edict_s * passedict ) ;
2001-02-19 21:15:25 +00:00
// mins and maxs are reletive
// if the entire move stays in a solid volume, trace.allsolid will be set
// if the starting point is in a solid, it will be allowed to move out
// to an open area
// nomonsters is used for line of sight or edge testing, where mosnters
// shouldn't be considered solid objects
// passedict is explicitly excluded from clipping checks (normally NULL)
2002-01-03 05:29:38 +00:00
struct edict_s * SV_TestPlayerPosition ( struct edict_s * ent ,
const vec3_t origin ) ;
2001-08-27 22:16:11 +00:00
2018-10-09 03:35:01 +00:00
int SV_HullPointContents ( hull_t * hull , int num , const vec3_t p ) __attribute__ ( ( pure ) ) ;
2002-01-03 05:29:38 +00:00
hull_t * SV_HullForEntity ( struct edict_s * ent , const vec3_t mins ,
2006-12-24 03:13:29 +00:00
const vec3_t maxs , vec3_t extents , vec3_t offset ) ;
2007-09-17 11:24:42 +00:00
void MOD_TraceLine ( hull_t * hull , int num ,
const vec3_t start , const vec3_t end , trace_t * trace ) ;
2011-12-01 03:26:33 +00:00
int MOD_HullContents ( hull_t * hull , int num , const vec3_t origin ,
trace_t * trace ) ;
2001-08-27 22:16:11 +00:00
2011-11-15 03:57:08 +00:00
typedef struct clipport_s {
int planenum ;
struct clipport_s * next [ 2 ] ; ///< front, back
struct clipleaf_s * leafs [ 2 ] ; ///< front, back
struct winding_s * winding ;
2011-11-15 11:21:49 +00:00
struct winding_s * edges ; ///< unit vectors along edges
2011-11-15 03:57:08 +00:00
} clipport_t ;
typedef struct clipleaf_s {
clipport_t * portals ;
int contents ;
2011-12-01 03:57:06 +00:00
int test_count ;
2011-11-15 03:57:08 +00:00
} clipleaf_t ;
typedef struct nodeleaf_s {
clipleaf_t * leafs [ 2 ] ; ///< front, back. If null, node's child is a node
} nodeleaf_t ;
nodeleaf_t * MOD_BuildBrushes ( hull_t * hull ) ;
2011-12-08 05:58:08 +00:00
void MOD_FreeBrushes ( hull_t * hull ) ;
2011-11-15 03:57:08 +00:00
2001-02-19 21:15:25 +00:00
# endif // __world_h