demo02.pas 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. program demo02;
  2. {$I zglCustomConfig.cfg}
  3. uses
  4. {$IFDEF UNIX}
  5. cthreads,
  6. {$ENDIF}
  7. Classes,
  8. {$IFDEF USE_ZENGL_STATIC}
  9. zgl_types,
  10. zgl_screen,
  11. zgl_window,
  12. zgl_timers,
  13. // RU: Модули для работы с файлами, файлами в памяти и zip-архивами.
  14. // EN: Units for using files, files in memory and zip archives.
  15. zgl_file,
  16. zgl_memory,
  17. // RU: Модуль для поддержки многопоточной загрузки ресурсов.
  18. // EN: Unit for multithreaded resource loading.
  19. zgl_resources,
  20. // RU: Модуль для работы со шрифтами.
  21. // EN: Unit for using fonts.
  22. zgl_font,
  23. // RU: Модули для работы с текстурами. zgl_textures является основным, следующие за ним предоставляют поддержку определённых форматов.
  24. // EN: Units for using textures. zgl_textures is a main unit, next units provide support of different formats.
  25. zgl_textures,
  26. zgl_textures_tga, // TGA
  27. zgl_textures_jpg, // JPG
  28. zgl_textures_png, // PNG
  29. // RU: Звуковая подсистема реализована в модулях ниже. Подход такой же как и с текстурами - основной модуль и модули поддержки форматов.
  30. // EN: Sound subsystem implemented in units below. Idea the same as for textures - there is a main unit and units for support different formats.
  31. zgl_sound,
  32. zgl_sound_wav, // WAV
  33. zgl_sound_ogg, // OGG
  34. zgl_primitives_2d,
  35. zgl_text,
  36. zgl_sprite_2d,
  37. zgl_utils
  38. {$ELSE}
  39. zglHeader
  40. {$ENDIF}
  41. ;
  42. var
  43. dirRes : UTF8String {$IFNDEF MACOSX} = '../data/' {$ENDIF};
  44. memory : zglTMemory;
  45. // RU: У каждого ресурса есть свой определённый тип, который является указателем на структуру.
  46. // EN: Every resource has its own typem which is just a pointer to structure.
  47. fntMain : Byte;
  48. //
  49. texLogo : zglPTexture;
  50. texTest : zglPTexture;
  51. //
  52. sndClick : zglPSound;
  53. sndMusic : zglPSound;
  54. procedure TextureCalcEffect( pData : PByteArray; Width, Height : Word );
  55. begin
  56. u_Sleep( 1000 );
  57. end;
  58. procedure Init;
  59. var
  60. i : Integer;
  61. memStream : TMemoryStream;
  62. begin
  63. // RU: Более детальное рассмотрение параметров функций загрузки ресурсов есть в соответствующих примерах, тут же показана лишь основная суть.
  64. // EN: Description with more details about parameters of functions can be found in other demos, here is only main idea shown.
  65. snd_Init();
  66. // RU: Функции загрузки ресурсов именуются в формате "$(префикс)_LoadFrom$(откуда)", где "$(префикс)" может быть tex, snd, font и т.д., а "$(откуда)" - File и Memory.
  67. // EN: Functions for loading resources named in format "$(prefix)_LoadFrom$(where)", where "$(prefix)" can be tex, snd, font and so on, and $(where) - File and Memory.
  68. fntMain := font_LoadFromFile( dirRes + 'font.zfi' );
  69. texLogo := tex_LoadFromFile( dirRes + 'zengl.png' );
  70. sndClick := snd_LoadFromFile( dirRes + 'click.wav' );
  71. // RU: Многопоточная загрузка ресурсов позволяет составить очередь и не ожидать загрузки выполняя другие операции, например рендеринг какой-то анимации.
  72. // Процесс загрузки в многопоточном режиме практически ничем не отличается от обычного за исключением вызова функций старта и окончания очереди.
  73. // EN: Multithreaded resource loading allows to make queue and do something while loading, e.g. rendering some animation.
  74. // Loading resources in multithreaded mode has almost no difference with standard mode, except using functions for beginning and ending queues.
  75. res_BeginQueue( 0 );
  76. // RU: Между res_BeginQueue и res_EndQueue могут использоваться все обычные функции загрузки ресурсов.
  77. // Для задержки экрана загрузки ресурсы будут загружены несколько раз, а для текстуры будет использована обработка с задержкой.
  78. // EN: All standard functions for loading resources can be used between res_BeginQueue and res_EndQueue.
  79. // Just for holding loading screen resources will be loaded multiple times, and texture will be post-processed with delay.
  80. zgl_Reg( TEXTURE_CURRENT_EFFECT, @TextureCalcEffect );
  81. for i := 0 to 3 do
  82. begin
  83. texTest := tex_LoadFromFile( dirRes + 'back01.jpg', TEX_NO_COLORKEY, TEX_DEFAULT_2D or TEX_CUSTOM_EFFECT );
  84. sndMusic := snd_LoadFromFile( dirRes + 'music.ogg' );
  85. end;
  86. res_EndQueue();
  87. // RU: Загружая ресурсы из файлов в памяти необходимо дополнительно указывать их расширение.
  88. // В качестве примера будет использован TMemoryStream вместо mem_LoadFromFile/mem_Free что бы показать как устроен zglTMemory.
  89. // EN: Loading resources from files in memory need additional set their extension.
  90. // As an example TMemoryStream will be used instead of mem_LoadFromFile/mem_Free, just for showing how zglTMemory works.
  91. memStream := TMemoryStream.Create();
  92. {$IFNDEF MACOSX}
  93. memStream.LoadFromFile( dirRes + 'back01.jpg' );
  94. {$ELSE}
  95. memStream.LoadFromFile( PAnsiChar( zgl_Get( DIRECTORY_APPLICATION ) ) + 'Contents/Resources/back01.jpg' );
  96. {$ENDIF}
  97. memory.Position := memStream.Position;
  98. memory.Memory := memStream.Memory;
  99. memory.Size := memStream.Size;
  100. texTest := tex_LoadFromMemory( memory, 'JPG' );
  101. memStream.Free();
  102. // код выше с использованием Stream не заработал у меня с MacOS Cocoa
  103. //texTest := tex_LoadFromFile(dirRes + 'back01.jpg');
  104. // RU: Для загрузки ресурсов из zip-архива необходимо его сначала "открыть" и потом "закрыть" :) Для этого существуют функции file_OpenArchive и file_CloseArchive.
  105. // EN: For loading resources from zip-archive this archive should be "opened" first and then "closed" :) There are functions file_OpenArchive and file_CloseArchive for this.
  106. file_OpenArchive( dirRes + 'zengl.zip' );
  107. texLogo := tex_LoadFromFile( 'zengl.png' );
  108. file_CloseArchive();
  109. setTextScale(15, fntMain);
  110. end;
  111. procedure Draw;
  112. begin
  113. // RU: К ресурсам, которые загружаются в многопоточном режиме, можно обращаться только после завершения загрузки. Код ниже рисует экран загрузки если ресурсы ещё не загрузились.
  114. // EN: Resources which are loading in multithreaded mode can be used only after finishing the loading process. Code below renders loading screen if resources are not loaded yet.
  115. if res_GetCompleted() < 100 Then
  116. begin
  117. ssprite2d_Draw( texLogo, ( 800 - texLogo.Width ) / 2, ( 600 - texLogo.Height ) / 2, texLogo.Width, texLogo.Height, 0 );
  118. text_Draw( fntMain, 400, 300 + texLogo.Height / 4, 'Loading... ' + u_IntToStr( res_GetCompleted() ) + '%', TEXT_HALIGN_CENTER );
  119. exit;
  120. end;
  121. ssprite2d_Draw( texTest, 0, 0, 800, 600, 0 );
  122. text_Draw( fntMain, 0, 0, 'FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) );
  123. text_Draw( fntMain, 0, 18, 'VRAM Used: ' + u_FloatToStr( zgl_Get( RENDER_VRAM_USED ) / 1024 / 1024 ) + 'Mb' );
  124. end;
  125. Begin
  126. {$IFNDEF USE_ZENGL_STATIC}
  127. if not zglLoad( libZenGL ) Then exit;
  128. {$ENDIF}
  129. zgl_Reg( SYS_LOAD, @Init );
  130. zgl_Reg( SYS_DRAW, @Draw );
  131. wnd_SetCaption(utf8_Copy('02 - Resources'));
  132. zgl_Init();
  133. End.