2e1a70e319
maplist command now generates links. implemented skin objects for q3. added a csqc builtin for it. also supports compositing skins. playing demos inside zips/pk3s/paks should now work. bumped default rate cvar. added cl_transfer to attempt to connect to a new server without disconnecting first. rewrote fog command. alpha and mindist arguments are now supported. fog change also happens over a short time period. added new args to the showpic console command. can now create clickable items for touchscreen/absmouse users. fixed menus to properly support right-aligned text. this finally fixes variable-width fonts. rewrote console tab completion suggestions display. now clickable links. strings obtained from qc are now marked as const. this has required quite a few added consts all over the place. probably crappy attempt at adding joypad support to the sdl port. no idea if it works. changed key bind event code. buttons now track which event they should trigger when released, instead of being the same one the whole time. this allows +forward etc clickable buttons on screen. Also simplified modifier keys - they no longer trigger random events when pressing the modifier key itself. Right modifiers can now be bound separately from left modifiers. Right will use left's binding if not otherwise bound. Bind assumes left if there's no prefix. multiplayer->setup->network menu no longer crashes. added rgb colours to the translation view (but not to the colour-changing keys). added modelviewer command to view models. added menu_mods menu to switch mods in a more friendly way. will be shown by default if multiple manifests exist in the binarydir. clamped classic tracer density. scrag particles no longer look quite so buggy. added ifdefs to facilitate a potential winrt port. the engine should now have no extra dependencies, but still needs system code+audio drivers to be written. if it can't set a renderer, it'll now try to use *every* renderer until it finds one that works. added experimental mapcluster server mode (that console command). New maps will be started up as required. rewrote skeletal blending code a bit. added cylinder geomtypes. fix cfg_save writing to the wrong path bug. VFS_CLOSE now returns a boolean. false means there was some sort of fatal error (either crc when reading was bad, or the write got corrupted or something). Typically ignorable, depends how robust you want to be. win32 tls code now supports running as a server. added connect tls://address support, as well as equivalent sv_addport support. exposed basic model loading api to plugins. d3d11 backend now optionally supports tessellation hlsl. no suitable hlsl provided by default. !!tess to enable. attempted to add gamma ramp support for d3d11. added support for shader blobs to speed up load times. r_shaderblobs 1 to enable. almost vital for d3d11. added vid_srgb cvar. shadowless lights are no longer disabled if shadows are not supported. attempt to add support for touchscreens in win7/8. Wrote gimmicky lua support, using lua instead of ssqc. define VM_LUA to enable. updated saved game code. can again load saved games from vanilla-like engines. changed scale clamping. 0.0001 should no longer appear as 1. changed default mintic from 0.03 to 0.013 to match vanilla qw. I don't know why it was at 0.03. probably a typo. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4623 fc73d0e0-1445-4013-8a0c-d673dee63da5
492 lines
17 KiB
C
492 lines
17 KiB
C
/*
|
|
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 the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
/* file generated by qcc, do not modify */
|
|
|
|
typedef struct globalvars_s
|
|
{
|
|
int null;
|
|
union {
|
|
vec3_t vec;
|
|
float f;
|
|
int i;
|
|
} ret;
|
|
union {
|
|
vec3_t vec;
|
|
float f;
|
|
int i;
|
|
} param[8];
|
|
} globalvars_t;
|
|
|
|
#define NUM_SPAWN_PARMS 64
|
|
typedef struct nqglobalvars_s
|
|
{
|
|
int *self;
|
|
int *other;
|
|
int *world;
|
|
float *time;
|
|
float *frametime;
|
|
int *newmis;
|
|
float *force_retouch;
|
|
string_t *mapname;
|
|
float *deathmatch;
|
|
float *coop;
|
|
float *teamplay;
|
|
float *serverflags;
|
|
float *total_secrets;
|
|
float *total_monsters;
|
|
float *found_secrets;
|
|
float *killed_monsters;
|
|
vec3_t *v_forward;
|
|
vec3_t *v_up;
|
|
vec3_t *v_right;
|
|
float *trace_allsolid;
|
|
float *trace_startsolid;
|
|
float *trace_fraction;
|
|
float *trace_surfaceflags;
|
|
float *trace_endcontents;
|
|
vec3_t *trace_endpos;
|
|
vec3_t *trace_plane_normal;
|
|
float *trace_plane_dist;
|
|
int *trace_ent;
|
|
float *trace_inopen;
|
|
float *trace_inwater;
|
|
int *msg_entity;
|
|
func_t *main;
|
|
func_t *StartFrame;
|
|
func_t *PlayerPreThink;
|
|
func_t *PlayerPostThink;
|
|
func_t *ClientKill;
|
|
func_t *ClientConnect;
|
|
func_t *PutClientInServer;
|
|
func_t *ClientDisconnect;
|
|
func_t *SetNewParms;
|
|
func_t *SetChangeParms;
|
|
float *cycle_wrapped;
|
|
float *dimension_send;
|
|
|
|
float *physics_mode;
|
|
float *clientcommandframe;
|
|
float *input_timelength;
|
|
float *input_impulse;
|
|
vec3_t *input_angles;
|
|
vec3_t *input_movevalues;
|
|
float *input_buttons;
|
|
float *spawnparamglobals[NUM_SPAWN_PARMS];
|
|
float *serverid;
|
|
} globalptrs_t;
|
|
|
|
#define P_VEC(v) (pr_global_struct->v)
|
|
|
|
|
|
/*my hands are tied when it comes to the layout of this structure
|
|
On the server side, the structure *must* match original quakeworld, or we break compatibility with mvdsv's qvm api
|
|
On the client, it really doesn't matter what order fields are in, qclib will remap.
|
|
But fields that are actually useful on both sides need to be in the same locations.
|
|
But if we include all, that's a waste for csqc...
|
|
But we can overlap useful csqc-only ones with ssqc ones that are not going to be used on the client, so long as the types match.
|
|
This list isn't shared with the menu.
|
|
|
|
so the base fields are a fixed size
|
|
and the extension fields are added on the end and can have extra vm-specific stuff added on the end
|
|
*/
|
|
/*DO NOT ADD TO THIS STRUCTURE (base-qw-compat for q1qvm)*/
|
|
#define comqcfields \
|
|
comfieldfloat(modelindex,NULL)\
|
|
comfieldvector(absmin,NULL)\
|
|
comfieldvector(absmax,NULL)\
|
|
comfieldfloat(ltime,NULL)\
|
|
comfieldfloat(lastruntime,NULL) /*type doesn't match the qc, we use a hidden double instead. this is dead.*/ \
|
|
comfieldfloat(movetype,NULL)\
|
|
comfieldfloat(solid,NULL)\
|
|
comfieldvector(origin,NULL)\
|
|
comfieldvector(oldorigin,NULL)\
|
|
comfieldvector(velocity,NULL)\
|
|
comfieldvector(angles,NULL)\
|
|
comfieldvector(avelocity,NULL)\
|
|
comfieldstring(classname,NULL)\
|
|
comfieldstring(model,NULL)\
|
|
comfieldfloat(frame,NULL)\
|
|
comfieldfloat(skin,NULL)\
|
|
comfieldfloat(effects,NULL)\
|
|
comfieldvector(mins,NULL)\
|
|
comfieldvector(maxs,NULL)\
|
|
comfieldvector(size,NULL)\
|
|
comfieldfunction(touch, ".void()",NULL)\
|
|
comfieldfunction(use, ".void()",NULL)\
|
|
comfieldfunction(think, ".void()",NULL)\
|
|
comfieldfunction(blocked, ".void()",NULL)\
|
|
comfieldfloat(nextthink,NULL)\
|
|
comfieldentity(groundentity,NULL)\
|
|
comfieldfloat(health,NULL)\
|
|
comfieldfloat(frags,NULL)\
|
|
comfieldfloat(weapon,NULL)\
|
|
comfieldstring(weaponmodel,NULL)\
|
|
comfieldfloat(weaponframe,NULL)\
|
|
comfieldfloat(currentammo,NULL)\
|
|
comfieldfloat(ammo_shells,NULL)\
|
|
comfieldfloat(ammo_nails,NULL)\
|
|
comfieldfloat(ammo_rockets,NULL)\
|
|
comfieldfloat(ammo_cells,NULL)\
|
|
comfieldfloat(items,NULL)\
|
|
comfieldfloat(takedamage,NULL)\
|
|
comfieldentity(chain,NULL)\
|
|
comfieldfloat(deadflag,NULL)\
|
|
comfieldvector(view_ofs,NULL)\
|
|
comfieldfloat(button0,NULL)\
|
|
comfieldfloat(button1,NULL) /*dead field in nq mode*/ \
|
|
comfieldfloat(button2,NULL)\
|
|
comfieldfloat(impulse,NULL)\
|
|
comfieldfloat(fixangle,NULL)\
|
|
comfieldvector(v_angle,NULL)\
|
|
comfieldstring(netname,NULL)\
|
|
comfieldentity(enemy,NULL)\
|
|
comfieldfloat(flags,NULL)\
|
|
comfieldfloat(colormap,NULL)\
|
|
comfieldfloat(team,NULL)\
|
|
comfieldfloat(max_health,NULL)\
|
|
comfieldfloat(teleport_time,NULL)\
|
|
comfieldfloat(armortype,NULL)\
|
|
comfieldfloat(armorvalue,NULL)\
|
|
comfieldfloat(waterlevel,NULL)\
|
|
comfieldfloat(watertype,NULL)\
|
|
comfieldfloat(ideal_yaw,NULL)\
|
|
comfieldfloat(yaw_speed,NULL)\
|
|
comfieldentity(aiment,NULL)\
|
|
comfieldentity(goalentity,NULL)\
|
|
comfieldfloat(spawnflags,NULL)\
|
|
comfieldstring(target,NULL)\
|
|
comfieldstring(targetname,NULL)\
|
|
comfieldfloat(dmg_take,NULL)\
|
|
comfieldfloat(dmg_save,NULL)\
|
|
comfieldentity(dmg_inflictor,NULL)\
|
|
comfieldentity(owner,NULL)\
|
|
comfieldvector(movedir,NULL)\
|
|
comfieldstring(message,NULL) /*don't use directly, hexen2 uses floats, so we go via qclib for message*/\
|
|
comfieldfloat(sounds,NULL)\
|
|
comfieldstring(noise,NULL)\
|
|
comfieldstring(noise1,NULL)\
|
|
comfieldstring(noise2,NULL)\
|
|
comfieldstring(noise3,NULL)
|
|
/*DO NOT ADD TO THE ABOVE STRUCTURE*/
|
|
|
|
#define comextqcfields \
|
|
comfieldvector(punchangle,NULL) /*std in nq*/\
|
|
comfieldfloat(gravity,NULL) /*added in quake 1.09 (for hipnotic)*/\
|
|
comfieldfloat(hull,"Overrides the hull used by the entity for walkmove/movetogoal and not traceline/tracebox.")/*PEXT_HEXEN2*/\
|
|
comfieldentity(movechain,NULL)/*hexen2*/\
|
|
comfieldfunction(chainmoved, ".void()",NULL)/*hexen2*/\
|
|
comfieldfunction(contentstransition, ".void(float old, float new)","This function is called when the entity moves between water and air. If specified, default splash sounds will be disabled allowing you to provide your own.")/*ENTITYCONTENTSTRANSITION*/\
|
|
comfieldfloat(dimension_solid,"This is the bitmask of dimensions which the entity is solid within.")/*EXT_DIMENSION_PHYSICS*/\
|
|
comfieldfloat(dimension_hit,"This is the bitmask of dimensions which the entity will be blocked by. If other.dimension_solid & self.dimension_hit, our traces will impact and not proceed. If its false, the traces will NOT impact, allowing self to pass straight through.")/*EXT_DIMENSION_PHYSICS*/\
|
|
comfieldfloat(hitcontentsmask,NULL)\
|
|
comfieldfloat(scale,NULL)/*DP_ENT_SCALE*/\
|
|
comfieldfloat(fatness,NULL)/*FTE_PEXT_FATNESS*/\
|
|
comfieldfloat(alpha,NULL)/*DP_ENT_ALPHA*/\
|
|
comfieldentity(tag_entity,NULL)\
|
|
comfieldfloat(tag_index,NULL)\
|
|
comfieldfloat(skeletonindex,"This object serves as a container for the skeletal bone states used to override the animation data.") /*FTE_CSQC_SKELETONOBJECTS*/\
|
|
comfieldvector(colormod,NULL)\
|
|
comfieldvector(glowmod,NULL)\
|
|
comfieldvector(gravitydir,"Specifies the direction in which gravity acts. Must be normalised. '0 0 0' also means down. Use '0 0 1' if you want the player to be able to run on ceilings.")\
|
|
comfieldfunction(camera_transform,".vector(vector org, vector ang)", NULL)\
|
|
comfieldfloat(pmove_flags,NULL)/*EXT_CSQC_1*/\
|
|
comfieldfloat(geomtype,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(friction,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(erp,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(jointtype,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(mass,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(bouncefactor,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(bouncestop,NULL)/*DP_...PHYSICS*/\
|
|
comfieldfloat(idealpitch,NULL)/*DP_QC_CHANGEPITCH (inconsistant naming)*/\
|
|
comfieldfloat(pitch_speed,NULL)/*DP_QC_CHANGEPITCH*/
|
|
|
|
#define svextqcfields \
|
|
comfieldfloat(maxspeed,NULL)/*added in quake 1.09*/\
|
|
comfieldfloat(items2,NULL) /*added in quake 1.09 (for hipnotic)*/\
|
|
comfieldentity(view2,NULL)/*FTE_PEXT_VIEW2*/\
|
|
comfieldvector(movement,NULL)\
|
|
comfieldfloat(vw_index,NULL)\
|
|
comfieldentity(nodrawtoclient,NULL)\
|
|
comfieldentity(drawonlytoclient,NULL)\
|
|
comfieldentity(viewmodelforclient,NULL)/*DP_ENT_VIEWMODEL*/\
|
|
comfieldentity(exteriormodeltoclient,NULL)\
|
|
comfieldfloat(button3,"DP_INPUTBUTTONS (note in qw, we set 1 to equal 3, to match zquake/fuhquake/mvdsv)")\
|
|
comfieldfloat(button4,NULL)\
|
|
comfieldfloat(button5,NULL)\
|
|
comfieldfloat(button6,NULL)\
|
|
comfieldfloat(button7,NULL)\
|
|
comfieldfloat(button8,NULL)\
|
|
comfieldfloat(viewzoom,NULL)/*DP_VIEWZOOM*/\
|
|
comfieldfloat(glow_size,NULL)\
|
|
comfieldfloat(glow_color,NULL)\
|
|
comfieldfloat(glow_trail,NULL)\
|
|
comfieldfloat(traileffectnum,NULL)/*DP_ENT_TRAILEFFECTNUM*/\
|
|
comfieldvector(color,NULL)/*Hexen2 has a .float color, the warnings should be benign*/ \
|
|
comfieldfloat(light_lev,NULL)\
|
|
comfieldfloat(style,NULL)\
|
|
comfieldfloat(pflags,"Realtime lighting flags")\
|
|
comfieldfloat(clientcolors,NULL)\
|
|
comfieldfloat(dimension_see,"This is the dimension mask (bitfield) that the client is allowed to see. Entities and events not in this dimension mask will be invisible.")/*EXT_DIMENSION_VISIBLE*/\
|
|
comfieldfloat(dimension_seen,"This is the dimension mask (bitfield) that the client is visible within. Clients that cannot see this dimension mask will not see this entity.")/*EXT_DIMENSION_VISIBLE*/\
|
|
comfieldfloat(dimension_ghost,"If this entity is visible only within these dimensions, it will become transparent, as if a ghost.")/*EXT_DIMENSION_GHOST*/\
|
|
comfieldfloat(dimension_ghost_alpha,"If this entity is subject to dimension_ghost, this is the scaler for its alpha value. If 0, 0.5 will be used instead.")/*EXT_DIMENSION_GHOST*/\
|
|
comfieldfloat(playerclass,NULL)/*hexen2 requirements*/\
|
|
comfieldfloat(drawflags,"Various flags that affect lighting values and scaling. Typically set to 96 in quake for proper compatibility with DP_QC_SCALE.")/*hexen2*/\
|
|
comfieldfloat(hasted,NULL)/*hexen2 uses this AS WELL as maxspeed*/\
|
|
comfieldfloat(light_level,NULL)/*hexen2's grabbing light level from client*/\
|
|
comfieldfloat(abslight,"Allows overriding light levels. Use drawflags to state that this field should actually be used.")/*hexen2's force a lightlevel*/\
|
|
comfieldfunction(SendEntity, ".float(entity playerent, float changedflags)",NULL)/*EXT_CSQC*/\
|
|
comfieldfloat(SendFlags,NULL)/*EXT_CSQC_1 (one of the DP guys came up with it)*/\
|
|
comfieldfloat(Version,"Obsolete, set a SendFlags bit instead.")/*EXT_CSQC (obsolete)*/\
|
|
comfieldfloat(pvsflags,"Reconfigures when the entity is visible to clients")/*EXT_CSQC_1*/\
|
|
comfieldfloat(modelflags,NULL)\
|
|
comfieldfloat(uniquespawnid,NULL)/*FTE_ENT_UNIQUESPAWNID*/\
|
|
comfieldfunction(customizeentityforclient, ".float()",NULL)
|
|
|
|
//this is the list for all the csqc fields.
|
|
//(the #define is so the list always matches the ones pulled out)
|
|
#define csqcextfields \
|
|
comfieldfloat(entnum,NULL) \
|
|
comfieldfloat(frame2,NULL) /*EXT_CSQC_1*/\
|
|
comfieldfloat(frame1time,NULL) /*EXT_CSQC_1*/\
|
|
comfieldfloat(frame2time,NULL) /*EXT_CSQC_1*/\
|
|
comfieldfloat(lerpfrac,NULL) /*EXT_CSQC_1*/\
|
|
comfieldfloat(renderflags,NULL)\
|
|
comfieldfloat(forceshader,"Contains a shader handle used to replace all surfaces upon the entity.")/*FTE_CSQC_SHADERS*/\
|
|
\
|
|
comfieldfloat(baseframe,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
comfieldfloat(baseframe2,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
comfieldfloat(baseframe1time,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
comfieldfloat(baseframe2time,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
comfieldfloat(baselerpfrac,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
comfieldfloat(basebone,NULL) /*FTE_CSQC_BASEFRAME*/\
|
|
\
|
|
comfieldfloat(bonecontrol1,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(bonecontrol2,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(bonecontrol3,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(bonecontrol4,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(bonecontrol5,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(subblendfrac,NULL) /*FTE_CSQC_HALFLIFE_MODELS*/\
|
|
comfieldfloat(basesubblendfrac,NULL) /*FTE_CSQC_HALFLIFE_MODELS+FTE_CSQC_BASEFRAME*/\
|
|
\
|
|
comfieldfloat(drawmask,NULL) /*So that the qc can specify all rockets at once or all bannanas at once*/ \
|
|
comfieldfunction(predraw, ".float()",NULL) /*If present, is called just before it's drawn.*/
|
|
|
|
typedef struct stdentvars_s //standard = standard for qw
|
|
{
|
|
#define comfieldfloat(sharedname,desc) float sharedname;
|
|
#define comfieldvector(sharedname,desc) vec3_t sharedname;
|
|
#define comfieldentity(sharedname,desc) int sharedname;
|
|
#define comfieldstring(sharedname,desc) string_t sharedname;
|
|
#define comfieldfunction(sharedname, typestr,desc) func_t sharedname;
|
|
comqcfields
|
|
#undef comfieldfloat
|
|
#undef comfieldvector
|
|
#undef comfieldentity
|
|
#undef comfieldstring
|
|
#undef comfieldfunction
|
|
#ifdef VM_Q1
|
|
} stdentvars_t;
|
|
|
|
typedef struct extentvars_s
|
|
{
|
|
#endif
|
|
#define comfieldfloat(name,desc) float name;
|
|
#define comfieldvector(name,desc) vec3_t name;
|
|
#define comfieldentity(name,desc) int name;
|
|
#define comfieldstring(name,desc) string_t name;
|
|
#define comfieldfunction(name, typestr,desc) func_t name;
|
|
comextqcfields
|
|
svextqcfields
|
|
#undef comfieldfloat
|
|
#undef comfieldvector
|
|
#undef comfieldentity
|
|
#undef comfieldstring
|
|
#undef comfieldfunction
|
|
|
|
#ifdef VM_Q1
|
|
} extentvars_t;
|
|
#else
|
|
} stdentvars_t;
|
|
#endif
|
|
|
|
typedef struct {
|
|
#define comfieldfloat(sharedname,desc) float sharedname;
|
|
#define comfieldvector(sharedname,desc) vec3_t sharedname;
|
|
#define comfieldentity(sharedname,desc) int sharedname;
|
|
#define comfieldstring(sharedname,desc) string_t sharedname;
|
|
#define comfieldfunction(sharedname, typestr,desc) func_t sharedname;
|
|
comqcfields
|
|
#undef comfieldfloat
|
|
#undef comfieldvector
|
|
#undef comfieldentity
|
|
#undef comfieldstring
|
|
#undef comfieldfunction
|
|
|
|
#ifdef VM_Q1
|
|
} comentvars_t;
|
|
typedef struct {
|
|
#endif
|
|
|
|
#define comfieldfloat(name,desc) float name;
|
|
#define comfieldvector(name,desc) vec3_t name;
|
|
#define comfieldentity(name,desc) int name;
|
|
#define comfieldstring(name,desc) string_t name;
|
|
#define comfieldfunction(name, typestr,desc) func_t name;
|
|
comextqcfields
|
|
#undef comfieldfloat
|
|
#undef comfieldvector
|
|
#undef comfieldentity
|
|
#undef comfieldstring
|
|
#undef comfieldfunction
|
|
|
|
#ifdef VM_Q1
|
|
} comextentvars_t;
|
|
#else
|
|
} comentvars_t;
|
|
#endif
|
|
|
|
#ifdef USEODE
|
|
typedef struct
|
|
{
|
|
void *ode_body;
|
|
void *ode_geom;
|
|
} odebody_t;
|
|
typedef struct
|
|
{
|
|
//doll info
|
|
char name[32];
|
|
int bone;
|
|
float animate;
|
|
qboolean draw:1;
|
|
qboolean orient:1;
|
|
int orientpeer;
|
|
|
|
//ode info
|
|
int geomshape;
|
|
vec3_t dimensions;
|
|
float mass;
|
|
} odebodyinfo_t;
|
|
|
|
typedef struct
|
|
{
|
|
void *ode_joint;
|
|
} odejoint_t;
|
|
typedef struct
|
|
{
|
|
//doll info
|
|
char name[32];
|
|
// unsigned int disablebits;
|
|
qboolean draw:1;
|
|
|
|
//ode info
|
|
int type;
|
|
int body1; //handled by the ragdoll code, rather than the physics library.
|
|
int body2; //handled by the ragdoll code.
|
|
int bonepivot; //pivot is specified relative to this bone.
|
|
|
|
float FMax, FMax2;
|
|
float HiStop, HiStop2;
|
|
float LoStop, LoStop2;
|
|
float CFM, CFM2;
|
|
float ERP, ERP2;
|
|
float Vel, Vel2;
|
|
vec3_t offset, offset2;
|
|
vec3_t axis, axis2;
|
|
} odejointinfo_t;
|
|
|
|
typedef struct odecommandqueue_s
|
|
{
|
|
struct odecommandqueue_s *next;
|
|
enum
|
|
{
|
|
ODECMD_ENABLE,
|
|
ODECMD_DISABLE,
|
|
ODECMD_FORCE,
|
|
ODECMD_TORQUE,
|
|
} command;
|
|
struct wedict_s *edict;
|
|
vec3_t v1;
|
|
vec3_t v2;
|
|
} odecommandqueue_t;
|
|
|
|
typedef struct
|
|
{
|
|
// physics parameters
|
|
qboolean ode_physics;
|
|
void *ode_body;
|
|
void *ode_geom;
|
|
void *ode_joint;
|
|
float *ode_vertex3f;
|
|
int *ode_element3i;
|
|
int ode_numvertices;
|
|
int ode_numtriangles;
|
|
vec3_t ode_mins;
|
|
vec3_t ode_maxs;
|
|
vec_t ode_mass;
|
|
vec3_t ode_origin;
|
|
vec3_t ode_velocity;
|
|
vec3_t ode_angles;
|
|
vec3_t ode_avelocity;
|
|
qboolean ode_gravity;
|
|
int ode_modelindex;
|
|
vec_t ode_movelimit; // smallest component of (maxs[]-mins[])
|
|
float ode_offsetmatrix[16];
|
|
float ode_offsetimatrix[16];
|
|
int ode_joint_type;
|
|
int ode_joint_enemy;
|
|
int ode_joint_aiment;
|
|
vec3_t ode_joint_origin; // joint anchor
|
|
vec3_t ode_joint_angles; // joint axis
|
|
vec3_t ode_joint_velocity; // second joint axis
|
|
vec3_t ode_joint_movedir; // parameters
|
|
void *ode_massbuf;
|
|
} entityode_t;
|
|
/*
|
|
typedef struct
|
|
{
|
|
void *ode_body;
|
|
} skelbodyode_t;
|
|
typedef struct
|
|
{
|
|
int dummy;
|
|
} skeljointode_t;
|
|
*/
|
|
typedef struct
|
|
{
|
|
// for ODE physics engine
|
|
qboolean ode; // if true then ode is activated
|
|
qboolean hasodeents; // if true then we have some ode body somewhere, and we consume more cycles processing full physics, instead of trying to skip as much as we can
|
|
qboolean hasextraobjs;
|
|
void *ode_world;
|
|
void *ode_space;
|
|
void *ode_contactgroup;
|
|
// number of constraint solver iterations to use (for dWorldStepFast)
|
|
int ode_iterations;
|
|
// actual step (server frametime / ode_iterations)
|
|
vec_t ode_step;
|
|
// max velocity for a 1-unit radius object at current step to prevent
|
|
// missed collisions
|
|
vec_t ode_movelimit;
|
|
odecommandqueue_t *cmdqueuehead;
|
|
odecommandqueue_t *cmdqueuetail;
|
|
} worldode_t;
|
|
#endif
|