X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=progsvm.h;h=92ead5dc772a8393f7a7470fee8cec35be11a78c;hp=6c185b63b30b1f2ad0c64a0b31a0a60a52ed53cc;hb=4be7d59693a1e9fb66852a4f279cfef85c1880a8;hpb=46a24b411ef2bee4eb2a08da15d38a61b484f471 diff --git a/progsvm.h b/progsvm.h index 6c185b63..92ead5dc 100644 --- a/progsvm.h +++ b/progsvm.h @@ -29,10 +29,20 @@ The code uses void pointers instead. #ifndef PROGSVM_H #define PROGSVM_H +#include +#include "qtypes.h" +#include "qdefs.h" +#include "common.h" +#include "zone.h" #include "pr_comp.h" // defs shared with qcc #include "progdefs.h" // generated by program cdefs #include "clprogdefs.h" // generated by program cdefs +struct framegroupblend_s; +struct frameblend_s; +struct cmd_state_s; +struct qfile_s; + #ifndef DP_SMALLMEMORY #define PROFILING #endif @@ -64,23 +74,27 @@ typedef struct prvm_required_field_s const char *name; } prvm_required_field_t; - +#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN -1 +#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT -2 // AK: I dont call it engine private cause it doesnt really belongs to the engine // it belongs to prvm. typedef struct prvm_edict_private_s { - qboolean free; - double freetime; // realtime of last change to "free" (i.e. also set on allocation) - int mark; // used during leaktest (0 = unref, >0 = referenced); special values during server physics: -#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN -1 -#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT -2 + // mark for the leak detector + int mark; + // place in the code where it was allocated (for the leak detector) const char *allocation_origin; } prvm_edict_private_t; typedef struct prvm_edict_s { + // true if this edict is unused + qbool free; + // sv.time when the object was freed (to prevent early reuse which could + // mess up client interpolation or obscure severe QuakeC bugs) + double freetime; + // engine-private fields (stored in dynamically resized array) - //edict_engineprivate_t *e; union { prvm_edict_private_t *required; @@ -88,7 +102,7 @@ typedef struct prvm_edict_s prvm_int_t *ip; // 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; + struct edict_engineprivate_s *server; // add other private structs as you desire // new structs have to start with the elements of prvm_edit_private_t // e.g. a new struct has to either look like this: @@ -99,7 +113,7 @@ typedef struct prvm_edict_s // ... } server_edict_private_t; // or: // typedef struct server_edict_private_s { - // qboolean free; + // qbool free; // float freetime; // vec3_t moved_from; // vec3_t moved_fromangles; @@ -616,12 +630,12 @@ 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]; + struct qfile_s *openfiles[PRVM_MAX_OPENFILES]; const char * openfiles_origin[PRVM_MAX_OPENFILES]; - fssearch_t *opensearches[PRVM_MAX_OPENSEARCHES]; + struct fssearch_s *opensearches[PRVM_MAX_OPENSEARCHES]; const char * opensearches_origin[PRVM_MAX_OPENSEARCHES]; - skeleton_t *skeletons[MAX_EDICTS]; - cmd_state_t *console_cmd; // points to the relevant console command interpreter for this vm (&cmd_client or &cmd_server), also used to access cvars + struct skeleton_s *skeletons[MAX_EDICTS]; + struct cmd_state_s *console_cmd; // points to the relevant console command interpreter for this vm (cmd_local or &cmd_server), also used to access cvars // buffer for storing all tempstrings created during one invocation of ExecuteProgram sizebuf_t tempstringsbuf; @@ -634,14 +648,14 @@ typedef struct prvm_prog_s // this tracks the last polygonbegin's choice of // CL_Mesh_CSQC or CL_Mesh_UI for this polygon - dp_model_t *polygonbegin_model; + struct model_s *polygonbegin_model; // indicates if polygonbegin should be interpreted as 2d // (clearscene sets this to false, renderscene sets this to true, drawpic // also sets this to true) // note that in FTEQW polygonbegin with 2 args is handled very differently, // where the behavior is always 3D unless DRAWFLAG_2D is passed, but // DRAWFLAG_2D conflicts with our DRAWFLAG_SCREEN. - qboolean polygonbegin_guess2d; + qbool polygonbegin_guess2d; // the texture name and drawflags provided to polygonbegin char polygonbegin_texname[MAX_QPATH]; int polygonbegin_drawflags; @@ -677,7 +691,7 @@ typedef struct prvm_prog_s // allow writing to world entity fields, this is set by server init and // cleared before first server frame - qboolean allowworldwrites; + qbool allowworldwrites; // name of the prog, e.g. "Server", "Client" or "Menu" (used for text output) const char *name; // [INIT] @@ -687,11 +701,11 @@ typedef struct prvm_prog_s const char **extensionstring; // [INIT] - qboolean loadintoworld; // [INIT] + qbool loadintoworld; // [INIT] // used to indicate whether a prog is loaded - qboolean loaded; - qboolean leaktest_active; + qbool loaded; + qbool leaktest_active; // translation buffer (only needs to be freed on unloading progs, type is private to prvm_edict.c) void *po; @@ -722,7 +736,7 @@ typedef struct prvm_prog_s void (*count_edicts)(struct prvm_prog_s *prog); // [INIT] used by PRVM_ED_Count_f - qboolean (*load_edict)(struct prvm_prog_s *prog, prvm_edict_t *ent); // [INIT] used by PRVM_ED_LoadFromFile + qbool (*load_edict)(struct prvm_prog_s *prog, prvm_edict_t *ent); // [INIT] used by PRVM_ED_LoadFromFile void (*init_cmd)(struct prvm_prog_s *prog); // [INIT] used by PRVM_InitProg void (*reset_cmd)(struct prvm_prog_s *prog); // [INIT] used by PRVM_ResetProg @@ -802,10 +816,10 @@ void PRVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessa #define PRVM_Free(buffer) Mem_Free(buffer) void PRVM_Profile (prvm_prog_t *prog, int maxfunctions, double mintime, int sortby); -void PRVM_Profile_f(cmd_state_t *cmd); -void PRVM_ChildProfile_f(cmd_state_t *cmd); -void PRVM_CallProfile_f(cmd_state_t *cmd); -void PRVM_PrintFunction_f(cmd_state_t *cmd); +void PRVM_Profile_f(struct cmd_state_s *cmd); +void PRVM_ChildProfile_f(struct cmd_state_s *cmd); +void PRVM_CallProfile_f(struct cmd_state_s *cmd); +void PRVM_PrintFunction_f(struct cmd_state_s *cmd); void PRVM_PrintState(prvm_prog_t *prog, int stack_index); void PRVM_Crash(prvm_prog_t *prog); @@ -826,21 +840,21 @@ func_t PRVM_ED_FindFunctionOffset(prvm_prog_t *prog, const char *name); void PRVM_MEM_IncreaseEdicts(prvm_prog_t *prog); -qboolean PRVM_ED_CanAlloc(prvm_prog_t *prog, prvm_edict_t *e); +qbool PRVM_ED_CanAlloc(prvm_prog_t *prog, prvm_edict_t *e); prvm_edict_t *PRVM_ED_Alloc(prvm_prog_t *prog); void PRVM_ED_Free(prvm_prog_t *prog, prvm_edict_t *ed); void PRVM_ED_ClearEdict(prvm_prog_t *prog, prvm_edict_t *e); void PRVM_PrintFunctionStatements(prvm_prog_t *prog, const char *name); void PRVM_ED_Print(prvm_prog_t *prog, prvm_edict_t *ed, const char *wildcard_fieldname); -void PRVM_ED_Write(prvm_prog_t *prog, qfile_t *f, prvm_edict_t *ed); +void PRVM_ED_Write(prvm_prog_t *prog, struct qfile_s *f, prvm_edict_t *ed); const char *PRVM_ED_ParseEdict(prvm_prog_t *prog, const char *data, prvm_edict_t *ent); -void PRVM_ED_WriteGlobals(prvm_prog_t *prog, qfile_t *f); +void PRVM_ED_WriteGlobals(prvm_prog_t *prog, struct qfile_s *f); void PRVM_ED_ParseGlobals(prvm_prog_t *prog, const char *data); void PRVM_ED_CallPrespawnFunction(prvm_prog_t *prog, prvm_edict_t *ent); -qboolean PRVM_ED_CallSpawnFunction(prvm_prog_t *prog, prvm_edict_t *ent, const char *data, const char *start); +qbool PRVM_ED_CallSpawnFunction(prvm_prog_t *prog, prvm_edict_t *ent, const char *data, const char *start); void PRVM_ED_CallPostspawnFunction (prvm_prog_t *prog, prvm_edict_t *ent); void PRVM_ED_LoadFromFile(prvm_prog_t *prog, const char *data); @@ -881,7 +895,7 @@ extern int prvm_type_size[8]; // for consistency : I think a goal of this sub-pr void PRVM_Init_Exec(prvm_prog_t *prog); -void PRVM_ED_PrintEdicts_f(cmd_state_t *cmd); +void PRVM_ED_PrintEdicts_f(struct cmd_state_s *cmd); void PRVM_ED_PrintNum (prvm_prog_t *prog, int ent, const char *wildcard_fieldname); const char *PRVM_GetString(prvm_prog_t *prog, int num); @@ -892,7 +906,7 @@ int PRVM_AllocString(prvm_prog_t *prog, size_t bufferlength, char **pointer); void PRVM_FreeString(prvm_prog_t *prog, int num); mdef_t *PRVM_ED_FieldAtOfs(prvm_prog_t *prog, unsigned int ofs); -qboolean PRVM_ED_ParseEpair(prvm_prog_t *prog, prvm_edict_t *ent, mdef_t *key, const char *s, qboolean parsebackslash); +qbool PRVM_ED_ParseEpair(prvm_prog_t *prog, prvm_edict_t *ent, mdef_t *key, const char *s, qbool parsebackslash); char *PRVM_UglyValueString(prvm_prog_t *prog, etype_t type, prvm_eval_t *val, char *line, size_t linelength); char *PRVM_GlobalString(prvm_prog_t *prog, int ofs, char *line, size_t linelength); char *PRVM_GlobalStringNoContents(prvm_prog_t *prog, int ofs, char *line, size_t linelength); @@ -906,8 +920,8 @@ Set up the fields marked with [INIT] in the prog struct Load a program with LoadProgs */ // Load expects to be called right after Reset -void PRVM_Prog_Init(prvm_prog_t *prog, cmd_state_t *cmd); -void PRVM_Prog_Load(prvm_prog_t *prog, const char *filename, unsigned char *data, fs_offset_t size, int numrequiredfunc, const char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, prvm_required_field_t *required_global); +void PRVM_Prog_Init(prvm_prog_t *prog, struct cmd_state_s *cmd); +void PRVM_Prog_Load(prvm_prog_t *prog, const char *filename, unsigned char *data, int64_t size, int numrequiredfunc, const char **required_func, int numrequiredfields, prvm_required_field_t *required_field, int numrequiredglobals, prvm_required_field_t *required_global); void PRVM_Prog_Reset(prvm_prog_t *prog); void PRVM_StackTrace(prvm_prog_t *prog); @@ -916,9 +930,9 @@ void PRVM_Watchpoint(prvm_prog_t *prog, int stack_index, const char *text, etype void VM_Warning(prvm_prog_t *prog, const char *fmt, ...) DP_FUNC_PRINTF(2); -void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, framegroupblend_t *framegroupblend, const prvm_edict_t *ed); -void VM_FrameBlendFromFrameGroupBlend(frameblend_t *frameblend, const framegroupblend_t *framegroupblend, const dp_model_t *model, double curtime); -void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const dp_model_t *edmodel, const frameblend_t *frameblend); +void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, struct framegroupblend_s *framegroupblend, const prvm_edict_t *ed); +void VM_FrameBlendFromFrameGroupBlend(struct frameblend_s *frameblend, const struct framegroupblend_s *framegroupblend, const struct model_s *model, double curtime); +void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const struct model_s *edmodel, const struct frameblend_s *frameblend); void VM_RemoveEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed); void PRVM_ExplicitCoverageEvent(prvm_prog_t *prog, mfunction_t *func, int statement);