demo12.pas 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. program demo12;
  2. {$I zglCustomConfig.cfg}
  3. uses
  4. {$IFDEF USE_ZENGL_STATIC}
  5. zgl_main,
  6. zgl_screen,
  7. zgl_window,
  8. zgl_timers,
  9. zgl_keyboard,
  10. zgl_render_2d,
  11. zgl_fx,
  12. zgl_textures,
  13. zgl_textures_png,
  14. zgl_render_target,
  15. zgl_sprite_2d,
  16. zgl_font,
  17. zgl_text,
  18. zgl_math_2d,
  19. zgl_utils
  20. {$ELSE}
  21. zglHeader
  22. {$ENDIF}
  23. ;
  24. var
  25. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  26. fntMain : zglPFont;
  27. texTux : zglPTexture;
  28. rtFull : zglPRenderTarget;
  29. rtDefault : zglPRenderTarget;
  30. procedure Init;
  31. begin
  32. texTux := tex_LoadFromFile( dirRes + 'tux_stand.png' );
  33. tex_SetFrameSize( texTux, 64, 64 );
  34. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  35. // RU: Создаем RenderTarget и "цепляем" пустую текстуру. В процессе текстуру можно сменить присвоив rtarget.Surface другую zglPTexture, главное что бы совпадали размеры с теми, что указаны в
  36. // tex_CreateZero. Таргету также указан флаг RT_FULL_SCREEN, отвечающий за то, что бы в текстуру помещалось все содержимое экрана а не область 256x256(как с флагом RT_DEFAULT).
  37. // EN: Create a RenderTarget and "bind" empty texture to it. Later texture can be changed via changing rtarget.Surface to another zglPTexture, the only requirement - the same size, that was
  38. // set in tex_CreateZero. Also target use flag RT_FULL_SCREEN that responsible for rendering whole content of screen into target, not only region 256x256(like with flag RT_DEFAULT).
  39. rtFull := rtarget_Add( tex_CreateZero( 256, 256 ), RT_FULL_SCREEN );
  40. // RU: Для сравнения создадим ещё один RenderTarget с флагом RT_DEFAULT.
  41. // EN: Create one more RenderTarget with flag RT_DEFAULT for comparison.
  42. rtDefault := rtarget_Add( tex_CreateZero( 256, 256 ), RT_DEFAULT );
  43. end;
  44. procedure Draw;
  45. begin
  46. // RU: Устанавливаем текущий RenderTarget.
  47. // EN: Set current RenderTarget.
  48. rtarget_Set( rtFull );
  49. // RU: Рисуем в него.
  50. // EN: Render to it.
  51. asprite2d_Draw( texTux, random( 800 - 64 ), random( 600 - 64 ), 64, 64, 0, random( 9 ) + 1 );
  52. // RU: Возвращаемся к обычному рендеру.
  53. // EN: Return to default rendering.
  54. rtarget_Set( nil );
  55. rtarget_Set( rtDefault );
  56. asprite2d_Draw( texTux, random( 800 - 64 ), random( 600 - 64 ), 64, 64, 0, random( 9 ) + 1 );
  57. rtarget_Set( nil );
  58. // RU: Теперь рисуем содержимое RenderTarget'ов.
  59. // EN: Render content of RenderTargets.
  60. ssprite2d_Draw( rtFull.Surface, ( 400 - 256 ) / 2, ( 600 - 256 ) / 2, 256, 256, 0 );
  61. ssprite2d_Draw( rtDefault.Surface, ( 400 - 256 ) / 2 + 400, ( 600 - 256 ) / 2, 256, 256, 0 );
  62. text_Draw( fntMain, 0, 0, 'FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) );
  63. end;
  64. procedure Timer;
  65. begin
  66. if key_Press( K_ESCAPE ) Then zgl_Exit();
  67. key_ClearState();
  68. end;
  69. Begin
  70. {$IFNDEF USE_ZENGL_STATIC}
  71. if not zglLoad( libZenGL ) Then exit;
  72. {$ENDIF}
  73. randomize();
  74. timer_Add( @Timer, 16 );
  75. zgl_Reg( SYS_LOAD, @Init );
  76. zgl_Reg( SYS_DRAW, @Draw );
  77. wnd_SetCaption( '12 - Render into Texture' );
  78. wnd_ShowCursor( TRUE );
  79. scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
  80. zgl_Init();
  81. End.