]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - progsvm.h
fix annotation of crypto fields
[xonotic/darkplaces.git] / progsvm.h
index e31c2ffadd667620c74a475e98903a706edd81c7..1dc25e813d198d1b6f1b8bbfb29963ae55c15fc9 100644 (file)
--- a/progsvm.h
+++ b/progsvm.h
@@ -33,10 +33,20 @@ The code uses void pointers instead.
 #include "progdefs.h"                  // generated by program cdefs
 #include "clprogdefs.h"                        // generated by program cdefs
 
+#ifndef DP_SMALLMEMORY
+#define PROFILING
+#endif
+
+// forward declaration of clgecko_t
+struct clgecko_s;
+
 typedef struct prvm_stack_s
 {
        int                             s;
        mfunction_t             *f;
+       double                  tprofile_acc;
+       double                  profile_acc;
+       double                  builtinsprofile_acc;
 } prvm_stack_t;
 
 
@@ -64,6 +74,8 @@ typedef struct prvm_edict_private_s
 {
        qboolean free;
        float freetime;
+       int mark;
+       const char *allocation_origin;
 } prvm_edict_private_t;
 
 typedef struct prvm_edict_s
@@ -73,7 +85,7 @@ typedef struct prvm_edict_s
        union
        {
                prvm_edict_private_t *required;
-               void *vp;
+               vec_t *vp;
                // FIXME: this server pointer really means world, not server
                // (it is used by both server qc and client qc, but not menu qc)
                edict_engineprivate_t *server;
@@ -97,7 +109,7 @@ typedef struct prvm_edict_s
        // QuakeC fields (stored in dynamically resized array)
        union
        {
-               void *vp;
+               vec_t *vp;
                entvars_t               *server;
                cl_entvars_t    *client;
        } fields;
@@ -109,11 +121,21 @@ typedef struct prvm_edict_s
 //============================================================================
 #define PRVM_OP_STATE          1
 
+#ifdef DP_SMALLMEMORY
+#define        PRVM_MAX_STACK_DEPTH            128
+#define        PRVM_LOCALSTACK_SIZE            2048
+
+#define PRVM_MAX_OPENFILES 16
+#define PRVM_MAX_OPENSEARCHES 8
+#define PRVM_MAX_GECKOINSTANCES 1
+#else
 #define        PRVM_MAX_STACK_DEPTH            1024
 #define        PRVM_LOCALSTACK_SIZE            16384
 
 #define PRVM_MAX_OPENFILES 256
 #define PRVM_MAX_OPENSEARCHES 128
+#define PRVM_MAX_GECKOINSTANCES 32
+#endif
 
 typedef void (*prvm_builtin_t) (void);
 
@@ -122,7 +144,8 @@ typedef struct prvm_prog_fieldoffsets_s
 {
        // server and client use a lot of similar fields, so this is combined
        int SendEntity; // ssqc
-       int Version; // ssqc
+       int SendFlags; // ssqc
+       int Version; // ssqc (legacy)
        int alpha; // ssqc / csqc
        int ammo_cells1; // ssqc - Dissolution of Eternity mission pack
        int ammo_lava_nails; // ssqc - Dissolution of Eternity mission pack
@@ -150,7 +173,9 @@ typedef struct prvm_prog_fieldoffsets_s
        int buttonuse; // ssqc
        int chain; // common - used by find builtins
        int classname; // common
+       int clientcamera; // ssqc
        int clientcolors; // ssqc
+       int clientstatus; // ssqc
        int color; // ssqc
        int colormod; // ssqc / csqc
        int contentstransition; // ssqc
@@ -163,36 +188,46 @@ typedef struct prvm_prog_fieldoffsets_s
        int dimension_hit; // ssqc / csqc
        int dimension_solid; // ssqc / csqc
        int disableclientprediction; // ssqc
+       int discardabledemo; // ssqc
        int dphitcontentsmask; // ssqc / csqc
        int drawonlytoclient; // ssqc
-       int effects; // ssqc / csqc
        int exteriormodeltoclient; // ssqc
        int fatness; // ssqc / csqc
        int forceshader; // csqc
        int frame1time; // csqc
        int frame2; // csqc
        int frame2time; // csqc
+       int frame3; // csqc
+       int frame3time; // csqc
+       int frame4; // csqc
+       int frame4time; // csqc
        int frame; // common - used by OP_STATE
        int fullbright; // ssqc - Nehahra support
        int glow_color; // ssqc
        int glow_size; // ssqc
        int glow_trail; // ssqc
+       int glowmod; // ssqc / csqc
        int gravity; // ssqc
        int groundentity; // ssqc / csqc
        int hull; // ssqc / csqc
        int ideal_yaw; // ssqc / csqc
        int idealpitch; // ssqc / csqc
        int items2; // ssqc
+       int lerpfrac3; // csqc
+       int lerpfrac4; // csqc
        int lerpfrac; // csqc
        int light_lev; // ssqc
        int message; // csqc
        int modelflags; // ssqc
        int movement; // ssqc
-       int nextthink; // common - used by OP_STATE
+       int movetypesteplandevent; // ssqc
        int netaddress; // ssqc
+       int nextthink; // common - used by OP_STATE
        int nodrawtoclient; // ssqc
        int pflags; // ssqc
        int ping; // ssqc
+       int packetloss; // ssqc
+       int movementloss; // ssqc
        int pitch_speed; // ssqc / csqc
        int playermodel; // ssqc
        int playerskin; // ssqc
@@ -202,6 +237,8 @@ typedef struct prvm_prog_fieldoffsets_s
        int renderflags; // csqc
        int rendermode; // ssqc - HalfLife support
        int scale; // ssqc / csqc
+       int shadertime; // csqc
+       int skeletonindex; // csqc / ssqc FTE_CSQC_SKELETONOBJECTS / DP_SKELETONOBJECTS
        int style; // ssqc
        int tag_entity; // ssqc / csqc
        int tag_index; // ssqc / csqc
@@ -209,6 +246,41 @@ typedef struct prvm_prog_fieldoffsets_s
        int viewmodelforclient; // ssqc
        int viewzoom; // ssqc
        int yaw_speed; // ssqc / csqc
+       int bouncefactor; // ssqc
+       int bouncestop; // ssqc
+       int sendcomplexanimation; // ssqc
+
+       int solid; // ssqc / csqc (physics)
+       int movetype; // ssqc / csqc (physics)
+       int modelindex; // ssqc / csqc (physics)
+       int mins; // ssqc / csqc (physics)
+       int maxs; // ssqc / csqc (physics)
+       int mass; // ssqc / csqc (physics)
+       int origin; // ssqc / csqc (physics)
+       int velocity; // ssqc / csqc (physics)
+       //int axis_forward; // ssqc / csqc (physics)
+       //int axis_left; // ssqc / csqc (physics)
+       //int axis_up; // ssqc / csqc (physics)
+       //int spinvelocity; // ssqc / csqc (physics)
+       //int angles; // ssqc / csqc (physics)
+       int avelocity; // ssqc / csqc (physics)
+       int jointtype; // ssqc / csqc (physics)
+       int enemy; // ssqc / csqc (physics)
+       int aiment; // ssqc / csqc (physics)
+       int movedir; // ssqc / csqc (physics)
+
+       int camera_transform; // csqc (warpzones)
+
+       int userwavefunc_param0; // csqc (userwavefunc)
+       int userwavefunc_param1; // csqc (userwavefunc)
+       int userwavefunc_param2; // csqc (userwavefunc)
+       int userwavefunc_param3; // csqc (userwavefunc)
+
+       int crypto_keyfp; // ssqc (DP_CRYPTO)
+       int crypto_mykeyfp; // ssqc (DP_CRYPTO)
+       int crypto_idfp; // ssqc (DP_CRYPTO)
+       int crypto_encryptmethod; // ssqc (DP_CRYPTO)
+       int crypto_signmethod; // ssqc (DP_CRYPTO)
 }
 prvm_prog_fieldoffsets_t;
 
@@ -223,6 +295,8 @@ typedef struct prvm_prog_globaloffsets_s
        int v_right; // ssqc / csqc
        int v_up; // ssqc / csqc
        int view_angles; // csqc
+       int view_punchangle; // csqc
+       int view_punchvector; // csqc
        int trace_allsolid; // ssqc / csqc
        int trace_startsolid; // ssqc / csqc
        int trace_fraction; // ssqc / csqc
@@ -232,6 +306,7 @@ typedef struct prvm_prog_globaloffsets_s
        int trace_plane_normal; // ssqc / csqc
        int trace_plane_dist; // ssqc / csqc
        int trace_ent; // ssqc / csqc
+       int trace_networkentity; // csqc
        int trace_dphitcontents; // ssqc / csqc
        int trace_dphitq3surfaceflags; // ssqc / csqc
        int trace_dphittexturename; // ssqc / csqc
@@ -244,6 +319,24 @@ typedef struct prvm_prog_globaloffsets_s
        int dmg_origin; // csqc
        int sb_showscores; // csqc
        int drawfont; // csqc / menu
+       int drawfontscale; // csqc / menu
+       int require_spawnfunc_prefix; // ssqc
+       int worldstatus; // ssqc
+       int servertime; // csqc
+       int serverprevtime; // csqc
+       int serverdeltatime; // csqc
+       int gettaginfo_name; // ssqc / csqc
+       int gettaginfo_parent; // ssqc / csqc
+       int gettaginfo_offset; // ssqc / csqc
+       int gettaginfo_forward; // ssqc / csqc
+       int gettaginfo_right; // ssqc / csqc
+       int gettaginfo_up; // ssqc / csqc
+       int transparent_offset; // csqc
+
+       int particles_alphamin; // csqc
+       int particles_alphamax; // csqc
+       int particles_colormin; // csqc
+       int particles_colormax; // csqc
 }
 prvm_prog_globaloffsets_t;
 
@@ -253,6 +346,7 @@ typedef struct prvm_prog_funcoffsets_s
 {
        func_t CSQC_ConsoleCommand; // csqc
        func_t CSQC_Ent_Remove; // csqc
+       func_t CSQC_Ent_Spawn; // csqc DP_CSQC_ENT_SPAWN extension (BlackHC - TODO: needs to be added to dpextensions.qc)
        func_t CSQC_Ent_Update; // csqc
        func_t CSQC_Event; // csqc [515]: engine call this for its own needs so csqc can do some things according to what engine it's running on.  example: to say about edicts increase, whatever...
        func_t CSQC_Event_Sound; // csqc : called by engine when an incoming sound packet arrives so CSQC can act on it
@@ -264,31 +358,50 @@ typedef struct prvm_prog_funcoffsets_s
        func_t CSQC_Parse_TempEntity; // csqc [515]: very helpfull when you want to create your own particles/decals/etc for effects that already exist
        func_t CSQC_Shutdown; // csqc
        func_t CSQC_UpdateView; // csqc
+       func_t Gecko_Query; // csqc, mqc
        func_t EndFrame; // ssqc
        func_t RestoreGame; // ssqc
        func_t SV_ChangeTeam; // ssqc
        func_t SV_ParseClientCommand; // ssqc
        func_t SV_PlayerPhysics; // ssqc
+       func_t SV_OnEntityPreSpawnFunction; // ssqc
        func_t SV_OnEntityNoSpawnFunction; // ssqc
+       func_t SV_OnEntityPostSpawnFunction; // ssqc
        func_t GameCommand; // any
+       func_t SV_Shutdown; // ssqc
+       func_t URI_Get_Callback; // any
+       func_t SV_PausedTic; //ssqc
 
        // menu qc only uses some functions, nothing else
-       func_t m_display; // mqc
        func_t m_draw; // mqc
-       func_t m_hide; // mqc
        func_t m_init; // mqc
        func_t m_keydown; // mqc
        func_t m_keyup; // mqc
        func_t m_shutdown; // mqc
        func_t m_toggle; // mqc
+       func_t m_newmap; // mqc
 }
 prvm_prog_funcoffsets_t;
 
+// stringbuffer flags
+#define STRINGBUFFER_SAVED     1 // saved in savegames
+
+typedef struct prvm_stringbuffer_s
+{
+       int max_strings;
+       int num_strings;
+       char **strings;
+       const char *origin;
+       unsigned char flags;
+}
+prvm_stringbuffer_t;
+
 // [INIT] variables flagged with this token can be initialized by 'you'
 // NOTE: external code has to create and free the mempools but everything else is done by prvm !
 typedef struct prvm_prog_s
 {
        double              starttime;
+       unsigned int            id; // increasing unique id of progs instance
        dprograms_t                     *progs;
        mfunction_t                     *functions;
        char                            *strings;
@@ -296,15 +409,15 @@ typedef struct prvm_prog_s
        ddef_t                          *fielddefs;
        ddef_t                          *globaldefs;
        dstatement_t            *statements;
-       int                                     edict_size;                     // in bytes
-       int                                     edictareasize;          // LordHavoc: in bytes (for bound checking)
+       int                                     entityfields;                   // number of vec_t fields in progs (some variables are 3)
+       int                                     entityfieldsarea;               // LordHavoc: equal to max_edicts * entityfields (for bounds checking)
 
        int                                     *statement_linenums; // NULL if not available
 
        double                          *statement_profile; // only incremented if prvm_statementprofiling is on
 
        union {
-               float *generic;
+               vec_t *generic;
                globalvars_t *server;
                cl_globalvars_t *client;
        } globals;
@@ -315,9 +428,12 @@ typedef struct prvm_prog_s
        // (simple optimization of the free string search)
        int                                     firstfreeknownstring;
        const char                      **knownstrings;
-       unsigned char                           *knownstrings_freeable;
+       unsigned char           *knownstrings_freeable;
+       const char          **knownstrings_origin;
        const char                      ***stringshash;
 
+       memexpandablearray_t    stringbuffersarray;
+
        // all memory allocations related to this vm_prog (code, edicts, strings)
        mempool_t                       *progs_mempool; // [INIT]
 
@@ -339,6 +455,7 @@ typedef struct prvm_prog_s
        int                                     localstack_used;
 
        unsigned short          headercrc; // [INIT]
+       unsigned short          headercrc2; // [INIT] alternate CRC for tenebrae progs.dat
 
        unsigned short          filecrc;
 
@@ -346,7 +463,11 @@ typedef struct prvm_prog_s
        // until this point everything also exists (with the pr_ prefix) in the old vm
 
        qfile_t                         *openfiles[PRVM_MAX_OPENFILES];
+       const char *         openfiles_origin[PRVM_MAX_OPENFILES];
        fssearch_t                      *opensearches[PRVM_MAX_OPENSEARCHES];
+       const char *         opensearches_origin[PRVM_MAX_OPENSEARCHES];
+       struct clgecko_s                *opengeckoinstances[PRVM_MAX_GECKOINSTANCES];
+       skeleton_t                      *skeletons[MAX_EDICTS];
 
        // copies of some vars that were former read from sv
        int                                     num_edicts;
@@ -359,8 +480,8 @@ typedef struct prvm_prog_s
        int                                     reserved_edicts; // [INIT]
 
        prvm_edict_t            *edicts;
-       void                            *edictsfields;
-       void                            *edictprivate;
+       vec_t                           *edictsfields;
+       void                                    *edictprivate;
 
        // size of the engine private struct
        int                                     edictprivate_size; // [INIT]
@@ -374,17 +495,24 @@ typedef struct prvm_prog_s
        qboolean                        allowworldwrites;
 
        // name of the prog, e.g. "Server", "Client" or "Menu" (used for text output)
-       char                            *name; // [INIT]
+       const char                      *name; // [INIT]
 
        // flag - used to store general flags like PRVM_GE_SELF, etc.
-       int                                     flag;
+       int                             flag;
 
-       char                            *extensionstring; // [INIT]
+       const char                      *extensionstring; // [INIT]
 
        qboolean                        loadintoworld; // [INIT]
 
        // used to indicate whether a prog is loaded
        qboolean                        loaded;
+       qboolean                        leaktest_active;
+
+       // translation buffer (only needs to be freed on unloading progs, type is private to prvm_edict.c)
+       void *po;
+
+       // printed together with backtraces
+       const char *statestring;
 
 //     prvm_builtin_mem_t  *mem_list;
 
@@ -414,6 +542,7 @@ typedef struct prvm_prog_s
 
        void                            (*error_cmd)(const char *format, ...) DP_FUNC_PRINTF(1); // [INIT]
 
+       void                            (*ExecuteProgram)(func_t fnum, const char *errormessage); // pointer to one of the *VM_ExecuteProgram functions
 } prvm_prog_t;
 
 extern prvm_prog_t * prog;
@@ -436,8 +565,8 @@ extern const int vm_sv_numbuiltins;
 extern const int vm_cl_numbuiltins;
 extern const int vm_m_numbuiltins;
 
-extern char * vm_sv_extensions; // client also uses this
-extern char * vm_m_extensions;
+extern const char * vm_sv_extensions; // client also uses this
+extern const char * vm_m_extensions;
 
 void VM_SV_Cmd_Init(void);
 void VM_SV_Cmd_Reset(void);
@@ -454,7 +583,16 @@ void VM_Cmd_Reset(void);
 
 void PRVM_Init (void);
 
-void PRVM_ExecuteProgram (func_t fnum, const char *errormessage);
+#ifdef PROFILING
+void MVM_ExecuteProgram (func_t fnum, const char *errormessage);
+void CLVM_ExecuteProgram (func_t fnum, const char *errormessage);
+void SVVM_ExecuteProgram (func_t fnum, const char *errormessage);
+#else
+#define MVM_ExecuteProgram SVVM_ExecuteProgram
+#define CLVM_ExecuteProgram SVVM_ExecuteProgram
+void SVVM_ExecuteProgram (func_t fnum, const char *errormessage);
+#endif
+#define PRVM_ExecuteProgram prog->ExecuteProgram
 
 #define PRVM_Alloc(buffersize) _PRVM_Alloc(buffersize, __FILE__, __LINE__)
 #define PRVM_Free(buffer) _PRVM_Free(buffer, __FILE__, __LINE__)
@@ -463,14 +601,17 @@ void *_PRVM_Alloc (size_t buffersize, const char *filename, int fileline);
 void _PRVM_Free (void *buffer, const char *filename, int fileline);
 void _PRVM_FreeAll (const char *filename, int fileline);
 
-void PRVM_Profile (int maxfunctions, int mininstructions);
+void PRVM_Profile (int maxfunctions, double mintime, int sortby);
 void PRVM_Profile_f (void);
+void PRVM_ChildProfile_f (void);
 void PRVM_CallProfile_f (void);
 void PRVM_PrintFunction_f (void);
 
 void PRVM_PrintState(void);
 void PRVM_CrashAll (void);
 void PRVM_Crash (void);
+void PRVM_ShortStackTrace(char *buf, size_t bufsize);
+const char *PRVM_AllocationOrigin(void);
 
 ddef_t *PRVM_ED_FindField(const char *name);
 ddef_t *PRVM_ED_FindGlobal(const char *name);
@@ -484,6 +625,7 @@ func_t PRVM_ED_FindFunctionOffset(const char *name);
 
 void PRVM_MEM_IncreaseEdicts(void);
 
+qboolean PRVM_ED_CanAlloc(prvm_edict_t *e);
 prvm_edict_t *PRVM_ED_Alloc (void);
 void PRVM_ED_Free (prvm_edict_t *ed);
 void PRVM_ED_ClearEdict (prvm_edict_t *e);
@@ -498,8 +640,9 @@ void PRVM_ED_ParseGlobals (const char *data);
 
 void PRVM_ED_LoadFromFile (const char *data);
 
-prvm_edict_t *PRVM_EDICT_NUM_ERROR(int n, char *filename, int fileline);
-#define        PRVM_EDICT_NUM(n) (((unsigned)(n) < (unsigned int)prog->max_edicts) ? prog->edicts + (n) : PRVM_EDICT_NUM_ERROR(n, __FILE__, __LINE__))
+unsigned int PRVM_EDICT_NUM_ERROR(unsigned int n, const char *filename, int fileline);
+#define        PRVM_EDICT(n) (((unsigned)(n) < (unsigned int)prog->max_edicts) ? (unsigned int)(n) : PRVM_EDICT_NUM_ERROR((unsigned int)(n), __FILE__, __LINE__))
+#define        PRVM_EDICT_NUM(n) (prog->edicts + PRVM_EDICT(n))
 
 //int NUM_FOR_EDICT_ERROR(prvm_edict_t *e);
 #define PRVM_NUM_FOR_EDICT(e) ((int)((prvm_edict_t *)(e) - prog->edicts))
@@ -538,6 +681,7 @@ void PRVM_ED_PrintNum (int ent, const char *wildcard_fieldname);
 
 const char *PRVM_GetString(int num);
 int PRVM_SetEngineString(const char *s);
+const char *PRVM_ChangeEngineString(int i, const char *s);
 int PRVM_SetTempString(const char *s);
 int PRVM_AllocString(size_t bufferlength, char **pointer);
 void PRVM_FreeString(int num);
@@ -579,7 +723,7 @@ Load a program with LoadProgs
 */
 void PRVM_InitProg(int prognr);
 // LoadProgs expects to be called right after InitProg
-void PRVM_LoadProgs (const char *filename, int numrequiredfunc, char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, char **required_global);
+void PRVM_LoadProgs (const char *filename, int numrequiredfunc, const char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, char **required_global);
 void PRVM_ResetProg(void);
 
 qboolean PRVM_ProgLoaded(int prognr);
@@ -591,4 +735,9 @@ void VM_Warning(const char *fmt, ...) DP_FUNC_PRINTF(1);
 // TODO: fill in the params
 //void PRVM_Create();
 
+void VM_GenerateFrameGroupBlend(framegroupblend_t *framegroupblend, const prvm_edict_t *ed);
+void VM_FrameBlendFromFrameGroupBlend(frameblend_t *frameblend, const framegroupblend_t *framegroupblend, const dp_model_t *model);
+void VM_UpdateEdictSkeleton(prvm_edict_t *ed, const dp_model_t *edmodel, const frameblend_t *frameblend);
+void VM_RemoveEdictSkeleton(prvm_edict_t *ed);
+
 #endif