X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=progsvm.h;h=6bcb808a1dd75fa1db884a068eb2f32745e74c48;hb=3161ae840da309834bd08f39be63777836fade71;hp=83666557ceaad96fccd6a0ab8b9d4c9ac80534d9;hpb=add1a1b0abc10b8e720d74aeac52ad8276ee9fe0;p=xonotic%2Fdarkplaces.git diff --git a/progsvm.h b/progsvm.h index 83666557..6bcb808a 100644 --- a/progsvm.h +++ b/progsvm.h @@ -70,7 +70,7 @@ typedef struct prvm_required_field_s typedef struct prvm_edict_private_s { qboolean free; - float freetime; + float 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 @@ -116,43 +116,6 @@ typedef struct prvm_edict_s } fields; } prvm_edict_t; -#define VMPOLYGONS_MAXPOINTS 64 - -typedef struct vmpolygons_triangle_s -{ - rtexture_t *texture; - int drawflag; - qboolean hasalpha; - unsigned short elements[3]; -} vmpolygons_triangle_t; - -typedef struct vmpolygons_s -{ - mempool_t *pool; - qboolean initialized; - - int max_vertices; - int num_vertices; - float *data_vertex3f; - float *data_color4f; - float *data_texcoord2f; - - int max_triangles; - int num_triangles; - vmpolygons_triangle_t *data_triangles; - unsigned short *data_sortedelement3s; - - qboolean begin_active; - int begin_draw2d; - rtexture_t *begin_texture; - int begin_drawflag; - int begin_vertices; - float begin_vertex[VMPOLYGONS_MAXPOINTS][3]; - float begin_color[VMPOLYGONS_MAXPOINTS][4]; - float begin_texcoord[VMPOLYGONS_MAXPOINTS][2]; - qboolean begin_texture_hasalpha; -} vmpolygons_t; - extern prvm_eval_t prvm_badvalue; #define PRVM_alledictfloat(ed, fieldname) (PRVM_EDICTFIELDFLOAT(ed, prog->fieldoffsets.fieldname)) @@ -228,13 +191,13 @@ extern prvm_eval_t prvm_badvalue; #define PRVM_menufunction(funcname) (prog->funcoffsets.funcname) #if 1 -#define PRVM_EDICTFIELDVALUE(ed, fieldoffset) (fieldoffset < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)(ed->fields.fp + fieldoffset)) +#define PRVM_EDICTFIELDVALUE(ed, fieldoffset) ((fieldoffset) < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)((ed)->fields.fp + (fieldoffset))) #define PRVM_EDICTFIELDFLOAT(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->_float) #define PRVM_EDICTFIELDVECTOR(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->vector) #define PRVM_EDICTFIELDSTRING(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->string) #define PRVM_EDICTFIELDEDICT(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->edict) #define PRVM_EDICTFIELDFUNCTION(ed, fieldoffset) (PRVM_EDICTFIELDVALUE(ed, fieldoffset)->function) -#define PRVM_GLOBALFIELDVALUE(fieldoffset) (fieldoffset < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)(prog->globals.fp + fieldoffset)) +#define PRVM_GLOBALFIELDVALUE(fieldoffset) ((fieldoffset) < 0 ? Con_Printf("Invalid fieldoffset at %s:%i\n", __FILE__, __LINE__), &prvm_badvalue : (prvm_eval_t *)(prog->globals.fp + (fieldoffset))) #define PRVM_GLOBALFIELDFLOAT(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->_float) #define PRVM_GLOBALFIELDVECTOR(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->vector) #define PRVM_GLOBALFIELDSTRING(fieldoffset) (PRVM_GLOBALFIELDVALUE(fieldoffset)->string) @@ -513,7 +476,9 @@ typedef struct prvm_prog_funcoffsets_s prvm_prog_funcoffsets_t; // stringbuffer flags -#define STRINGBUFFER_SAVED 1 // saved in savegames +#define STRINGBUFFER_SAVED 1 // saved in savegames +#define STRINGBUFFER_QCFLAGS 1 // allowed to be set by QC +#define STRINGBUFFER_TEMP 128 // internal use ONLY typedef struct prvm_stringbuffer_s { int max_strings; @@ -529,9 +494,10 @@ prvm_stringbuffer_t; typedef struct prvm_prog_s { double starttime; // system time when PRVM_Prog_Load was called + double inittime; // system time when QC initialization code finished (any entity created before is not a leak) double profiletime; // system time when last PRVM_CallProfile was called (or PRVM_Prog_Load initially) - unsigned int id; // increasing unique id of progs instance mfunction_t *functions; + int functions_covered; char *strings; int stringssize; ddef_t *fielddefs; @@ -560,8 +526,13 @@ typedef struct prvm_prog_s int numglobals; int *statement_linenums; // NULL if not available + int *statement_columnnums; // NULL if not available double *statement_profile; // only incremented if prvm_statementprofiling is on + int statements_covered; + double *explicit_profile; // only incremented if prvm_statementprofiling is on + int explicit_covered; + int numexplicitcoveragestatements; union { prvm_vec_t *fp; @@ -591,6 +562,16 @@ typedef struct prvm_prog_s int argc; int trace; + int break_statement; + int break_stack_index; + int watch_global; + etype_t watch_global_type; + prvm_eval_t watch_global_value; + int watch_edict; + int watch_field; + etype_t watch_field_type; + prvm_eval_t watch_edictfield_value; + mfunction_t *xfunction; int xstatement; @@ -616,9 +597,17 @@ typedef struct prvm_prog_s // buffer for storing all tempstrings created during one invocation of ExecuteProgram sizebuf_t tempstringsbuf; - // LordHavoc: moved this here to clean up things that relied on prvm_prog_list too much - // FIXME: make VM_CL_R_Polygon functions use Debug_Polygon functions? - vmpolygons_t vmpolygons; + // in csqc the polygonbegin,polygonvertex,polygonend sequencing is + // stateful, so this tracks the last polygonbegin's choice of + // CL_Mesh_CSQC or CL_Mesh_UI for this polygon + dp_model_t *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; // copies of some vars that were former read from sv int num_edicts; @@ -665,6 +654,8 @@ typedef struct prvm_prog_s // printed together with backtraces const char *statestring; + struct animatemodel_cache *animatemodel_cache; + // prvm_builtin_mem_t *mem_list; // now passed as parameter of PRVM_LoadProgs @@ -712,7 +703,9 @@ prvm_prog_t *PRVM_FriendlyProgFromString(const char *str); // for console comman #define PRVM_ProgLoaded(n) (PRVM_GetProg(n)->loaded) #define SVVM_prog (&prvm_prog_list[PRVM_PROG_SERVER]) #define CLVM_prog (&prvm_prog_list[PRVM_PROG_CLIENT]) +#ifdef CONFIG_MENU #define MVM_prog (&prvm_prog_list[PRVM_PROG_MENU]) +#endif //============================================================================ // prvm_cmds part @@ -734,8 +727,10 @@ void SVVM_reset_cmd(prvm_prog_t *prog); void CLVM_init_cmd(prvm_prog_t *prog); void CLVM_reset_cmd(prvm_prog_t *prog); +#ifdef CONFIG_MENU void MVM_init_cmd(prvm_prog_t *prog); void MVM_reset_cmd(prvm_prog_t *prog); +#endif void VM_Cmd_Init(prvm_prog_t *prog); void VM_Cmd_Reset(prvm_prog_t *prog); @@ -746,11 +741,15 @@ void PRVM_Init (void); #ifdef PROFILING void SVVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessage); void CLVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessage); +#ifdef CONFIG_MENU void MVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessage); +#endif #else #define SVVM_ExecuteProgram PRVM_ExecuteProgram #define CLVM_ExecuteProgram PRVM_ExecuteProgram +#ifdef CONFIG_MENU #define MVM_ExecuteProgram PRVM_ExecuteProgram +#endif void PRVM_ExecuteProgram (prvm_prog_t *prog, func_t fnum, const char *errormessage); #endif @@ -763,7 +762,7 @@ void PRVM_ChildProfile_f (void); void PRVM_CallProfile_f (void); void PRVM_PrintFunction_f (void); -void PRVM_PrintState(prvm_prog_t *prog); +void PRVM_PrintState(prvm_prog_t *prog, int stack_index); void PRVM_Crash(prvm_prog_t *prog); void PRVM_ShortStackTrace(prvm_prog_t *prog, char *buf, size_t bufsize); const char *PRVM_AllocationOrigin(prvm_prog_t *prog); @@ -822,7 +821,7 @@ unsigned int PRVM_EDICT_NUM_ERROR(prvm_prog_t *prog, unsigned int n, const char // FIXME: make these go away? #define PRVM_E_FLOAT(e,o) (e->fields.fp[o]) -#define PRVM_E_INT(e,o) (e->fields.fp[o]) +#define PRVM_E_INT(e,o) (e->fields.ip[o]) //#define PRVM_E_VECTOR(e,o) (&(e->fields.fp[o])) #define PRVM_E_STRING(e,o) (PRVM_GetString(prog, e->fields.ip[o])) @@ -855,12 +854,14 @@ Call InitProg with the num Set up the fields marked with [INIT] in the prog struct Load a program with LoadProgs */ -// Load expects to be called right after Init +// Load expects to be called right after Reset void PRVM_Prog_Init(prvm_prog_t *prog); -void PRVM_Prog_Load(prvm_prog_t *prog, const char *filename, 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_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_Reset(prvm_prog_t *prog); void PRVM_StackTrace(prvm_prog_t *prog); +void PRVM_Breakpoint(prvm_prog_t *prog, int stack_index, const char *text); +void PRVM_Watchpoint(prvm_prog_t *prog, int stack_index, const char *text, etype_t type, prvm_eval_t *o, prvm_eval_t *n); void VM_Warning(prvm_prog_t *prog, const char *fmt, ...) DP_FUNC_PRINTF(2); @@ -869,4 +870,6 @@ void VM_FrameBlendFromFrameGroupBlend(frameblend_t *frameblend, const framegroup void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const dp_model_t *edmodel, const frameblend_t *frameblend); void VM_RemoveEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed); +void PRVM_ExplicitCoverageEvent(prvm_prog_t *prog, mfunction_t *func, int statement); + #endif