311 lines
11 KiB
C
311 lines
11 KiB
C
//=======================================================================
|
|
// Copyright XashXT Group 2008 ©
|
|
// engine_api.h - xash engine api
|
|
//=======================================================================
|
|
#ifndef ENGINE_API_H
|
|
#define ENGINE_API_H
|
|
|
|
//
|
|
// engine constant limits, touching networking protocol modify with precaution
|
|
//
|
|
#define MAX_DLIGHTS 128 // dynamic lights (per one frame)
|
|
#define MAX_LIGHTSTYLES 256 // can be blindly increased
|
|
#define MAX_CLASSNAMES 512 // maxcount of various edicts classnames
|
|
#define MAX_SOUNDS 512 // openal software limit
|
|
#define MAX_MODELS 4096 // total count of brush & studio various models per one map
|
|
#define MAX_PARTICLES 32768 // pre one frame
|
|
#define MAX_EDICTS 65535 // absolute limit that never be reached, (do not edit!)
|
|
#define MAX_VERTS_ON_POLY 10 // decal vertices
|
|
|
|
// engine edict types
|
|
typedef enum
|
|
{
|
|
ED_SPAWNED = 0, // this entity requris to set own type with SV_ClassifyEdict
|
|
ED_WORLDSPAWN, // this is a worldspawn
|
|
ED_STATIC, // this is a logic without model or entity with static model
|
|
ED_AMBIENT, // this is entity emitted ambient sounds only
|
|
ED_NORMAL, // normal entity with model (and\or) sound
|
|
ED_BSPBRUSH, // brush entity (a part of level)
|
|
ED_CLIENT, // this is a client entity
|
|
ED_MONSTER, // monster or bot (generic npc with AI)
|
|
ED_TEMPENTITY, // this edict will be removed on server when "lifetime" exceeds
|
|
ED_BEAM, // laser beam (needs to recalculate pvs and frustum)
|
|
ED_MOVER, // func_train, func_door and another bsp or mdl movers
|
|
ED_VIEWMODEL, // client or bot viewmodel (for spectating)
|
|
ED_ITEM, // holdable items
|
|
ED_RAGDOLL, // dead body with simulated ragdolls
|
|
ED_RIGIDBODY, // simulated physic
|
|
ED_TRIGGER, // just for sorting on a server
|
|
ED_PORTAL, // realtime display, portal or mirror brush or model
|
|
ED_MISSILE, // greande, rocket e.t.c
|
|
ED_DECAL, // render will be merge real coords and normal
|
|
ED_VEHICLE, // controllable vehicle
|
|
ED_MAXTYPES,
|
|
} edtype_t;
|
|
|
|
// edict movetype
|
|
typedef enum
|
|
{
|
|
MOVETYPE_NONE, // never moves
|
|
MOVETYPE_NOCLIP, // origin and angles change with no interaction
|
|
MOVETYPE_PUSH, // no clip to world, push on box contact
|
|
MOVETYPE_WALK, // gravity
|
|
MOVETYPE_STEP, // gravity, special edge handling
|
|
MOVETYPE_FLY,
|
|
MOVETYPE_TOSS, // gravity
|
|
MOVETYPE_BOUNCE,
|
|
MOVETYPE_FOLLOW, // attached models
|
|
MOVETYPE_CONVEYOR,
|
|
MOVETYPE_PUSHABLE,
|
|
MOVETYPE_PHYSIC, // phys simulation
|
|
} movetype_t;
|
|
|
|
// edict collision modes
|
|
typedef enum
|
|
{
|
|
SOLID_NOT = 0, // no interaction with other objects
|
|
SOLID_TRIGGER, // only touch when inside, after moving
|
|
SOLID_BBOX, // touch on edge
|
|
SOLID_BSP, // bsp clip, touch on edge
|
|
SOLID_BOX, // physbox
|
|
SOLID_SPHERE, // sphere
|
|
SOLID_CYLINDER, // cylinder e.g. barrel
|
|
SOLID_MESH, // custom convex hull
|
|
} solid_t;
|
|
|
|
// model_state_t communication (a part of network protocol)
|
|
typedef struct model_state_s
|
|
{
|
|
int index; // server & client shared modelindex
|
|
int colormap; // change base color for some textures or sprite frames
|
|
float scale; // model or sprite scale, affects to physics too
|
|
float frame; // % playback position in animation sequences (0..255)
|
|
float animtime; // auto-animating time
|
|
float framerate; // custom framerate, specified by QC
|
|
int sequence; // animation sequence (0 - 255)
|
|
int gaitsequence; // client\nps\bot gaitsequence
|
|
int skin; // skin for studiomodels
|
|
int body; // sub-model selection for studiomodels
|
|
float blending[16]; // studio animation blending
|
|
float controller[16]; // studio bone controllers
|
|
} model_state_t;
|
|
|
|
// entity_state_t communication (a part of network protocol)
|
|
typedef struct entity_state_s
|
|
{
|
|
// engine specific
|
|
uint number; // edict index
|
|
edtype_t ed_type; // edict type
|
|
string_t classname; // edict classname
|
|
int soundindex; // looped ambient sound
|
|
|
|
// physics information
|
|
vec3_t origin;
|
|
vec3_t angles; // entity angles, not viewangles
|
|
vec3_t velocity; // player velocity
|
|
vec3_t infotarget; // portal camera, etc
|
|
model_state_t model; // general entity model
|
|
solid_t solidtype; // entity solidtype
|
|
movetype_t movetype; // entity movetype
|
|
int gravity; // gravity multiplier
|
|
int aiment; // attahced entity (not a physic attach, only rendering)
|
|
int solid; // using for symmetric bboxes
|
|
vec3_t mins; // not symmetric entity bbox
|
|
vec3_t maxs;
|
|
|
|
// render information
|
|
uint effects; // effect flags like q1 and hl1
|
|
int renderfx; // render effects same as hl1
|
|
float renderamt; // alpha value or like somewhat
|
|
vec3_t rendercolor; // hl1 legacy stuff, working, but not needed
|
|
int rendermode; // hl1 legacy stuff, working, but not needed
|
|
|
|
// client specific
|
|
int pm_type; // client movetype
|
|
int pm_flags; // ducked, jump_held, etc
|
|
vec3_t delta_angles; // add to command angles to get view direction
|
|
vec3_t punch_angles; // add to view direction to get render angles
|
|
vec3_t viewangles; // already calculated view angles on server-side
|
|
vec3_t viewoffset; // viewoffset over ground
|
|
int maxspeed; // sv_maxspeed will be duplicate on all clients
|
|
float health; // client health (other parms can be send by custom messages)
|
|
float fov; // horizontal field of view
|
|
model_state_t pmodel; // weaponmodel info
|
|
} entity_state_t;
|
|
|
|
// usercmd_t communication (a part of network protocol)
|
|
typedef struct usercmd_s
|
|
{
|
|
int msec;
|
|
int angles[3];
|
|
int forwardmove;
|
|
int sidemove;
|
|
int upmove;
|
|
int buttons;
|
|
int impulse;
|
|
int lightlevel;
|
|
|
|
} usercmd_t;
|
|
|
|
/*
|
|
==============================================================================
|
|
|
|
ENGINE TRACE FORMAT
|
|
==============================================================================
|
|
*/
|
|
#define SIDE_FRONT 0
|
|
#define SIDE_BACK 1
|
|
#define SIDE_ON 2
|
|
#define SIDE_CROSS -2
|
|
|
|
#define PLANE_X 0 // 0 - 2 are axial planes
|
|
#define PLANE_Y 1 // 3 needs alternate calc
|
|
#define PLANE_Z 2
|
|
|
|
typedef struct cplane_s
|
|
{
|
|
vec3_t normal;
|
|
float dist;
|
|
byte type; // for fast side tests
|
|
byte signbits; // signx + (signy<<1) + (signz<<1)
|
|
byte pad[2]; // padding bytes
|
|
} cplane_t;
|
|
|
|
typedef struct cmesh_s
|
|
{
|
|
vec3_t *verts;
|
|
int *indices;
|
|
uint numverts;
|
|
uint numtris;
|
|
} cmesh_t;
|
|
|
|
typedef struct cmodel_s
|
|
{
|
|
string name; // model name
|
|
byte *mempool; // private mempool
|
|
int registration_sequence;
|
|
|
|
vec3_t mins, maxs; // model boundbox
|
|
int type; // model type
|
|
int firstface; // used to create collision tree
|
|
int numfaces;
|
|
int firstbrush; // used to create collision brush
|
|
int numbrushes;
|
|
int numframes; // sprite framecount
|
|
int numbodies; // physmesh numbody
|
|
cmesh_t *col[256]; // max bodies
|
|
byte *extradata; // server studio uses this
|
|
|
|
// g-cont: stupid pushmodel stuff
|
|
vec3_t normalmins; // bounding box at angles '0 0 0'
|
|
vec3_t normalmaxs;
|
|
vec3_t yawmins; // bounding box if yaw angle is not 0, but pitch and roll are
|
|
vec3_t yawmaxs;
|
|
vec3_t rotatedmins; // bounding box if pitch or roll are used
|
|
vec3_t rotatedmaxs;
|
|
|
|
// custom traces for various model types
|
|
void (*TraceBox)( const vec3_t, const vec3_t, const vec3_t, const vec3_t, struct cmodel_s*, struct trace_s*, int );
|
|
int (*PointContents)( const vec3_t point, struct cmodel_s *model );
|
|
bool (*AmbientLevel)( const vec3_t point, float *volumes, struct cmodel_s *model );
|
|
} cmodel_t;
|
|
|
|
typedef struct csurface_s
|
|
{
|
|
string name;
|
|
int surfaceflags;
|
|
int contentflags;
|
|
int value;
|
|
|
|
vec3_t mins;
|
|
vec3_t maxs;
|
|
|
|
// patches support
|
|
int numtriangles;
|
|
int numvertices;
|
|
int *indices;
|
|
float *vertices;
|
|
int markframe;
|
|
} csurface_t;
|
|
|
|
typedef struct trace_s
|
|
{
|
|
bool allsolid; // if true, plane is not valid
|
|
bool startsolid; // if true, the initial point was in a solid area
|
|
bool startstuck; // trace started from solid entity
|
|
float fraction; // time completed, 1.0 = didn't hit anything
|
|
float realfraction; // like fraction but is not nudged away from the surface
|
|
vec3_t endpos; // final position
|
|
cplane_t plane; // surface normal at impact
|
|
csurface_t *surface; // surface hit
|
|
int contents; // contents on other side of surface hit
|
|
int startcontents;
|
|
int contentsmask;
|
|
int surfaceflags;
|
|
int hitgroup; // hit a studiomodel hitgroup #
|
|
int flags; // misc trace flags
|
|
edict_t *ent; // not set by CM_*() functions
|
|
} trace_t;
|
|
|
|
|
|
_inline void PlaneClassify( cplane_t *p )
|
|
{
|
|
// for optimized plane comparisons
|
|
if( p->normal[0] == 1 || p->normal[0] == -1 )
|
|
p->type = PLANE_X;
|
|
else if( p->normal[1] == 1 || p->normal[1] == -1 )
|
|
p->type = PLANE_Y;
|
|
else if( p->normal[2] == 1 || p->normal[2] == -1 )
|
|
p->type = PLANE_Z;
|
|
else p->type = 3; // needs alternate calc
|
|
|
|
// for BoxOnPlaneSide
|
|
p->signbits = 0;
|
|
if( p->normal[0] < 0 ) p->signbits |= 1;
|
|
if( p->normal[1] < 0 ) p->signbits |= 2;
|
|
if( p->normal[2] < 0 ) p->signbits |= 4;
|
|
}
|
|
|
|
/*
|
|
==============
|
|
BoxOnPlaneSide (engine fast version)
|
|
|
|
Returns SIDE_FRONT, SIDE_BACK, or SIDE_ON
|
|
==============
|
|
*/
|
|
_inline int BoxOnPlaneSide( const vec3_t emins, const vec3_t emaxs, cplane_t *p )
|
|
{
|
|
if (p->type < 3) return ((emaxs[p->type] >= p->dist) | ((emins[p->type] < p->dist) << 1));
|
|
switch( p->signbits )
|
|
{
|
|
default:
|
|
case 0: return (((p->normal[0] * emaxs[0] + p->normal[1] * emaxs[1] + p->normal[2] * emaxs[2]) >= p->dist) | (((p->normal[0] * emins[0] + p->normal[1] * emins[1] + p->normal[2] * emins[2]) < p->dist) << 1));
|
|
case 1: return (((p->normal[0] * emins[0] + p->normal[1] * emaxs[1] + p->normal[2] * emaxs[2]) >= p->dist) | (((p->normal[0] * emaxs[0] + p->normal[1] * emins[1] + p->normal[2] * emins[2]) < p->dist) << 1));
|
|
case 2: return (((p->normal[0] * emaxs[0] + p->normal[1] * emins[1] + p->normal[2] * emaxs[2]) >= p->dist) | (((p->normal[0] * emins[0] + p->normal[1] * emaxs[1] + p->normal[2] * emins[2]) < p->dist) << 1));
|
|
case 3: return (((p->normal[0] * emins[0] + p->normal[1] * emins[1] + p->normal[2] * emaxs[2]) >= p->dist) | (((p->normal[0] * emaxs[0] + p->normal[1] * emaxs[1] + p->normal[2] * emins[2]) < p->dist) << 1));
|
|
case 4: return (((p->normal[0] * emaxs[0] + p->normal[1] * emaxs[1] + p->normal[2] * emins[2]) >= p->dist) | (((p->normal[0] * emins[0] + p->normal[1] * emins[1] + p->normal[2] * emaxs[2]) < p->dist) << 1));
|
|
case 5: return (((p->normal[0] * emins[0] + p->normal[1] * emaxs[1] + p->normal[2] * emins[2]) >= p->dist) | (((p->normal[0] * emaxs[0] + p->normal[1] * emins[1] + p->normal[2] * emaxs[2]) < p->dist) << 1));
|
|
case 6: return (((p->normal[0] * emaxs[0] + p->normal[1] * emins[1] + p->normal[2] * emins[2]) >= p->dist) | (((p->normal[0] * emins[0] + p->normal[1] * emaxs[1] + p->normal[2] * emaxs[2]) < p->dist) << 1));
|
|
case 7: return (((p->normal[0] * emins[0] + p->normal[1] * emins[1] + p->normal[2] * emins[2]) >= p->dist) | (((p->normal[0] * emaxs[0] + p->normal[1] * emaxs[1] + p->normal[2] * emaxs[2]) < p->dist) << 1));
|
|
}
|
|
}
|
|
|
|
/*
|
|
==============================================================================
|
|
|
|
Generic LAUNCH.DLL INTERFACE
|
|
==============================================================================
|
|
*/
|
|
typedef struct launch_exp_s
|
|
{
|
|
// interface validator
|
|
size_t api_size; // must matched with sizeof(launch_api_t)
|
|
|
|
void ( *Init ) ( int argc, char **argv ); // init host
|
|
void ( *Main ) ( void ); // host frame
|
|
void ( *Free ) ( void ); // close host
|
|
void (*CPrint) ( const char *msg ); // host print
|
|
void (*MSG_Init)( sizebuf_t *buf, byte *data, size_t len ); // MSG init network buffer
|
|
} launch_exp_t;
|
|
|
|
#endif//ENGINE_API_H
|