zglHeader.pas 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928
  1. {--------------------------------}
  2. {-----------= ZenGL =------------}
  3. {--------------------------------}
  4. { }
  5. { version: 0.3.9 }
  6. { date: 2013.03.06 }
  7. { license: zlib }
  8. { homepage: http://zengl.org }
  9. { }
  10. {-------- developed by: ---------}
  11. { }
  12. { Andrey Kemka aka Andru }
  13. { }
  14. { mail: [email protected] }
  15. { JID: [email protected] }
  16. { ICQ: 496929849 }
  17. { Skype: kemka.andrey }
  18. { }
  19. {--------------------------------}
  20. unit zglHeader;
  21. {
  22. * Copyright (c) 2012 Andrey Kemka
  23. *
  24. * This software is provided 'as-is', without any express or
  25. * implied warranty. In no event will the authors be held
  26. * liable for any damages arising from the use of this software.
  27. *
  28. * Permission is granted to anyone to use this software for any purpose,
  29. * including commercial applications, and to alter it and redistribute
  30. * it freely, subject to the following restrictions:
  31. *
  32. * 1. The origin of this software must not be misrepresented;
  33. * you must not claim that you wrote the original software.
  34. * If you use this software in a product, an acknowledgment
  35. * in the product documentation would be appreciated but
  36. * is not required.
  37. *
  38. * 2. Altered source versions must be plainly marked as such,
  39. * and must not be misrepresented as being the original software.
  40. *
  41. * 3. This notice may not be removed or altered from any
  42. * source distribution.
  43. }
  44. {$IFDEF FPC}
  45. {$MODE DELPHI}
  46. {$ENDIF}
  47. {$IFDEF MSWINDOWS}
  48. {$DEFINE WINDOWS}
  49. {$ENDIF}
  50. {$IFDEF WINDOWS}
  51. {$IF DEFINED(WIN32) or DEFINED(WIN64)}
  52. {$DEFINE WINDESKTOP}
  53. {$ELSE}
  54. {$DEFINE WINMOBILE}
  55. {$IFEND}
  56. {$ENDIF}
  57. {$IFDEF DARWIN}
  58. {$IF DEFINED(iPHONESIM) or (DEFINED(DARWIN) and DEFINED(CPUARM))}
  59. {$DEFINE iOS}
  60. {$ELSE}
  61. {$DEFINE MACOSX}
  62. {$IFEND}
  63. {$ENDIF}
  64. {$IF DEFINED(LINUX) and DEFINED(CPUARM)}
  65. {$DEFINE ANDROID}
  66. {$IFEND}
  67. interface
  68. {$IFDEF MACOSX}
  69. uses
  70. MacOSAll;
  71. {$ENDIF}
  72. {$IFDEF WINMOBILE}
  73. uses
  74. Windows;
  75. {$ENDIF}
  76. type
  77. Ptr = {$IFDEF CPU64}QWORD{$ELSE}LongWord{$ENDIF};
  78. {$IFDEF WINDOWS}
  79. HANDLE = Ptr;
  80. HDC = Ptr;
  81. HGLRC = Ptr;
  82. {$ENDIF}
  83. PByteArray = ^TByteArray;
  84. TByteArray = array[ 0..High(LongWord) shr 1 - 1 ] of Byte;
  85. PWordArray = ^TWordArray;
  86. TWordArray = array[ 0..High(LongWord) shr 2 - 1 ] of Word;
  87. PLongWordArray = ^TLongWordArray;
  88. TLongWordArray = array[ 0..High(LongWord) shr 3 - 1 ] of LongWord;
  89. type
  90. zglTStringList = record
  91. Count : Integer;
  92. Items : array of UTF8String;
  93. end;
  94. type
  95. zglTFile = Ptr;
  96. zglTFileList = zglTStringList;
  97. type
  98. zglPMemory = ^zglTMemory;
  99. zglTMemory = record
  100. Memory : Pointer;
  101. Size : LongWord;
  102. Position : LongWord;
  103. end;
  104. const
  105. {$IFDEF LINUX}
  106. libZenGL = 'libZenGL.so';
  107. {$ENDIF}
  108. {$IFDEF WINDOWS}
  109. libZenGL = 'ZenGL.dll';
  110. {$ENDIF}
  111. {$IFDEF MACOSX}
  112. libZenGL = 'libZenGL.dylib';
  113. {$ENDIF}
  114. function zglLoad( LibraryName : AnsiString; Error : Boolean = TRUE ) : Boolean;
  115. procedure zglFree;
  116. var
  117. zgl_Init : procedure( FSAA : Byte = 0; StencilBits : Byte = 0 );
  118. zgl_InitToHandle : procedure( Handle : Ptr; FSAA : Byte = 0; StencilBits : Byte = 0 );
  119. zgl_Exit : procedure;
  120. const
  121. SYS_APP_INIT = $000001;
  122. SYS_APP_LOOP = $000002;
  123. SYS_LOAD = $000003;
  124. SYS_DRAW = $000004;
  125. SYS_UPDATE = $000005;
  126. SYS_EXIT = $000006;
  127. SYS_ACTIVATE = $000007;
  128. SYS_CLOSE_QUERY = $000008;
  129. INPUT_MOUSE_MOVE = $000020;
  130. INPUT_MOUSE_PRESS = $000021;
  131. INPUT_MOUSE_RELEASE = $000022;
  132. INPUT_MOUSE_WHEEL = $000023;
  133. INPUT_KEY_PRESS = $000030;
  134. INPUT_KEY_RELEASE = $000031;
  135. INPUT_KEY_CHAR = $000032;
  136. TEX_FORMAT_EXTENSION = $000100;
  137. TEX_FORMAT_FILE_LOADER = $000101;
  138. TEX_FORMAT_MEM_LOADER = $000102;
  139. TEX_CURRENT_EFFECT = $000103;
  140. SND_FORMAT_EXTENSION = $000110;
  141. SND_FORMAT_FILE_LOADER = $000111;
  142. SND_FORMAT_MEM_LOADER = $000112;
  143. SND_FORMAT_DECODER = $000113;
  144. VIDEO_FORMAT_DECODER = $000130;
  145. var
  146. zgl_Reg : procedure( What : LongWord; UserData : Pointer );
  147. const
  148. ZENGL_VERSION = 1; // Major shr 16, ( Minor and $FF00 ) shr 8, Revision and $FF
  149. ZENGL_VERSION_STRING = 2; // PAnsiChar
  150. ZENGL_VERSION_DATE = 3; // PAnsiChar
  151. DIRECTORY_APPLICATION = 101; // PAnsiChar
  152. DIRECTORY_HOME = 102; // PAnsiChar
  153. LOG_FILENAME = 203; // PPAnsiChar
  154. DESKTOP_WIDTH = 300;
  155. DESKTOP_HEIGHT = 301;
  156. RESOLUTION_LIST = 302; // zglPResolutionList
  157. WINDOW_HANDLE = 400; // TWindow(GNU/Linux), HWND(Windows), WindowRef(MacOS X)
  158. WINDOW_X = 401;
  159. WINDOW_Y = 402;
  160. WINDOW_WIDTH = 403;
  161. WINDOW_HEIGHT = 404;
  162. GAPI_CONTEXT = 500; // GLXContext(GNU/Linux), HGLRC(Windows), TAGLContext(MacOS X)
  163. GAPI_DEVICE = 500; // For ZenGL with Direct3D render only
  164. GAPI_MAX_TEXTURE_SIZE = 501;
  165. GAPI_MAX_TEXTURE_UNITS = 502;
  166. GAPI_MAX_ANISOTROPY = 503;
  167. GAPI_CAN_BLEND_SEPARATE = 504; // Boolean
  168. GAPI_CAN_AUTOGEN_MIPMAP = 505; // Boolean
  169. VIEWPORT_WIDTH = 600;
  170. VIEWPORT_HEIGHT = 601;
  171. VIEWPORT_OFFSET_X = 602;
  172. VIEWPORT_OFFSET_Y = 603;
  173. RENDER_FPS = 700;
  174. RENDER_BATCHES_2D = 701;
  175. RENDER_CURRENT_MODE = 702;
  176. RENDER_CURRENT_TARGET = 703;
  177. RENDER_VRAM_USED = 704;
  178. MANAGER_TIMER = 800; // zglPTimerManager
  179. MANAGER_TEXTURE = 801; // zglPTextureManager
  180. MANAGER_FONT = 802; // zglPFontManager
  181. MANAGER_RTARGET = 803; // zglPRenderTargetManager
  182. MANAGER_SOUND = 804; // zglPSoundManager
  183. MANAGER_EMITTER2D = 805; // zglPEmitter2DManager
  184. var
  185. zgl_Get : function( What : LongWord ) : Ptr;
  186. zgl_GetMem : procedure( out Mem : Pointer; Size : LongWord );
  187. zgl_FreeMem : procedure( var Mem : Pointer );
  188. zgl_FreeStrList : procedure( var List : zglTStringList );
  189. const
  190. COLOR_BUFFER_CLEAR = $000001;
  191. DEPTH_BUFFER = $000002;
  192. DEPTH_BUFFER_CLEAR = $000004;
  193. DEPTH_MASK = $000008;
  194. STENCIL_BUFFER_CLEAR = $000010;
  195. CORRECT_RESOLUTION = $000020;
  196. CORRECT_WIDTH = $000040;
  197. CORRECT_HEIGHT = $000080;
  198. APP_USE_AUTOPAUSE = $000100;
  199. APP_USE_LOG = $000200;
  200. APP_USE_ENGLISH_INPUT = $000400;
  201. APP_USE_DT_CORRECTION = $000800;
  202. WND_USE_AUTOCENTER = $001000;
  203. SND_CAN_PLAY = $002000;
  204. SND_CAN_PLAY_FILE = $004000;
  205. CLIP_INVISIBLE = $008000;
  206. var
  207. zgl_Enable : procedure( What : LongWord );
  208. zgl_Disable : procedure( What : LongWord );
  209. // LOG
  210. log_Add : procedure( const Message : UTF8String; Timings : Boolean = TRUE );
  211. // WINDOW
  212. wnd_SetCaption : procedure( const NewCaption : UTF8String );
  213. wnd_SetSize : procedure( Width, Height : Integer );
  214. wnd_SetPos : procedure( X, Y : Integer );
  215. wnd_ShowCursor : procedure( Show : Boolean );
  216. // SCREEN
  217. type
  218. zglPResolutionList = ^zglTResolutionList;
  219. zglTResolutionList = record
  220. Count : Integer;
  221. Width : array of Integer;
  222. Height : array of Integer;
  223. end;
  224. const
  225. REFRESH_MAXIMUM = 0;
  226. REFRESH_DEFAULT = 1;
  227. var
  228. scr_Clear : procedure;
  229. scr_Flush : procedure;
  230. scr_SetVSync : procedure( VSync : Boolean );
  231. // RU: ВНИМАНИЕ: Функция уничтожает контекст OpenGL, что потребует перезагрузку ресурсов
  232. // EN: WARNING: Function will destroy OpenGL context, so all resources must be reloaded
  233. scr_SetFSAA : procedure( FSAA : Byte );
  234. scr_SetOptions : function( Width, Height, Refresh : Word; FullScreen, VSync : Boolean ) : Boolean;
  235. scr_CorrectResolution : procedure( Width, Height : Word );
  236. scr_ReadPixels : procedure( var pData : Pointer; X, Y, Width, Height : Word );
  237. // GL
  238. const
  239. TARGET_SCREEN = 1;
  240. TARGET_TEXTURE = 2;
  241. var
  242. Set2DMode : procedure;
  243. Set3DMode : procedure( FOVY : Single = 45 );
  244. // Z BUFFER
  245. zbuffer_SetDepth : procedure( zNear, zFar : Single );
  246. zbuffer_Clear : procedure;
  247. // SCISSOR
  248. scissor_Begin : procedure( X, Y, Width, Height : Integer; ConsiderCamera : Boolean = TRUE );
  249. scissor_End : procedure;
  250. // INI
  251. ini_LoadFromFile : function( const FileName : UTF8String ) : Boolean;
  252. ini_SaveToFile : procedure( const FileName : UTF8String );
  253. ini_Free : procedure;
  254. ini_Add : procedure( const Section, Key : UTF8String );
  255. ini_Del : procedure( const Section, Key : UTF8String );
  256. ini_Clear : procedure( const Section : UTF8String );
  257. ini_IsSection : function( const Section : UTF8String ) : Boolean;
  258. ini_IsKey : function( const Section, Key : UTF8String ) : Boolean;
  259. _ini_ReadKeyStr : function( const Section, Key : UTF8String ) : PAnsiChar;
  260. ini_ReadKeyInt : function( const Section, Key : UTF8String ) : Integer;
  261. ini_ReadKeyFloat : function( const Section, Key : UTF8String ) : Single;
  262. ini_ReadKeyBool : function( const Section, Key : UTF8String ) : Boolean;
  263. ini_WriteKeyStr : function( const Section, Key, Value : UTF8String ) : Boolean;
  264. ini_WriteKeyInt : function( const Section, Key : UTF8String; Value : Integer ) : Boolean;
  265. ini_WriteKeyFloat : function( const Section, Key : UTF8String; Value : Single; Digits : Integer = 2 ) : Boolean;
  266. ini_WriteKeyBool : function( const Section, Key : UTF8String; Value : Boolean ) : Boolean;
  267. function ini_ReadKeyStr( const Section, Key : UTF8String ) : UTF8String;
  268. // TIMERS
  269. type
  270. zglPTimer = ^zglTTimer;
  271. zglTTimer = record
  272. Active : Boolean;
  273. Custom : Boolean;
  274. UserData : Pointer;
  275. Interval : LongWord;
  276. LastTick : Double;
  277. OnTimer : procedure;
  278. OnTimerEx : procedure( Timer : zglPTimer );
  279. prev, next : zglPTimer;
  280. end;
  281. type
  282. zglPTimerManager = ^zglTTimerManager;
  283. zglTTimerManager = record
  284. Count : Integer;
  285. First : zglTTimer;
  286. end;
  287. var
  288. timer_Add : function( OnTimer : Pointer; Interval : LongWord; UseSenderForCallback : Boolean = FALSE; UserData : Pointer = nil ) : zglPTimer;
  289. timer_Del : procedure( var Timer : zglPTimer );
  290. timer_GetTicks : function : Double;
  291. timer_Reset : procedure;
  292. // MOUSE
  293. const
  294. M_BLEFT = 0;
  295. M_BMIDDLE = 1;
  296. M_BRIGHT = 2;
  297. M_WUP = 0;
  298. M_WDOWN = 1;
  299. var
  300. mouse_X : function : Integer;
  301. mouse_Y : function : Integer;
  302. mouse_DX : function : Integer;
  303. mouse_DY : function : Integer;
  304. mouse_Down : function( Button : Byte ) : Boolean;
  305. mouse_Up : function( Button : Byte ) : Boolean;
  306. mouse_Click : function( Button : Byte ) : Boolean;
  307. mouse_DblClick : function( Button : Byte ) : Boolean;
  308. mouse_Wheel : function( Axis : Byte ) : Boolean;
  309. mouse_ClearState : procedure;
  310. mouse_Lock : procedure( X : Integer = -1; Y : Integer = -1 );
  311. // KEYBOARD
  312. const
  313. K_SYSRQ = $B7;
  314. K_PAUSE = $C5;
  315. K_ESCAPE = $01;
  316. K_ENTER = $1C;
  317. K_KP_ENTER = $9C;
  318. K_UP = $C8;
  319. K_DOWN = $D0;
  320. K_LEFT = $CB;
  321. K_RIGHT = $CD;
  322. K_BACKSPACE = $0E;
  323. K_SPACE = $39;
  324. K_TAB = $0F;
  325. K_TILDE = $29;
  326. K_INSERT = $D2;
  327. K_DELETE = $D3;
  328. K_HOME = $C7;
  329. K_END = $CF;
  330. K_PAGEUP = $C9;
  331. K_PAGEDOWN = $D1;
  332. K_CTRL = $FF - $01;
  333. K_CTRL_L = $1D;
  334. K_CTRL_R = $9D;
  335. K_ALT = $FF - $02;
  336. K_ALT_L = $38;
  337. K_ALT_R = $B8;
  338. K_SHIFT = $FF - $03;
  339. K_SHIFT_L = $2A;
  340. K_SHIFT_R = $36;
  341. K_SUPER = $FF - $04;
  342. K_SUPER_L = $DB;
  343. K_SUPER_R = $DC;
  344. K_APP_MENU = $DD;
  345. K_CAPSLOCK = $3A;
  346. K_NUMLOCK = $45;
  347. K_SCROLL = $46;
  348. K_BRACKET_L = $1A; // [ {
  349. K_BRACKET_R = $1B; // ] }
  350. K_BACKSLASH = $2B; // \
  351. K_SLASH = $35; // /
  352. K_COMMA = $33; // ,
  353. K_DECIMAL = $34; // .
  354. K_SEMICOLON = $27; // : ;
  355. K_APOSTROPHE = $28; // ' "
  356. K_0 = $0B;
  357. K_1 = $02;
  358. K_2 = $03;
  359. K_3 = $04;
  360. K_4 = $05;
  361. K_5 = $06;
  362. K_6 = $07;
  363. K_7 = $08;
  364. K_8 = $09;
  365. K_9 = $0A;
  366. K_MINUS = $0C;
  367. K_EQUALS = $0D;
  368. K_A = $1E;
  369. K_B = $30;
  370. K_C = $2E;
  371. K_D = $20;
  372. K_E = $12;
  373. K_F = $21;
  374. K_G = $22;
  375. K_H = $23;
  376. K_I = $17;
  377. K_J = $24;
  378. K_K = $25;
  379. K_L = $26;
  380. K_M = $32;
  381. K_N = $31;
  382. K_O = $18;
  383. K_P = $19;
  384. K_Q = $10;
  385. K_R = $13;
  386. K_S = $1F;
  387. K_T = $14;
  388. K_U = $16;
  389. K_V = $2F;
  390. K_W = $11;
  391. K_X = $2D;
  392. K_Y = $15;
  393. K_Z = $2C;
  394. K_KP_0 = $52;
  395. K_KP_1 = $4F;
  396. K_KP_2 = $50;
  397. K_KP_3 = $51;
  398. K_KP_4 = $4B;
  399. K_KP_5 = $4C;
  400. K_KP_6 = $4D;
  401. K_KP_7 = $47;
  402. K_KP_8 = $48;
  403. K_KP_9 = $49;
  404. K_KP_SUB = $4A;
  405. K_KP_ADD = $4E;
  406. K_KP_MUL = $37;
  407. K_KP_DIV = $B5;
  408. K_KP_DECIMAL = $53;
  409. K_F1 = $3B;
  410. K_F2 = $3C;
  411. K_F3 = $3D;
  412. K_F4 = $3E;
  413. K_F5 = $3F;
  414. K_F6 = $40;
  415. K_F7 = $41;
  416. K_F8 = $42;
  417. K_F9 = $43;
  418. K_F10 = $44;
  419. K_F11 = $57;
  420. K_F12 = $58;
  421. KA_DOWN = 0;
  422. KA_UP = 1;
  423. var
  424. key_Down : function( KeyCode : Byte ) : Boolean;
  425. key_Up : function( KeyCode : Byte ) : Boolean;
  426. key_Press : function( KeyCode : Byte ) : Boolean;
  427. key_Last : function( KeyAction : Byte ) : Byte;
  428. key_BeginReadText : procedure( const Text : UTF8String; MaxSymbols : Integer = -1 );
  429. key_UpdateReadText : procedure( const Text : UTF8String; MaxSymbols : Integer = -1 );
  430. _key_GetText : function : PAnsiChar;
  431. key_EndReadText : procedure;
  432. key_ClearState : procedure;
  433. function key_GetText : UTF8String;
  434. // JOYSTICK
  435. type
  436. zglPJoyInfo = ^zglTJoyInfo;
  437. zglTJoyInfo = record
  438. Name : UTF8String;
  439. Count : record
  440. Axes : Integer;
  441. Buttons : Integer;
  442. end;
  443. Caps : LongWord;
  444. end;
  445. const
  446. JOY_HAS_Z = $000001;
  447. JOY_HAS_R = $000002;
  448. JOY_HAS_U = $000004;
  449. JOY_HAS_V = $000008;
  450. JOY_HAS_POV = $000010;
  451. JOY_AXIS_X = 0;
  452. JOY_AXIS_Y = 1;
  453. JOY_AXIS_Z = 2;
  454. JOY_AXIS_R = 3;
  455. JOY_AXIS_U = 4;
  456. JOY_AXIS_V = 5;
  457. JOY_POVX = 6;
  458. JOY_POVY = 7;
  459. var
  460. joy_Init : function : Byte;
  461. joy_GetInfo : function( JoyID : Byte ) : zglPJoyInfo;
  462. joy_AxisPos : function( JoyID, Axis : Byte ) : Single;
  463. joy_Down : function( JoyID, Button : Byte ) : Boolean;
  464. joy_Up : function( JoyID, Button : Byte ) : Boolean;
  465. joy_Press : function( JoyID, Button : Byte ) : Boolean;
  466. joy_ClearState : procedure;
  467. // 2D
  468. type
  469. zglPPoint2D = ^zglTPoint2D;
  470. zglTPoint2D = record
  471. X, Y : Single;
  472. end;
  473. type
  474. zglPPoints2D = ^zglTPoints2D;
  475. zglTPoints2D = array[ 0..0 ] of zglTPoint2D;
  476. type
  477. zglPLine = ^zglTLine;
  478. zglTLine = record
  479. x0, y0 : Single;
  480. x1, y1 : Single;
  481. end;
  482. type
  483. zglPRect = ^zglTRect;
  484. zglTRect = record
  485. X, Y, W, H : Single;
  486. end;
  487. type
  488. zglPCircle = ^zglTCircle;
  489. zglTCircle = record
  490. cX, cY : Single;
  491. Radius : Single;
  492. end;
  493. // RESOURCES
  494. var
  495. res_BeginQueue : procedure( QueueID : Byte );
  496. res_EndQueue : procedure;
  497. res_GetPercentage : function( QueueID : Byte ) : Integer;
  498. res_GetCompleted : function : Integer;
  499. res_Proc : procedure;
  500. // TEXTURES
  501. type
  502. zglPTextureCoord = ^zglTTextureCoord;
  503. zglTTextureCoord = array[ 0..3 ] of zglTPoint2D;
  504. type
  505. zglPTexture = ^zglTTexture;
  506. zglTTexture = record
  507. ID : LongWord;
  508. Width, Height : Word;
  509. Format : Word;
  510. U, V : Single;
  511. FramesCoord : array of zglTTextureCoord;
  512. Flags : LongWord;
  513. prev, next : zglPTexture;
  514. end;
  515. type
  516. zglPTextureFormat = ^zglTTextureFormat;
  517. zglTTextureFormat = record
  518. Extension : UTF8String;
  519. FileLoader : procedure( const FileName : UTF8String; out pData : PByteArray; out W, H, Format : Word );
  520. MemLoader : procedure( const Memory : zglTMemory; out pData : PByteArray; out W, H, Format : Word );
  521. end;
  522. type
  523. zglPTextureManager = ^zglTTextureManager;
  524. zglTTextureManager = record
  525. Count : record
  526. Items : Integer;
  527. Formats : Integer;
  528. end;
  529. First : zglTTexture;
  530. Formats : array of zglTTextureFormat;
  531. end;
  532. const
  533. TEX_FORMAT_RGBA = $01;
  534. TEX_FORMAT_RGBA_PVR2 = $10;
  535. TEX_FORMAT_RGBA_PVR4 = $11;
  536. TEX_FORMAT_RGBA_DXT1 = $20;
  537. TEX_FORMAT_RGBA_DXT3 = $21;
  538. TEX_FORMAT_RGBA_DXT5 = $22;
  539. TEX_NO_COLORKEY = $FF000000;
  540. TEX_MIPMAP = $000001;
  541. TEX_CLAMP = $000002;
  542. TEX_REPEAT = $000004;
  543. TEX_COMPRESS = $000008;
  544. TEX_CONVERT_TO_POT = $000010;
  545. TEX_CALCULATE_ALPHA = $000020;
  546. TEX_GRAYSCALE = $000040;
  547. TEX_INVERT = $000080;
  548. TEX_CUSTOM_EFFECT = $000100;
  549. TEX_FILTER_NEAREST = $000200;
  550. TEX_FILTER_LINEAR = $000400;
  551. TEX_FILTER_BILINEAR = $000800;
  552. TEX_FILTER_TRILINEAR = $001000;
  553. TEX_FILTER_ANISOTROPY = $002000;
  554. TEX_DEFAULT_2D = TEX_CLAMP or TEX_FILTER_LINEAR or TEX_CONVERT_TO_POT or TEX_CALCULATE_ALPHA;
  555. var
  556. tex_Add : function : zglPTexture;
  557. tex_Del : procedure( var Texture : zglPTexture );
  558. tex_Create : function( var Data : PByteArray; Width, Height : Word; Format : Word = TEX_FORMAT_RGBA; Flags : LongWord = TEX_DEFAULT_2D ) : zglPTexture;
  559. tex_CreateZero : function( Width, Height : Word; Color : LongWord = $000000; Flags : LongWord = TEX_DEFAULT_2D ) : zglPTexture;
  560. tex_LoadFromFile : function( const FileName : UTF8String; TransparentColor : LongWord = TEX_NO_COLORKEY; Flags : LongWord = TEX_DEFAULT_2D ) : zglPTexture;
  561. tex_LoadFromMemory : function( const Memory : zglTMemory; const Extension : UTF8String; TransparentColor : LongWord = TEX_NO_COLORKEY; Flags : LongWord = TEX_DEFAULT_2D ) : zglPTexture;
  562. tex_SetFrameSize : procedure( var Texture : zglPTexture; FrameWidth, FrameHeight : Word );
  563. tex_SetMask : procedure( var Texture : zglPTexture; Mask : zglPTexture );
  564. tex_SetData : procedure( Texture : zglPTexture; pData : PByteArray; X, Y, Width, Height : Word; Stride : Integer = 0 );
  565. tex_GetData : procedure( Texture : zglPTexture; out pData : PByteArray );
  566. tex_Filter : procedure( Texture : zglPTexture; Flags : LongWord );
  567. tex_SetAnisotropy : procedure( Level : Byte );
  568. // RENDER TARGETS
  569. type
  570. zglPRenderTarget = ^zglTRenderTarget;
  571. zglTRenderTarget = record
  572. Type_ : Byte;
  573. Handle : Pointer;
  574. Surface : zglPTexture;
  575. Flags : Byte;
  576. prev, next : zglPRenderTarget;
  577. end;
  578. type
  579. zglPRenderTargetManager = ^zglTRenderTargetManager;
  580. zglTRenderTargetManager = record
  581. Count : Integer;
  582. First : zglTRenderTarget;
  583. end;
  584. type
  585. zglTRenderCallback = procedure( Data : Pointer );
  586. const
  587. RT_DEFAULT = $00;
  588. RT_FULL_SCREEN = $01;
  589. RT_USE_DEPTH = $02;
  590. RT_CLEAR_COLOR = $04;
  591. RT_CLEAR_DEPTH = $08;
  592. RT_SAVE_CONTENT = $10; // Direct3D only!
  593. var
  594. rtarget_Add : function( Surface : zglPTexture; Flags : Byte ) : zglPRenderTarget;
  595. rtarget_Del : procedure( var Target : zglPRenderTarget );
  596. rtarget_Set : procedure( Target : zglPRenderTarget );
  597. rtarget_DrawIn : procedure( Target : zglPRenderTarget; RenderCallback : zglTRenderCallback; Data : Pointer );
  598. // FX
  599. const
  600. FX_BLEND_NORMAL = $00;
  601. FX_BLEND_ADD = $01;
  602. FX_BLEND_MULT = $02;
  603. FX_BLEND_BLACK = $03;
  604. FX_BLEND_WHITE = $04;
  605. FX_BLEND_MASK = $05;
  606. FX_COLOR_MIX = $00;
  607. FX_COLOR_SET = $01;
  608. FX_BLEND = $100000;
  609. FX_COLOR = $200000;
  610. var
  611. fx_SetBlendMode : procedure( Mode : Byte; SeparateAlpha : Boolean = TRUE );
  612. fx_SetColorMode : procedure( Mode : Byte );
  613. fx_SetColorMask : procedure( R, G, B, Alpha : Boolean );
  614. // FX 2D
  615. const
  616. FX2D_FLIPX = $000001;
  617. FX2D_FLIPY = $000002;
  618. FX2D_VCA = $000004;
  619. FX2D_VCHANGE = $000008;
  620. FX2D_SCALE = $000010;
  621. FX2D_RPIVOT = $000020;
  622. var
  623. fx2d_SetColor : procedure( Color : LongWord );
  624. fx2d_SetVCA : procedure( c1, c2, c3, c4 : LongWord; a1, a2, a3, a4 : Byte );
  625. fx2d_SetVertexes : procedure( x1, y1, x2, y2, x3, y3, x4, y4 : Single );
  626. fx2d_SetScale : procedure( scaleX, scaleY : Single );
  627. fx2d_SetRotatingPivot : procedure( X, Y : Single );
  628. // Camera 2D
  629. type
  630. zglPCamera2D = ^zglTCamera2D;
  631. zglTCamera2D = record
  632. X, Y : Single;
  633. Angle : Single;
  634. Zoom : zglTPoint2D;
  635. Center : zglTPoint2D;
  636. end;
  637. var
  638. cam2d_Init : procedure( out Camera : zglTCamera2D );
  639. cam2d_Set : procedure( Camera : zglPCamera2D );
  640. cam2d_Get : function : zglPCamera2D;
  641. // Render 2D
  642. batch2d_Begin : procedure;
  643. batch2d_End : procedure;
  644. batch2d_Flush : procedure;
  645. // Primitives 2D
  646. const
  647. PR2D_FILL = $010000;
  648. PR2D_SMOOTH = $020000;
  649. var
  650. pr2d_Pixel : procedure( X, Y : Single; Color : LongWord = $FFFFFF; Alpha : Byte = 255 );
  651. pr2d_Line : procedure( X1, Y1, X2, Y2 : Single; Color : LongWord = $FFFFFF; Alpha : Byte = 255; FX : LongWord = 0 );
  652. pr2d_Rect : procedure( X, Y, W, H : Single; Color : LongWord = $FFFFFF; Alpha : Byte = 255; FX : LongWord = 0 );
  653. pr2d_Circle : procedure( X, Y, Radius : Single; Color : LongWord = $FFFFFF; Alpha : Byte = 255; Quality : Word = 32; FX : LongWord = 0 );
  654. pr2d_Ellipse : procedure( X, Y, xRadius, yRadius : Single; Color : LongWord = $FFFFFF; Alpha : Byte = 255; Quality : Word = 32; FX : LongWord = 0 );
  655. pr2d_TriList : procedure( Texture : zglPTexture; TriList, TexCoords : zglPPoints2D; iLo, iHi : Integer; Color : LongWord = $FFFFFF; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  656. // Sprites 2D
  657. type
  658. zglPSprite2D = ^zglTSprite2D;
  659. zglPSEngine2D = ^zglTSEngine2D;
  660. zglTSEngine2D = record
  661. Count : Integer;
  662. List : array of zglPSprite2D;
  663. end;
  664. zglTSprite2D = record
  665. ID : Integer;
  666. Manager : zglPSEngine2D;
  667. Texture : zglPTexture;
  668. Destroy : Boolean;
  669. Layer : Integer;
  670. X, Y : Single;
  671. W, H : Single;
  672. Angle : Single;
  673. Frame : Single;
  674. Alpha : Integer;
  675. FxFlags : LongWord;
  676. Data : Pointer;
  677. OnInit : procedure( Sprite : zglPSprite2D );
  678. OnDraw : procedure( Sprite : zglPSprite2D );
  679. OnProc : procedure( Sprite : zglPSprite2D );
  680. OnFree : procedure( Sprite : zglPSprite2D );
  681. end;
  682. type
  683. zglPTiles2D = ^zglTTiles2D;
  684. zglTTiles2D = record
  685. Count : record
  686. X, Y : Integer;
  687. end;
  688. Size : record
  689. W, H : Single;
  690. end;
  691. Tiles : array of array of Integer;
  692. end;
  693. type
  694. zglPGrid2D = ^zglTGrid2D;
  695. zglTGrid2D = record
  696. Cols : Integer;
  697. Rows : Integer;
  698. Grid : array of array of zglTPoint2D;
  699. end;
  700. var
  701. sengine2d_AddSprite : function( Texture : zglPTexture; Layer : Integer; OnInit, OnDraw, OnProc, OnFree : Pointer ) : zglPSprite2D;
  702. sengine2d_AddCustom : function( Texture : zglPTexture; Size : LongWord; Layer : Integer; OnInit, OnDraw, OnProc, OnFree : Pointer ) : zglPSprite2D;
  703. sengine2d_DelSprite : procedure( ID : Integer );
  704. sengine2d_ClearAll : procedure;
  705. sengine2d_Set : procedure( SEngine : zglPSEngine2D );
  706. sengine2d_Draw : procedure;
  707. sengine2d_Proc : procedure;
  708. texture2d_Draw : procedure( Texture : zglPTexture; const TexCoord : array of zglTPoint2D; X, Y, W, H, Angle : Single; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  709. ssprite2d_Draw : procedure( Texture : zglPTexture; X, Y, W, H, Angle : Single; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  710. asprite2d_Draw : procedure( Texture : zglPTexture; X, Y, W, H, Angle : Single; Frame : Word; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  711. csprite2d_Draw : procedure( Texture : zglPTexture; X, Y, W, H, Angle : Single; const CutRect : zglTRect; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  712. tiles2d_Draw : procedure( Texture : zglPTexture; X, Y : Single; Tiles : zglPTiles2D; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  713. sgrid2d_Draw : procedure( Texture : zglPTexture; X, Y : Single; Grid : zglPGrid2D; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  714. agrid2d_Draw : procedure( Texture : zglPTexture; X, Y : Single; Grid : zglPGrid2D; Frame : Integer; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  715. cgrid2d_Draw : procedure( Texture : zglPTexture; X, Y : Single; Grid : zglPGrid2D; const CutRect : zglTRect; Alpha : Byte = 255; FX : LongWord = FX_BLEND );
  716. // Particles
  717. const
  718. EMITTER_MAX_PARTICLES = 1024;
  719. EMITTER_NONE = 0;
  720. EMITTER_POINT = 1;
  721. EMITTER_LINE = 2;
  722. EMITTER_RECTANGLE = 3;
  723. EMITTER_CIRCLE = 4;
  724. EMITTER_RING = 5;
  725. type
  726. PDiagramByte = ^TDiagramByte;
  727. PDiagramLW = ^TDiagramLW;
  728. PDiagramSingle = ^TDiagramSingle;
  729. zglPParticle2D = ^zglTParticle2D;
  730. zglPEmitterPoint = ^zglTEmitterPoint;
  731. zglPEmitterLine = ^zglTEmitterLine;
  732. zglPEmitterRect = ^zglTEmitterRect;
  733. zglPEmitterCircle = ^zglTEmitterCircle;
  734. zglPEmitterRing = ^zglTEmitterRing;
  735. zglPParticleParams = ^zglTParticleParams;
  736. zglPEmitter2D = ^zglTEmitter2D;
  737. zglPPEmitter2D = ^zglPEmitter2D;
  738. zglPPEngine2D = ^zglTPEngine2D;
  739. zglPEmitter2DManager = ^zglTEmitter2DManager;
  740. TDiagramByte = record
  741. Life : Single;
  742. Value : Byte;
  743. end;
  744. TDiagramLW = record
  745. Life : Single;
  746. Value : LongWord;
  747. end;
  748. TDiagramSingle = record
  749. Life : Single;
  750. Value : Single;
  751. end;
  752. zglTParticle2D = record
  753. _private : record
  754. lColorID : Integer;
  755. lAlphaID : Integer;
  756. lSizeXID : Integer;
  757. lSizeYID : Integer;
  758. lVelocityID : Integer;
  759. laVelocityID : Integer;
  760. lSpinID : Integer;
  761. end;
  762. ID : Integer;
  763. Life : Single;
  764. LifeTime : Integer;
  765. Time : Double;
  766. Frame : Word;
  767. Color : LongWord;
  768. Alpha : Byte;
  769. Position : zglTPoint2D;
  770. Size : zglTPoint2D;
  771. SizeS : zglTPoint2D;
  772. Angle : Single;
  773. Direction : Single;
  774. Velocity : Single;
  775. VelocityS : Single;
  776. aVelocity : Single;
  777. aVelocityS : Single;
  778. Spin : Single;
  779. end;
  780. zglTEmitterPoint = record
  781. Direction : Single;
  782. Spread : Single;
  783. end;
  784. zglTEmitterLine = record
  785. Direction : Single;
  786. Spread : Single;
  787. Size : Single;
  788. TwoSide : Boolean;
  789. end;
  790. zglTEmitterRect = record
  791. Direction : Single;
  792. Spread : Single;
  793. Rect : zglTRect;
  794. end;
  795. zglTEmitterCircle = record
  796. Direction : Single;
  797. Spread : Single;
  798. cX, cY : Single;
  799. Radius : Single;
  800. end;
  801. zglTEmitterRing = record
  802. Direction : Single;
  803. Spread : Single;
  804. cX, cY : Single;
  805. Radius0 : Single;
  806. Radius1 : Single;
  807. end;
  808. zglTParticleParams = record
  809. Texture : zglPTexture;
  810. BlendMode : Byte;
  811. ColorMode : Byte;
  812. LifeTimeS : Integer;
  813. LifeTimeV : Integer;
  814. Frame : array[ 0..1 ] of Integer;
  815. Color : array of TDiagramLW;
  816. Alpha : array of TDiagramByte;
  817. SizeXYBind : Boolean;
  818. SizeXS : Single;
  819. SizeYS : Single;
  820. SizeXV : Single;
  821. SizeYV : Single;
  822. SizeXD : array of TDiagramSingle;
  823. SizeYD : array of TDiagramSingle;
  824. AngleS : Single;
  825. AngleV : Single;
  826. VelocityS : Single;
  827. VelocityV : Single;
  828. VelocityD : array of TDiagramSingle;
  829. aVelocityS : Single;
  830. aVelocityV : Single;
  831. aVelocityD : array of TDiagramSingle;
  832. SpinS : Single;
  833. SpinV : Single;
  834. SpinD : array of TDiagramSingle;
  835. end;
  836. zglTEmitter2D = record
  837. _private : record
  838. pengine : zglPPEngine2D;
  839. particle : array[ 0..EMITTER_MAX_PARTICLES - 1 ] of zglTParticle2D;
  840. list : array[ 0..EMITTER_MAX_PARTICLES - 1 ] of zglPParticle2D;
  841. parCreated : Integer;
  842. texFile : UTF8String;
  843. texHash : LongWord;
  844. end;
  845. ID : Integer;
  846. Type_ : Byte;
  847. Params : record
  848. Layer : Integer;
  849. LifeTime : Integer;
  850. Loop : Boolean;
  851. Emission : Integer;
  852. Position : zglTPoint2D;
  853. end;
  854. ParParams : zglTParticleParams;
  855. Life : Single;
  856. Time : Double;
  857. LastSecond : Double;
  858. Particles : Integer;
  859. BBox : record
  860. MinX, MaxX : Single;
  861. MinY, MaxY : Single;
  862. end;
  863. case Byte of
  864. EMITTER_POINT: ( AsPoint : zglTEmitterPoint );
  865. EMITTER_LINE: ( AsLine : zglTEmitterLine );
  866. EMITTER_RECTANGLE: ( AsRect : zglTEmitterRect );
  867. EMITTER_CIRCLE: ( AsCircle : zglTEmitterCircle );
  868. EMITTER_RING: ( AsRing : zglTEmitterRing );
  869. end;
  870. zglTPEngine2D = record
  871. Count : record
  872. Emitters : Integer;
  873. Particles : Integer;
  874. end;
  875. List : array of zglPEmitter2D;
  876. ListU : array of zglPPEmitter2D;
  877. end;
  878. zglTEmitter2DManager = record
  879. Count : Integer;
  880. List : array of zglPEmitter2D;
  881. end;
  882. var
  883. pengine2d_Set : procedure( PEngine : zglPPEngine2D );
  884. pengine2d_Get : function : zglPPEngine2D;
  885. pengine2d_Draw : procedure;
  886. pengine2d_Proc : procedure( dt : Double );
  887. pengine2d_AddEmitter : procedure( Emitter : zglPEmitter2D; Result : zglPPEmitter2D = nil; X : Single = 0; Y : Single = 0 );
  888. pengine2d_DelEmitter : procedure( ID : Integer );
  889. pengine2d_ClearAll : procedure;
  890. emitter2d_Add : function : zglPEmitter2D;
  891. emitter2d_Del : procedure( var Emitter : zglPEmitter2D );
  892. emitter2d_LoadFromFile : function( const FileName : UTF8String ) : zglPEmitter2D;
  893. emitter2d_LoadFromMemory : function( const Memory : zglTMemory ) : zglPEmitter2D;
  894. emitter2d_Init : procedure( Emitter : zglPEmitter2D );
  895. emitter2d_Free : procedure( var Emitter : zglPEmitter2D );
  896. emitter2d_Draw : procedure( Emitter : zglPEmitter2D );
  897. emitter2d_Proc : procedure( Emitter : zglPEmitter2D; dt : Double );
  898. // Text
  899. type
  900. zglPCharDesc = ^zglTCharDesc;
  901. zglTCharDesc = record
  902. Page : Word;
  903. Width : Byte;
  904. Height : Byte;
  905. ShiftX : Integer;
  906. ShiftY : Integer;
  907. ShiftP : Integer;
  908. TexCoords : array[ 0..3 ] of zglTPoint2D;
  909. end;
  910. type
  911. zglPFont = ^zglTFont;
  912. zglTFont = record
  913. Count : record
  914. Pages : Word;
  915. Chars : Word;
  916. end;
  917. Pages : array of zglPTexture;
  918. CharDesc : array[ 0..65535 ] of zglPCharDesc;
  919. MaxHeight : Integer;
  920. MaxShiftY : Integer;
  921. Padding : array[ 0..3 ] of Byte;
  922. prev, next : zglPFont;
  923. end;
  924. type
  925. zglPFontManager = ^zglTFontManager;
  926. zglTFontManager = record
  927. Count : Integer;
  928. First : zglTFont;
  929. end;
  930. const
  931. TEXT_HALIGN_LEFT = $000001;
  932. TEXT_HALIGN_CENTER = $000002;
  933. TEXT_HALIGN_RIGHT = $000004;
  934. TEXT_HALIGN_JUSTIFY = $000008;
  935. TEXT_VALIGN_TOP = $000010;
  936. TEXT_VALIGN_CENTER = $000020;
  937. TEXT_VALIGN_BOTTOM = $000040;
  938. TEXT_CLIP_RECT = $000080;
  939. TEXT_FX_VCA = $000100;
  940. TEXT_FX_LENGTH = $000200;
  941. var
  942. font_Add : function : zglPFont;
  943. font_Del : procedure( var Font : zglPFont );
  944. font_LoadFromFile : function( const FileName : UTF8String ) : zglPFont;
  945. font_LoadFromMemory : function( const Memory : zglTMemory ) : zglPFont;
  946. text_Draw : procedure( Font : zglPFont; X, Y : Single; const Text : UTF8String; Flags : LongWord = 0 );
  947. text_DrawEx : procedure( Font : zglPFont; X, Y, Scale, Step : Single; const Text : UTF8String; Alpha : Byte = 255; Color : LongWord = $FFFFFF; Flags : LongWord = 0 );
  948. text_DrawInRect : procedure( Font : zglPFont; const Rect : zglTRect; const Text : UTF8String; Flags : LongWord = 0 );
  949. text_DrawInRectEx : procedure( Font : zglPFont; const Rect : zglTRect; Scale, Step : Single; const Text : UTF8String; Alpha : Byte = 0; Color : LongWord = $FFFFFF; Flags : LongWord = 0 );
  950. text_GetWidth : function( Font : zglPFont; const Text : UTF8String; Step : Single = 0.0 ) : Single;
  951. text_GetHeight : function( Font : zglPFont; Width : Single; const Text : UTF8String; Scale : Single = 1.0; Step : Single = 0.0 ) : Single;
  952. textFx_SetLength : procedure( Length : Integer; LastCoord : zglPPoint2D = nil; LastCharDesc : zglPCharDesc = nil );
  953. // Sound
  954. const
  955. SND_FORMAT_MONO8 = 1;
  956. SND_FORMAT_MONO16 = 2;
  957. SND_FORMAT_STEREO8 = 3;
  958. SND_FORMAT_STEREO16 = 4;
  959. SND_VOLUME_DEFAULT = -1;
  960. SND_SOUNDS = nil;
  961. SND_STREAM = nil;
  962. SND_ALL_SOURCES = -1;
  963. SND_ALL_SOURCES_LOOPED = -2;
  964. SND_ALL_STREAMS = -3;
  965. SND_ALL_STREAMS_LOOPED = -4;
  966. SND_STATE_PLAYING = 1;
  967. SND_STATE_LOOPED = 2;
  968. SND_STATE_PERCENT = 3;
  969. SND_STATE_TIME = 4;
  970. SND_INFO_DURATION = 5;
  971. type
  972. zglPSound = ^zglTSound;
  973. zglPSoundStream = ^zglTSoundStream;
  974. zglPSoundDecoder = ^zglTSoundDecoder;
  975. zglPSoundFormat = ^zglTSoundFormat;
  976. zglPSoundManager = ^zglTSoundManager;
  977. zglTSoundChannel = record
  978. Source : Ptr;
  979. Speed : Single;
  980. Volume : Single;
  981. Position : record
  982. X, Y, Z : Single;
  983. end;
  984. end;
  985. zglTSound = record
  986. Buffer : LongWord;
  987. SourceCount : LongWord;
  988. Channel : array of zglTSoundChannel;
  989. Data : PByteArray;
  990. Size : LongWord;
  991. Duration : Double;
  992. Frequency : LongWord;
  993. prev, next : zglPSound;
  994. end;
  995. zglTSoundStream = record
  996. _data : Pointer;
  997. _file : zglTFile;
  998. _memory : zglTMemory;
  999. _decoder : zglPSoundDecoder;
  1000. _playing : Boolean;
  1001. _paused : Boolean;
  1002. _waiting : Boolean;
  1003. _complete : Double;
  1004. _lastTime : Double;
  1005. ID : Integer;
  1006. Buffer : PByteArray;
  1007. BufferSize : LongWord;
  1008. Bits : LongWord;
  1009. Frequency : LongWord;
  1010. Channels : LongWord;
  1011. Duration : Double;
  1012. Loop : Boolean;
  1013. end;
  1014. zglTSoundDecoder = record
  1015. Ext : UTF8String;
  1016. Open : function( var Stream : zglTSoundStream; const FileName : UTF8String ) : Boolean;
  1017. OpenMem : function( var Stream : zglTSoundStream; const Memory : zglTMemory ) : Boolean;
  1018. Read : function( var Stream : zglTSoundStream; Buffer : PByteArray; Bytes : LongWord; out _End : Boolean ) : LongWord;
  1019. Loop : procedure( var Stream : zglTSoundStream );
  1020. Seek : procedure( var Stream : zglTSoundStream; Milliseconds : Double );
  1021. Close : procedure( var Stream : zglTSoundStream );
  1022. end;
  1023. zglTSoundFormat = record
  1024. Extension : UTF8String;
  1025. Decoder : zglPSoundDecoder;
  1026. FileLoader : procedure( const FileName : UTF8String; out Data : PByteArray; out Size, Format, Frequency : LongWord );
  1027. MemLoader : procedure( const Memory : zglTMemory; out Data : PByteArray; out Size, Format, Frequency : LongWord );
  1028. end;
  1029. zglTSoundManager = record
  1030. Count : record
  1031. Items : Integer;
  1032. Formats : Integer;
  1033. end;
  1034. First : zglTSound;
  1035. Formats : array of zglTSoundFormat;
  1036. end;
  1037. var
  1038. snd_Init : function : Boolean;
  1039. snd_Free : procedure;
  1040. snd_Add : function( SourceCount : Integer ) : zglPSound;
  1041. snd_Del : procedure( var Sound : zglPSound );
  1042. snd_LoadFromFile : function( const FileName : UTF8String; SourceCount : Integer = 8 ) : zglPSound;
  1043. snd_LoadFromMemory : function( const Memory : zglTMemory; const Extension : UTF8String; SourceCount : Integer = 8 ) : zglPSound;
  1044. snd_Play : function( Sound : zglPSound; Loop : Boolean = FALSE; X : Single = 0; Y : Single = 0; Z : Single = 0; Volume : Single = SND_VOLUME_DEFAULT ) : Integer;
  1045. snd_Stop : procedure( Sound : zglPSound; ID : Integer );
  1046. snd_SetPos : procedure( Sound : zglPSound; ID : Integer; X, Y, Z : Single );
  1047. snd_SetVolume : procedure( Sound : zglPSound; ID : Integer; Volume : Single );
  1048. snd_SetSpeed : procedure( Sound : zglPSound; ID : Integer; Speed : Single );
  1049. snd_Get : function( Sound : zglPSound; ID, What : Integer ) : Integer;
  1050. snd_PlayFile : function( const FileName : UTF8String; Loop : Boolean = FALSE; Volume : Single = SND_VOLUME_DEFAULT ) : Integer;
  1051. snd_PlayMemory : function( const Memory : zglTMemory; const Extension : UTF8String; Loop : Boolean = FALSE; Volume : Single = SND_VOLUME_DEFAULT ) : Integer;
  1052. snd_PauseStream : procedure( ID : Integer );
  1053. snd_StopStream : procedure( ID : Integer );
  1054. snd_ResumeStream : procedure( ID : Integer );
  1055. snd_SeekStream : procedure( ID : Integer; Milliseconds : Double );
  1056. // Video
  1057. type
  1058. zglPVideoStream = ^zglTVideoStream;
  1059. zglPVideoDecoder = ^zglTVideoDecoder;
  1060. zglPVideoManager = ^zglTVideoManager;
  1061. zglTVideoStream = record
  1062. _private : record
  1063. Data : Pointer;
  1064. File_ : zglTFile;
  1065. Memory : zglTMemory;
  1066. Decoder : zglPVideoDecoder;
  1067. end;
  1068. Data : Pointer;
  1069. Texture : zglPTexture;
  1070. Frame : Integer;
  1071. Time : Double;
  1072. Info : record
  1073. Width : Word;
  1074. Height : Word;
  1075. FrameRate : Single;
  1076. Duration : Double;
  1077. Frames : Integer;
  1078. end;
  1079. Loop : Boolean;
  1080. prev, next : zglPVideoStream;
  1081. end;
  1082. zglTVideoDecoder = record
  1083. Extension : UTF8String;
  1084. Open : function( var Stream : zglTVideoStream; const FileName : UTF8String ) : Boolean;
  1085. OpenMem : function( var Stream : zglTVideoStream; const Memory : zglTMemory ) : Boolean;
  1086. Update : procedure( var Stream : zglTVideoStream; Milliseconds : Double; Data : PByteArray );
  1087. Seek : procedure( var Stream : zglTVideoStream; Milliseconds : Double );
  1088. Loop : procedure( var Stream : zglTVideoStream );
  1089. Close : procedure( var Stream : zglTVideoStream );
  1090. end;
  1091. zglTVideoManager = record
  1092. Count : record
  1093. Items : Integer;
  1094. Decoders : Integer;
  1095. end;
  1096. First : zglTVideoStream;
  1097. Decoders : array of zglPVideoDecoder;
  1098. end;
  1099. var
  1100. video_Add : function : zglPVideoStream;
  1101. video_Del : procedure( var Stream : zglPVideoStream );
  1102. video_OpenFile : function( const FileName : UTF8String ) : zglPVideoStream;
  1103. video_OpenMemory : function( const Memory : zglTMemory; const Extension : UTF8String ) : zglPVideoStream;
  1104. video_Update : procedure( var Stream : zglPVideoStream; Milliseconds : Double; Loop : Boolean = FALSE );
  1105. video_Seek : procedure( var Stream : zglPVideoStream; Milliseconds : Double );
  1106. // MATH
  1107. const
  1108. pi = 3.141592654;
  1109. rad2deg = 57.29578049;
  1110. deg2rad = 0.017453292;
  1111. ORIENTATION_LEFT = -1;
  1112. ORIENTATION_RIGHT = 1;
  1113. ORIENTATION_ZERO = 0;
  1114. var
  1115. m_Cos : function( Angle : Integer ) : Single;
  1116. m_Sin : function( Angle : Integer ) : Single;
  1117. m_Distance : function( x1, y1, x2, y2 : Single ) : Single;
  1118. m_FDistance : function( x1, y1, x2, y2 : Single ) : Single;
  1119. m_Angle : function( x1, y1, x2, y2 : Single ) : Single;
  1120. m_Orientation : function( x, y, x1, y1, x2, y2 : Single ) : Integer;
  1121. tess_Triangulate : procedure( Contour : zglPPoints2D; iLo, iHi : Integer; AddHoles : Boolean = FALSE );
  1122. tess_AddHole : procedure( Contour : zglPPoints2D; iLo, iHi : Integer; LastHole : Boolean = TRUE );
  1123. tess_GetData : function( out TriPoints : zglPPoints2D ) : Integer;
  1124. // COLLISION 2D
  1125. col2d_PointInRect : function( X, Y : Single; const Rect : zglTRect ) : Boolean;
  1126. col2d_PointInTriangle : function( X, Y : Single; const P1, P2, P3 : zglTPoint2D ) : Boolean;
  1127. col2d_PointInCircle : function( X, Y : Single; const Circle : zglTCircle ) : Boolean;
  1128. // line 2d
  1129. col2d_Line : function( const A, B : zglTLine; ColPoint : zglPPoint2D ) : Boolean;
  1130. col2d_LineVsRect : function( const Line : zglTLine; const Rect : zglTRect ) : Boolean;
  1131. col2d_LineVsCircle : function( const Line : zglTLine; const Circle : zglTCircle ) : Boolean;
  1132. // rect
  1133. col2d_Rect : function( const Rect1, Rect2 : zglTRect ) : Boolean;
  1134. col2d_ClipRect : function( const Rect1, Rect2 : zglTRect ) : zglTRect;
  1135. col2d_RectInRect : function( const Rect1, Rect2 : zglTRect ) : Boolean;
  1136. col2d_RectInCircle : function( const Rect : zglTRect; const Circle : zglTCircle ) : Boolean;
  1137. col2d_RectVsCircle : function( const Rect : zglTRect; const Circle : zglTCircle ) : Boolean;
  1138. // circle
  1139. col2d_Circle : function( const Circle1, Circle2 : zglTCircle ) : Boolean;
  1140. col2d_CircleInCircle : function( const Circle1, Circle2 : zglTCircle ) : Boolean;
  1141. col2d_CircleInRect : function( const Circle : zglTCircle; const Rect : zglTRect ) : Boolean;
  1142. const
  1143. FILE_ERROR = {$IFNDEF WINDOWS} 0 {$ELSE} LongWord( -1 ) {$ENDIF};
  1144. // Open Mode
  1145. FOM_CREATE = $01; // Create
  1146. FOM_OPENR = $02; // Read
  1147. FOM_OPENRW = $03; // Read&Write
  1148. // Seek Mode
  1149. FSM_SET = $01;
  1150. FSM_CUR = $02;
  1151. FSM_END = $03;
  1152. var
  1153. file_Open : function( out FileHandle : zglTFile; const FileName : UTF8String; Mode : Byte ) : Boolean;
  1154. file_MakeDir : function( const Directory : UTF8String ) : Boolean;
  1155. file_Remove : function( const Name : UTF8String ) : Boolean;
  1156. file_Exists : function( const Name : UTF8String ) : Boolean;
  1157. file_Seek : function( FileHandle : zglTFile; Offset, Mode : Integer ) : LongWord;
  1158. file_GetPos : function( FileHandle : zglTFile ) : LongWord;
  1159. file_Read : function( FileHandle : zglTFile; var Buffer; Bytes : LongWord ) : LongWord;
  1160. file_Write : function( FileHandle : zglTFile; const Buffer; Bytes : LongWord ) : LongWord;
  1161. file_GetSize : function( FileHandle : zglTFile ) : LongWord;
  1162. file_Flush : procedure( const FileHandle : zglTFile );
  1163. file_Close : procedure( var FileHandle : zglTFile );
  1164. file_Find : procedure( const Directory : UTF8String; out List : zglTFileList; FindDir : Boolean );
  1165. _file_GetName : function( const FileName : UTF8String ) : PAnsiChar;
  1166. _file_GetExtension : function( const FileName : UTF8String ) : PAnsiChar;
  1167. _file_GetDirectory : function( const FileName : UTF8String ) : PAnsiChar;
  1168. file_SetPath : procedure( const Path : UTF8String );
  1169. file_OpenArchive : function( const FileName : UTF8String; const Password : UTF8String = '' ) : Boolean;
  1170. file_CloseArchive : procedure;
  1171. function file_GetName( const FileName : UTF8String ) : UTF8String;
  1172. function file_GetExtension( const FileName : UTF8String ) : UTF8String;
  1173. function file_GetDirectory( const FileName : UTF8String ) : UTF8String;
  1174. var
  1175. mem_LoadFromFile : function( out Memory : zglTMemory; const FileName : UTF8String ) : Boolean;
  1176. mem_SaveToFile : function( var Memory : zglTMemory; const FileName : UTF8String ) : Boolean;
  1177. mem_Seek : function( var Memory : zglTMemory; Offset, Mode : Integer ) : LongWord;
  1178. mem_Read : function( var Memory : zglTMemory; var Buffer; Bytes : LongWord ) : LongWord;
  1179. mem_Write : function( var Memory : zglTMemory; const Buffer; Bytes : LongWord ) : LongWord;
  1180. mem_SetSize : procedure( var Memory : zglTMemory; Size : LongWord );
  1181. mem_Free : procedure( var Memory : zglTMemory );
  1182. // String Utils
  1183. function u_IntToStr( Value : Integer ) : UTF8String;
  1184. function u_StrToInt( const Value : UTF8String ) : Integer;
  1185. function u_FloatToStr( Value : Single; Digits : Integer = 2 ) : UTF8String;
  1186. function u_StrToFloat( const Value : UTF8String ) : Single;
  1187. function u_BoolToStr( Value : Boolean ) : UTF8String;
  1188. function u_StrToBool( const Value : UTF8String ) : Boolean;
  1189. // RU: Только для латинских символов попадающих в диапазон 0..127
  1190. // EN: Only for latin symbols in range 0..127
  1191. function u_StrUp( const Str : UTF8String ) : UTF8String;
  1192. function u_StrDown( const Str : UTF8String ) : UTF8String;
  1193. function utf8_Copy( const Str : UTF8String ) : UTF8String; overload;
  1194. function utf8_Copy( const Str : UTF8String; FromPosition, Count : Integer ) : UTF8String; overload;
  1195. procedure utf8_Delete( var Str : UTF8String; FromPosition, Count : Integer );
  1196. var
  1197. utf8_Length : function( const Str : UTF8String ) : Integer;
  1198. utf8_GetShift : procedure( const Str : UTF8String; Pos : Integer; out NewPos : Integer; Chars : Integer = 1 );
  1199. utf8_GetID : function( const Str : UTF8String; Pos : Integer; Shift : PInteger ) : LongWord;
  1200. // Utils
  1201. var
  1202. u_SortList : procedure( var List : zglTStringList; iLo, iHi : Integer );
  1203. u_Sleep : procedure( Milliseconds : LongWord );
  1204. u_Hash : function( const Str : UTF8String ) : LongWord;
  1205. {$IFDEF UNIX}
  1206. function dlopen ( Name : PAnsiChar; Flags : longint) : Pointer; cdecl; external 'dl';
  1207. function dlclose( Lib : Pointer) : Longint; cdecl; external 'dl';
  1208. function dlsym ( Lib : Pointer; Name : PAnsiChar) : Pointer; cdecl; external 'dl';
  1209. {$ENDIF}
  1210. {$IFDEF WINDOWS}
  1211. {$IFNDEF WINCE}
  1212. function dlopen ( lpLibFileName : PAnsiChar) : HMODULE; stdcall; external 'kernel32.dll' name 'LoadLibraryA';
  1213. function dlclose( hLibModule : HMODULE ) : Boolean; stdcall; external 'kernel32.dll' name 'FreeLibrary';
  1214. function dlsym ( hModule : HMODULE; lpProcName : PAnsiChar) : Pointer; stdcall; external 'kernel32.dll' name 'GetProcAddress';
  1215. function MessageBoxA( hWnd : LongWord; lpText, lpCaption : PAnsiChar; uType : LongWord) : Integer; stdcall; external 'user32.dll';
  1216. {$ELSE}
  1217. function dlopen ( lpLibFileName : PWideChar) : HMODULE; stdcall; external 'coredll.dll' name 'LoadLibraryW';
  1218. function dlclose( hLibModule : HMODULE ) : Boolean; stdcall; external 'coredll.dll' name 'FreeLibrary';
  1219. function dlsym ( hModule : HMODULE; lpProcName : PWideChar) : Pointer; stdcall; external 'coredll.dll' name 'GetProcAddressW';
  1220. function MessageBoxA( hWnd : LongWord; lpText, lpCaption : PWideChar; uType : LongWord) : Integer; stdcall; external 'coredll.dll' name 'MessageBoxW';
  1221. {$ENDIF}
  1222. {$ENDIF}
  1223. implementation
  1224. var
  1225. zglLib : {$IFDEF UNIX} Pointer {$ENDIF} {$IFDEF WINDOWS} HMODULE {$ENDIF};
  1226. {$IFDEF MACOSX}
  1227. mainBundle : CFBundleRef;
  1228. tmpCFURLRef : CFURLRef;
  1229. tmpCFString : CFStringRef;
  1230. tmpPath : array[ 0..8191 ] of AnsiChar;
  1231. outItemHit : SInt16;
  1232. mainPath : UTF8String;
  1233. {$ENDIF}
  1234. function ini_ReadKeyStr( const Section, Key : UTF8String ) : UTF8String;
  1235. var
  1236. tmp : PAnsiChar;
  1237. begin
  1238. tmp := _ini_ReadKeyStr( Section, Key );
  1239. Result := utf8_Copy( tmp );
  1240. zgl_FreeMem( Pointer( tmp ) );
  1241. end;
  1242. function key_GetText : UTF8String;
  1243. var
  1244. tmp : PAnsiChar;
  1245. begin
  1246. tmp := _key_GetText();
  1247. Result := utf8_Copy( tmp );
  1248. zgl_FreeMem( Pointer( tmp ) );
  1249. end;
  1250. function file_GetName( const FileName : UTF8String ) : UTF8String;
  1251. var
  1252. tmp : PAnsiChar;
  1253. begin
  1254. tmp := _file_GetName( FileName );
  1255. Result := utf8_Copy( tmp );
  1256. zgl_FreeMem( Pointer( tmp ) );
  1257. end;
  1258. function file_GetExtension( const FileName : UTF8String ) : UTF8String;
  1259. var
  1260. tmp : PAnsiChar;
  1261. begin
  1262. tmp := _file_GetExtension( FileName );
  1263. Result := utf8_Copy( tmp );
  1264. zgl_FreeMem( Pointer( tmp ) );
  1265. end;
  1266. function file_GetDirectory( const FileName : UTF8String ) : UTF8String;
  1267. var
  1268. tmp : PAnsiChar;
  1269. begin
  1270. tmp := _file_GetDirectory( FileName );
  1271. Result := utf8_Copy( tmp );
  1272. zgl_FreeMem( Pointer( tmp ) );
  1273. end;
  1274. function u_IntToStr( Value : Integer ) : UTF8String;
  1275. begin
  1276. Str( Value, Result );
  1277. end;
  1278. function u_StrToInt( const Value : UTF8String ) : Integer;
  1279. var
  1280. e : Integer;
  1281. begin
  1282. Val( Value, Result, e );
  1283. if e <> 0 Then
  1284. Result := 0;
  1285. end;
  1286. function u_FloatToStr( Value : Single; Digits : Integer = 2 ) : UTF8String;
  1287. begin
  1288. Str( Value:0:Digits, Result );
  1289. end;
  1290. function u_StrToFloat( const Value : UTF8String ) : Single;
  1291. var
  1292. e : Integer;
  1293. begin
  1294. Val( Value, Result, e );
  1295. if e <> 0 Then
  1296. Result := 0;
  1297. end;
  1298. function u_BoolToStr( Value : Boolean ) : UTF8String;
  1299. begin
  1300. if Value Then
  1301. Result := 'TRUE'
  1302. else
  1303. Result := 'FALSE';
  1304. end;
  1305. function u_StrToBool( const Value : UTF8String ) : Boolean;
  1306. begin
  1307. if Value = '1' Then
  1308. Result := TRUE
  1309. else
  1310. if u_StrUp( Value ) = 'TRUE' Then
  1311. Result := TRUE
  1312. else
  1313. Result := FALSE;
  1314. end;
  1315. function u_StrUp( const Str : UTF8String ) : UTF8String;
  1316. var
  1317. i, l : Integer;
  1318. begin
  1319. l := length( Str );
  1320. SetLength( Result, l );
  1321. for i := 1 to l do
  1322. if ( Byte( Str[ i ] ) >= 97 ) and ( Byte( Str[ i ] ) <= 122 ) Then
  1323. Result[ i ] := AnsiChar( Byte( Str[ i ] ) - 32 )
  1324. else
  1325. Result[ i ] := Str[ i ];
  1326. end;
  1327. function u_StrDown( const Str : UTF8String ) : UTF8String;
  1328. var
  1329. i, l : Integer;
  1330. begin
  1331. l := length( Str );
  1332. SetLength( Result, l );
  1333. for i := 1 to l do
  1334. if ( Byte( Str[ i ] ) >= 65 ) and ( Byte( Str[ i ] ) <= 90 ) Then
  1335. Result[ i ] := AnsiChar( Byte( Str[ i ] ) + 32 )
  1336. else
  1337. Result[ i ] := Str[ i ];
  1338. end;
  1339. function utf8_Copy( const Str : UTF8String ) : UTF8String;
  1340. var
  1341. len : Integer;
  1342. begin
  1343. len := length( Str );
  1344. SetLength( Result, len );
  1345. if len > 0 Then
  1346. System.Move( Str[ 1 ], Result[ 1 ], len );
  1347. end;
  1348. function utf8_Copy( const Str : UTF8String; FromPosition, Count : Integer ) : UTF8String;
  1349. var
  1350. i, j, len : Integer;
  1351. begin
  1352. len := utf8_Length( Str );
  1353. if FromPosition < 1 Then FromPosition := 1;
  1354. if ( FromPosition > len ) or ( Count < 1 ) Then
  1355. begin
  1356. Result := '';
  1357. exit;
  1358. end;
  1359. if FromPosition + Count > len + 1 Then Count := len - FromPosition + 1;
  1360. i := 1;
  1361. utf8_GetShift( Str, i, i, FromPosition - 1 );
  1362. utf8_GetShift( Str, i, j, Count );
  1363. SetLength( Result, j - i );
  1364. System.Move( Str[ i ], Result[ 1 ], j - i );
  1365. end;
  1366. procedure utf8_Delete( var Str : UTF8String; FromPosition, Count : Integer );
  1367. var
  1368. i, j, len : Integer;
  1369. Result : UTF8String;
  1370. begin
  1371. len := utf8_Length( Str );
  1372. if FromPosition < 1 Then FromPosition := 1;
  1373. if ( FromPosition > len ) or ( Count < 1 ) Then exit;
  1374. if FromPosition + Count > len + 1 Then Count := len - FromPosition + 1;
  1375. if ( FromPosition = 1 ) and ( Count = len ) Then
  1376. begin
  1377. Str := '';
  1378. exit;
  1379. end;
  1380. len := Length( Str );
  1381. i := 1;
  1382. utf8_GetShift( Str, i, i, FromPosition - 1 );
  1383. utf8_GetShift( Str, i, j, Count );
  1384. SetLength( Result, len - j + i );
  1385. System.Move( Str[ 1 ], Result[ 1 ], i - 1 );
  1386. if j <= len Then
  1387. System.Move( Str[ j ], Result[ i ], len - ( j - 1 ) );
  1388. Str := Result;
  1389. end;
  1390. {$IFDEF WINCE}
  1391. function utf8_GetPWideChar( const Str : UTF8String ) : PWideChar;
  1392. var
  1393. len : Integer;
  1394. begin
  1395. len := MultiByteToWideChar( CP_UTF8, 0, @Str[ 1 ], length( Str ), nil, 0 );
  1396. GetMem( Result, len * 2 + 2 );
  1397. Result[ len ] := #0;
  1398. MultiByteToWideChar( CP_UTF8, 0, @Str[ 1 ], length( Str ), Result, len );
  1399. end;
  1400. {$ENDIF}
  1401. function zglLoad( LibraryName : AnsiString; Error : Boolean = TRUE ) : Boolean;
  1402. {$IFDEF WINCE}
  1403. var
  1404. lib : PWideChar;
  1405. {$ENDIF}
  1406. begin
  1407. Result := FALSE;
  1408. {$IFDEF LINUX}
  1409. zglLib := dlopen( PAnsiChar( './' + LibraryName ), $001 );
  1410. if not Assigned( zglLib ) Then
  1411. {$ENDIF}
  1412. {$IFDEF MACOSX}
  1413. mainBundle := CFBundleGetMainBundle;
  1414. tmpCFURLRef := CFBundleCopyBundleURL( mainBundle );
  1415. tmpCFString := CFURLCopyFileSystemPath( tmpCFURLRef, kCFURLPOSIXPathStyle );
  1416. CFStringGetFileSystemRepresentation( tmpCFString, @tmpPath[ 0 ], 8192 );
  1417. mainPath := tmpPath + '/Contents/';
  1418. LibraryName := mainPath + 'Frameworks/' + LibraryName;
  1419. {$ENDIF}
  1420. {$IFDEF WINCE}
  1421. lib := u_GetPWideChar( LibraryName );
  1422. zglLib := dlopen( lib );
  1423. FreeMem( lib );
  1424. {$ELSE}
  1425. zglLib := dlopen( PAnsiChar( LibraryName ) {$IFDEF UNIX}, $001 {$ENDIF} );
  1426. {$ENDIF}
  1427. if zglLib <> {$IFDEF UNIX} nil {$ENDIF} {$IFDEF WINDOWS} 0 {$ENDIF} Then
  1428. begin
  1429. Result := TRUE;
  1430. zgl_Init := dlsym( zglLib, 'zgl_Init' );
  1431. zgl_InitToHandle := dlsym( zglLib, 'zgl_InitToHandle' );
  1432. zgl_Exit := dlsym( zglLib, 'zgl_Exit' );
  1433. zgl_Reg := dlsym( zglLib, 'zgl_Reg' );
  1434. zgl_Get := dlsym( zglLib, 'zgl_Get' );
  1435. zgl_GetMem := dlsym( zglLib, 'zgl_GetMem' );
  1436. zgl_FreeMem := dlsym( zglLib, 'zgl_FreeMem' );
  1437. zgl_FreeStrList := dlsym( zglLib, 'zgl_FreeStrList' );
  1438. zgl_Enable := dlsym( zglLib, 'zgl_Enable' );
  1439. zgl_Disable := dlsym( zglLib, 'zgl_Disable' );
  1440. log_Add := dlsym( zglLib, 'log_Add' );
  1441. wnd_SetCaption := dlsym( zglLib, 'wnd_SetCaption' );
  1442. wnd_SetSize := dlsym( zglLib, 'wnd_SetSize' );
  1443. wnd_SetPos := dlsym( zglLib, 'wnd_SetPos' );
  1444. wnd_ShowCursor := dlsym( zglLib, 'wnd_ShowCursor' );
  1445. scr_Clear := dlsym( zglLib, 'scr_Clear' );
  1446. scr_Flush := dlsym( zglLib, 'scr_Flush' );
  1447. scr_SetVSync := dlsym( zglLib, 'scr_SetVSync' );
  1448. scr_SetFSAA := dlsym( zglLib, 'scr_SetFSAA' );
  1449. scr_SetOptions := dlsym( zglLib, 'scr_SetOptions' );
  1450. scr_CorrectResolution := dlsym( zglLib, 'scr_CorrectResolution' );
  1451. scr_ReadPixels := dlsym( zglLib, 'scr_ReadPixels' );
  1452. ini_LoadFromFile := dlsym( zglLib, 'ini_LoadFromFile' );
  1453. ini_SaveToFile := dlsym( zglLib, 'ini_SaveToFile' );
  1454. ini_Free := dlsym( zglLib, 'ini_Free' );
  1455. ini_Add := dlsym( zglLib, 'ini_Add' );
  1456. ini_Del := dlsym( zglLib, 'ini_Del' );
  1457. ini_Clear := dlsym( zglLib, 'ini_Clear' );
  1458. ini_IsSection := dlsym( zglLib, 'ini_IsSection' );
  1459. ini_IsKey := dlsym( zglLib, 'ini_IsKey' );
  1460. _ini_ReadKeyStr := dlsym( zglLib, 'ini_ReadKeyStr' );
  1461. ini_ReadKeyInt := dlsym( zglLib, 'ini_ReadKeyInt' );
  1462. ini_ReadKeyFloat := dlsym( zglLib, 'ini_ReadKeyFloat' );
  1463. ini_ReadKeyBool := dlsym( zglLib, 'ini_ReadKeyBool' );
  1464. ini_WriteKeyStr := dlsym( zglLib, 'ini_WriteKeyStr' );
  1465. ini_WriteKeyInt := dlsym( zglLib, 'ini_WriteKeyInt' );
  1466. ini_WriteKeyFloat := dlsym( zglLib, 'ini_WriteKeyFloat' );
  1467. ini_WriteKeyBool := dlsym( zglLib, 'ini_WriteKeyBool' );
  1468. timer_Add := dlsym( zglLib, 'timer_Add' );
  1469. timer_Del := dlsym( zglLib, 'timer_Del' );
  1470. timer_GetTicks := dlsym( zglLib, 'timer_GetTicks' );
  1471. timer_Reset := dlsym( zglLib, 'timer_Reset' );
  1472. mouse_X := dlsym( zglLib, 'mouse_X' );
  1473. mouse_Y := dlsym( zglLib, 'mouse_Y' );
  1474. mouse_DX := dlsym( zglLib, 'mouse_DX' );
  1475. mouse_DY := dlsym( zglLib, 'mouse_DY' );
  1476. mouse_Down := dlsym( zglLib, 'mouse_Down' );
  1477. mouse_Up := dlsym( zglLib, 'mouse_Up' );
  1478. mouse_Click := dlsym( zglLib, 'mouse_Click' );
  1479. mouse_DblClick := dlsym( zglLib, 'mouse_DblClick' );
  1480. mouse_Wheel := dlsym( zglLib, 'mouse_Wheel' );
  1481. mouse_ClearState := dlsym( zglLib, 'mouse_ClearState' );
  1482. mouse_Lock := dlsym( zglLib, 'mouse_Lock' );
  1483. key_Down := dlsym( zglLib, 'key_Down' );
  1484. key_Up := dlsym( zglLib, 'key_Up' );
  1485. key_Press := dlsym( zglLib, 'key_Press' );
  1486. key_Last := dlsym( zglLib, 'key_Last' );
  1487. key_BeginReadText := dlsym( zglLib, 'key_BeginReadText' );
  1488. key_UpdateReadText := dlsym( zglLib, 'key_UpdateReadText' );
  1489. _key_GetText := dlsym( zglLib, 'key_GetText' );
  1490. key_EndReadText := dlsym( zglLib, 'key_EndReadText' );
  1491. key_ClearState := dlsym( zglLib, 'key_ClearState' );
  1492. joy_Init := dlsym( zglLib, 'joy_Init' );
  1493. joy_GetInfo := dlsym( zglLib, 'joy_GetInfo' );
  1494. joy_AxisPos := dlsym( zglLib, 'joy_AxisPos' );
  1495. joy_Down := dlsym( zglLib, 'joy_Down' );
  1496. joy_Up := dlsym( zglLib, 'joy_Up' );
  1497. joy_Press := dlsym( zglLib, 'joy_Press' );
  1498. joy_ClearState := dlsym( zglLib, 'joy_ClearState' );
  1499. res_BeginQueue := dlsym( zglLib, 'res_BeginQueue' );
  1500. res_EndQueue := dlsym( zglLib, 'res_EndQueue' );
  1501. res_GetPercentage := dlsym( zglLib, 'res_GetPercentage' );
  1502. res_GetCompleted := dlsym( zglLib, 'res_GetCompleted' );
  1503. res_Proc := dlsym( zglLib, 'res_Proc' );
  1504. tex_Add := dlsym( zglLib, 'tex_Add' );
  1505. tex_Del := dlsym( zglLib, 'tex_Del' );
  1506. tex_Create := dlsym( zglLib, 'tex_Create' );
  1507. tex_CreateZero := dlsym( zglLib, 'tex_CreateZero' );
  1508. tex_LoadFromFile := dlsym( zglLib, 'tex_LoadFromFile' );
  1509. tex_LoadFromMemory := dlsym( zglLib, 'tex_LoadFromMemory' );
  1510. tex_SetFrameSize := dlsym( zglLib, 'tex_SetFrameSize' );
  1511. tex_SetMask := dlsym( zglLib, 'tex_SetMask' );
  1512. tex_SetData := dlsym( zglLib, 'tex_SetData' );
  1513. tex_GetData := dlsym( zglLib, 'tex_GetData' );
  1514. tex_Filter := dlsym( zglLib, 'tex_Filter' );
  1515. tex_SetAnisotropy := dlsym( zglLib, 'tex_SetAnisotropy' );
  1516. Set2DMode := dlsym( zglLib, 'Set2DMode' );
  1517. Set3DMode := dlsym( zglLib, 'Set3DMode' );
  1518. zbuffer_SetDepth := dlsym( zglLib, 'zbuffer_SetDepth' );
  1519. zbuffer_Clear := dlsym( zglLib, 'zbuffer_Clear' );
  1520. scissor_Begin := dlsym( zglLib, 'scissor_Begin' );
  1521. scissor_End := dlsym( zglLib, 'scissor_End' );
  1522. rtarget_Add := dlsym( zglLib, 'rtarget_Add' );
  1523. rtarget_Del := dlsym( zglLib, 'rtarget_Del' );
  1524. rtarget_Set := dlsym( zglLib, 'rtarget_Set' );
  1525. rtarget_DrawIn := dlsym( zglLib, 'rtarget_Set' );
  1526. fx_SetBlendMode := dlsym( zglLib, 'fx_SetBlendMode' );
  1527. fx_SetColorMode := dlsym( zglLib, 'fx_SetColorMode' );
  1528. fx_SetColorMask := dlsym( zglLib, 'fx_SetColorMask' );
  1529. fx2d_SetColor := dlsym( zglLib, 'fx2d_SetColor' );
  1530. fx2d_SetVCA := dlsym( zglLib, 'fx2d_SetVCA' );
  1531. fx2d_SetVertexes := dlsym( zglLib, 'fx2d_SetVertexes' );
  1532. fx2d_SetScale := dlsym( zglLib, 'fx2d_SetScale' );
  1533. fx2d_SetRotatingPivot := dlsym( zglLib, 'fx2d_SetRotatingPivot' );
  1534. cam2d_Init := dlsym( zglLib, 'cam2d_Init' );
  1535. cam2d_Set := dlsym( zglLib, 'cam2d_Set' );
  1536. cam2d_Get := dlsym( zglLib, 'cam2d_Get' );
  1537. batch2d_Begin := dlsym( zglLib, 'batch2d_Begin' );
  1538. batch2d_End := dlsym( zglLib, 'batch2d_End' );
  1539. batch2d_Flush := dlsym( zglLib, 'batch2d_Flush' );
  1540. pr2d_Pixel := dlsym( zglLib, 'pr2d_Pixel' );
  1541. pr2d_Line := dlsym( zglLib, 'pr2d_Line' );
  1542. pr2d_Rect := dlsym( zglLib, 'pr2d_Rect' );
  1543. pr2d_Circle := dlsym( zglLib, 'pr2d_Circle' );
  1544. pr2d_Ellipse := dlsym( zglLib, 'pr2d_Ellipse' );
  1545. pr2d_TriList := dlsym( zglLib, 'pr2d_TriList' );
  1546. sengine2d_AddSprite := dlsym( zglLib, 'sengine2d_AddSprite' );
  1547. sengine2d_AddCustom := dlsym( zglLib, 'sengine2d_AddCustom' );
  1548. sengine2d_DelSprite := dlsym( zglLib, 'sengine2d_DelSprite' );
  1549. sengine2d_ClearAll := dlsym( zglLib, 'sengine2d_ClearAll' );
  1550. sengine2d_Set := dlsym( zglLib, 'sengine2d_Set' );
  1551. sengine2d_Draw := dlsym( zglLib, 'sengine2d_Draw' );
  1552. sengine2d_Proc := dlsym( zglLib, 'sengine2d_Proc' );
  1553. texture2d_Draw := dlsym( zglLib, 'texture2d_Draw' );
  1554. ssprite2d_Draw := dlsym( zglLib, 'ssprite2d_Draw' );
  1555. asprite2d_Draw := dlsym( zglLib, 'asprite2d_Draw' );
  1556. csprite2d_Draw := dlsym( zglLib, 'csprite2d_Draw' );
  1557. tiles2d_Draw := dlsym( zglLib, 'tiles2d_Draw' );
  1558. sgrid2d_Draw := dlsym( zglLib, 'sgrid2d_Draw' );
  1559. agrid2d_Draw := dlsym( zglLib, 'agrid2d_Draw' );
  1560. cgrid2d_Draw := dlsym( zglLib, 'cgrid2d_Draw' );
  1561. pengine2d_Set := dlsym( zglLib, 'pengine2d_Set' );
  1562. pengine2d_Get := dlsym( zglLib, 'pengine2d_Get' );
  1563. pengine2d_Draw := dlsym( zglLib, 'pengine2d_Draw' );
  1564. pengine2d_Proc := dlsym( zglLib, 'pengine2d_Proc' );
  1565. pengine2d_AddEmitter := dlsym( zglLib, 'pengine2d_AddEmitter' );
  1566. pengine2d_DelEmitter := dlsym( zglLib, 'pengine2d_DelEmitter' );
  1567. pengine2d_ClearAll := dlsym( zglLib, 'pengine2d_ClearAll' );
  1568. emitter2d_Add := dlsym( zglLib, 'emitter2d_Add' );
  1569. emitter2d_Del := dlsym( zglLib, 'emitter2d_Del' );
  1570. emitter2d_LoadFromFile := dlsym( zglLib, 'emitter2d_LoadFromFile' );
  1571. emitter2d_LoadFromMemory := dlsym( zglLib, 'emitter2d_LoadFromMemory' );
  1572. emitter2d_Init := dlsym( zglLib, 'emitter2d_Init' );
  1573. emitter2d_Free := dlsym( zglLib, 'emitter2d_Free' );
  1574. emitter2d_Draw := dlsym( zglLib, 'emitter2d_Draw' );
  1575. emitter2d_Proc := dlsym( zglLib, 'emitter2d_Proc' );
  1576. font_Add := dlsym( zglLib, 'font_Add' );
  1577. font_Del := dlsym( zglLib, 'font_Del' );
  1578. font_LoadFromFile := dlsym( zglLib, 'font_LoadFromFile' );
  1579. font_LoadFromMemory := dlsym( zglLib, 'font_LoadFromMemory' );
  1580. text_Draw := dlsym( zglLib, 'text_Draw' );
  1581. text_DrawEx := dlsym( zglLib, 'text_DrawEx' );
  1582. text_DrawInRect := dlsym( zglLib, 'text_DrawInRect' );
  1583. text_DrawInRectEx := dlsym( zglLib, 'text_DrawInRectEx' );
  1584. text_GetWidth := dlsym( zglLib, 'text_GetWidth' );
  1585. text_GetHeight := dlsym( zglLib, 'text_GetHeight' );
  1586. textFx_SetLength := dlsym( zglLib, 'textFx_SetLength' );
  1587. snd_Init := dlsym( zglLib, 'snd_Init' );
  1588. snd_Free := dlsym( zglLib, 'snd_Free' );
  1589. snd_Add := dlsym( zglLib, 'snd_Add' );
  1590. snd_Del := dlsym( zglLib, 'snd_Del' );
  1591. snd_LoadFromFile := dlsym( zglLib, 'snd_LoadFromFile' );
  1592. snd_LoadFromMemory := dlsym( zglLib, 'snd_LoadFromMemory' );
  1593. snd_Play := dlsym( zglLib, 'snd_Play' );
  1594. snd_Stop := dlsym( zglLib, 'snd_Stop' );
  1595. snd_SetPos := dlsym( zglLib, 'snd_SetPos' );
  1596. snd_SetVolume := dlsym( zglLib, 'snd_SetVolume' );
  1597. snd_SetSpeed := dlsym( zglLib, 'snd_SetSpeed' );
  1598. snd_Get := dlsym( zglLib, 'snd_Get' );
  1599. snd_PlayFile := dlsym( zglLib, 'snd_PlayFile' );
  1600. snd_PlayMemory := dlsym( zglLib, 'snd_PlayMemory' );
  1601. snd_PauseStream := dlsym( zglLib, 'snd_PauseStream' );
  1602. snd_StopStream := dlsym( zglLib, 'snd_StopStream' );
  1603. snd_ResumeStream := dlsym( zglLib, 'snd_ResumeStream' );
  1604. snd_SeekStream := dlsym( zglLib, 'snd_SeekStream' );
  1605. video_Add := dlsym( zglLib, 'video_Add' );
  1606. video_Del := dlsym( zglLib, 'video_Del' );
  1607. video_OpenFile := dlsym( zglLib, 'video_OpenFile' );
  1608. video_OpenMemory := dlsym( zglLib, 'video_OpenMemory' );
  1609. video_Update := dlsym( zglLib, 'video_Update' );
  1610. video_Seek := dlsym( zglLib, 'video_Seek' );
  1611. m_Cos := dlsym( zglLib, 'm_Cos' );
  1612. m_Sin := dlsym( zglLib, 'm_Sin' );
  1613. m_Distance := dlsym( zglLib, 'm_Distance' );
  1614. m_FDistance := dlsym( zglLib, 'm_FDistance' );
  1615. m_Angle := dlsym( zglLib, 'm_Angle' );
  1616. m_Orientation := dlsym( zglLib, 'm_Orientation' );
  1617. tess_Triangulate := dlsym( zglLib, 'tess_Triangulate' );
  1618. tess_AddHole := dlsym( zglLib, 'tess_AddHole' );
  1619. tess_GetData := dlsym( zglLib, 'tess_GetData' );
  1620. col2d_PointInRect := dlsym( zglLib, 'col2d_PointInRect' );
  1621. col2d_PointInTriangle := dlsym( zglLib, 'col2d_PointInTriangle' );
  1622. col2d_PointInCircle := dlsym( zglLib, 'col2d_PointInCircle' );
  1623. col2d_Line := dlsym( zglLib, 'col2d_Line' );
  1624. col2d_LineVsRect := dlsym( zglLib, 'col2d_LineVsRect' );
  1625. col2d_LineVsCircle := dlsym( zglLib, 'col2d_LineVsCircle' );
  1626. col2d_Rect := dlsym( zglLib, 'col2d_Rect' );
  1627. col2d_ClipRect := dlsym( zglLib, 'col2d_ClipRect' );
  1628. col2d_RectInRect := dlsym( zglLib, 'col2d_RectInRect' );
  1629. col2d_RectInCircle := dlsym( zglLib, 'col2d_RectInCircle' );
  1630. col2d_RectVsCircle := dlsym( zglLib, 'col2d_RectVsCircle' );
  1631. col2d_Circle := dlsym( zglLib, 'col2d_Circle' );
  1632. col2d_CircleInCircle := dlsym( zglLib, 'col2d_CircleInCircle' );
  1633. col2d_CircleInRect := dlsym( zglLib, 'col2d_CircleInRect' );
  1634. file_Open := dlsym( zglLib, 'file_Open' );
  1635. file_MakeDir := dlsym( zglLib, 'file_MakeDir' );
  1636. file_Remove := dlsym( zglLib, 'file_Remove' );
  1637. file_Exists := dlsym( zglLib, 'file_Exists' );
  1638. file_Seek := dlsym( zglLib, 'file_Seek' );
  1639. file_GetPos := dlsym( zglLib, 'file_GetPos' );
  1640. file_Read := dlsym( zglLib, 'file_Read' );
  1641. file_Write := dlsym( zglLib, 'file_Write' );
  1642. file_GetSize := dlsym( zglLib, 'file_GetSize' );
  1643. file_Flush := dlsym( zglLib, 'file_Flush' );
  1644. file_Close := dlsym( zglLib, 'file_Close' );
  1645. file_Find := dlsym( zglLib, 'file_Find' );
  1646. _file_GetName := dlsym( zglLib, 'file_GetName' );
  1647. _file_GetExtension := dlsym( zglLib, 'file_GetExtension' );
  1648. _file_GetDirectory := dlsym( zglLib, 'file_GetDirectory' );
  1649. file_SetPath := dlsym( zglLib, 'file_SetPath' );
  1650. file_OpenArchive := dlsym( zglLib, 'file_OpenArchive' );
  1651. file_CloseArchive := dlsym( zglLib, 'file_CloseArchive' );
  1652. mem_LoadFromFile := dlsym( zglLib, 'mem_LoadFromFile' );
  1653. mem_SaveToFile := dlsym( zglLib, 'mem_SaveToFile' );
  1654. mem_Seek := dlsym( zglLib, 'mem_Seek' );
  1655. mem_Read := dlsym( zglLib, 'mem_Read' );
  1656. mem_Write := dlsym( zglLib, 'mem_Write' );
  1657. mem_SetSize := dlsym( zglLib, 'mem_SetSize' );
  1658. mem_Free := dlsym( zglLib, 'mem_Free' );
  1659. utf8_Length := dlsym( zglLib, 'utf8_Length' );
  1660. utf8_GetShift := dlsym( zglLib, 'utf8_GetShift' );
  1661. utf8_GetID := dlsym( zglLib, 'utf8_GetID' );
  1662. u_SortList := dlsym( zglLib, 'u_SortList' );
  1663. u_Hash := dlsym( zglLib, 'u_Hash' );
  1664. u_Sleep := dlsym( zglLib, 'u_Sleep' );
  1665. end else
  1666. if Error Then
  1667. begin
  1668. {$IFDEF LINUX}
  1669. WriteLn( 'Error while loading ZenGL' );
  1670. {$ENDIF}
  1671. {$IFDEF WINDOWS}
  1672. MessageBoxA( 0, 'Error while loading ZenGL', 'Error', $00000010 );
  1673. {$ENDIF}
  1674. {$IFDEF MACOSX}
  1675. StandardAlert( kAlertNoteAlert, 'Error', 'Error while loading ZenGL', nil, outItemHit );
  1676. {$ENDIF}
  1677. end;
  1678. end;
  1679. procedure zglFree;
  1680. begin
  1681. dlClose( zglLib );
  1682. end;
  1683. end.