hedgewars/uStore.pas
changeset 1916 9c3d0e3df6bb
parent 1912 c3d31fb59f0e
child 1939 4b8e4cd9e7c0
equal deleted inserted replaced
1915:c357f5b55320 1916:9c3d0e3df6bb
   314 end;
   314 end;
   315 
   315 
   316 procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   316 procedure DrawFromRect(X, Y: LongInt; r: PSDL_Rect; SourceTexture: PTexture);
   317 var rr: TSDL_Rect;
   317 var rr: TSDL_Rect;
   318     _l, _r, _t, _b: real;
   318     _l, _r, _t, _b: real;
       
   319     VertexBuffer, TextureBuffer: array [0..3] of TVertex2f;
   319 begin
   320 begin
   320 if SourceTexture^.h = 0 then exit;
   321 if SourceTexture^.h = 0 then exit;
   321 rr.x:= X;
   322 rr.x:= X;
   322 rr.y:= Y;
   323 rr.y:= Y;
   323 rr.w:= r^.w;
   324 rr.w:= r^.w;
   328 _t:= r^.y / SourceTexture^.h * SourceTexture^.ry;
   329 _t:= r^.y / SourceTexture^.h * SourceTexture^.ry;
   329 _b:= (r^.y + r^.h) / SourceTexture^.h * SourceTexture^.ry;
   330 _b:= (r^.y + r^.h) / SourceTexture^.h * SourceTexture^.ry;
   330 
   331 
   331 glBindTexture(GL_TEXTURE_2D, SourceTexture^.id);
   332 glBindTexture(GL_TEXTURE_2D, SourceTexture^.id);
   332 
   333 
   333 glBegin(GL_QUADS);
   334 VertexBuffer[0].X:= X;
   334 
   335 VertexBuffer[0].Y:= Y;
   335 glTexCoord2f(_l, _t);
   336 VertexBuffer[1].X:= rr.w + X;
   336 glVertex2i(X, Y);
   337 VertexBuffer[1].Y:= Y;
   337 
   338 VertexBuffer[2].X:= rr.w + X;
   338 glTexCoord2f(_r, _t);
   339 VertexBuffer[2].Y:= rr.h + Y;
   339 glVertex2i(rr.w + X, Y);
   340 VertexBuffer[3].X:= X;
   340 
   341 VertexBuffer[3].Y:= rr.h + Y;
   341 glTexCoord2f(_r, _b);
   342 
   342 glVertex2i(rr.w + X, rr.h + Y);
   343 TextureBuffer[0].X:= _l;
   343 
   344 TextureBuffer[0].Y:= _t;
   344 glTexCoord2f(_l, _b);
   345 TextureBuffer[1].X:= _r;
   345 glVertex2i(X, rr.h + Y);
   346 TextureBuffer[1].Y:= _t;
   346 
   347 TextureBuffer[2].X:= _r;
   347 glEnd()
   348 TextureBuffer[2].Y:= _b;
       
   349 TextureBuffer[3].X:= _l;
       
   350 TextureBuffer[3].Y:= _b;
       
   351 
       
   352 glEnableClientState(GL_VERTEX_ARRAY);
       
   353 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
       
   354 
       
   355 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
       
   356 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
       
   357 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   358 
       
   359 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
       
   360 glDisableClientState(GL_VERTEX_ARRAY)
   348 end;
   361 end;
   349 
   362 
   350 procedure DrawTexture(X, Y: LongInt; Texture: PTexture);
   363 procedure DrawTexture(X, Y: LongInt; Texture: PTexture);
   351 begin
   364 begin
   352 glPushMatrix;
   365 glPushMatrix;
   368 end;
   381 end;
   369 
   382 
   370 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, Frames: LongInt);
   383 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, Frames: LongInt);
   371 var ft, fb: GLfloat;
   384 var ft, fb: GLfloat;
   372 	hw: LongInt;
   385 	hw: LongInt;
       
   386     VertexBuffer, TextureBuffer: array [0..3] of TVertex2f;
   373 begin
   387 begin
   374 glPushMatrix;
   388 glPushMatrix;
   375 glTranslatef(X, Y, 0);
   389 glTranslatef(X, Y, 0);
   376 glScalef(Scale, Scale, 1.0);
   390 glScalef(Scale, Scale, 1.0);
   377 
   391 
   383 ft:= Frame / Frames * Texture^.ry;
   397 ft:= Frame / Frames * Texture^.ry;
   384 fb:= (Frame + 1) / Frames * Texture^.ry;
   398 fb:= (Frame + 1) / Frames * Texture^.ry;
   385 
   399 
   386 glBindTexture(GL_TEXTURE_2D, Texture^.id);
   400 glBindTexture(GL_TEXTURE_2D, Texture^.id);
   387 
   401 
   388 glBegin(GL_QUADS);
   402 VertexBuffer[0].X:= -hw;
   389 
   403 VertexBuffer[0].Y:= -16;
   390 glTexCoord2f(0, ft);
   404 VertexBuffer[1].X:= hw;
   391 glVertex2i(-hw, -16);
   405 VertexBuffer[1].Y:= -16;
   392 
   406 VertexBuffer[2].X:= hw;
   393 glTexCoord2f(Texture^.rx, ft);
   407 VertexBuffer[2].Y:= 16;
   394 glVertex2i(hw, -16);
   408 VertexBuffer[3].X:= -hw;
   395 
   409 VertexBuffer[3].Y:= 16;
   396 glTexCoord2f(Texture^.rx, fb);
   410 
   397 glVertex2i(hw, 16);
   411 TextureBuffer[0].X:= 0;
   398 
   412 TextureBuffer[0].Y:= ft;
   399 glTexCoord2f(0, fb);
   413 TextureBuffer[1].X:= Texture^.rx;
   400 glVertex2i(-hw, 16);
   414 TextureBuffer[1].Y:= ft;
   401 
   415 TextureBuffer[2].X:= Texture^.rx;
   402 glEnd();
   416 TextureBuffer[2].Y:= fb;
       
   417 TextureBuffer[3].X:= 0;
       
   418 TextureBuffer[3].Y:= fb;
       
   419 
       
   420 glEnableClientState(GL_VERTEX_ARRAY);
       
   421 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
       
   422 
       
   423 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
       
   424 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
       
   425 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   426 
       
   427 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
       
   428 glDisableClientState(GL_VERTEX_ARRAY);
       
   429 
   403 
   430 
   404 glPopMatrix
   431 glPopMatrix
   405 end;
   432 end;
   406 
   433 
   407 procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
   434 procedure DrawRotated(Sprite: TSprite; X, Y, Dir: LongInt; Angle: real);
   424 
   451 
   425 glPopMatrix
   452 glPopMatrix
   426 end;
   453 end;
   427 
   454 
   428 procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
   455 procedure DrawRotatedTex(Tex: PTexture; hw, hh, X, Y, Dir: LongInt; Angle: real);
       
   456 var VertexBuffer: array [0..3] of TVertex2f;
   429 begin
   457 begin
   430 glPushMatrix;
   458 glPushMatrix;
   431 glTranslatef(X, Y, 0);
   459 glTranslatef(X, Y, 0);
   432 
   460 
   433 if Dir < 0 then
   461 if Dir < 0 then
   438    glRotatef(Angle, 0, 0,  1);
   466    glRotatef(Angle, 0, 0,  1);
   439 
   467 
   440 
   468 
   441 glBindTexture(GL_TEXTURE_2D, Tex^.id);
   469 glBindTexture(GL_TEXTURE_2D, Tex^.id);
   442 
   470 
   443 glBegin(GL_QUADS);
   471 VertexBuffer[0].X:= -hw;
   444 
   472 VertexBuffer[0].Y:= -hh;
   445 glTexCoord2f(0, 0);
   473 VertexBuffer[1].X:= hw;
   446 glVertex2i(-hw, -hh);
   474 VertexBuffer[1].Y:= -hh;
   447 
   475 VertexBuffer[2].X:= hw;
   448 glTexCoord2f(Tex^.rx, 0);
   476 VertexBuffer[2].Y:= hh;
   449 glVertex2i(hw, -hh);
   477 VertexBuffer[3].X:= -hw;
   450 
   478 VertexBuffer[3].Y:= hh;
   451 glTexCoord2f(Tex^.rx, Tex^.ry);
   479 
   452 glVertex2i(hw, hh);
   480 glEnableClientState(GL_VERTEX_ARRAY);
   453 
   481 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
   454 glTexCoord2f(0, Tex^.ry);
   482 
   455 glVertex2i(-hw, hh);
   483 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   456 
   484 glTexCoordPointer(2, GL_FLOAT, 0, @Tex^.tb);
   457 glEnd();
   485 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   486 
       
   487 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
       
   488 glDisableClientState(GL_VERTEX_ARRAY);
   458 
   489 
   459 glPopMatrix
   490 glPopMatrix
   460 end;
   491 end;
   461 
   492 
   462 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
   493 procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt);
   500 begin
   531 begin
   501 DrawTexture(X - Source^.w div 2, Top, Source)
   532 DrawTexture(X - Source^.w div 2, Top, Source)
   502 end;
   533 end;
   503 
   534 
   504 procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real);
   535 procedure DrawHedgehog(X, Y: LongInt; Dir: LongInt; Pos, Step: LongWord; Angle: real);
       
   536 const VertexBuffer: array [0..3] of TVertex2f = (
       
   537 		(x: -16; y: -16),
       
   538 		(x:  16; y: -16),
       
   539 		(x:  16; y:  16),
       
   540 		(x: -16; y:  16));
   505 var l, r, t, b: real;
   541 var l, r, t, b: real;
       
   542     TextureBuffer: array [0..3] of TVertex2f;
   506 begin
   543 begin
   507 
   544 
   508 t:= Pos * 32 / HHTexture^.h;
   545 t:= Pos * 32 / HHTexture^.h;
   509 b:= (Pos + 1) * 32 / HHTexture^.h;
   546 b:= (Pos + 1) * 32 / HHTexture^.h;
   510 
   547 
   523 glTranslatef(X, Y, 0);
   560 glTranslatef(X, Y, 0);
   524 glRotatef(Angle, 0, 0, 1);
   561 glRotatef(Angle, 0, 0, 1);
   525 
   562 
   526 glBindTexture(GL_TEXTURE_2D, HHTexture^.id);
   563 glBindTexture(GL_TEXTURE_2D, HHTexture^.id);
   527 
   564 
   528 glBegin(GL_QUADS);
   565 TextureBuffer[0].X:= l;
   529 
   566 TextureBuffer[0].Y:= t;
   530 glTexCoord2f(l, t);
   567 TextureBuffer[1].X:= r;
   531 glVertex2i(-16, -16);
   568 TextureBuffer[1].Y:= t;
   532 
   569 TextureBuffer[2].X:= r;
   533 glTexCoord2f(r, t);
   570 TextureBuffer[2].Y:= b;
   534 glVertex2i(16, -16);
   571 TextureBuffer[3].X:= l;
   535 
   572 TextureBuffer[3].Y:= b;
   536 glTexCoord2f(r, b);
   573 
   537 glVertex2i(16, 16);
   574 glEnableClientState(GL_VERTEX_ARRAY);
   538 
   575 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
   539 glTexCoord2f(l, b);
   576 
   540 glVertex2i(-16, 16);
   577 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   541 
   578 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   542 
   579 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   543 glEnd();
   580 
       
   581 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
       
   582 glDisableClientState(GL_VERTEX_ARRAY);
       
   583 
       
   584 
   544 glColor4f(1,1,1,1);
   585 glColor4f(1,1,1,1);
   545 
   586 
   546 glPopMatrix
   587 glPopMatrix
   547 end;
   588 end;
   548 
   589 
   549 procedure DrawFillRect(r: TSDL_Rect);
   590 procedure DrawFillRect(r: TSDL_Rect);
       
   591 var VertexBuffer: array [0..3] of TVertex2f;
   550 begin
   592 begin
   551 glDisable(GL_TEXTURE_2D);
   593 glDisable(GL_TEXTURE_2D);
   552 
   594 
   553 glColor4ub(0, 0, 0, 127);
   595 glColor4ub(0, 0, 0, 127);
   554 
   596 
   555 glBegin(GL_QUADS);
   597 VertexBuffer[0].X:= r.x;
   556 
   598 VertexBuffer[0].Y:= r.y;
   557 glVertex2i(r.x       , r.y      );
   599 VertexBuffer[1].X:= r.x + r.w;
   558 glVertex2i(r.x + r.w , r.y      );
   600 VertexBuffer[1].Y:= r.y;
   559 glVertex2i(r.x + r.w , r.y + r.h);
   601 VertexBuffer[2].X:= r.x + r.w;
   560 glVertex2i(r.x       , r.y + r.h);
   602 VertexBuffer[2].Y:= r.y + r.h;
   561 
   603 VertexBuffer[3].X:= r.x;
   562 glEnd();
   604 VertexBuffer[3].Y:= r.y + r.h;
       
   605 
       
   606 glEnableClientState(GL_VERTEX_ARRAY);
       
   607 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
       
   608 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
       
   609 glDisableClientState(GL_VERTEX_ARRAY);
   563 
   610 
   564 glColor4f(1, 1, 1, 1);
   611 glColor4f(1, 1, 1, 1);
   565 glEnable(GL_TEXTURE_2D)
   612 glEnable(GL_TEXTURE_2D)
   566 end;
   613 end;
   567 
   614