X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fclient%2Fmiscfunctions.qc;h=b37e209a569bbd74faa991ea2b75b35f21bc334a;hb=4fc59bbd7e2d4f25ba21952ed50ae754295a7faa;hp=5c377bffadb8ade59c381071def85021d3181ba8;hpb=30d92d8ea9df4c1e354a3b1e186dd5d0ee61709f;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/client/miscfunctions.qc b/qcsrc/client/miscfunctions.qc index 5c377bffa..b37e209a5 100644 --- a/qcsrc/client/miscfunctions.qc +++ b/qcsrc/client/miscfunctions.qc @@ -460,43 +460,47 @@ void drawpic_tiled(vector pos, string pic, vector sz, vector area, vector color, } // 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 float _drawpic_aspect; +var vector _drawpic_imgsize; +var vector _drawpic_sz; +var vector _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_oldsz = _drawpic_sz = mySize;\ + _drawpic_aspect = _drawpic_sz_x/_drawpic_sz_y;\ + if(_drawpic_aspect > _drawpic_imgaspect) {\ + _drawpic_sz_x = _drawpic_sz_y * _drawpic_imgaspect;\ + drawpic(pos + eX * (_drawpic_oldsz_x - _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_sz_y = _drawpic_sz_x / _drawpic_imgaspect;\ + drawpic(pos + eY * (_drawpic_oldsz_y - _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) @@ -627,28 +631,33 @@ void drawcolorcodedstring_aspect_expanding(vector pos, string text, vector sz, f } // 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; - for(i_s = 0; ; ++i_s) + 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) { - 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) - { - 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(); - } + 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)