}
// drawpic wrapper to draw an image as large as possible with preserved aspect ratio into a box
-var float imgaspect;
-var float aspect;
+var float _drawpic_imgaspect;
+var vector _drawpic_imgsize;
+var vector _drawpic_sz;
+var float _drawpic_oldsz;
+var string _drawpic_picpath;
#define drawpic_aspect(pos,pic,mySize,color,alpha,drawflag)\
do {\
- vector imgsize;\
- imgsize = drawgetimagesize(pic);\
- imgaspect = imgsize_x/imgsize_y;\
- vector oldsz, sz;\
- oldsz = sz = mySize;\
- aspect = sz_x/sz_y;\
- if(aspect > imgaspect) {\
- sz_x = sz_y * imgaspect;\
- drawpic(pos + eX * (oldsz_x - sz_x) * 0.5, pic, sz, color, alpha, drawflag);\
+ _drawpic_imgsize = drawgetimagesize(pic);\
+ _drawpic_imgaspect = _drawpic_imgsize_x/_drawpic_imgsize_y;\
+ _drawpic_sz = mySize;\
+ if(_drawpic_sz_x/_drawpic_sz_y > _drawpic_imgaspect) {\
+ _drawpic_oldsz = _drawpic_sz_x;\
+ _drawpic_sz_x = _drawpic_sz_y * _drawpic_imgaspect;\
+ drawpic(pos + eX * (_drawpic_oldsz - _drawpic_sz_x) * 0.5, pic, _drawpic_sz, color, alpha, drawflag);\
} else {\
- sz_y = sz_x / imgaspect;\
- drawpic(pos + eY * (oldsz_y - sz_y) * 0.5, pic, sz, color, alpha, drawflag);\
+ _drawpic_oldsz = _drawpic_sz_y;\
+ _drawpic_sz_y = _drawpic_sz_x / _drawpic_imgaspect;\
+ drawpic(pos + eY * (_drawpic_oldsz - _drawpic_sz_y) * 0.5, pic, _drawpic_sz, color, alpha, drawflag);\
}\
} while(0)
// draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga
#define drawpic_aspect_skin(pos,pic,sz,color,alpha,drawflag)\
do{\
- picpath = strcat(hud_skin_path, "/", pic);\
- if(precache_pic(picpath) == "") {\
- picpath = strcat("gfx/hud/default/", pic);\
+ _drawpic_picpath = strcat(hud_skin_path, "/", pic);\
+ if(precache_pic(_drawpic_picpath) == "") {\
+ _drawpic_picpath = strcat("gfx/hud/default/", pic);\
}\
- drawpic_aspect(pos, picpath, sz, color, alpha, drawflag);\
+ drawpic_aspect(pos, _drawpic_picpath, sz, color, alpha, drawflag);\
+ _drawpic_picpath = string_null;\
} while(0)
// draw HUD element with image from gfx/hud/hud_skin/foo.tga if it exists, otherwise gfx/hud/default/foo.tga
#define drawpic_skin(pos,pic,sz,color,alpha,drawflag)\
do{\
- picpath = strcat(hud_skin_path, "/", pic);\
- if(precache_pic(picpath) == "") {\
- picpath = strcat("gfx/hud/default/", pic);\
+ _drawpic_picpath = strcat(hud_skin_path, "/", pic);\
+ if(precache_pic(_drawpic_picpath) == "") {\
+ _drawpic_picpath = strcat("gfx/hud/default/", pic);\
}\
- drawpic(pos, picpath, sz, color, alpha, drawflag);\
+ drawpic(pos, _drawpic_picpath, sz, color, alpha, drawflag);\
+ _drawpic_picpath = string_null;\
} while(0)
void drawpic_aspect_skin_expanding(vector position, string pic, vector scale, vector rgb, float alpha, float flag, float fadelerp)
// drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box
void drawstring_aspect(vector pos, string text, vector sz, vector color, float alpha, float drawflag) {
- vector textsize;
- textsize = eX * stringwidth(text, FALSE, '1 1 1' * sz_y) + eY * sz_y;
-
- float textaspect;
- textaspect = textsize_x/textsize_y;
-
- vector oldsz;
- oldsz = sz;
- float aspect;
- aspect = sz_x/sz_y;
-
- if(aspect > textaspect) {
+ float textaspect, oldsz;
+ textaspect = stringwidth(text, FALSE, '1 1 1' * sz_y) / sz_y;
+ if(sz_x/sz_y > textaspect) {
+ oldsz = sz_x;
sz_x = sz_y * textaspect;
- drawstring(pos + eX * (oldsz_x - sz_x) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag);
+ drawstring(pos + eX * (oldsz - sz_x) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag);
} else {
+ oldsz = sz_y;
sz_y = sz_x / textaspect;
- drawstring(pos + eY * (oldsz_y - sz_y) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag);
+ drawstring(pos + eY * (oldsz - sz_y) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag);
}
}
// drawstring wrapper to draw a colorcodedstring as large as possible with preserved aspect ratio into a box
void drawcolorcodedstring_aspect(vector pos, string text, vector sz, float alpha, float drawflag) {
- vector textsize;
- textsize = eX * stringwidth(text, TRUE, '1 1 1' * sz_y) + eY * sz_y;
-
- float textaspect;
- textaspect = textsize_x/textsize_y;
-
- vector oldsz;
- oldsz = sz;
- float aspect;
- aspect = sz_x/sz_y;
-
- if(aspect > textaspect) {
+ float textaspect, oldsz;
+ textaspect = stringwidth(text, TRUE, '1 1 1' * sz_y) / sz_y;
+ if(sz_x/sz_y > textaspect) {
+ oldsz = sz_x;
sz_x = sz_y * textaspect;
- drawcolorcodedstring(pos + eX * (oldsz_x - sz_x) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag);
+ drawcolorcodedstring(pos + eX * (oldsz - sz_x) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag);
} else {
+ oldsz = sz_y;
sz_y = sz_x / textaspect;
- drawcolorcodedstring(pos + eY * (oldsz_y - sz_y) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag);
+ drawcolorcodedstring(pos + eY * (oldsz - sz_y) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag);
}
}
// drawstring wrapper to draw a string as large as possible with preserved aspect ratio into a box
void drawstring_aspect_expanding(vector pos, string text, vector sz, vector color, float alpha, float drawflag, float fadelerp) {
- vector textsize;
- textsize = eX * stringwidth(text, FALSE, '1 1 1' * sz_y) + eY * sz_y;
-
- float textaspect;
- textaspect = textsize_x/textsize_y;
-
- vector oldsz;
- oldsz = sz;
- float aspect;
- aspect = sz_x/sz_y;
-
- if(aspect > textaspect) {
+ float textaspect, oldsz;
+ textaspect = stringwidth(text, FALSE, '1 1 1' * sz_y) / sz_y;
+ if(sz_x/sz_y > textaspect) {
+ oldsz = sz_x;
sz_x = sz_y * textaspect;
- drawstring_expanding(pos + eX * (oldsz_x - sz_x) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag, fadelerp);
+ drawstring_expanding(pos + eX * (oldsz - sz_x) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag, fadelerp);
} else {
+ oldsz = sz_y;
sz_y = sz_x / textaspect;
- drawstring_expanding(pos + eY * (oldsz_y - sz_y) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag, fadelerp);
+ drawstring_expanding(pos + eY * (oldsz - sz_y) * 0.5, text, '1 1 0' * sz_y, color, alpha, drawflag, fadelerp);
}
}
}
void drawcolorcodedstring_aspect_expanding(vector pos, string text, vector sz, float alpha, float drawflag, float fadelerp) {
- vector textsize;
- textsize = eX * stringwidth(text, TRUE, '1 1 1' * sz_y) + eY * sz_y;
-
- float textaspect;
- textaspect = textsize_x/textsize_y;
-
- vector oldsz;
- oldsz = sz;
- float aspect;
- aspect = sz_x/sz_y;
-
- if(aspect > textaspect) {
+ float textaspect, oldsz;
+ textaspect = stringwidth(text, TRUE, '1 1 1' * sz_y) / sz_y;
+ if(sz_x/sz_y > textaspect) {
+ oldsz = sz_x;
sz_x = sz_y * textaspect;
- drawcolorcodedstring_expanding(pos + eX * (oldsz_x - sz_x) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag, fadelerp);
+ drawcolorcodedstring_expanding(pos + eX * (oldsz - sz_x) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag, fadelerp);
} else {
+ oldsz = sz_y;
sz_y = sz_x / textaspect;
- drawcolorcodedstring_expanding(pos + eY * (oldsz_y - sz_y) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag, fadelerp);
+ drawcolorcodedstring_expanding(pos + eY * (oldsz - sz_y) * 0.5, text, '1 1 0' * sz_y, alpha, drawflag, fadelerp);
}
}
// this draws the triangles of a model DIRECTLY. Don't expect high performance, really...
-void PolyDrawModel(entity e)
+float PolyDrawModelSurface(entity e, float i_s)
{
- float i_s, i_t;
+ float i_t;
float n_t;
vector tri;
string tex;
+ tex = getsurfacetexture(e, i_s);
+ if not(tex)
+ return 0; // this is beyond the last one
+ n_t = getsurfacenumtriangles(e, i_s);
+ for(i_t = 0; i_t < n_t; ++i_t)
+ {
+ tri = getsurfacetriangle(e, i_s, i_t);
+ R_BeginPolygon(tex, 0);
+ R_PolygonVertex(getsurfacepoint(e, i_s, tri_x), getsurfacepointattribute(e, i_s, tri_x, SPA_TEXCOORDS0), '1 1 1', 1);
+ R_PolygonVertex(getsurfacepoint(e, i_s, tri_y), getsurfacepointattribute(e, i_s, tri_y, SPA_TEXCOORDS0), '1 1 1', 1);
+ R_PolygonVertex(getsurfacepoint(e, i_s, tri_z), getsurfacepointattribute(e, i_s, tri_z, SPA_TEXCOORDS0), '1 1 1', 1);
+ R_EndPolygon();
+ }
+ return 1;
+}
+void PolyDrawModel(entity e)
+{
+ float i_s;
for(i_s = 0; ; ++i_s)
+ if(!PolyDrawModelSurface(e, i_s))
+ break;
+}
+
+void DrawCircleClippedPic(vector centre, float radius, string pic, float f, vector rgb, float a, float drawflag)
+{
+ float x, y, q, d;
+ vector ringsize, v, t;
+ ringsize = radius * '1 1 0';
+
+ x = cos(f * 2 * M_PI);
+ y = sin(f * 2 * M_PI);
+ q = fabs(x) + fabs(y);
+ x /= q;
+ y /= q;
+
+ if(f >= 1)
{
- tex = getsurfacetexture(e, i_s);
- if not(tex)
- break; // this is beyond the last one
- n_t = getsurfacenumtriangles(e, i_s);
- for(i_t = 0; i_t < n_t; ++i_t)
+ // draw full rectangle
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ R_EndPolygon();
+
+ d = q - 1;
+ if(d > 0)
{
- tri = getsurfacetriangle(e, i_s, i_t);
- R_BeginPolygon(tex, 0);
- R_PolygonVertex(getsurfacepoint(e, i_s, tri_x), getsurfacepointattribute(e, i_s, tri_x, SPA_TEXCOORDS0), '1 1 1', 1);
- R_PolygonVertex(getsurfacepoint(e, i_s, tri_y), getsurfacepointattribute(e, i_s, tri_y, SPA_TEXCOORDS0), '1 1 1', 1);
- R_PolygonVertex(getsurfacepoint(e, i_s, tri_z), getsurfacepointattribute(e, i_s, tri_z, SPA_TEXCOORDS0), '1 1 1', 1);
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ }
+ }
+ else if(f > 0.75)
+ {
+ // draw upper and first triangle
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ R_EndPolygon();
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y -= 0.5 * ringsize_y; t -= '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ d = q - 0.75;
+ if(d <= 0)
R_EndPolygon();
+ }
+ else if(f > 0.5)
+ {
+ // draw upper triangle
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ R_EndPolygon();
+
+ d = q - 0.5;
+ if(d > 0)
+ {
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x -= 0.5 * ringsize_x; t -= '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
}
}
+ else if(f > 0.25)
+ {
+ // draw first triangle
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_y += 0.5 * ringsize_y; t += '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ d = q - 0.25;
+ if(d <= 0)
+ R_EndPolygon();
+ }
+ else
+ {
+ d = q;
+ if(d > 0)
+ {
+ R_BeginPolygon(pic, drawflag);
+ v = centre; t = '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+
+ v = centre; t = '0.5 0.5 0';
+ v_x += 0.5 * ringsize_x; t += '0.5 0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ }
+ }
+
+ if(d > 0)
+ {
+ v = centre; t = '0.5 0.5 0';
+ v_x += x * 0.5 * ringsize_x; t += x * '0.5 0.5 0';
+ v_y += y * 0.5 * ringsize_y; t += y * '0.5 -0.5 0';
+ R_PolygonVertex(v, t, rgb, a);
+ R_EndPolygon();
+ }
}