hedgewars/uRender.pas
changeset 7377 1aceade403ba
parent 7304 8b3575750cd2
child 11317 62287d4044e7
equal deleted inserted replaced
7374:514138949c76 7377:1aceade403ba
   120     mModelview[0,1]:= 0.0; mModelview[1,1]:=1.0;
   120     mModelview[0,1]:= 0.0; mModelview[1,1]:=1.0;
   121 end;
   121 end;
   122 
   122 
   123 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
   123 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
   124 begin
   124 begin
   125 r.y:= r.y + Height * Position;
   125     r.y:= r.y + Height * Position;
   126 r.h:= Height;
   126     r.h:= Height;
   127 DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture)
   127     DrawTextureFromRect(X, Y, @r, SpritesData[Sprite].Texture)
   128 end;
   128 end;
   129 
   129 
   130 procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   130 procedure DrawTextureFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   131 begin
   131 begin
   132 DrawTextureFromRect(X, Y, r^.w, r^.h, r, SourceTexture)
   132     DrawTextureFromRect(X, Y, r^.w, r^.h, r, SourceTexture)
   133 end;
   133 end;
   134 
   134 
   135 procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   135 procedure DrawTextureFromRect(X, Y, W, H: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   136 var 
   136 var 
   137     rr: TSDL_Rect;
   137     rr: TSDL_Rect;
   172     VertexBuffer[3].Y:= _b;
   172     VertexBuffer[3].Y:= _b;
   173 
   173 
   174     SetVertexPointer(@VertexBuffer[0]);
   174     SetVertexPointer(@VertexBuffer[0]);
   175     //SetTexCoordPointer(@TextureBuffer[0]);
   175     //SetTexCoordPointer(@TextureBuffer[0]);
   176     SetTexCoordPointer(@SourceTexture^.tb[0]);
   176     SetTexCoordPointer(@SourceTexture^.tb[0]);
   177     glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   177     //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   178 end;
   178 end;
   179 
   179 
   180 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
   180 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
   181 begin
   181 begin
   182     DrawTexture(X, Y, Texture, 1.0);
   182     DrawTexture(X, Y, Texture, 1.0);
   183 end;
   183 end;
   184 
   184 
   185 procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat);
   185 procedure DrawTexture(X, Y: LongInt; Texture: PTexture; Scale: GLfloat);
   186 begin
   186 begin
   187 SetOffset(X, Y);
   187     SetOffset(X, Y);
   188 ResetRotation;
   188     ResetRotation;
   189 SetScale(Scale);
   189     SetScale(Scale);
   190 UpdateModelview;
   190     UpdateModelview;
   191 
   191 
   192 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   192     glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   193 
   193     SetVertexPointer(@Texture^.vb);
   194 SetVertexPointer(@Texture^.vb);
   194     SetTexCoordPointer(@Texture^.tb);
   195 SetTexCoordPointer(@Texture^.tb);
   195     //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
   196 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
   196     glBindTexture(GL_TEXTURE_2D, 0); // DEBUG
   197 ResetModelview;
   197 
       
   198     ResetModelview;
   198 end;
   199 end;
   199 
   200 
   200 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt);
   201 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt);
   201 begin
   202 begin
   202     DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0)
   203     DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0)
   216     end;
   217     end;
   217 
   218 
   218     if Texture = nil then
   219     if Texture = nil then
   219         exit;
   220         exit;
   220 
   221 
   221 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
   222     // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
   222 if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then
   223     if (abs(X) > W) and ((abs(X + dir * OffsetX) - W / 2) * cScaleFactor > cScreenWidth) then
   223     exit;
   224         exit;
   224 if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then
   225     if (abs(Y) > H) and ((abs(Y + OffsetY - (0.5 * cScreenHeight)) - W / 2) * cScaleFactor > cScreenHeight) then
   225     exit;
   226         exit;
   226 
   227 
   227 SetOffset(X, Y);
   228 
   228 if Dir = 0 then Dir:= 1;
   229     SetOffset(X, Y);
   229 
   230     if Dir = 0 then
   230 SetRotation(Angle, Dir);
   231         Dir:= 1;
   231 AddOffset(Dir*OffsetX, OffsetY);
   232 
   232 AddScale(Scale);
   233     SetRotation(Angle, Dir);
   233 UpdateModelview;
   234     AddOffset(Dir*OffsetX, OffsetY);
       
   235     AddScale(Scale);
       
   236     UpdateModelview;
   234 
   237 
   235 // Any reason for this call? And why only in t direction, not s?
   238 // Any reason for this call? And why only in t direction, not s?
   236 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   239 //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   237 
   240 
   238 hw:= w div (2 div Dir);
   241     hw:= w div (2 div Dir);
   239 
   242 
   240 r.y:=0;
   243     r.y:=0;
   241 r.x:=0;
   244     r.x:=0;
   242 r.w:=w;
   245     r.w:=w;
   243 r.h:=h;
   246     r.h:=h;
   244 ComputeTexcoords(Texture, @r, @TextureBuffer);
   247     ComputeTexcoords(Texture, @r, @TextureBuffer);
       
   248 
       
   249     glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
       
   250 
       
   251     _l:= -hw + Texture^.cropInfo.l;
       
   252     _t:= w/-2 + Texture^.cropInfo.t;
       
   253     _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
       
   254     _b:= w/2 - Texture^.cropInfo.t - Texture^.cropInfo.b;
       
   255 
       
   256     VertexBuffer[0].X:= _l;
       
   257     VertexBuffer[0].Y:= _t;
       
   258     VertexBuffer[1].X:= _r;
       
   259     VertexBuffer[1].Y:= _t;
       
   260     VertexBuffer[2].X:= _r;
       
   261     VertexBuffer[2].Y:= _b;
       
   262     VertexBuffer[3].X:= _l;
       
   263     VertexBuffer[3].Y:= _b;
       
   264 
       
   265     //SetVertexPointer(@VertexBuffer[0]);
       
   266     //SetTexCoordPointer(@TextureBuffer[0]);
       
   267 
       
   268     SetVertexPointer(@Texture^.vb[0]);
       
   269     SetTexCoordPointer(@Texture^.tb[0]);
       
   270     //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   271 
       
   272     ResetModelview;
       
   273 end;
       
   274 
       
   275 procedure DrawSpriteRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
       
   276 begin
       
   277     DrawTextureRotated(SpritesData[Sprite].Texture,
       
   278         SpritesData[Sprite].Width,
       
   279         SpritesData[Sprite].Height,
       
   280         X, Y, Dir, Angle)
       
   281 end;
       
   282 
       
   283 procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
       
   284 var VertexBuffer: array [0..3] of TVertex2f;
       
   285     _l, _r, _t, _b: GLfloat;
       
   286 begin
       
   287 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
       
   288 if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then
       
   289     exit;
       
   290 if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then
       
   291     exit;
       
   292 
       
   293 SetOffset(X, Y);
       
   294 
       
   295 if Dir < 0 then
       
   296     begin
       
   297     hw:= - hw;
       
   298     SetRotation(Angle, -1.0);
       
   299     end
       
   300 else
       
   301     SetRotation(Angle, 1.0);
       
   302 UpdateModelview;
   245 
   303 
   246 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   304 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   247 
   305 
   248 _l:= -hw + Texture^.cropInfo.l;
   306 _l:= -hw + Texture^.cropInfo.l;
   249 _t:= w/-2 + Texture^.cropInfo.t;
   307 _t:= -hh + Texture^.cropInfo.t;
   250 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
   308 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
   251 _b:= w/2 - Texture^.cropInfo.t - Texture^.cropInfo.b;
   309 _b:= hh - Texture^.cropInfo.t - Texture^.cropInfo.b;
   252 
   310 
   253 VertexBuffer[0].X:= _l;
   311 VertexBuffer[0].X:= _l;
   254 VertexBuffer[0].Y:= _t;
   312 VertexBuffer[0].Y:= _t;
   255 VertexBuffer[1].X:= _r;
   313 VertexBuffer[1].X:= _r;
   256 VertexBuffer[1].Y:= _t;
   314 VertexBuffer[1].Y:= _t;
   258 VertexBuffer[2].Y:= _b;
   316 VertexBuffer[2].Y:= _b;
   259 VertexBuffer[3].X:= _l;
   317 VertexBuffer[3].X:= _l;
   260 VertexBuffer[3].Y:= _b;
   318 VertexBuffer[3].Y:= _b;
   261 
   319 
   262 SetVertexPointer(@VertexBuffer[0]);
   320 SetVertexPointer(@VertexBuffer[0]);
   263 //SetTexCoordPointer(@TextureBuffer[0]);
   321 SetTexCoordPointer(@Texture^.tb);
   264 SetTexCoordPointer(@Texture^.tb[0]);
   322 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   265 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   266 
   323 
   267 ResetModelview;
   324 ResetModelview;
   268 end;
   325 end;
   269 
   326 
   270 procedure DrawSpriteRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
   327 
   271 begin
       
   272     DrawTextureRotated(SpritesData[Sprite].Texture,
       
   273         SpritesData[Sprite].Width,
       
   274         SpritesData[Sprite].Height,
       
   275         X, Y, Dir, Angle)
       
   276 end;
       
   277 
   328 
   278 procedure DrawSpriteRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real);
   329 procedure DrawSpriteRotatedF(Sprite: TSprite; X, Y, Frame, Dir: LongInt; Angle: real);
   279 begin
   330 var
   280 SetOffset(X, Y);
       
   281 if Dir < 0 then
       
   282     SetRotation(Angle, -1.0)
       
   283 else
       
   284     SetRotation(Angle, 1.0);
       
   285 if Dir < 0 then
       
   286     AddScale(-1.0, 1.0);
       
   287 UpdateModelview;
       
   288 
       
   289 DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame);
       
   290 
       
   291 ResetModelview;
       
   292 end;
       
   293 
       
   294 procedure DrawTextureRotated(Texture: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
       
   295 var VertexBuffer: array [0..3] of TVertex2f;
       
   296     _l, _r, _t, _b: GLfloat;
       
   297 begin
       
   298 // do not draw anything outside the visible screen space (first check fixes some sprite drawing, e.g. hedgehogs)
       
   299 if (abs(X) > 2 * hw) and ((abs(X) - hw) > cScreenWidth / cScaleFactor) then
       
   300     exit;
       
   301 if (abs(Y) > 2 * hh) and ((abs(Y - 0.5 * cScreenHeight) - hh) > cScreenHeight / cScaleFactor) then
       
   302     exit;
       
   303 
       
   304 SetOffset(X, Y);
       
   305 
       
   306 if Dir < 0 then
       
   307     begin
       
   308     hw:= - hw;
       
   309     SetRotation(Angle, -1.0);
       
   310     end
       
   311 else
       
   312     SetRotation(Angle, 1.0);
       
   313 UpdateModelview;
       
   314 
       
   315 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
       
   316 
       
   317 _l:= -hw + Texture^.cropInfo.l;
       
   318 _t:= -hh + Texture^.cropInfo.t;
       
   319 _r:= hw - Texture^.cropInfo.l - Texture^.cropInfo.r;
       
   320 _b:= hh - Texture^.cropInfo.t - Texture^.cropInfo.b;
       
   321 
       
   322 VertexBuffer[0].X:= _l;
       
   323 VertexBuffer[0].Y:= _t;
       
   324 VertexBuffer[1].X:= _r;
       
   325 VertexBuffer[1].Y:= _t;
       
   326 VertexBuffer[2].X:= _r;
       
   327 VertexBuffer[2].Y:= _b;
       
   328 VertexBuffer[3].X:= _l;
       
   329 VertexBuffer[3].Y:= _b;
       
   330 
       
   331 SetVertexPointer(@VertexBuffer[0]);
       
   332 SetTexCoordPointer(@Texture^.tb);
       
   333 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   334 
       
   335 ResetModelview;
       
   336 end;
       
   337 
       
   338 procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt);
       
   339 var 
       
   340     r: TSDL_Rect;
       
   341     tex: PTexture;
   331     tex: PTexture;
   342 begin
   332 begin
   343     if SpritesData[Sprite].imageHeight = 0 then
   333     if SpritesData[Sprite].imageHeight = 0 then
   344         exit;
   334         exit;
   345 
   335 
   352     end;
   342     end;
   353 
   343 
   354     if (tex = nil) or (tex^.w = 0) or (tex^.h = 0) then
   344     if (tex = nil) or (tex^.w = 0) or (tex^.h = 0) then
   355         exit;
   345         exit;
   356 
   346 
   357     r.x:= 0;
   347     SetOffset(X, Y);
   358     r.w:= SpritesData[Sprite].Width;
   348 
   359     r.y:= 0;
   349     if Dir < 0 then
   360     r.h:= SpritesData[Sprite].Height;
   350     begin
   361     DrawTextureFromRect(X, Y, @r, tex)
   351         SetRotation(Angle, -1.0);
       
   352         AddScale(-1.0, 1.0);
       
   353     end 
       
   354     else
       
   355         SetRotation(Angle, 1.0);
       
   356         
       
   357     UpdateModelview;
       
   358 
       
   359     glBindTexture(GL_TEXTURE_2D, tex^.atlas^.id);
       
   360     SetVertexPointer(@tex^.vb);
       
   361     SetTexCoordPointer(@tex^.tb);
       
   362     glDrawArrays(GL_TRIANGLE_FAN, 0, Length(tex^.vb));
       
   363     glBindTexture(GL_TEXTURE_2D, 0); // DEBUG
       
   364 
       
   365     ResetModelview;
       
   366 end;
       
   367 
       
   368 
       
   369 procedure DrawSprite(Sprite: TSprite; X, Y, Frame: LongInt);
       
   370 begin
       
   371     DrawSpriteRotatedF(Sprite, X, Y, Frame, 1, 0.0);
   362 end;
   372 end;
   363 
   373 
   364 procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt);
   374 procedure DrawSpriteClipped(Sprite: TSprite; X, Y, TopY, RightX, BottomY, LeftX: LongInt);
   365 var r: TSDL_Rect;
   375 var r: TSDL_Rect;
   366 begin
   376 begin
   411     VertexBuffer[0].Y:= Y0;
   421     VertexBuffer[0].Y:= Y0;
   412     VertexBuffer[1].X:= X1;
   422     VertexBuffer[1].X:= X1;
   413     VertexBuffer[1].Y:= Y1;
   423     VertexBuffer[1].Y:= Y1;
   414 
   424 
   415     SetVertexPointer(@VertexBuffer[0]);
   425     SetVertexPointer(@VertexBuffer[0]);
   416     glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
   426     //glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
   417     Tint($FF, $FF, $FF, $FF);
   427     Tint($FF, $FF, $FF, $FF);
   418     
   428     
   419     ResetModelview;
   429     ResetModelview;
   420     
   430     
   421     glEnable(GL_TEXTURE_2D);
   431     glEnable(GL_TEXTURE_2D);
   447 VertexBuffer[2].Y:= r.y + r.h;
   457 VertexBuffer[2].Y:= r.y + r.h;
   448 VertexBuffer[3].X:= r.x;
   458 VertexBuffer[3].X:= r.x;
   449 VertexBuffer[3].Y:= r.y + r.h;
   459 VertexBuffer[3].Y:= r.y + r.h;
   450 
   460 
   451 SetVertexPointer(@VertexBuffer[0]);
   461 SetVertexPointer(@VertexBuffer[0]);
   452 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   462 //glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   453 
   463 
   454 Tint($FF, $FF, $FF, $FF);
   464 Tint($FF, $FF, $FF, $FF);
   455 glEnable(GL_TEXTURE_2D);
   465 glEnable(GL_TEXTURE_2D);
   456 
   466 
   457 ResetModelview;
   467 ResetModelview;
   478     SetOffset(0, 0);
   488     SetOffset(0, 0);
   479     ResetRotation;
   489     ResetRotation;
   480     UpdateModelview;
   490     UpdateModelview;
   481     glLineWidth(Width);
   491     glLineWidth(Width);
   482     SetVertexPointer(@CircleVertex[0]);
   492     SetVertexPointer(@CircleVertex[0]);
   483     glDrawArrays(GL_LINE_LOOP, 0, 60);
   493     //glDrawArrays(GL_LINE_LOOP, 0, 60);
   484     glEnable(GL_TEXTURE_2D);
   494     glEnable(GL_TEXTURE_2D);
   485     glDisable(GL_LINE_SMOOTH);
   495     glDisable(GL_LINE_SMOOTH);
   486     ResetModelview;
   496     ResetModelview;
   487 end;
   497 end;
   488 
   498 
   520     if Dir = -1 then
   530     if Dir = -1 then
   521         SetVertexPointer(@VertexBuffers[1][0])
   531         SetVertexPointer(@VertexBuffers[1][0])
   522     else
   532     else
   523         SetVertexPointer(@VertexBuffers[0][0]);
   533         SetVertexPointer(@VertexBuffers[0][0]);
   524     SetTexCoordPointer(@TextureBuffer[0]);
   534     SetTexCoordPointer(@TextureBuffer[0]);
   525     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
   535     //glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
   526 
   536 
   527     ResetModelview;
   537     ResetModelview;
   528 end;
   538 end;
   529 
   539 
   530 procedure DrawScreenWidget(widget: POnScreenWidget);
   540 procedure DrawScreenWidget(widget: POnScreenWidget);