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); |
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 |