X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fgame%2Frenders%2Fopengl%2Fr_draw.pas;h=1b1c6262bdf17196cfabf8e88714e664c512d54b;hb=0592c8529428165e2523e0cb054bff29e297777a;hp=fbdae7e4ee8e09cdfd307dc29365d7b322f88149;hpb=df1f12c26369a0d5e9e996583b30c9879570fe99;p=d2df-sdl.git diff --git a/src/game/renders/opengl/r_draw.pas b/src/game/renders/opengl/r_draw.pas index fbdae7e..1b1c626 100644 --- a/src/game/renders/opengl/r_draw.pas +++ b/src/game/renders/opengl/r_draw.pas @@ -26,16 +26,21 @@ interface procedure r_Draw_TextureRepeat (img: TGLTexture; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean); procedure r_Draw_TextureRepeatRotate (img: TGLTexture; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean; rx, ry, angle: Integer); - procedure r_Draw_MultiTextureRepeat (m: TGLMultiTexture; const anim: TAnimState; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean); - procedure r_Draw_MultiTextureRepeatRotate (m: TGLMultiTexture; const anim: TAnimState; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean; rx, ry, angle: Integer); + procedure r_Draw_MultiTextureRepeat (m: TGLMultiTexture; const anim: TAnimState; backanim: Boolean; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean); + 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 @@ -45,8 +50,7 @@ implementation GL, GLEXT, {$ENDIF} SysUtils, Classes, Math, - e_log, utils, - g_game // gScreenWidth, gScreenHeight + e_log, utils ; const @@ -55,15 +59,25 @@ implementation 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); @@ -123,22 +137,24 @@ implementation begin offx := 0; offy := 0; + 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 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; + glTranslatef(n.width, 0, 0); offx := offx + n.width; end; + glTranslatef(-offx, n.height, 0); offx := 0; offy := offy + n.height; end; + glPopMatrix; end end; @@ -172,28 +188,23 @@ implementation r_Draw_TextureRepeat(img, x, y, w, h, flip, r, g, b, a, blend); end; - procedure r_Draw_MultiTextureRepeat (m: TGLMultiTexture; const anim: TAnimState; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean); - var img: TGLTexture; cur, total, i: Integer; + procedure r_Draw_MultiTextureRepeat (m: TGLMultiTexture; const anim: TAnimState; backanim: Boolean; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean); + var img: TGLTexture; frame: LongInt; begin ASSERT(anim.IsValid()); if m = nil then r_Draw_TextureRepeat(nil, x, y, w, h, flip, NTR, NTG, NTB, NTB, blend) else begin - if m.BackAnim then - begin - total := m.count * 2 - 1; - cur := anim.CurrentFrame mod total; - if cur < m.count then i := cur else i := total - cur - 1; - end - else - i := anim.CurrentFrame mod m.count; - img := m.GetTexture(i); + g_Anim_GetFrameFromState(anim, backanim, frame); + ASSERT(frame >= 0); + ASSERT(frame < m.count); + img := m.GetTexture(frame); r_Draw_TextureRepeat(img, x, y, w, h, flip, r, g, b, a, blend); end end; - procedure r_Draw_MultiTextureRepeatRotate (m: TGLMultiTexture; const anim: TAnimState; x, y, w, h: Integer; flip: Boolean; r, g, b, a: Byte; blend: Boolean; rx, ry, angle: Integer); + 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); begin ASSERT(w >= 0); ASSERT(h >= 0); @@ -203,11 +214,11 @@ implementation glTranslatef(x + rx, y + ry, 0); glRotatef(angle, 0, 0, 1); glTranslatef(-(x + rx), -(y + ry), 0); - r_Draw_MultiTextureRepeat(m, anim, x, y, w, h, flip, r, g, b, a, blend); + r_Draw_MultiTextureRepeat(m, anim, backanim, x, y, w, h, flip, r, g, b, a, blend); glPopMatrix; end else - r_Draw_MultiTextureRepeat(m, anim, x, y, w, h, flip, r, g, b, a, blend); + r_Draw_MultiTextureRepeat(m, anim, backanim, x, y, w, h, flip, r, g, b, a, blend); end; procedure r_Draw_Filter (l, t, r, b: Integer; rr, gg, bb, aa: Byte); @@ -226,6 +237,28 @@ implementation 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); @@ -235,10 +268,22 @@ implementation 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; @@ -287,4 +332,20 @@ implementation 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.