hedgewars/uRender.pas
changeset 7188 580cd247511e
parent 7138 f8248bcba8f1
child 7304 8b3575750cd2
equal deleted inserted replaced
7186:013deb83086b 7188:580cd247511e
    46 procedure DrawLine              (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte);
    46 procedure DrawLine              (X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte);
    47 procedure DrawFillRect          (r: TSDL_Rect);
    47 procedure DrawFillRect          (r: TSDL_Rect);
    48 procedure DrawHedgehog          (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real);
    48 procedure DrawHedgehog          (X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real);
    49 procedure DrawScreenWidget      (widget: POnScreenWidget);
    49 procedure DrawScreenWidget      (widget: POnScreenWidget);
    50 
    50 
    51 procedure Tint                  (r, g, b, a: Byte); inline;
       
    52 procedure Tint                  (c: Longword); inline;
       
    53 
       
    54 // This is just temporary and becomes non public once everything changed to GL2
    51 // This is just temporary and becomes non public once everything changed to GL2
    55 procedure UpdateModelview;
    52 procedure UpdateModelview;
    56 procedure ResetModelview;
    53 procedure ResetModelview;
    57 procedure SetOffset(X, Y: Longint);
    54 procedure SetOffset(X, Y: Longint);
    58 procedure ResetRotation;
    55 procedure ResetRotation;
    59 
    56 
    60 
    57 
    61 implementation
    58 implementation
    62 uses uVariables, uStore;
    59 uses uVariables, uStore;
    63 
       
    64 var LastTint: LongWord = 0;
       
    65 
    60 
    66 const DegToRad =  0.01745329252; // 2PI / 360
    61 const DegToRad =  0.01745329252; // 2PI / 360
    67 
    62 
    68 procedure UpdateModelview;
    63 procedure UpdateModelview;
    69 begin
    64 begin
   167 VertexBuffer[2].X:= rr.w + X;
   162 VertexBuffer[2].X:= rr.w + X;
   168 VertexBuffer[2].Y:= rr.h + Y;
   163 VertexBuffer[2].Y:= rr.h + Y;
   169 VertexBuffer[3].X:= X;
   164 VertexBuffer[3].X:= X;
   170 VertexBuffer[3].Y:= rr.h + Y;
   165 VertexBuffer[3].Y:= rr.h + Y;
   171 
   166 
   172 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   167 SetVertexPointer(@VertexBuffer[0]);
   173 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   168 SetTexCoordPointer(@TextureBuffer[0]);
   174 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   169 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   175 end;
   170 end;
   176 
   171 
   177 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
   172 procedure DrawTexture(X, Y: LongInt; Texture: PTexture); inline;
   178 begin
   173 begin
   186 SetScale(Scale);
   181 SetScale(Scale);
   187 UpdateModelview;
   182 UpdateModelview;
   188 
   183 
   189 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   184 glBindTexture(GL_TEXTURE_2D, Texture^.atlas^.id);
   190 
   185 
   191 glVertexPointer(2, GL_FLOAT, 0, @Texture^.vb);
   186 SetVertexPointer(@Texture^.vb);
   192 glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb);
   187 SetTexCoordPointer(@Texture^.tb);
   193 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
   188 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(Texture^.vb));
   194 ResetModelview;
   189 ResetModelview;
   195 end;
   190 end;
   196 
   191 
   197 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt);
   192 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt);
   241 VertexBuffer[2].X:= hw;
   236 VertexBuffer[2].X:= hw;
   242 VertexBuffer[2].Y:= w / 2;
   237 VertexBuffer[2].Y:= w / 2;
   243 VertexBuffer[3].X:= -hw;
   238 VertexBuffer[3].X:= -hw;
   244 VertexBuffer[3].Y:= w / 2;
   239 VertexBuffer[3].Y:= w / 2;
   245 
   240 
   246 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   241 SetVertexPointer(@VertexBuffer[0]);
   247 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   242 SetTexCoordPointer(@TextureBuffer[0]);
   248 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   243 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   249 
   244 
   250 ResetModelview;
   245 ResetModelview;
   251 end;
   246 end;
   252 
   247 
   303 VertexBuffer[2].X:= hw;
   298 VertexBuffer[2].X:= hw;
   304 VertexBuffer[2].Y:= hh;
   299 VertexBuffer[2].Y:= hh;
   305 VertexBuffer[3].X:= -hw;
   300 VertexBuffer[3].X:= -hw;
   306 VertexBuffer[3].Y:= hh;
   301 VertexBuffer[3].Y:= hh;
   307 
   302 
   308 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   303 SetVertexPointer(@VertexBuffer[0]);
   309 glTexCoordPointer(2, GL_FLOAT, 0, @Texture^.tb);
   304 SetTexCoordPointer(@Texture^.tb);
   310 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   305 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   311 
   306 
   312 ResetModelview;
   307 ResetModelview;
   313 end;
   308 end;
   314 
   309 
   382     VertexBuffer[0].X:= X0;
   377     VertexBuffer[0].X:= X0;
   383     VertexBuffer[0].Y:= Y0;
   378     VertexBuffer[0].Y:= Y0;
   384     VertexBuffer[1].X:= X1;
   379     VertexBuffer[1].X:= X1;
   385     VertexBuffer[1].Y:= Y1;
   380     VertexBuffer[1].Y:= Y1;
   386 
   381 
   387     glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   382     SetVertexPointer(@VertexBuffer[0]);
   388     glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
   383     glDrawArrays(GL_LINES, 0, Length(VertexBuffer));
   389     Tint($FF, $FF, $FF, $FF);
   384     Tint($FF, $FF, $FF, $FF);
   390     
   385     
   391     ResetModelview;
   386     ResetModelview;
   392     
   387     
   418 VertexBuffer[2].X:= r.x + r.w;
   413 VertexBuffer[2].X:= r.x + r.w;
   419 VertexBuffer[2].Y:= r.y + r.h;
   414 VertexBuffer[2].Y:= r.y + r.h;
   420 VertexBuffer[3].X:= r.x;
   415 VertexBuffer[3].X:= r.x;
   421 VertexBuffer[3].Y:= r.y + r.h;
   416 VertexBuffer[3].Y:= r.y + r.h;
   422 
   417 
   423 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   418 SetVertexPointer(@VertexBuffer[0]);
   424 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   419 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   425 
   420 
   426 Tint($FF, $FF, $FF, $FF);
   421 Tint($FF, $FF, $FF, $FF);
   427 glEnable(GL_TEXTURE_2D);
   422 glEnable(GL_TEXTURE_2D);
   428 
   423 
   449     glEnable(GL_LINE_SMOOTH);
   444     glEnable(GL_LINE_SMOOTH);
   450     SetOffset(0, 0);
   445     SetOffset(0, 0);
   451     ResetRotation;
   446     ResetRotation;
   452     UpdateModelview;
   447     UpdateModelview;
   453     glLineWidth(Width);
   448     glLineWidth(Width);
   454     glVertexPointer(2, GL_FLOAT, 0, @CircleVertex[0]);
   449     SetVertexPointer(@CircleVertex[0]);
   455     glDrawArrays(GL_LINE_LOOP, 0, 60);
   450     glDrawArrays(GL_LINE_LOOP, 0, 60);
   456     glEnable(GL_TEXTURE_2D);
   451     glEnable(GL_TEXTURE_2D);
   457     glDisable(GL_LINE_SMOOTH);
   452     glDisable(GL_LINE_SMOOTH);
   458     ResetModelview;
   453     ResetModelview;
   459 end;
   454 end;
   488     SetRotation(Angle, 1.0);
   483     SetRotation(Angle, 1.0);
   489     UpdateModelview;
   484     UpdateModelview;
   490 
   485 
   491     glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id);
   486     glBindTexture(GL_TEXTURE_2D, HHTexture^.atlas^.id);
   492     if Dir = -1 then
   487     if Dir = -1 then
   493         glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[1][0])
   488         SetVertexPointer(@VertexBuffers[1][0])
   494     else
   489     else
   495         glVertexPointer(2, GL_FLOAT, 0, @VertexBuffers[0][0]);
   490         SetVertexPointer(@VertexBuffers[0][0]);
   496     glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   491     SetTexCoordPointer(@TextureBuffer[0]);
   497     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
   492     glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
   498 
   493 
   499     ResetModelview;
   494     ResetModelview;
   500 end;
   495 end;
   501 
   496 
   544 begin
   539 begin
   545 widget:= widget; // avoid hint
   540 widget:= widget; // avoid hint
   546 {$ENDIF}
   541 {$ENDIF}
   547 end;
   542 end;
   548 
   543 
   549 procedure Tint(r, g, b, a: Byte); inline;
       
   550 var nc, tw: Longword;
       
   551 begin
       
   552     nc:= (a shl 24) or (b shl 16) or (g shl 8) or r;
       
   553 
       
   554     if nc = lastTint then
       
   555         exit;
       
   556 
       
   557     if GrayScale then
       
   558         begin
       
   559         tw:= round(r * RGB_LUMINANCE_RED + g * RGB_LUMINANCE_GREEN + b * RGB_LUMINANCE_BLUE);
       
   560         if tw > 255 then
       
   561             tw:= 255;
       
   562         r:= tw;
       
   563         g:= tw;
       
   564         b:= tw
       
   565         end;
       
   566 
       
   567     glColor4ub(r, g, b, a);
       
   568     lastTint:= nc;
       
   569 end;
       
   570 
       
   571 procedure Tint(c: Longword); inline;
       
   572 begin
       
   573     Tint(((c shr 24) and $FF), ((c shr 16) and $FF), (c shr 8) and $FF, (c and $FF))
       
   574 end;
       
   575 
       
   576 end.
   544 end.