X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Futil.qh;h=3d6911b3fe917ee24d142ec1c27c1aa266ad3b99;hb=09c2c7cc220916338ad8d401265624efc5114a4e;hp=222c0223fdaefe8c595c31db76b7e5b841b3ca94;hpb=d03bf59652dab079deef7cf35e5b80599b13df05;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 222c0223f..3d6911b3f 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -1,7 +1,13 @@ // a dummy macro that prevents the "hanging ;" warning #define ENDS_WITH_CURLY_BRACE -#define ACCUMULATE_FUNCTION(func,otherfunc) \ +#ifdef HAVE_YO_DAWG_CPP +// TODO make ascii art pic of xzibit +// YO DAWG! +// I HERD YO LIEK MACROS +// SO I PUT A MACRO DEFINITION IN YO MACRO DEFINITION +// SO YO CAN EXPAND MACROS WHILE YO EXPAND MACROS +# define ACCUMULATE_FUNCTION(func,otherfunc) \ #ifdef func \ void __merge__##otherfunc() { func(); otherfunc(); } \ #undef func \ @@ -9,6 +15,27 @@ #else \ #define func otherfunc \ #endif +# define CALL_ACCUMULATED_FUNCTION(func) \ + func() +#else +# define ACCUMULATE_FUNCTION(func,otherfunc) \ + .void _ACCUMULATE_##func##__##otherfunc; +void ACCUMULATE_call(string func) +{ + float i; + float n = numentityfields(); + string funcprefix = strcat("_ACCUMULATE_", func, "__"); + float funcprefixlen = strlen(funcprefix); + for(i = 0; i < n; ++i) + { + string name = entityfieldname(i); + if(substring(name, 0, funcprefixlen) == funcprefix) + callfunction(substring(name, funcprefixlen, -1)); + } +} +# define CALL_ACCUMULATED_FUNCTION(func) \ + ACCUMULATE_call(#func) +#endif // this returns a tempstring containing a copy of s with additional \n newlines added, it also replaces \n in the text with a real newline // NOTE: s IS allowed to be a tempstring @@ -18,7 +45,12 @@ string wordwrap(string s, float l); void wordwrap_sprint(string s, float l); #endif #endif -void wordwrap_cb(string s, float l, void(string) callback) +void wordwrap_cb(string s, float l, void(string) callback); + +#ifndef SVQC +string draw_currentSkin; +string draw_UseSkinFor(string pic); +#endif // iterative depth-first search, with fields that go "up", "down left" and "right" in a tree // for each element, funcPre is called first, then funcPre and funcPost for all its children, and funcPost last @@ -69,6 +101,7 @@ string mmssss(float t); string ScoreString(float vflags, float value); +float dotproduct(vector a, vector b); vector cross(vector a, vector b); void compressShortVector_init(); @@ -158,13 +191,18 @@ vector solve_quadratic(float a, float b, float c); // z = 1 if a real solution exists, 0 if not // if no real solution exists, x contains the real part and y the imaginary part of the complex solutions x+iy and x-iy +vector solve_shotdirection(vector myorg, vector myvel, vector eorg, vector evel, float spd, float newton_style); +vector get_shotvelocity(vector myvel, vector mydir, float spd, float newton_style, float mi, float ma); + void check_unacceptable_compiler_bugs(); float compressShotOrigin(vector v); vector decompressShotOrigin(float f); +#ifdef SVQC string rankings_reply, ladder_reply, lsmaps_reply, lsnewmaps_reply, maplist_reply; // cached replies string records_reply[10]; +#endif float RandomSelection_totalweight; float RandomSelection_best_priority; @@ -188,8 +226,8 @@ void WriteInt24_t(float dest, float val); #endif // the NULL function -const var void func_null(void); FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(func_null) -const var string string_null; +var void func_null(void); FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(func_null) +var string string_null; float float2range11(float f); float float2range01(float f); @@ -270,7 +308,7 @@ float xdecode(string s); float lowestbit(float f); #ifdef CSQC -entity ReadCSQCEntity() +entity ReadCSQCEntity(); #endif #ifndef MENUQC @@ -287,6 +325,45 @@ float InterpretBoolean(string input); void Shutdown(); #ifndef MENUQC +.float skeleton_bones; +void Skeleton_SetBones(entity e); // loops through the tags of model v using counter tagnum -#define FOR_EACH_TAG(v) float tagnum; for(tagnum = 1, gettaginfo(v, tagnum);; tagnum++, gettaginfo(v, tagnum)) if not(gettaginfo_name) break; else +#define FOR_EACH_TAG(v) float tagnum; Skeleton_SetBones(v); for(tagnum = 0; tagnum < v.skeleton_bones; tagnum++, gettaginfo(v, tagnum)) +#endif +#ifdef SVQC +void WriteApproxPastTime(float dst, float t); +#endif +#ifdef CSQC +float ReadApproxPastTime(); +#endif + +// execute-stuff-next-frame subsystem +void execute_next_frame(); +void queue_to_execute_next_frame(string s); + +// for marking written-to values as unused where it's a good idea to do this +noref float unused_float; + + + +// a function f with: +// f(0) = 0 +// f(1) = 1 +// f'(0) = startspeedfactor +// f'(1) = endspeedfactor +float cubic_speedfunc(float startspeedfactor, float endspeedfactor, float x); + +// checks whether f'(x) = 0 anywhere from 0 to 1 +// because if this is the case, the function is not usable for platforms +// as it may exceed 0..1 bounds, or go in reverse +float cubic_speedfunc_is_sane(float startspeedfactor, float endspeedfactor); + +typedef entity(entity cur, entity near, entity pass) findNextEntityNearFunction_t; +typedef float(entity a, entity b, entity pass) isConnectedFunction_t; +void FindConnectedComponent(entity e, .entity fld, findNextEntityNearFunction_t nxt, isConnectedFunction_t iscon, entity pass); + +vector vec3(float x, float y, float z); + +#ifndef MENUQC +vector animfixfps(entity e, vector a, vector b); #endif