index b8b90210de603771695a9b76e8f2b1328207f9e6..9db91836645d5460279debd7a4937a1ab3471bb9 100644 (file)
procedure r_Draw_MultiTextureRepeatRotate (m: TGLMultiTexture; const anim: TAnimState; backanim: Boolean; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean; rx, ry, angle: Integer);
procedure r_Draw_Filter (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
+ procedure r_Draw_Rect (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
procedure r_Draw_FillRect (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
procedure r_Draw_InvertRect (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
procedure r_Draw_Text (const text: AnsiString; x, y: Integer; r, g, b, a: Byte; f: TGLFont);
procedure r_Draw_GetTextSize (const text: AnsiString; f: TGLFont; out w, h: Integer);
+ procedure r_Draw_Setup (w, h: Integer);
+ procedure r_Draw_SetRect (l, t, r, b: Integer);
+ procedure r_Draw_GetRect (out l, t, r, b: Integer);
+
implementation
uses
GL, GLEXT,
{$ENDIF}
SysUtils, Classes, Math,
- e_log, utils,
- g_game // gScreenWidth, gScreenHeight
+ e_log, utils
;
const
NTB = $00;
NTA = $FF;
- procedure SetupMatrix;
+ var
+ sl, st, sr, sb: Integer;
+ ScreenWidth, ScreenHeight: Integer;
+
+ procedure r_Draw_Setup (w, h: Integer);
begin
- glScissor(0, 0, gScreenWidth, gScreenHeight);
- glViewport(0, 0, gScreenWidth, gScreenHeight);
+ ASSERT(w >= 0);
+ ASSERT(h >= 0);
+ ScreenWidth := w;
+ ScreenHeight := h;
+ glScissor(0, 0, w, h);
+ glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
- glOrtho(0, gScreenWidth, gScreenHeight, 0, 0, 1);
+ glOrtho(0, w, h, 0, 0, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
+ glEnable(GL_SCISSOR_TEST);
+ r_Draw_SetRect(0, 0, w - 1, h - 1);
end;
procedure DrawQuad (x, y, w, h: Integer);
end;
procedure r_Draw_Texture (img: TGLTexture; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean);
- var i, j, offx, offy: Integer; n: TGLAtlasNode;
+ var i, j, first, last, step: Integer; n: TGLAtlasNode;
begin
ASSERT(w >= 0);
ASSERT(h >= 0);
DrawTile(nil, x, y, w, h, flip, NTR, NTB, NTG, NTA, blend)
else
begin
- offx := 0;
- offy := 0;
+ if flip then first := img.cols - 1 else first := 0;
+ if flip then last := -1 else last := img.cols;
+ if flip then step := -1 else step := +1;
+ glPushMatrix;
+ glTranslatef(x, y, 0);
+ glScalef(w / img.width, h / img.height, 1);
for j := 0 to img.lines - 1 do
begin
- for i := 0 to img.cols - 1 do
- begin
+ i := first;
+ repeat
n := img.GetTile(i, j);
ASSERT(n <> nil);
- glPushMatrix;
- glTranslatef(x + offx, y + offy, 0);
- glScalef(w / img.width, h / img.height, 1);
DrawTile(n, 0, 0, n.width, n.height, flip, r, g, b, a, blend);
- glPopMatrix;
- offx := offx + n.width;
- end;
- offx := 0;
- offy := offy + n.height;
+ glTranslatef(n.width, 0, 0);
+ i := i + step;
+ until i = last;
+ glTranslatef(-img.width, n.height, 0);
end;
+ glPopMatrix;
end
end;
glEnd;
end;
+ procedure r_Draw_Rect (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
+ begin
+ ASSERT(r >= l);
+ ASSERT(b >= t);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_TEXTURE_2D);
+ glColor4ub(rr, gg, bb, aa);
+ glBegin(GL_LINE_LOOP);
+{
+ glVertex2i(l, t);
+ glVertex2i(r, t);
+ glVertex2i(r, b);
+ glVertex2i(l, b);
+}
+ glVertex2f(l + 0.5, t + 0.5);
+ glVertex2f(r - 0.5, t + 0.5);
+ glVertex2f(r - 0.5, b - 0.5);
+ glVertex2f(l + 0.5, b - 0.5);
+ glEnd;
+ end;
+
procedure r_Draw_FillRect (l, t, r, b: Integer; rr, gg, bb, aa: Byte);
begin
ASSERT(r >= l);
glDisable(GL_TEXTURE_2D);
glColor4ub(rr, gg, bb, aa);
glBegin(GL_QUADS);
+{
glVertex2i(l, t);
glVertex2i(r, t);
glVertex2i(r, b);
glVertex2i(l, b);
+}
+{
+ glVertex2f(l + 0.5, t + 0.5);
+ glVertex2f(r - 0.5, t + 0.5);
+ glVertex2f(r - 0.5, b - 0.5);
+ glVertex2f(l + 0.5, b - 0.5);
+}
+ glVertex2f(l + 0, t + 0);
+ glVertex2f(r + 0.75, t + 0);
+ glVertex2f(r + 0.75, b + 0.75);
+ glVertex2f(l + 0, b + 0.75);
glEnd;
end;
end;
end;
+ procedure r_Draw_SetRect (l, t, r, b: Integer);
+ var w, h: Integer;
+ begin
+ ASSERT(l <= r);
+ ASSERT(t <= b);
+ w := r - l + 1;
+ h := b - t + 1;
+ glScissor(l, ScreenHeight - h - t, w, h);
+ sl := l; st := t; sr := r; sb := b;
+ end;
+
+ procedure r_Draw_GetRect (out l, t, r, b: Integer);
+ begin
+ l := sl; t := st; r := sr; b := sb;
+ end;
+
end.