Merge pull request #285 from raysan5/develop

Integrate develop branch
This commit is contained in:
Ray 2017-05-12 14:01:39 +02:00 committed by GitHub
commit 1ed3d3285f
27 changed files with 5062 additions and 3980 deletions

View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

View file

@ -615,7 +615,63 @@ cΆ
u" -÷~~XT§ʲâŘł¦Ś•]aaěiÇúéŔ˙oďŢc«®î€'MÆS¦Č„D<>ĚAym¸‰Ż!$čnşi&fĹÄ1 Îŕt‰2µ "uČĂńpK&dnĚ=€: §d¨“âÔŤ‡Pކ­8"ęf ĺě÷ýµ·)ĺŢ>¤“}>ÉInzoOĎí?ßďďśď9g~2­şäwéóýĄYđTŰ€ěýř\śóßöĘ<<3C>(6ćH:şŽź™Ćn®[¨€Ł•”ĺűŐkŇĄ_{öŤ§;_~W:{î®tŢĎövH„âęŤu+óůÚ°&_rśYP,ę®ăg” Ô˝&>Óô)Ž şć Ŕŕ¬ß ˛~еv'Ń÷Ž4<ę!zŢľ <0A>˛¦č<C2A6>űU>“âýĆm€­ô 4ś±OާWţę@źŰĄaďí<C48F>ÖőşŮé[ëVqOÓ;ŇŔXď;mIÝiY ??K0š·Š»×¤Hb:˝p `KŇÍ€A?Ş.™ĚônG<02>'V;Ň©qRÔ$7ş2 Ë«bcŽď2hţźŢuG{ <Şě#X}sÝţ'?>vjęĎÚôůyµGÜş^7«c€†ĄŠ¸ÜgÔŠmŽ=%ťűÓ˝E[çËďL_\ýĎťů;±]ŻĄ@}H0/ ¸·:ť“%.ĹÚé·¶#ŘťŽĎŚŻ©tÖÂßýĸ‡KŽ7ľË—W﩯[p0G{ Ö„š7]Ľ|ËË]ĆÜ“úVţ9 ťS{Dí¤±łňęöXż? cX´=ŤŠsş\{oÉ`<1D>:y|.ź¨żr¸Ľ- @ĹÔę4lţޢ­×-mK®/îË*qraK‰EżÉkR|—ĆŁ‹pÔg˛ŐúqŇÝE˶Ľxň ÓÓ)ăI˝'­JÜ™†<TŰ®żÓůФ/=±ai[ÎĺouŚqdńöTSĺC<ż/ÎÎsóvÖC»˛ż{gş ±g?ß<>‚¦ @Źçµ8óŃë%­&Ť˙Ç­éśřÜůŹoÚ_jśŃ⽡ ×ü+v
4.dú€c<E282AC>ěNݢ-vDP<wQő®ž“~ž>rŮ­éÄkg¶«}lôäÔ}ÂĚý°ó€y„ŐíŤWoO_˝ćőşÇb©âŚ;VĄĎÍ­=¬ĹĎăýoTżýBÄ“FTäNĽ¸p[:/Ž0îqóÜÔ/KŠőí´Hf//y@!řÇ˙/’¨ŻŻ}g]ŚaŔ´×Zc|—|‰$űn¦˙8vI@ö¤Ĺhq(Mϸ<C48E>/Ž©˝xĹ—‡/ýűáUëw^Xµa{Öj.Y˝ç•«6\ëüQí-˝©nŮČßV/żfíľĘ| `ýÚö?ÝĆÚzóXßľtCMç+îHĽąčňC·oĎOÔcë`ś"<22>Ř5ŰĐôžřě§§¬-ąśŃó{Y0kŮ{MŽîÔĽŻHtâvÉs{^č9éüwŠőcޱaéúmy­B$(.ŕ'eůŐ˝»S·8Č&¦Đc ?Š#<23>Ćě@ăĹë8ĺ/NÝ'ŘXoĎ[ĽÎZţ|[Ű®Ô3[G<Ý6^]Ľ# ż~sÝýg.űO—1÷§Á3v¦Ďţ¤ö°ďő™üë|Ť=ĘnV<0F>ď.Řš>; "8óîµEű‰vĘ <52>x3.;j~Ć@ÓBĘ+«÷WĹ“}˙býÄXc\LÄwČ/NĘľ“§><‰@ö”OťG€ŠŕYĚ{ĺ-^ÇĎb«]Ľß´~V?íŢ©#<23>[Ţ_ö·# ÇÔ}ßű—<~ôä˘u
ńł“ĆÎL=nśőN86ßfŻ#ɉ<C389><E280B0>†ĚYYŰă»Z¬g¸ôą7žĘŹ®O$Ęšö“×'l©»­ëwx?j'JőÓĺęűRďÉĆŘó; â˙híyBP?íÖ·˛cőÔ3
ñ— E­þòý¨9èuûª4hví!íŒÉkó†|ê>¦Ú›ï5ÖlK_¹ò¥·~ÓeÌ”tæÔ×Òàì÷𶓝ŸŸ†Ì}z_~PÌj4«g(Ì$Dá_ü­Šé;GŒ-Æø©ißàGç3 ¦þ ÉHCOä1•>jÅÖ ±s!ñ„ìi;rßÊGk&n=0¶aê¾Sód"ƒ˜Ú¿ø<C2BF>Ÿ?!Kºß¸(}rââ¼E½ïúÅ¿£"ßÎXd[aáR¥Xÿï>aƾ˜-h^c»hÅÖõã6×ÝOþ…àoê>@˱ŽÞP°8gäâW_Qµþõ(X±äo¯\µî­GcŠ?ŠýŠ<C3BD> X¨+ˆÓ£<>˞ݽxÀôÇÿQ1ãÉ·Ìxb߈߿ú—,hOÉψ[ Kmÿ˃Øî3 #÷×g²1l¸°jý¶c$#?ï¿ë"àÿ3 ˆš€,€Çú~×XˆÅxâ<78>¢¼ØÍ<C398>oÛ«ßfשD?õ[ø²ÏEmÁM5ÆÅV¾¨ˆ>òä¡• <E280A2>NîH§F"}ÄõÅ…bÉSŒ-¯A¨/ø³æDÞ—Nl,VŒÛã©¿¾±¼•>ÊóÏe¿Óó¬£@0ï'úm¥˜±1‰C‡"Ù(LŠ%ëÇöQOýð¿›8¤µó÷Ë}¡•€>šL ú­û/öÆêåCp-tEXtSoftwareby.blooddy.crypto.image.PNG24Encoder¨IEND®B`RIFF.eWAVEfmt ˆXdatae óÿñÿïÿíÿëÿéÿçÿåÿäÿâÿàÿÞÿÝÿÛÿÙÿ×ÿÖÿÔÿÒÿÑÿÏÿÍÿÌÿÊÿÉÿÇÿ%FHJLNòÿ·ÿ¶ÿ´ÿ³ÿ±ÿ°ÿ®ÿ­ÿ«ÿªÿ©ÿ§ÿ¦ÿ¤ÿ£ÿ¢ÿ ÿŸÿžÿ<C5BE>ÿÿšÿ™ÿ˜ÿÿÔÿš†ÿ…ÿƒÿÿ<E2809A>ÿ€ÿÿ~ÿ}ÿ{ÿzÿyÿxÿwÿvÿuÿtÿsÿrÿqÿpÿoÿnÿmÿlÿkÿ'çéêìíZÿYÿXÿWÿVÿUÿUÿTÿSÿRÿQÿQÿPÿOÿNÿMÿMÿLÿKÿJÿJÿIÿHÿHÿGÿFÿBCEFG4ÿ3ÿ2ÿ2ÿ1ÿ1ÿ0ÿ/ÿ/ÿ.ÿ.ÿ-ÿ,ÿ,ÿ+ÿ+ÿ*ÿ*ÿ)ÿ)ÿ(ÿ(ÿ'ÿ'ÿ&ÿ&ÿc££¤¥¦Tÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ
ñ— E­þòý¨9èuûª4hví!íŒÉkó†|ê>¦Ú›ï5ÖlK_¹ò¥·~ÓeÌ”tæÔ×Òàì÷𶓝ŸŸ†Ì}z_~PÌj4«g(Ì$Dá_ü­Šé;GŒ-Æø©ißàGç3 ¦þ ÉHCOä1•>jÅÖ ±s!ñ„ìi;rßÊGk&n=0¶aê¾Sód"ƒ˜Ú¿ø<C2BF>Ÿ?!Kºß¸(}rââ¼E½ïúÅ¿£"ßÎXd[aáR¥Xÿï>aƾ˜-h^c»hÅÖõã6×ÝOþ…àoê>@˱ŽÞP°8gäâW_Qµþõ(X±äo¯\µî­GcŠ?ŠýŠ<C3BD> X¨+ˆÓ£<>˞ݽxÀôÇÿQ1ãÉ·Ìxb߈߿ú—,hOÉψ[ Kmÿ˃Øî3 #÷×g²1l¸°jý¶c$#?ï¿ë"àÿ3 ˆš€,€Çú~×XˆÅxâ<78>¢¼ØÍ<C398>oÛ«ßfשD?õ[ø²ÏEmÁM5ÆÅV¾¨ˆ>òä¡• <E280A2>NîH§F"}ÄõÅ…bÉSŒ-¯A¨/ø³æDÞ—Nl,VŒÛã©¿¾±¼•>ÊóÏe¿Óó¬£@0ï'úm¥˜±1‰C‡"Ù(LŠ%ëÇöQOýð¿›8¤µó÷Ë}¡•€>šL ú­û/öÆêåCp-tEXtSoftwareby.blooddy.crypto.image.PNG24Encoder¨IEND®B`—D´C<00>æ)7ÿ€£DÚ´C Ѩ9Ðæ)7ÿ°D¶u²C<C2B2>2<EFBFBD>» æ)7ÿ€¼Dg™µCg¹•;æ)7ÿÉD£†´CâóÄ:pæ)7ÿ€ÕD—Þ±CþvÇ»!æ)7ÿâD¸e®Cb"ƒ¼æ)7ÿ€îD ²C™`µ»+æ)7ÿûDï´¯CÜøH¼«æ)7ÿÀE´Ñ¸CX—a<Wæ)7ÿ
E/§C1+½?æ)7ÿ@E¬€µC4®Œ;« æ)7ÿE®CåmŒ¼À æ)7ÿÀ¸C©í?<
æ)7ÿ#E—½´C·«
;<
æ)7ÿ@)E5µCøb; Iæ)7ÿ€/E¥ÿ¨Cm¿½ÐÕæ)7ÿÀ5EñϰCÇ8¼æ)7ÿ<Ea.¦CA¸]æ)7ÿ@BEx
'CÄ"<22>¾æ)7ÿ€HEX¤C —:½Dæ)7ÿÀNE $çCI¡>_æ)7ÿUEvaCQ®í½æ)7ÿ@[E´«Cw0¼æ)7ÿ€aE]D¦C· ½ÿÿæ)7ÿÀgE<67>ã¸CdÛd<æ)7ÿnEZÚC“Þ=æ)7ÿ@tE…B§C ½æ)7ÿ€zEßWìC Ø$>æ)7ÿ`€E¶‰<C2B6>Có€Ï½æ)7ÿ€ƒE Ó®Cà+r¼æ)7ÿ †E&A§C´(½æ)7ÿÀ‰EnÛ¬C/§¼æ)7ÿàŒEÃù C±£^½æ)7ÿ<00>Ez ¸C8/A<æ)7ÿ “E Dè—¾æ)7ÿ@ƒC)¾æ)7ÿ`™EîØÃC§u9=æ)7ÿ€œEk•¦Cm½æ)7ÿ ŸEÆ×«Ckì¾¼æ)7ÿÀ¢El»C·­<æ)7ÿà¥E-®Cm Œ¼æ)7ÿ©E„;„CÁ ¾æ)7ÿ ¬Ev·C¥"<æ)7ÿ@¯EÃÈCÇÒj=æ)7ÿ`²Edý¤C…©/½æ)7ÿ€µE“cžC,é|½æ)7ÿ ¸EU†£CÀÎ@½æ)7ÿÀ»EêÅ«CpŽÀ¼æ)7ÿà¾EÆCNS=æ)7ÿÂEÇÀ¶C•ß<æ)7ÿ ÅE*
Ľæ)7ÿ@ÈE(ÈCäk=æ)7ÿ`ËEïrµCû§‡;æ)7ÿ€ÎE¼$©C§þ¼æ)7ÿ ÑEIƒÄCL?A=æ)7ÿÀÔE†î‰CÑ(ö½æ)7ÿà×E&½²Ci$l»æ)7ÿÛE¯)³C»æ)7ÿ ÞEüÆÌCˆû<CB86>=æ)7ÿ@áEæÍC¨—=æ)7ÿ`äEƒÖŸC.ôk½æ)7ÿ€çE ²C™`µ»æ)7ÿ êEW©Cætù¼æ)7ÿÀíEô£³C¼¦†ºæ)7ÿàðEËç¬CŸ ¦¼æ)7ÿôE ¦ÀCM=æ)7ÿ ÷EYà¹CQЉ<æ)7ÿ@úE{ÑžCôâw½æ)7ÿ`ýEê~­Cƒ<˜¼æ)7ÿ@FEf¤Cæ)7ÿÐF)¹CêÁ<æ)7ÿ`FO(åCÒ>æ)7ÿðF|W²C?@›»æ)7ÿFxVC¡îí½æ)7ÿ<46><C3B0>CjˆÕ½æ)7ÿ  F˜°•Cž[±½æ)7ÿ0 ¦CXò½æ)7ÿÀ F 1¯C¹æ)7ÿPFìè3C¹ƒ¾æ)7ÿàFpŸC×_u½æ)7ÿpFͧŸCÒæ)7ÿF—9òCn 6>.æ)7ÿ<00>Fñ(ÒC‡z°=èhæ)7ÿ FjéCþvǽæ)7ÿ°Fð¯C|+>¼æ)7ÿ@F'ÖÆCøp\=æ)7ÿÐÇCwD_=æ)7ÿ`Fó_8Cu€¾æ)7ÿðFé±C8޽æ)7ÿF<>D#§d>æ)7ÿ!FkCZʽæ)7ÿ "F©ä¤CëÊ0½æ)7ÿ0$FŒzÈCĨo=æ)7ÿÀ%F-ú¥C6æ)7ÿP'F<×CP/Î=æ)7ÿà(FáߺC>ç <æ)7ÿp*Fn™²Cb"ƒ»æ)7ÿ,FÐnµC&†; æ)7ÿ<00>-FcL¾Cz
ñ<æ)7ÿ /Fõ3<C3B5>C/e…½æ)7ÿ°0Fƒà§C®ß ½æ)7ÿ@2Fî$øCá^G>æ)7ÿÐ3F×÷ªCÅeÓ¼æ)7ÿ`5F÷w¶C0ç;æ)7ÿð6F•ICFDŽæ)7ÿ€8FÒÃCD%9=æ)7ÿ:FŪC† ؼæ)7ÿ ;F CŒà®½æ)7ÿ0=FÑ}óCÂ9>æ)7ÿÀ>F]j§C^F½æ)7ÿP@FÛ¢ùCI¼K>æ)7ÿàAF»iºCÞ<æ)7ÿpCF( ¢C7$R½æ)7ÿEF{4CãW®½æ)7ÿ<00>FF8ŽhCÛn:¾æ)7ÿ HF4<46>£C\~@½æ)7ÿ°IF8=ÄCT >=æ)7ÿ@KF ɾæ)7ÿÐLFÊf<C38A>C¾;„½æ)7ÿ`NF'º޽æ)7ÿðOF25¬C×a¶¼ æ)7ÿ€QFryÜCDÕì=ÿÿÿÿæ)7ÿSFØ »C8ì¤<ÿÿÿÿæ)7ÿ TF.¶CInÀ;æ)7ÿ0VF<56>ÅÌC~ó<>=æ)7ÿÀWF¡T¾CiËñ<!"æ)7ÿPYF³¦<C2B3>ChN¾@`æ)7ÿàZF˜,¡CÑP\½à/dæ)7ÿp\FX4¥Ci&-½P0dæ)7ÿ^FÕõ½C­ é< 0dæ)7ÿ<00>_Fë¡—Cý¥½À/dæ)7ÿ aF©´9C¸÷~¾ .dæ)7ÿ°bFyjC!Ú<>½°.dæ)7ÿ@dFYn„CV, ¾°-dæ)7ÿÐeFËñC¹…¾ð-dæ)7ÿ`gFõüCùÀR>X1dæ)7ÿðhFßf”Cô丽(1dæ)7ÿ€jFù]CêI¾Ø2dæ)7ÿlFîušC q•½ˆ2dæ)7ÿ mFµ¤CZ Ç¢æ)7ÿ0oF.ÖDäón>æ)7ÿÀpF U&Ch§<68>¾æ)7ÿPrFËÜC=ží= æ)7ÿàsF§²~CÀ
¾æ)7ÿpuFîT<C3AE>C?¤„½æ)7ÿwF4ú¢C¯6G½æ)7ÿ<00>xF¹7ÄCË==æ)7ÿ zF Du¤Ý¾æ)7ÿ°{F»ÈClœr=æ)7ÿ@}Fqw½C^’Ý<æ)7ÿÐ~FslCní½æ)7ÿ0€FX<46><58>¾æ)7ÿø€FR1C4¬Ë½æ)7ÿÀ<>FF˺CêŸ<æ)7ÿˆFJ°TCØ~W¾æ)7ÿPƒF«7˜CN¢½æ)7ÿ„FZÖCsÇ=æ)7ÿà„FHgiCS19¾æ)7ÿ¨…FV¶¬C9“ª¼ æ)7ÿp†FsëßC> æ)7ÿ8‡FüžCðu½æ)7ÿˆF D¯iœ¾æ)7ÿȈFEJ«CpÜ˼æ)7ÿ<00>‰FKÉÊCU…=æ)7ÿXŠF"­ãCº| >æ)7ÿ F[¸CIn@<æ)7ÿèF˜ê¦Cš½æ)7ÿ°ŒFbKCD<43>æ)7ÿx<>F «Cƒ ýæ)7ÿ@ŽF\®Cy„¼æ)7ÿ<08>ÇCac^=æ)7ÿÐ<>FPÊ¿CÜú =
æ)7ÿ˜<>F¯mC<6D>í2¾
¸«æ)7ÿ`˜<C3B6>Cšv¾¯
´«æ)7ÿ(F¼kwCî¯$¾«
°«æ)7ÿðFÉѯCT²C¼§
¬«æ)7ÿ¸“Fm¡ÿCÿE]>£
¨«æ)7ÿ€”FhŒfC~^=¾¿
¤«æ)7ÿH•FPÿÌCE=»
 «æ)7ÿF\âCö£>·
œ«æ)7ÿØFÿáC¤>³
˜«æ)7ÿ —F꤮Ct¶z¼Ï
”«æ)7ÿh˜FᓆC<E280A0>ä¾Ë
<EFBFBD>«æ)7ÿ0™Flõ$C§¨Ž¾Ç
Œ«æ)7ÿø™FBãEC¨%m¾Ã
ˆ«æ)7ÿÀšFK£—C<E28094>õ¥½ß
„«æ)7ÿˆFBgÎCPš=Û
€«æ)7ÿPœF Cr¨>×
ü«æ)7ÿ<18>FòF†C¦Å¾Ó
ø«æ)7ÿà<>FeKÆCV=ï
ô«æ)7ÿ¨žFòÂCXȽë
ð«æ)7ÿpŸF5œáC>q>ç
ì«æ)7ÿ8 FÂs¿Cö=ã
è«æ)7ÿ¡FIÅCJJ=ÿ
䫿)7ÿÈ¡FÃëC&#>û
à«æ)7ÿ<00>¢FäP”C“e¹½÷
Ü«æ)7ÿX£F¼¿CZ =ó
Ø«æ)7ÿ ¤FyáÔC?fÀ=
Ô«æ)7ÿè¤FNŸCt
Ыæ)7ÿ°¥F©
¦CGZ#½
Ì«æ)7ÿx¦F:¿C²b=
È«æ)7ÿ@§F­R™CLœ½
Ä«æ)7ÿ¨FhO CVmf½
À«æ)7ÿШFl¸<6C>C oνÿÿÿÿæ)7ÿ˜©F*BœC슽ÿÿÿÿæ)7ÿ`ªF”¼CµØÈ<ÿÿÿÿæ)7ÿ(«F;¸×Ñ=æ)7ÿð«F°BÇCga= æ)7ÿ¸¬F—»Cˆ,¥<33æ)7ÿ­F¾G“Cu¿½˜3dæ)7ÿH®Fk-ÝC]òð=ˆ4dæ)7ÿ¯F½ÐC+#ë½84dæ)7ÿدF<µÀC(¸=Ð9dæ)7ÿ °F)½CjÖà<0:dæ)7ÿh±FéÉCÊñv=@:dæ)7ÿ0²Fù¿C<C2BF> =À:dæ)7ÿø²F ž¾8dæ)7ÿÀ³FÖÌuCÞ@7dæ)7ÿˆ´FO«Cjáϼ08dæ)7ÿPµFgɾC¢xü<07dæ)7ÿ¶FÂHºC#“<8=dæ)7ÿà¶F„J<E2809E>C½òнæ)7ÿ¨·FQ>°CÁÙ/¼àæ)7ÿp¸F/­«C=Ѽæ)7ÿ8¹F3-ÃCï1=æ)7ÿºFe*—Cí¸¨½æ)7ÿȺFØ™C¼B<C2BC>½æ)7ÿ<00>»F<C2BB>ʪCçŠ×¼ æ)7ÿX¼Fž9Cr—î½ æ)7ÿ ½FÄ.®Cš(ˆ¼æ)7ÿè½FéQíCª³'>æ)7ÿ°¾FåÇÍCÍÚ=æ)7ÿx¿FOÀ·Cr™/<æ)7ÿ@ÀF*
Ľæ)7ÿÁFוC‡z°½ æ)7ÿÐÁF<C381>ÔvC<00>æ)7ÿ˜ÂF¼ÎÐC¼<43>¨=æ)7ÿ`ÃF¯^òCõy6>æ)7ÿ(ÄFM¾C¥ì<æ)7ÿðÄF<Z€C¾æ)7ÿ¸ÅF=RÉCú„y=æ)7ÿ€ÆFZaÉCÕ5z=æ)7ÿHÇF<C387>ÿ±Ch»»æ)7ÿÈFBgœCúнæ)7ÿØÈF£¶Cè»ë½æ)7ÿ ÉFÓÕ¸CHXb<æ)7ÿhÊFq¹·CãW.< æ)7ÿ0ËF"âŒCnã使)7ÿøËF
—½Còuà<æ)7ÿÀÌFe<ˆC<CB86>
¾æ)7ÿˆÍFÐáCtÿ>æ)7ÿPÎF²ëbC­æ)7ÿÏFK6˜CX™¢½æ)7ÿàÏFN+ÊC¡¸<C2A1>=<00><00>æ)7ÿ¨ÐFìµ§CÒ½$;dæ)7ÿpÑFÖb[C¶²M¾ç º«æ)7ÿ8ÒF|³CèîÀºã ¶«æ)7ÿÓF9wÕC|ÒÃ=ÿ ²«æ)7ÿÈÓF £C¬eF½û ®«æ)7ÿ<00>ÔF~.šC—½÷ ª«æ)7ÿXÕF Dt|â¾ó ¦«æ)7ÿ ÖF¡cÊC:ƒ= ¢«æ)7ÿèÖFmèËC:å‹= ž«æ)7ÿ°×FéÍÆC€\= š«æ)7ÿxØFÐd­CxŸš¼ –«æ)7ÿ@ÙFÂ<46>†Cžð¾ ’«æ)7ÿÚF¾„C5C
¾ Ž«æ)7ÿÐÚFÿ™CŒë<C592>½ Š«æ)7ÿ˜ÛF^³ÄCrC= †«æ)7ÿ`ÜFµa@C¡3u¾/ ‚«æ)7ÿ(ÝF˜SCÔ+ þ«æ)7ÿðÝF`;“Cn½¿½' ú«æ)7ÿ¸ÞFíï†CA×¾# ö«æ)7ÿ€ßFÐÛCƾ? ò«æ)7ÿHàFÎ-³Ca¾»; î«æ)7ÿáF•NC&¿­½7 ê«æ)7ÿØáF—œ·C[)<3 æ«æ)7ÿ âFz<±C5`¼O â«æ)7ÿhãF¯)³C»K Þ«æ)7ÿ0äFí}ƒC¼ë ¾G Ú«æ)7ÿøäFHbDËÚ<C38B>>C Ö«æ)7ÿÀåFäUüC¢S>_ Ò«æ)7ÿˆæF<C3A6>U¼C<C2BC>Ã<[ Ϋæ)7ÿPçF„\QCß\\¾W Ê«æ)7ÿèF£ó³C.³¹S Æ«æ)7ÿàèFy ¨C1Ý ½æ)7ÿ¨éFOÁCÞÀ=Ge;¸æ)7ÿpêF/‡ªC†²Ý¼é³ü¶æ)7ÿ8ëFkøÏC«ª£=tÌ·æ)7ÿìF­C<C2AD>C«¨â½{M°·æ)7ÿÈìFtPöC?B>B8æ)7ÿ<00>íF» •CJ µ½Á.8æ)7ÿXîF˜áC/e>b„O7æ)7ÿ ïF ÉåC^¨>::Æ·æ)7ÿèïFÿ¥C[¸Ä/×8æ)7ÿ°ðFG¢ÔCuô¾=Û;F6æ)7ÿxñF“TöCNB>˜¶D8æ)7ÿ@òF蓵Cê¶“;{E©8æ)7ÿóF)zŽCá<43>Û½‡aÄ·æ)7ÿÐóFÉH#C+â<>¾¤õ·æ)7ÿ˜ôFÐ<46>äCï>”f8æ)7ÿ`õFÒ”Cëq¶½Cj‡¸æ)7ÿ(öF¦H”CΕ¹½¹æ)7ÿðöFN?¨CQŠ ½n0<6E>8æ)7ÿ¸÷FŠº£CÌk>½b>ƒ¸æ)7ÿ€øFx·C#o <;¾¸æ)7ÿHùF= Cu1)v8æ)7ÿúF"ضCß$<ô䏿)7ÿØúF
Ç”C;²¶½Ú¶C¹æ)7ÿ ûFKC áï½4†V¸æ)7ÿhüF ¬C-D¸¼e✷æ)7ÿ0ýF$¹C…§n<È€¬·æ)7ÿøýF•e½CYðÛ<)<ž¸æ)7ÿÀþFBÞsC]â)¾É5…8æ)7ÿˆÿF«³£C/¼>½vS$9æ)7ÿ(G DËE™¾v<13>¸æ)7ÿŒ
¦CGZ#½9ª8æ)7ÿðG( ¢C7$R½D´ª·æ)7ÿTGÍ|ÌCnI<6E>=ÊQû6æ)7ÿ¸GOÀ…C<E280A6>O¾}äã·æ)7ÿGòF¸Cî7H<•¸æ)7ÿGÂ…°C”É"¼¸æ)7ÿäG„âDýd€>´[7æ)7ÿHG­¾C0Åì<Òç 7æ)7ÿ¬G3¶»C´<¾‡8æ)7ÿG2øƒC ¾>;€8æ)7ÿtGyjC!Ú<>½ûh¸æ)7ÿØG™C²ì¾·o‡8æ)7ÿ<GÆø¨Cѽ9¤·æ)7ÿ G Døµã¾šà<C5A1>7æ)7ÿGöhªCòuà¼:­[¸æ)7ÿhGcîC"²)>&&9æ)7ÿÌGÊ@ÎC9ž™=óqÀ6æ)7ÿ0G&<26>©CÕŽô¼O+ú·æ)7ÿGP”CŸº½úÝT6æ)7ÿøGzÙ¹CŠéˆ<<73>·æ)7ÿ\GÄ¥ƒC-w ¾ñ)·æ)7ÿÀG<>Ï®CÐìr¼[ãÙ6æ)7ÿ$ GÊCwÇ€=Þ¶æ)7ÿˆ G÷[½CBÛ<™Ðóµæ)7ÿì G§ù¬C™k¤¼×47æ)7ÿP
G·cÁC ²=ÙéQ7æ)7ÿ´
G4ã­C)<11>¼¨Ï˜6æ)7ÿ <47>ôCßÝ<>Ù6æ)7ÿ| G,I¿CŒ=ñéÛ5æ)7ÿà G_ÑÜCÁ×î=8 ¢6æ)7ÿD GÄ8„CÉ ¾ü³5æ)7ÿ¨ G8ËŽCµÙ½¢8<C2A2>6æ)7ÿ Gg}¼C¶Æ<IEŵæ)7ÿp G[²Ca¾™»
l7æ)7ÿÔ GºÒC§Î³=¿’
¶æ)7ÿ8G ¨©C¹ ò¼hÓ6æ)7ÿœGÔ§œC&™ˆ½œ6¥6æ)7ÿGDïœC ÷†½½°³6æ)7ÿdG}Œ¿C\'=E]¸6æ)7ÿÈGú…ÊC2˃=¶æ)7ÿ,G·GÈCãUm=â”·æ)7ÿ<00>GÔVCꎭ½”š·æ)7ÿô¶CÌk¾;c+(·æ)7ÿXGPÿ8C<38>€¾³\66æ)7ÿ¼Gr»¤CA­XR·æ)7ÿ GwB}CZ%¾\º“¶æ)7ÿGõþóCÙ;;>Ûå6æ)7ÿèGÄ=XCiLR¾þ¶æ)7ÿLGLO¬Câþ³¼yÍß4æ)7ÿ°G²ë<43>Á½ëÕB6æ)7ÿG:×µCfU¬;/ ·æ)7ÿxGH•µC‰7”;6æ)7ÿÜGÝ¿CòÛ
=<00>"w6æ)7ÿ@G*Cꊾ°™Î6æ)7ÿ¤G¹®ËC™“Š=޵æ)7ÿGåáCEF>€Æ=¶æ)7ÿlG§â#C q<C2A0>¾µjŽ6æ)7ÿÐG º§CÜ¡½^çK7æ)7ÿ4G7ƼCN^Í<RVð6æ)7ÿ˜G CvÁþ><>5æ)7ÿüGÔ§œC&™ˆ½CÚœ¶æ)7ÿ`GD6ÍC®†“=úìH7æ)7ÿÄG#ä«C˽¼Ìq5æ)7ÿ(GéÈ<C3A9>C)ν<00>¾b7æ)7ÿŒÃC8:0=F¢í6æ)7ÿðG*¥ÅC´N=5æ)7ÿT×…C9 ¾#[ɳæ)7ÿ¸GÝÆC[Á\=ÑaF¶æ)7ÿGÚÔC >À=Ï©@·æ)7ÿG妞C]Õy½Q0µæ)7ÿäGSJ¥C*%,½wxŠ·æ)7ÿHG4%¨CÊ»
½£Ð6æ)7ÿ¬G¸¬¬COt«¼›ƒ¶æ)7ÿGÍŠC„ñ½ øS´æ)7ÿtG”G¥CRE,½LF0·æ)7ÿØG¡Á½CÅZä<uïN5æ)7ÿ<G^úôCh>>ë0ˆ5æ)7ÿ Gú4CۼŽ¾ç¶æ)7ÿGžòðCÎP2>tèk4æ)7ÿhGÞ÷§C[Î ½pGƶæ)7ÿÌG D žÓ¾<00>¿B´æ)7ÿ0 G-Þ¬Cµî¦¼m 7æ)7ÿ” G»|C‡ç¾Yº©¶æ)7ÿø Gs<47>ˆCÏ:þ½þ(`6æ)7ÿ\!G¢ÀC×=MÇ6æ)7ÿÀ!G=£ÏCA¸¡=9&á¶æ)7ÿ$"G„¢C_<43>5bl6æ)7ÿˆ"G<è®C6gn¼Q7æ)7ÿì"GPŸC<14>Š϶æ)7ÿP#GoâÏC *£=s(Ç6æ)7ÿ´#GfÌ£CÈš=½ò,ô6æ)7ÿ$G<>íŽC<C5BD>ìØ½ä Å6æ)7ÿ|$Gô,¬CÇ"·¼>+ª6æ)7ÿà$GìHÚCgà=Õdü¶æ)7ÿD%GyDÌCÖÿ<C396>=E1¶æ)7ÿ¨%G¡CÐÜ«½ÛÂæ¶æ)7ÿ &G£`³C­ éºÃtì4æ)7ÿp&G/££C}?½gp·æ)7ÿÔ&GpûãCÕa >‡áË7æ)7ÿ8'G —CA©½Yq<59>8æ)7ÿœ'G-¸ÝCJô=¢ñœ¶æ)7ÿ(G³Â¬CÒq©¼vº¸æ)7ÿd(Gå D_‰>{ZÎ7æ)7ÿÈ(GŠ™ØC1)Ö=²`@¸æ)7ÿ,)GU5<55>C$]…½Þ8æ)7ÿ<00>)G Caä¾>òÙ¸æ)7ÿô)GóòšCƒ•½Ûaß8æ)7ÿX*Gä³ïCL¬.>ÇJ8æ)7ÿ¼*GéלCʇ½36·æ)7ÿ +GùK¹Ców< <0F>8æ)7ÿ„+G¡C9C^½6ê·æ)7ÿè+G ÌÁCñw!=ލ—·æ)7ÿL,G®\¡C'g98æ)7ÿ°,GDžÈCÉJq=¹ÔÅ·æ)7ÿ-GjÈ”C1ª¶½_¨È¶æ)7ÿx-Gåd¤C'¢6½•8¸æ)7ÿÜ-GÐW,C÷A‰¾` 䏿)7ÿ@.G-³wClG$¾ì͸æ)7ÿ¤.Gï€C` ¾ º­6æ)7ÿ/G}âDÛ+‰>u2¯¸æ)7ÿl/G4bžCAù|½ðsu¸æ)7ÿÐ/G*“@CGët¾*Zc8æ)7ÿ40G1üC?ùR>fyŶæ)7ÿ˜0G<´a9DÛì·æ)7ÿü0G0ºCxŸš<S<03>¸æ)7ÿ`1GP—ŸCÁש#Ò8æ)7ÿÄ1G Düû¾}ºª8æ)7ÿ(2GœCÅ‹½ɬ}¸æ)7ÿŒ2G¯ ˆC6“¾NÙ¥8æ)7ÿð2GjîÇCÕ@i=èBA·æ)7ÿT3Gm>¤CTd8½ÿº7æ)7ÿ¸3G @YC•ÒP¾>_x¸æ)7ÿ4G- EC Cn¾ù*ˆ·æ)7ÿ€4G¯¶C].ô;èV$¹æ)7ÿä4GD˜CôH¢½:8æ)7ÿH5G…39C£´¾ÑˆŠµæ)7ÿ¬5GûàØC7Ë×=ßÎ:8æ)7ÿ6G8ËòC·7>ÌÄ;8æ)7ÿt6G©ß C+Õ_½&øó7æ)7ÿØ6GOSêCÐð>rDI9æ)7ÿ<7G^¼CeJ½<íÉ8æ)7ÿ 7G°˜ÑCs.­=?<3F>¸æ)7ÿ8G½JªC^9ã¼>zQ8æ)7ÿh8GkzC4ß ¾‰}º8æ)7ÿÌ8GBy+CÀ䉾Á¸æ)7ÿ09Gû;ƒC¬¬¾H9æ)7ÿ”9GBÙ=C7èx¾2=9·æ)7ÿø9G‰q¸CP<ü:·æ)7ÿ\:GçÁŸCYål½l×8æ)7ÿÀ:G.iD Pr>¡Ÿ·æ)7ÿ$;Góü¢C‡\±®¸æ)7ÿˆ;G+[°C9“*¼ĘM¸æ)7ÿì;G9j„Ce8 ¾îf 8æ)7ÿP<GOC&Ñ_¾ïy͸æ)7ÿ´<GDR”C‰]¹½Ë`·æ)7ÿ=G7ì[C¾éL¾§•·æ)7ÿ|=GUÕ(C$Ó‹¾‡d¸æ)7ÿà=GÔVúCÕÊM>äËü·æ)7ÿD>GÔ†ŸC°˜éö¶·æ)7ÿ¨>Gx“³C™Äžº̳†8æ)7ÿ ?G D`¾¾Ȭ
8æ)7ÿp?Gé¬gCt¸P­8æ)7ÿÔ?Gt*ÃCÆ{1=€?æ)7ÿ8@G0u¹C^|<mÄ~?æ)7ÿœ@GöŽ«C©”ż¾{?æ)7ÿAG íùCU•L> út?æ)7ÿdAGøÊÛCSØè=^ƒl?æ)7ÿÈAGb“îC6`+>˜Åa?æ)7ÿ,BGám…C¸@¾1ÛT?æ)7ÿ<00>BGÛ<47>˜C4ß ½äE?æ)7ÿôBG )”C´Nº½ó5?æ)7ÿXCGÅ&ÅC<C385>¸H=™g"?æ)7ÿ¼CG DóOоÚ9?æ)7ÿ DG<44>®«C±Â¼êZñ>æ)7ÿ„DG°|¦CÓ#½ïÃ>æ)7ÿèDG\Q“CÏ<¿½1 ”>æ)7ÿLEGwû®CÛâj¼ÂÅG>æ)7ÿ°EG§OéC#ù>6½È=æ)7ÿFG}EÁCRP=0<>$æ)7ÿxFG5U±C5µù»6½È½æ)7ÿÜFG´ŠˆCãJþ½ÂÅG¾æ)7ÿ@GGÅÕŒCÇ+å½1 ”¾æ)7ÿ¤GGÏqšC+‰•½ïþæ)7ÿHG?“ËCÒò‰=êZñ¾æ)7ÿlHG]sCHŸ*¾Ú9¿æ)7ÿÐHG¼ÂC<C382>u,=™g"¿æ)7ÿ4IGƒÖÑC3˜®=ó5¿æ)7ÿ˜IGÔîšC¡­½äE¿æ)7ÿüIG_žCÏ“x½1ÛT¿æ)7ÿ`JG€`DQif>˜Åa¿æ)7ÿÄJGu”DFMs>^ƒl¿æ)7ÿ(KGs³‰C}‚÷½ út¿æ)7ÿŒKGAðÆCr¢]=¾{¿æ)7ÿðKGã~°C" mÄ~¿æ)7ÿTLGbÕ„Cáþ ¾<00>€æ)7ÿ¸LG DEŸ¿ãðÿ>æ)7ÿMGÌûŠC2𽞺ÿ>æ)7ÿ€MGóÑÏC”É¢=é\ÿ>æ)7ÿäMG‰{ŽCׇ۽Ô×þ>æ)7ÿHNGjî•CÞñ¯½r+þ>æ)7ÿ¬NG <20>CPؾÞWý>æ)7ÿOGhþ™Co,˜½:]ü>æ)7ÿtOG—_ÁCÍ<43>=«;û>æ)7ÿØOG-ú¥C6^óù>æ)7ÿ<PGùãïCú8/>†„ø>æ)7ÿ PG§Œ­Cõú¼[ïö>æ)7ÿQGû¯Cÿ(<¼4õ>æ)7ÿhQG}k<>CÍ1нSó>æ)7ÿÌQGÃÉ—Ck¥½zLñ>æ)7ÿ0RGjÃÂCñÅ,=° ï>æ)7ÿ”RGÎS´Cœ/u:Ðì>æ)7ÿøRGžCÝQýÙZê>æ)7ÿ\SGDß$…>‡Áç>æ)7ÿÀSG<²C°L¥»yå>æ)7ÿ$TGˆ®LCY5c¾$â>æ)7ÿˆTGÞ,C3r‰¾Û ß>æ)7ÿìTGÌ“CòöÀ½4ûÛ>æ)7ÿPUGö¨Cø/½¡³Ø>æ)7ÿ´UGƒ§Cø$½¤JÕ>æ)7ÿVG×näCw³ >ÂÀÑ>æ)7ÿ|VG«ÉCRv=Î>æ)7ÿàVGÚ²CH
‡LÊ>æ)7ÿDWGÑx[CŽTcÆ>æ)7ÿ¨WG—*CŠÌ¾‰[Â>æ)7ÿ XG†0¶CÖýÌ;Å5¾>æ)7ÿpXG
vÀC”Ô=¬ò¹>æ)7ÿÔXGñæ¥CLü$½ç’µ>æ)7ÿ8YG¨þDB~‰>«„?æ)7ÿœYG=}œCZ‰½É¿|?æ)7ÿZG<5A>©¡C¼™V½Åw?æ)7ÿdZGå÷¤CÔé/½sõo?æ)7ÿÈZGEz´C|ݲ:ˆf?æ)7ÿ,[Gbh·C‰…<jòY?æ)7ÿ<00>[GµC_öF;ø»K?æ)7ÿô[Gi^¬C-<2D>²¼;<3B>;?æ)7ÿX\GµCÑQ;”)?æ)7ÿ¼\Guµ¨C #½Ùö?æ)7ÿ ]G$î³CÑäç?æ)7ÿ„]GÐ"³CUÈ!»A6Õ>æ)7ÿè]Gp´³C¿<12>¦>æ)7ÿL^G&ã³C Ѩ¹šl>æ)7ÿ°^GAý³CEŸ¸†Ï >æ)7ÿ_G`´CEŸ€7=æ)7ÿx_G!ù³CÇ ¸&ÆÁ9æ)7ÿÜ_G þ³CEŸ€· [Õ;æ)7ÿ@`G<>ú³CEŸ€¸º¥<æ)7ÿ¤`G`´CEŸ€7®‘(=æ)7ÿaGAý³CEŸ¸è<>=æ)7ÿlaG`´CEŸ€7wÕ=æ)7ÿÐaGAý³CEŸ¸>æ)7ÿ4bG¿´CEŸ8BE>æ)7ÿ˜bG´CD²z>æ)7ÿübG´C=š>æ)7ÿ`cGáû³Cèî@¸ ϸ>æ)7ÿÄcGAý³CEŸ¸~Ø>æ)7ÿ(dG¿´CEŸ8C¶ø>æ)7ÿRIFF.eWAVEfmt ˆXdatae óÿñÿïÿíÿëÿéÿçÿåÿäÿâÿàÿÞÿÝÿÛÿÙÿ×ÿÖÿÔÿÒÿÑÿÏÿÍÿÌÿÊÿÉÿÇÿ%FHJLNòÿ·ÿ¶ÿ´ÿ³ÿ±ÿ°ÿ®ÿ­ÿ«ÿªÿ©ÿ§ÿ¦ÿ¤ÿ£ÿ¢ÿ ÿŸÿžÿ<C5BE>ÿÿšÿ™ÿ˜ÿÿÔÿš†ÿ…ÿƒÿÿ<E2809A>ÿ€ÿÿ~ÿ}ÿ{ÿzÿyÿxÿwÿvÿuÿtÿsÿrÿqÿpÿoÿnÿmÿlÿkÿ'çéêìíZÿYÿXÿWÿVÿUÿUÿTÿSÿRÿQÿQÿPÿOÿNÿMÿMÿLÿKÿJÿJÿIÿHÿHÿGÿFÿBCEFG4ÿ3ÿ2ÿ2ÿ1ÿ1ÿ0ÿ/ÿ/ÿ.ÿ.ÿ-ÿ,ÿ,ÿ+ÿ+ÿ*ÿ*ÿ)ÿ)ÿ(ÿ(ÿ'ÿ'ÿ&ÿ&ÿc££¤¥¦Tÿÿÿÿÿÿÿÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ
˙
˙
˙
@ -12967,8 +13023,6 @@ Lޚ
zIWÂ$přYńčöiCúó…“ »»ő“ÍĄÍ@Ăp(QkË\*ś˙wb5ç Ł#Ľ®ˇ6ĐÂ˙Žěü@0€ ú˝ÔŤ,,ĐďOgIÝ j {R Ún±łsp"|5óÎýÜÄĐ5Đď”覼V—Ë%ńďř9Âś
 %QghÚÄŹj˘Uź1oX]CSÚi| ˘qáđňŘA˝ü}hďA=Wţ<57>=S^ž”Ć7M•ŤHI>úźÇ(űzŹ!7ađN„vEýłŹęÝyŕR˙®1ŕFČZ*EµRf„ éëĘÔÍřúź ?hřpxÓ>íöÂďáßUč&<€şŐ+2# ŤÄ§íBH´Ř‡ ß%qĐó_ޢżg 8&3<>Ň<EFBFBD>ŠFČĐvĐ`*<2A>uPPŁ×w”FřŠ<03>_ˇš&rቦ©L·Ţ!Ô|vdŮđ˙;¤ř ĐÉŇ·ŁVJ4źö8ÁAO8zω˙¶SﲭŇI[µ©âyŇ—ęútŽÜRćÝüűż çś ŠťeŇ&IEND®B`‰PNG

IHDR`tEXtSoftwareAdobe ImageReadyqÉe< iTXtXML:com.adobe.xmp<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5 Windows" xmpMM:InstanceID="xmp.iid:05C26790E09811E6BD84DA7C8067DC0F" xmpMM:DocumentID="xmp.did:05C26791E09811E6BD84DA7C8067DC0F"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:05C2678EE09811E6BD84DA7C8067DC0F" stRef:documentID="xmp.did:05C2678FE09811E6BD84DA7C8067DC0F"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>¢R¸,GIDATxÚbüÿÿ?Ã(8À8¦kÜ<6B>´ÄhP xÁÂÀpaÇh8 ` <>À`à1Z \4Z <09>F60n+ާ¸ºIEND®B`‰PNG

IHDRL\öśsRGB®ÎégAMA±Ź üa pHYsĂĂÇo¨dtEXtSoftwarePaint.NET v3.5.11GóB7»IDATx^í—ŃbŁ: Ű˙˙Ý»ď˛c6±>„CäRće—Z˛ä1Ťš/•oţý4j]wśJ;żM \×-&ëŔ*içČ*śu!YçČ:o^aËĚ:Hšąż[ŕ:n/öóŽ.pxj<78>ţăßî8•QűC«ţ˘f‰Qů´Ŕ˝ÔuŃÚÝy»qEŕQĐŞC^Čoxt?´ę<C2B4>—Ćč··?´Ć¨CXe´7°ć,Ńá«Ä©Ľ[­ýŔnÜuĺ7ż@^H÷ s4­:äŮEg‰qł·?´ĆÜCř\Đš7„łČ꯮VňŇq tżXjZuČ q7¨%P%Ú­:äĄq•+qhŤąĘv×u<C397>Öńż »Ą.Z[˘!o!Kôč§ĆÉo~<7E>Ľ<EFBFBD>¬ Qq÷w4­:äŮŽ&¦ć¬ó˘5ć· aw\´ú‡°O9ş?´ę<C2B4>·ŕ“%:«ż{äč~hŐ!ď îWâĐ“5„ÝbܸúCëřß„łâTŢ­VňF9ȧp×Ekźň+B^ČU~Ş?´ę<C2B4>—†[LÖ~%­a·@W]´Ž˙MŘÍ(‡VňÔ<>¸ă˛p÷‡Ö>÷^çč9ĐŞCŢŻxVZcÔ!śu•QűCkŢţô<C5A3>ł©Ď<C2A9>VňÜł.$«?ůÍ/<2F>âăf´yi˘łş)uŃŁa•¬»qť­ţ!<şč¬ţęşhŐ!oÁ}!î8•¬ş÷>ČŃyi˘ŹxJhŤÉÂY˘?}qh˝Î7awśş.Z[˘!oa”<61>|
w]´ę<C2B4>˘68ş@wŃ~hŐ!/ŤO‰©9«.Zc˛†°Š[ Zóľ Ź§ňn]´ę<C2B4>·0ş7îţĐÚ§üŠ<C3BC>2şčŃúCëB÷Ł<C3B7>Ľá޸/doZc˛†°—…«?´ę¸Ž§ňn]´¶DźEä-Ś~`7îóĘ~ŢCxťŁqhŐ!Ď.Đ}`•¬ş´Ćd áŃqť­ý?? Yo Ęč\÷‡VňÔgĹ©dőwádкнň.#0{?´Ćd ᬠVqő‡V˙ÎťUWĄ®VňÜÎ<12>Ő¸‡pY˘Ł8´.ÜC8଺hŤÉÂn˛D÷@ëřC8+NĺÝşhm‰n„ĽÝd‰qăî­}ÜC8KôhuŃŞCŢđÝýťU­áź":­ăa÷~nęţĐŞCŢBÖ…¸EgŐEku«¸˘uqhŐ!ď2UÔş{űCkĚčCXĺ,<2C>GA««¸ĹŚ*şP×EkKt#äťĆż <?ńýU/ńĽ¬€Ö>ęţioŕłÎ‡hžź<C5BE>ú€ç?˙ń캀îGyv<79>î;‡Ń§Ä±đ´ÄsůÉŢşhŤQ‡đݎéěŮŁ›/ő˛ˇGÂ*Žý0Ş9%T˝€ş?´¶¸‡đ–  ą<15>~Ťß€čž#Ö´řŤ!üJ}˘ĐÚÇ=„źˇÇD<1F>źţßöÇZżoyA«y_őÂÜŕĆ_xÄÎuyŢdÚď?ĂŹÖ„Nű±¦Ĺł°Ľ Ń ĹZcÔ!¬˛vqô¸*¨G»{iB'Xcőĺ?y<>…§7šgióĐęÂ{âč1îr;ßč Ö´xŢ߼öVňBŹŹ.•ýćPő#k†çMGâGÖR—gmó žĐÚGÂ*Ϣé1î˛čDżîß^0kA| ˙–:ß„Y V'ĐŞCžüć+ĐcÜĺs]˘7qaÎËB\ya­-]âĐŁaőBÖâč±í2€č žµĘŃăŁ<C483>çWć…<oîĎÂ÷u†đ =Ć]V-ź™ç—řý±Ö‰´ŕ Öţ­Ö^ĐÚÝyVč18CËZ†áD?íż Ńkń,LKńކčůÍW‡đž7ż@Źq—D÷ ú5~ăâ<C483>ţ˙ÇÂZ«<÷<>Ľ uˇ{!äY™|<1C>ç-ć<>̡=¦ýţ&LđŁUžD˝żĽX<ÇÁŃ˝P.­1őŤ<C591>× ľůî8•x? áČ]·ZýCXĹ}!űăĐßľ¤§P÷‡ÖčFČ[p9÷ z÷9ä7ż@^H¦č?<3F>>Ł'<27>ŢÇŃ­:䥉~çŔîAôg(ýˇ5FÂ*ďÜâ§ÇˇŐ?„Ő8•¬şnęţĐÚ5„Gí®Vň~,Ł]ZuČKĂ-PÝď¬8´ĆŚ>„łpő‡V˙Îâ§ő‡ÖůFDÜű©¨uGď/Ť«L;ÇUĤuwÝ«śCć*Ixsss“Ĺ××˙Źă5É<35>{IEND®B`‰PNG


View file

@ -14,8 +14,8 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
@ -24,8 +24,8 @@
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">

File diff suppressed because one or more lines are too long

View file

@ -542,6 +542,11 @@ physac/physics_restitution: physac/physics_restitution.c
physac/physics_shatter: physac/physics_shatter.c
$(CC) -o $@$(EXT) $< $(CFLAGS) $(INCLUDES) $(LFLAGS) $(LIBS) -static -lpthread -D$(PLATFORM) $(WINFLAGS)
ifeq ($(PLATFORM),PLATFORM_ANDROID)
external/native_app_glue.o : native_app_glue.c native_app_glue.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
endif
# fix dylib install path name for each executable (MAC)
fix_dylib:
ifeq ($(PLATFORM_OS),OSX)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 977 B

View file

@ -26,6 +26,8 @@
#include "raylib.h"
#include "screens.h"
#include <stdio.h>
#include <stdlib.h> // Required for: malloc(), free()
#include <math.h> // Required for: sqrtf(), asinf()
@ -79,7 +81,7 @@ static Rectangle waveRec;
// Samples variables
static Sample *samples; // Game samples
static int totalSamples = 0; // Total game samples (proportional to waveData num samples)
static int totalSamples; // Total game samples (proportional to waveData num samples)
static int collectedSamples; // Samples collected by player
static int currentSample; // Last sample to go through player collect area
static float samplesSpeed; // All samples move at the same speed
@ -91,7 +93,6 @@ static Texture2D texPlayer;
static Texture2D texSampleSmall;
static Texture2D texSampleMid;
static Texture2D texSampleBig;
static Texture2D texLine;
static RenderTexture2D waveTarget;
@ -103,7 +104,7 @@ static Sound fxPause; // Pause sound
//------------------------------------------------------------------------------------
// Module Functions Declaration (local)
//------------------------------------------------------------------------------------
static void DrawSamples(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color);
static void DrawSamplesMap(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color);
//----------------------------------------------------------------------------------
// Gameplay Screen Functions Definition
@ -123,7 +124,6 @@ void InitGameplayScreen(void)
texSampleSmall = LoadTexture("resources/textures/sample_small.png");
texSampleMid = LoadTexture("resources/textures/sample_mid.png");
texSampleBig = LoadTexture("resources/textures/sample_big.png");
texLine = LoadTexture("resources/textures/line.png");
waveRec = (Rectangle){ 32, 32, 1280 - 64, 105 };
waveTarget = LoadRenderTexture(waveRec.width, waveRec.height);
@ -200,11 +200,16 @@ void InitGameplayScreen(void)
samples[i].active = true;
samples[i].collected = false;
samples[i].color = RED;
samples[i].renderable = false;
}
samplesSpeed = MAX_SAMPLES_SPEED;
currentSample = 0;
//FILE *samplesFile = fopen("resources/samples.data", "wb");
//fwrite(samples, totalSamples*sizeof(Sample), 1, samplesFile);
//fclose(samplesFile);
// We already saved the samples we needed for the game, we can free waveData
free(waveData);
@ -329,7 +334,6 @@ void UpdateGameplayScreen(void)
// Check ending conditions
if (currentSample >= totalSamples - 1)
{
StopMusicStream(music);
endingStatus = 1; // Win
finishScreen = 1;
}
@ -337,7 +341,6 @@ void UpdateGameplayScreen(void)
if (synchro <= 0.0f)
{
synchro = 0.0f;
StopMusicStream(music);
endingStatus = 2; // Loose
finishScreen = 1;
}
@ -365,33 +368,20 @@ void DrawGameplayScreen(void)
if (i < (currentSample + 1)) col = Fade(DARKGRAY, 0.5f);
else col = WHITE;
//DrawCircleV(samples[i].position, samples[i].radius, col);
if (!samples[i].collected)
{
if (combo > 50) DrawTexture(texSampleSmall, samples[i].position.x - texSampleSmall.width/2, samples[i].position.y - texSampleSmall.height/2, col);
else if (combo > 25) DrawTexture(texSampleMid, samples[i].position.x - texSampleMid.width/2, samples[i].position.y - texSampleMid.height/2, col);
else DrawTexture(texSampleBig, samples[i].position.x - texSampleSmall.width/2, samples[i].position.y - texSampleBig.height/2, col);
//DrawCircleV(samples[i].position, samples[i].radius, col);
if (combo > 30) DrawTexture(texSampleSmall, samples[i].position.x - texSampleSmall.width/2, samples[i].position.y - texSampleSmall.height/2, col);
else if (combo > 15) DrawTexture(texSampleMid, samples[i].position.x - texSampleMid.width/2, samples[i].position.y - texSampleMid.height/2, col);
else DrawTexture(texSampleBig, samples[i].position.x - texSampleBig.width/2, samples[i].position.y - texSampleBig.height/2, col);
}
if (i < (currentSample + 1)) col = Fade(GRAY, 0.3f);
else col = Fade(WHITE, 0.5f);
else col = Fade(RED, 0.5f);
// Draw line between samples
//DrawLine(samples[i].position.x, samples[i].position.y, samples[i + 1].position.x, samples[i + 1].position.y, col);
float dx = samples[i + 1].position.x - samples[i].position.x;
float dy = samples[i + 1].position.y - samples[i].position.y;
float d = sqrtf(dx*dx + dy*dy);
float angle = asinf(dy/d);
// Draw lines using textures
//DrawTextureEx(texLine, (Vector2){ samples[i].position.x - 2, samples[i].position.y - 2 }, -RAD2DEG*angle, d/SAMPLES_SPACING, col);
// Draw lines using textures - IMPROVED
// TODO: Further improving to draw lines properly
DrawTexturePro(texLine, (Rectangle){ 0, 0, texLine.width, texLine.height },
(Rectangle){ samples[i].position.x, samples[i].position.y, (float)texLine.width*d/SAMPLES_SPACING, texLine.height },
(Vector2){ 0, (float)texLine.height/2 }, -RAD2DEG*angle, col);
DrawLineEx(samples[i].position, samples[i + 1].position, 3.0f, col);
}
}
@ -432,7 +422,7 @@ void DrawGameplayScreen(void)
// Draw wave
// NOTE: Old drawing method, replaced by rendertarget
//DrawSamples(samples, totalSamples, currentSample, waveRec, MAROON);
//DrawSamplesMap(samples, totalSamples, currentSample, waveRec, MAROON);
//DrawRectangle(waveRec.x + (int)currentSample*1240/totalSamples, waveRec.y, 2, 99, DARKGRAY);
//DrawRectangleLines(20, 20, 1240, 140, DARKGRAY);
//DrawRectangle(20, 150, (float)currentSample/totalSamples*1240, 10, GRAY);
@ -440,7 +430,7 @@ void DrawGameplayScreen(void)
// Draw wave using render target
ClearBackground(BLANK);
BeginTextureMode(waveTarget);
DrawSamples(samples, totalSamples, currentSample, (Rectangle){ 0, 0, waveTarget.texture.width, waveTarget.texture.height }, MAROON);
DrawSamplesMap(samples, totalSamples, currentSample, (Rectangle){ 0, 0, waveTarget.texture.width, waveTarget.texture.height }, MAROON);
EndTextureMode();
// TODO: Apply antialiasing shader
@ -451,13 +441,14 @@ void DrawGameplayScreen(void)
// Gameplay Screen Unload logic
void UnloadGameplayScreen(void)
{
StopMusicStream(music);
// Unload textures
UnloadTexture(texBackground);
UnloadTexture(texPlayer);
UnloadTexture(texSampleSmall);
UnloadTexture(texSampleMid);
UnloadTexture(texSampleBig);
UnloadTexture(texLine);
UnloadRenderTexture(waveTarget);
@ -466,7 +457,7 @@ void UnloadGameplayScreen(void)
UnloadSound(fxSampleOff);
UnloadSound(fxPause);
free(samples); // Unload game samples (crashes game)
free(samples); // Unload game samples
}
// Gameplay Screen should finish?
@ -483,7 +474,7 @@ int FinishGameplayScreen(void)
// NOTE: For proper visualization, MSAA x4 is recommended, alternatively
// it should be rendered to a bigger texture and then scaled down with
// bilinear/trilinear texture filtering
static void DrawSamples(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color)
static void DrawSamplesMap(Sample *samples, int sampleCount, int playedSamples, Rectangle bounds, Color color)
{
// NOTE: We just pick a sample to draw every increment
float sampleIncrementX = (float)bounds.width/sampleCount;

View file

@ -38,7 +38,8 @@ GameScreen currentScreen;
SpriteFont font;
Music music;
int endingStatus; // 1 - Win, 2 - Lose
//char *sampleFilename;
char *sampleFilename; // Required for custom music file
#ifdef __cplusplus
extern "C" { // Prevents name mangling of functions

View file

@ -19,6 +19,9 @@
#include <stdlib.h>
#include <stdio.h> // Required for: printf()
#include <string.h> // Required for: strcpy()
#if defined(PLATFORM_WEB)
#include <emscripten/emscripten.h>
#endif
@ -57,20 +60,27 @@ int main(int argc, char *argv[])
{
// Initialization
//---------------------------------------------------------
/*
#if !defined(PLATFORM_WEB)
// TODO: Add support for dropped files on the exe
sampleFilename = (char *)malloc(256);
// TODO: Support for dropped files on the exe
// Support command line argument for custom music file
if (argc > 1)
{
// Just supporting an input argument parameter!!! o__O
if ((IsFileExtension(argv[1], ".ogg")) ||
(IsFileExtension(argv[1], ".wav")))
{
if (sampleFilename != NULL) free(sampleFilename);
sampleFilename = (char *)malloc(256);
strcpy(sampleFilename, argv[1]);
printf("Custom audio file: %s", sampleFilename);
}
}
#endif
*/
SetConfigFlags(FLAG_MSAA_4X_HINT);
InitWindow(screenWidth, screenHeight, "GGJ17 - WAVE COLLECTOR");
@ -104,8 +114,6 @@ int main(int argc, char *argv[])
// De-Initialization
//--------------------------------------------------------------------------------------
StopMusicStream(music);
switch (currentScreen)
{
case LOGO: UnloadLogoScreen(); break;

View file

@ -101,7 +101,7 @@ ifeq ($(PLATFORM),PLATFORM_ANDROID)
# Android standalone toolchain path
# NOTE: This path is also used if toolchain generation
#ANDROID_TOOLCHAIN = $(CURDIR)/toolchain
ANDROID_TOOLCHAIN = C:/raylib/android-standalone-toolchain
ANDROID_TOOLCHAIN = C:/raylib/android-toolchain
# Android architecture: ARM or ARM64
ANDROID_ARCH ?= ARM
@ -230,8 +230,13 @@ endif
# external required libraries (stb and others)
INCLUDES = -I. -Iexternal
# OpenAL Soft library
ifeq ($(PLATFORM),PLATFORM_ANDROID)
INCLUDES += -Iandroid/jni/include/AL
else
INCLUDES += -Iexternal/openal_soft/include
endif
# define any directories containing required header files
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
@ -325,12 +330,12 @@ else
endif
ifeq ($(PLATFORM),PLATFORM_ANDROID)
$(CC) -shared -o $(OUTPUT_PATH)/libraylib.so $(OBJS)
@echo "raylib shared library (libraylib.so) generated!"
@echo "raylib shared library generated (libraylib.so)!"
endif
else
# compile raylib static library.
$(AR) rcs $(OUTPUT_PATH)/libraylib.a $(OBJS)
@echo "libraylib.a generated (static library)!"
@echo "raylib static library generated (libraylib.a)!"
ifeq ($(SHARED_OPENAL),NO)
@echo "expected OpenAL Soft static library linking"
else
@ -377,7 +382,6 @@ external/stb_vorbis.o: external/stb_vorbis.c external/stb_vorbis.h
utils.o : utils.c utils.h
$(CC) -c $< $(CFLAGS) $(INCLUDES) -D$(PLATFORM) -D$(SHAREDFLAG)
# It installs generated and needed files to compile projects using raylib.
# The installation works manually.
# TODO: add other platforms.

View file

@ -1,161 +0,0 @@
/**********************************************************************************************************************************
*
* OpenAL cross platform audio library
* Copyright (c) 2004-2006, Apple Computer, Inc. All rights reserved.
* Copyright (c) 2007-2008, Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
* conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided with the distribution.
* 3. Neither the name of Apple Inc. ("Apple") nor the names of its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************************************************************************/
#ifndef __OAL_MAC_OSX_OAL_EXTENSIONS_H__
#define __OAL_MAC_OSX_OAL_EXTENSIONS_H__
#include <OpenAL/al.h>
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ALC_EXT_MAC_OSX
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
// Retrieve functions via alGetProcAddress() by passing in strings: alcMacOSXMixerOutputRate or alcMacOSXGetMixerOutputRate
// Setting the Mixer Output Rate effectively sets the samnple rate at which the mixer
typedef ALvoid (*alcMacOSXRenderingQualityProcPtr) (ALint value);
typedef ALvoid (*alMacOSXRenderChannelCountProcPtr) (ALint value);
typedef ALvoid (*alcMacOSXMixerMaxiumumBussesProcPtr) (ALint value);
typedef ALvoid (*alcMacOSXMixerOutputRateProcPtr) (ALdouble value);
typedef ALint (*alcMacOSXGetRenderingQualityProcPtr) ();
typedef ALint (*alMacOSXGetRenderChannelCountProcPtr) ();
typedef ALint (*alcMacOSXGetMixerMaxiumumBussesProcPtr) ();
typedef ALdouble (*alcMacOSXGetMixerOutputRateProcPtr) ();
/* Render Quality. Used with alcMacOSXRenderingQuality() */
#define ALC_MAC_OSX_SPATIAL_RENDERING_QUALITY_HIGH 'rqhi'
#define ALC_MAC_OSX_SPATIAL_RENDERING_QUALITY_LOW 'rdlo'
// High Quality Spatial Algorithm suitable only for headphone use
#define ALC_IPHONE_SPATIAL_RENDERING_QUALITY_HEADPHONES 'hdph'
/*
Render Channels. Used with alMacOSXRenderChannelCount()
Allows a user to force OpenAL to render to stereo, regardless of the audio hardware being used
*/
#define ALC_MAC_OSX_RENDER_CHANNEL_COUNT_STEREO 'rcst'
/* GameKit extension */
#define AL_GAMEKIT 'gksr'
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AL_EXT_SOURCE_NOTIFICATIONS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*
Source Notifications
Eliminates the need for continuous polling for source state by providing a
mechanism for the application to receive source state change notifications.
Upon receiving a notification, the application can retrieve the actual state
corresponding to the notification ID for which the notification was sent.
*/
#define AL_QUEUE_HAS_LOOPED 0x9000
/*
Notification Proc: ALSourceNotificationProc
sid - source id
notificationID - id of state that has changed
userData - user data provided to alSourceAddNotification()
*/
typedef ALvoid (*alSourceNotificationProc)(ALuint sid, ALuint notificationID, ALvoid* userData);
/*
API: alSourceAddNotification
sid - source id
notificationID - id of state for which caller wants to be notified of a change
notifyProc - notification proc
userData - ptr to applications user data, will be returned in the notification proc
Returns AL_NO_ERROR if request is successful.
Valid IDs:
AL_SOURCE_STATE
AL_BUFFERS_PROCESSED
AL_QUEUE_HAS_LOOPED - notification sent when a looping source has looped to it's start point
*/
typedef ALenum (*alSourceAddNotificationProcPtr) (ALuint sid, ALuint notificationID, alSourceNotificationProc notifyProc, ALvoid* userData);
/*
API: alSourceRemoveStateNotification
sid - source id
notificationID - id of state for which caller wants to remove an existing notification
notifyProc - notification proc
userData - ptr to applications user data, will be returned in the notification proc
*/
typedef ALvoid (*alSourceRemoveNotificationProcPtr) (ALuint sid, ALuint notificationID, alSourceNotificationProc notifyProc, ALvoid* userData);
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ALC_EXT_ASA : Apple Spatial Audio Extension
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/*
Used with the ASA API calls: alcASAGetSource(), alcASASetSource(), alcASAGetListener(), alcASASetListener()
*/
typedef ALenum (*alcASAGetSourceProcPtr) (ALuint property, ALuint source, ALvoid *data, ALuint* dataSize);
typedef ALenum (*alcASASetSourceProcPtr) (ALuint property, ALuint source, ALvoid *data, ALuint dataSize);
typedef ALenum (*alcASAGetListenerProcPtr) (ALuint property, ALvoid *data, ALuint* dataSize);
typedef ALenum (*alcASASetListenerProcPtr) (ALuint property, ALvoid *data, ALuint dataSize);
/* listener properties */
#define ALC_ASA_REVERB_ON 'rvon' // type ALuint
#define ALC_ASA_REVERB_GLOBAL_LEVEL 'rvgl' // type ALfloat -40.0 db - 40.0 db
#define ALC_ASA_REVERB_ROOM_TYPE 'rvrt' // type ALint
/* reverb room type presets for the ALC_ASA_REVERB_ROOM_TYPE property */
#define ALC_ASA_REVERB_ROOM_TYPE_SmallRoom 0
#define ALC_ASA_REVERB_ROOM_TYPE_MediumRoom 1
#define ALC_ASA_REVERB_ROOM_TYPE_LargeRoom 2
#define ALC_ASA_REVERB_ROOM_TYPE_MediumHall 3
#define ALC_ASA_REVERB_ROOM_TYPE_LargeHall 4
#define ALC_ASA_REVERB_ROOM_TYPE_Plate 5
#define ALC_ASA_REVERB_ROOM_TYPE_MediumChamber 6
#define ALC_ASA_REVERB_ROOM_TYPE_LargeChamber 7
#define ALC_ASA_REVERB_ROOM_TYPE_Cathedral 8
#define ALC_ASA_REVERB_ROOM_TYPE_LargeRoom2 9
#define ALC_ASA_REVERB_ROOM_TYPE_MediumHall2 10
#define ALC_ASA_REVERB_ROOM_TYPE_MediumHall3 11
#define ALC_ASA_REVERB_ROOM_TYPE_LargeHall2 12
#define ALC_ASA_REVERB_EQ_GAIN 'rveg' // type ALfloat
#define ALC_ASA_REVERB_EQ_BANDWITH 'rveb' // type ALfloat
#define ALC_ASA_REVERB_EQ_FREQ 'rvef' // type ALfloat
/* source properties */
#define ALC_ASA_REVERB_SEND_LEVEL 'rvsl' // type ALfloat 0.0 (dry) - 1.0 (wet) (0-100% dry/wet mix, 0.0 default)
#define ALC_ASA_OCCLUSION 'occl' // type ALfloat -100.0 db (most occlusion) - 0.0 db (no occlusion, 0.0 default)
#define ALC_ASA_OBSTRUCTION 'obst' // type ALfloat -100.0 db (most obstruction) - 0.0 db (no obstruction, 0.0 default)
#endif // __OAL_MAC_OSX_OAL_EXTENSIONS_H__

View file

@ -801,20 +801,26 @@ void ResumeMusicStream(Music music)
}
// Stop music playing (close stream)
// TODO: To clear a buffer, make sure they have been already processed!
void StopMusicStream(Music music)
{
alSourceStop(music->stream.source);
/*
// Clear stream buffers
// WARNING: Queued buffers must have been processed before unqueueing and reloaded with data!!!
void *pcm = calloc(AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, 1);
for (int i = 0; i < MAX_STREAM_BUFFERS; i++)
{
UpdateAudioStream(music->stream, pcm, AUDIO_BUFFER_SIZE);
//alBufferData(music->stream.buffers[i], music->stream.format, pcm, AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, music->stream.sampleRate);
//UpdateAudioStream(music->stream, pcm, AUDIO_BUFFER_SIZE); // Update one buffer at a time
alBufferData(music->stream.buffers[i], music->stream.format, pcm, AUDIO_BUFFER_SIZE*music->stream.sampleSize/8*music->stream.channels, music->stream.sampleRate);
}
free(pcm);
*/
// Restart music context
switch (music->ctxType)
@ -897,8 +903,8 @@ void UpdateMusicStream(Music music)
}
}
// This error is registered when UpdateAudioStream() fails
if (alGetError() == AL_INVALID_VALUE) TraceLog(WARNING, "OpenAL: Error buffering data...");
// Free allocated pcm data
free(pcm);
// Reset audio stream for looping
if (!active)
@ -918,8 +924,6 @@ void UpdateMusicStream(Music music)
// just make sure to play again on window restore
if (state != AL_PLAYING) PlayMusicStream(music);
}
free(pcm);
}
}
@ -1066,7 +1070,8 @@ void CloseAudioStream(AudioStream stream)
}
// Update audio stream buffers with data
// NOTE: Only updates one buffer per call
// NOTE 1: Only updates one buffer of the stream source: unqueue -> update -> queue
// NOTE 2: To unqueue a buffer it needs to be processed: IsAudioBufferProcessed()
void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)
{
ALuint buffer = 0;
@ -1075,9 +1080,10 @@ void UpdateAudioStream(AudioStream stream, const void *data, int samplesCount)
// Check if any buffer was available for unqueue
if (alGetError() != AL_INVALID_VALUE)
{
alBufferData(buffer, stream.format, data, samplesCount*stream.channels*stream.sampleSize/8, stream.sampleRate);
alBufferData(buffer, stream.format, data, samplesCount*stream.sampleSize/8*stream.channels, stream.sampleRate);
alSourceQueueBuffers(stream.source, 1, &buffer);
}
else TraceLog(WARNING, "[AUD ID %i] Audio buffer not available for unqueuing", stream.source);
}
// Check if any audio stream buffers requires refill

View file

@ -108,6 +108,16 @@
#include <string.h> // Required for: strrchr(), strcmp()
//#include <errno.h> // Macros for reporting and retrieving error conditions through error codes
#ifdef _WIN32
#include <direct.h> // Required for: _getch(), _chdir()
#define GETCWD _getcwd // NOTE: MSDN recommends not to use getcwd(), chdir()
#define CHDIR _chdir
#else
#include "unistd.h" // Required for: getch(), chdir() (POSIX)
#define GETCWD getcwd
#define CHDIR chdir
#endif
#if defined(__linux__) || defined(PLATFORM_WEB)
#include <sys/time.h> // Required for: timespec, nanosleep(), select() - POSIX
#elif defined(__APPLE__)
@ -259,6 +269,7 @@ static Matrix downscaleView; // Matrix to downscale view (in case
static const char *windowTitle; // Window text title...
static bool cursorOnScreen = false; // Tracks if cursor is inside client area
static bool cursorHidden = false; // Track if cursor is hidden
static int screenshotCounter = 0; // Screenshots counter
// Register mouse states
static char previousMouseState[3] = { 0 }; // Registers previous mouse button state
@ -380,7 +391,7 @@ static void *GamepadThread(void *arg); // Mouse reading thread
// Module Functions Definition - Window and OpenGL Context Functions
//----------------------------------------------------------------------------------
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
// Initialize Window and Graphics Context (OpenGL)
// Initialize window and OpenGL context
void InitWindow(int width, int height, const char *title)
{
TraceLog(INFO, "Initializing raylib (v1.7.0)");
@ -443,7 +454,7 @@ void InitWindow(int width, int height, const char *title)
#endif
#if defined(PLATFORM_ANDROID)
// Android activity initialization
// Initialize Android activity
void InitWindow(int width, int height, void *state)
{
TraceLog(INFO, "Initializing raylib (v1.7.0)");
@ -506,7 +517,7 @@ void InitWindow(int width, int height, void *state)
}
#endif
// Close Window and Terminate Context
// Close window and unload OpenGL context
void CloseWindow(void)
{
#if defined(SUPPORT_DEFAULT_FONT)
@ -562,7 +573,7 @@ void CloseWindow(void)
TraceLog(INFO, "Window closed successfully");
}
// Detect if KEY_ESCAPE pressed or Close icon pressed
// Check if KEY_ESCAPE pressed or Close icon pressed
bool WindowShouldClose(void)
{
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
@ -577,7 +588,7 @@ bool WindowShouldClose(void)
#endif
}
// Detect if window has been minimized (or lost focus)
// Check if window has been minimized (or lost focus)
bool IsWindowMinimized(void)
{
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)
@ -587,7 +598,7 @@ bool IsWindowMinimized(void)
#endif
}
// Fullscreen toggle (only PLATFORM_DESKTOP)
// Toggle fullscreen mode (only PLATFORM_DESKTOP)
void ToggleFullscreen(void)
{
#if defined(PLATFORM_DESKTOP)
@ -646,7 +657,7 @@ void SetWindowMonitor(int monitor)
#endif
}
// Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE)
// Set window minimum dimensions (FLAG_WINDOW_RESIZABLE)
void SetWindowMinSize(int width, int height)
{
#if defined(PLATFORM_DESKTOP)
@ -681,7 +692,7 @@ void ShowCursor()
cursorHidden = false;
}
// Hide mouse cursor
// Hides mouse cursor
void HideCursor()
{
#if defined(PLATFORM_DESKTOP)
@ -701,13 +712,13 @@ void HideCursor()
cursorHidden = true;
}
// Check if mouse cursor is hidden
// Check if cursor is not visible
bool IsCursorHidden()
{
return cursorHidden;
}
// Enable mouse cursor
// Enables cursor (unlock cursor)
void EnableCursor()
{
#if defined(PLATFORM_DESKTOP)
@ -719,7 +730,7 @@ void EnableCursor()
cursorHidden = false;
}
// Disable mouse cursor
// Disables cursor (lock cursor)
void DisableCursor()
{
#if defined(PLATFORM_DESKTOP)
@ -732,14 +743,14 @@ void DisableCursor()
}
#endif // !defined(PLATFORM_ANDROID)
// Sets Background Color
// Set background color (framebuffer clear color)
void ClearBackground(Color color)
{
// Clear full framebuffer (not only render area) to color
rlClearColor(color.r, color.g, color.b, color.a);
}
// Setup drawing canvas to start drawing
// Setup canvas (framebuffer) to start drawing
void BeginDrawing(void)
{
currentTime = GetTime(); // Number of elapsed seconds since InitTimer() was called
@ -754,7 +765,7 @@ void BeginDrawing(void)
// NOTE: Not required with OpenGL 3.3+
}
// End canvas drawing and Swap Buffers (Double Buffering)
// End canvas drawing and swap buffers (double buffering)
void EndDrawing(void)
{
rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2)
@ -782,7 +793,7 @@ void EndDrawing(void)
}
}
// Initialize 2D mode with custom camera
// Initialize 2D mode with custom camera (2D)
void Begin2dMode(Camera2D camera)
{
rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2)
@ -800,7 +811,7 @@ void Begin2dMode(Camera2D camera)
rlMultMatrixf(MatrixToFloat(matTransform));
}
// Ends 2D mode custom camera usage
// Ends 2D mode with custom camera
void End2dMode(void)
{
rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2)
@ -808,7 +819,7 @@ void End2dMode(void)
rlLoadIdentity(); // Reset current matrix (MODELVIEW)
}
// Initializes 3D mode for drawing (Camera setup)
// Initializes 3D mode with custom camera (3D)
void Begin3dMode(Camera camera)
{
rlglDraw(); // Draw Buffers (Only OpenGL 3+ and ES2)
@ -897,283 +908,6 @@ void EndTextureMode(void)
rlLoadIdentity(); // Reset current matrix (MODELVIEW)
}
// Set target FPS for the game
void SetTargetFPS(int fps)
{
if (fps < 1) targetTime = 0.0;
else targetTime = 1.0/(double)fps;
TraceLog(INFO, "Target time per frame: %02.03f milliseconds", (float)targetTime*1000);
}
// Returns current FPS
int GetFPS(void)
{
return (int)(1.0f/GetFrameTime());
}
// Returns time in seconds for one frame
float GetFrameTime(void)
{
// NOTE: We round value to milliseconds
return (float)frameTime;
}
// Converts Color to float array and normalizes
float *ColorToFloat(Color color)
{
static float buffer[4];
buffer[0] = (float)color.r/255;
buffer[1] = (float)color.g/255;
buffer[2] = (float)color.b/255;
buffer[3] = (float)color.a/255;
return buffer;
}
// Converts Vector3 to float array
float *VectorToFloat(Vector3 vec)
{
static float buffer[3];
buffer[0] = vec.x;
buffer[1] = vec.y;
buffer[2] = vec.z;
return buffer;
}
// Converts Matrix to float array
// NOTE: Returned vector is a transposed version of the Matrix struct,
// it should be this way because, despite raymath use OpenGL column-major convention,
// Matrix struct memory alignment and variables naming are not coherent
float *MatrixToFloat(Matrix mat)
{
static float buffer[16];
buffer[0] = mat.m0;
buffer[1] = mat.m4;
buffer[2] = mat.m8;
buffer[3] = mat.m12;
buffer[4] = mat.m1;
buffer[5] = mat.m5;
buffer[6] = mat.m9;
buffer[7] = mat.m13;
buffer[8] = mat.m2;
buffer[9] = mat.m6;
buffer[10] = mat.m10;
buffer[11] = mat.m14;
buffer[12] = mat.m3;
buffer[13] = mat.m7;
buffer[14] = mat.m11;
buffer[15] = mat.m15;
return buffer;
}
// Returns a Color struct from hexadecimal value
Color GetColor(int hexValue)
{
Color color;
color.r = (unsigned char)(hexValue >> 24) & 0xFF;
color.g = (unsigned char)(hexValue >> 16) & 0xFF;
color.b = (unsigned char)(hexValue >> 8) & 0xFF;
color.a = (unsigned char)hexValue & 0xFF;
return color;
}
// Returns hexadecimal value for a Color
int GetHexValue(Color color)
{
return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a);
}
// Returns a random value between min and max (both included)
int GetRandomValue(int min, int max)
{
if (min > max)
{
int tmp = max;
max = min;
min = tmp;
}
return (rand()%(abs(max-min)+1) + min);
}
// Fades color by a percentadge
Color Fade(Color color, float alpha)
{
if (alpha < 0.0f) alpha = 0.0f;
else if (alpha > 1.0f) alpha = 1.0f;
float colorAlpha = (float)color.a*alpha;
return (Color){color.r, color.g, color.b, (unsigned char)colorAlpha};
}
// Activates raylib logo at startup
void ShowLogo(void)
{
showLogo = true;
}
// Enable some window/system configurations
void SetConfigFlags(char flags)
{
configFlags = flags;
if (configFlags & FLAG_SHOW_LOGO) showLogo = true;
if (configFlags & FLAG_FULLSCREEN_MODE) fullscreen = true;
}
// Takes a screenshot and saves it in the same folder as executable
void TakeScreenshot(void)
{
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI)
static int shotNum = 0; // Screenshot number, increments every screenshot take during program execution
char buffer[20]; // Buffer to store file name
unsigned char *imgData = rlglReadScreenPixels(renderWidth, renderHeight);
sprintf(buffer, "screenshot%03i.png", shotNum);
// Save image as PNG
SavePNG(buffer, imgData, renderWidth, renderHeight, 4);
free(imgData);
shotNum++;
TraceLog(INFO, "[%s] Screenshot taken #03i", buffer, shotNum);
#endif
}
// Check file extension
bool IsFileExtension(const char *fileName, const char *ext)
{
bool result = false;
const char *fileExt;
if ((fileExt = strrchr(fileName, '.')) != NULL)
{
if (strcmp(fileExt, ext) == 0) result = true;
}
return result;
}
#if defined(PLATFORM_DESKTOP)
// Check if a file have been dropped into window
bool IsFileDropped(void)
{
if (dropFilesCount > 0) return true;
else return false;
}
// Retrieve dropped files into window
char **GetDroppedFiles(int *count)
{
*count = dropFilesCount;
return dropFilesPath;
}
// Clear dropped files paths buffer
void ClearDroppedFiles(void)
{
if (dropFilesCount > 0)
{
for (int i = 0; i < dropFilesCount; i++) free(dropFilesPath[i]);
free(dropFilesPath);
dropFilesCount = 0;
}
}
#endif
// Storage save integer value (to defined position)
// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
void StorageSaveValue(int position, int value)
{
FILE *storageFile = NULL;
char path[128];
#if defined(PLATFORM_ANDROID)
strcpy(path, internalDataPath);
strcat(path, "/");
strcat(path, STORAGE_FILENAME);
#else
strcpy(path, STORAGE_FILENAME);
#endif
// Try open existing file to append data
storageFile = fopen(path, "rb+");
// If file doesn't exist, create a new storage data file
if (!storageFile) storageFile = fopen(path, "wb");
if (!storageFile) TraceLog(WARNING, "Storage data file could not be created");
else
{
// Get file size
fseek(storageFile, 0, SEEK_END);
int fileSize = ftell(storageFile); // Size in bytes
fseek(storageFile, 0, SEEK_SET);
if (fileSize < (position*4)) TraceLog(WARNING, "Storage position could not be found");
else
{
fseek(storageFile, (position*4), SEEK_SET);
fwrite(&value, 1, 4, storageFile);
}
fclose(storageFile);
}
}
// Storage load integer value (from defined position)
// NOTE: If requested position could not be found, value 0 is returned
int StorageLoadValue(int position)
{
int value = 0;
char path[128];
#if defined(PLATFORM_ANDROID)
strcpy(path, internalDataPath);
strcat(path, "/");
strcat(path, STORAGE_FILENAME);
#else
strcpy(path, STORAGE_FILENAME);
#endif
// Try open existing file to append data
FILE *storageFile = fopen(path, "rb");
if (!storageFile) TraceLog(WARNING, "Storage data file could not be found");
else
{
// Get file size
fseek(storageFile, 0, SEEK_END);
int fileSize = ftell(storageFile); // Size in bytes
rewind(storageFile);
if (fileSize < (position*4)) TraceLog(WARNING, "Storage position could not be found");
else
{
fseek(storageFile, (position*4), SEEK_SET);
fread(&value, 4, 1, storageFile); // Read 1 element of 4 bytes size
}
fclose(storageFile);
}
return value;
}
// Returns a ray trace from mouse position
Ray GetMouseRay(Vector2 mousePosition, Camera camera)
{
@ -1274,6 +1008,305 @@ Matrix GetCameraMatrix(Camera camera)
return MatrixLookAt(camera.position, camera.target, camera.up);
}
// Set target FPS (maximum)
void SetTargetFPS(int fps)
{
if (fps < 1) targetTime = 0.0;
else targetTime = 1.0/(double)fps;
TraceLog(INFO, "Target time per frame: %02.03f milliseconds", (float)targetTime*1000);
}
// Returns current FPS
int GetFPS(void)
{
return (int)(1.0f/GetFrameTime());
}
// Returns time in seconds for last frame drawn
float GetFrameTime(void)
{
// NOTE: We round value to milliseconds
return (float)frameTime;
}
// Converts Color to float array and normalizes
float *ColorToFloat(Color color)
{
static float buffer[4];
buffer[0] = (float)color.r/255;
buffer[1] = (float)color.g/255;
buffer[2] = (float)color.b/255;
buffer[3] = (float)color.a/255;
return buffer;
}
// Converts Vector3 to float array
float *VectorToFloat(Vector3 vec)
{
static float buffer[3];
buffer[0] = vec.x;
buffer[1] = vec.y;
buffer[2] = vec.z;
return buffer;
}
// NOTE: Returned vector is a transposed version of the Matrix struct,
// it should be this way because, despite raymath use OpenGL column-major convention,
// Matrix struct memory alignment and variables naming are not coherent
float *MatrixToFloat(Matrix mat)
{
static float buffer[16];
buffer[0] = mat.m0;
buffer[1] = mat.m4;
buffer[2] = mat.m8;
buffer[3] = mat.m12;
buffer[4] = mat.m1;
buffer[5] = mat.m5;
buffer[6] = mat.m9;
buffer[7] = mat.m13;
buffer[8] = mat.m2;
buffer[9] = mat.m6;
buffer[10] = mat.m10;
buffer[11] = mat.m14;
buffer[12] = mat.m3;
buffer[13] = mat.m7;
buffer[14] = mat.m11;
buffer[15] = mat.m15;
return buffer;
}
// Returns a Color struct from hexadecimal value
Color GetColor(int hexValue)
{
Color color;
color.r = (unsigned char)(hexValue >> 24) & 0xFF;
color.g = (unsigned char)(hexValue >> 16) & 0xFF;
color.b = (unsigned char)(hexValue >> 8) & 0xFF;
color.a = (unsigned char)hexValue & 0xFF;
return color;
}
// Returns hexadecimal value for a Color
int GetHexValue(Color color)
{
return (((int)color.r << 24) | ((int)color.g << 16) | ((int)color.b << 8) | (int)color.a);
}
// Returns a random value between min and max (both included)
int GetRandomValue(int min, int max)
{
if (min > max)
{
int tmp = max;
max = min;
min = tmp;
}
return (rand()%(abs(max-min)+1) + min);
}
// Color fade-in or fade-out, alpha goes from 0.0f to 1.0f
Color Fade(Color color, float alpha)
{
if (alpha < 0.0f) alpha = 0.0f;
else if (alpha > 1.0f) alpha = 1.0f;
float colorAlpha = (float)color.a*alpha;
return (Color){color.r, color.g, color.b, (unsigned char)colorAlpha};
}
// Activate raylib logo at startup (can be done with flags)
void ShowLogo(void)
{
showLogo = true;
}
// Setup window configuration flags (view FLAGS)
void SetConfigFlags(char flags)
{
configFlags = flags;
if (configFlags & FLAG_SHOW_LOGO) showLogo = true;
if (configFlags & FLAG_FULLSCREEN_MODE) fullscreen = true;
}
// NOTE TraceLog() function is located in [utils.h]
// Takes a screenshot of current screen (saved a .png)
void TakeScreenshot(const char *fileName)
{
#if defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI)
unsigned char *imgData = rlglReadScreenPixels(renderWidth, renderHeight);
SavePNG(fileName, imgData, renderWidth, renderHeight, 4); // Save image as PNG
free(imgData);
TraceLog(INFO, "Screenshot taken: %s", fileName);
#endif
}
// Check file extension
bool IsFileExtension(const char *fileName, const char *ext)
{
bool result = false;
const char *fileExt;
if ((fileExt = strrchr(fileName, '.')) != NULL)
{
if (strcmp(fileExt, ext) == 0) result = true;
}
return result;
}
// Get directory for a given fileName (with path)
const char *GetDirectoryPath(const char *fileName)
{
char *lastSlash = NULL;
static char filePath[256]; // MAX_DIRECTORY_PATH_SIZE = 256
memset(filePath, 0, 256);
lastSlash = strrchr(fileName, '\\');
strncpy(filePath, fileName, strlen(fileName) - (strlen(lastSlash) - 1));
filePath[strlen(fileName) - strlen(lastSlash)] = '\0';
return filePath;
}
// Get current working directory
const char *GetWorkingDirectory(void)
{
static char currentDir[256]; // MAX_DIRECTORY_PATH_SIZE = 256
memset(currentDir, 0, 256);
GETCWD(currentDir, 256 - 1);
return currentDir;
}
// Change working directory, returns true if success
bool ChangeDirectory(const char *dir)
{
return (CHDIR(dir) == 0);
}
#if defined(PLATFORM_DESKTOP)
// Check if a file has been dropped into window
bool IsFileDropped(void)
{
if (dropFilesCount > 0) return true;
else return false;
}
// Get dropped files names
char **GetDroppedFiles(int *count)
{
*count = dropFilesCount;
return dropFilesPath;
}
// Clear dropped files paths buffer
void ClearDroppedFiles(void)
{
if (dropFilesCount > 0)
{
for (int i = 0; i < dropFilesCount; i++) free(dropFilesPath[i]);
free(dropFilesPath);
dropFilesCount = 0;
}
}
#endif
// Save integer value to storage file (to defined position)
// NOTE: Storage positions is directly related to file memory layout (4 bytes each integer)
void StorageSaveValue(int position, int value)
{
FILE *storageFile = NULL;
char path[128];
#if defined(PLATFORM_ANDROID)
strcpy(path, internalDataPath);
strcat(path, "/");
strcat(path, STORAGE_FILENAME);
#else
strcpy(path, STORAGE_FILENAME);
#endif
// Try open existing file to append data
storageFile = fopen(path, "rb+");
// If file doesn't exist, create a new storage data file
if (!storageFile) storageFile = fopen(path, "wb");
if (!storageFile) TraceLog(WARNING, "Storage data file could not be created");
else
{
// Get file size
fseek(storageFile, 0, SEEK_END);
int fileSize = ftell(storageFile); // Size in bytes
fseek(storageFile, 0, SEEK_SET);
if (fileSize < (position*4)) TraceLog(WARNING, "Storage position could not be found");
else
{
fseek(storageFile, (position*4), SEEK_SET);
fwrite(&value, 1, 4, storageFile);
}
fclose(storageFile);
}
}
// Load integer value from storage file (from defined position)
// NOTE: If requested position could not be found, value 0 is returned
int StorageLoadValue(int position)
{
int value = 0;
char path[128];
#if defined(PLATFORM_ANDROID)
strcpy(path, internalDataPath);
strcat(path, "/");
strcat(path, STORAGE_FILENAME);
#else
strcpy(path, STORAGE_FILENAME);
#endif
// Try open existing file to append data
FILE *storageFile = fopen(path, "rb");
if (!storageFile) TraceLog(WARNING, "Storage data file could not be found");
else
{
// Get file size
fseek(storageFile, 0, SEEK_END);
int fileSize = ftell(storageFile); // Size in bytes
rewind(storageFile);
if (fileSize < (position*4)) TraceLog(WARNING, "Storage position could not be found");
else
{
fseek(storageFile, (position*4), SEEK_SET);
fread(&value, 4, 1, storageFile); // Read 1 element of 4 bytes size
}
fclose(storageFile);
}
return value;
}
//----------------------------------------------------------------------------------
// Module Functions Definition - Input (Keyboard, Mouse, Gamepad) Functions
//----------------------------------------------------------------------------------
@ -1559,7 +1592,7 @@ int GetMouseWheelMove(void)
#endif
}
// Returns touch position X
// Returns touch position X for touch point 0 (relative to screen size)
int GetTouchX(void)
{
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)
@ -1569,7 +1602,7 @@ int GetTouchX(void)
#endif
}
// Returns touch position Y
// Returns touch position Y for touch point 0 (relative to screen size)
int GetTouchY(void)
{
#if defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)
@ -1579,7 +1612,7 @@ int GetTouchY(void)
#endif
}
// Returns touch position XY
// Returns touch position XY for a touch point index (relative to screen size)
// TODO: Touch position should be scaled depending on display size and render size
Vector2 GetTouchPosition(int index)
{
@ -1836,8 +1869,8 @@ static void InitGraphicsDevice(int width, int height)
EGL_RED_SIZE, 8, // RED color bit depth (alternative: 5)
EGL_GREEN_SIZE, 8, // GREEN color bit depth (alternative: 6)
EGL_BLUE_SIZE, 8, // BLUE color bit depth (alternative: 5)
//EGL_ALPHA_SIZE, 8, // ALPHA bit depth
//EGL_TRANSPARENT_TYPE, EGL_TRANSPARENT_RGB, // Request transparent framebuffer
//EGL_ALPHA_SIZE, 8, // ALPHA bit depth (required for transparent framebuffer)
//EGL_TRANSPARENT_TYPE, EGL_NONE, // Request transparent framebuffer (EGL_TRANSPARENT_RGB does not work on RPI)
EGL_DEPTH_SIZE, 16, // Depth buffer size (Required to use Depth testing!)
//EGL_STENCIL_SIZE, 8, // Stencil buffer size
EGL_SAMPLE_BUFFERS, sampleBuffer, // Activate MSAA
@ -1912,7 +1945,7 @@ static void InitGraphicsDevice(int width, int height)
VC_DISPMANX_ALPHA_T alpha;
alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS;
alpha.opacity = 255;
alpha.opacity = 255; // Set transparency level for framebuffer, requires EGLAttrib: EGL_TRANSPARENT_TYPE
alpha.mask = 0;
dispmanDisplay = vc_dispmanx_display_open(0); // LCD
@ -2362,7 +2395,11 @@ static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, i
// NOTE: Before closing window, while loop must be left!
}
#if defined(PLATFORM_DESKTOP)
else if (key == GLFW_KEY_F12 && action == GLFW_PRESS) TakeScreenshot();
else if (key == GLFW_KEY_F12 && action == GLFW_PRESS)
{
TakeScreenshot(FormatText("screenshot%03i.png", screenshotCounter));
screenshotCounter++;
}
#endif
else
{
@ -3002,8 +3039,12 @@ static void ProcessKeyboard(void)
// Check exit key (same functionality as GLFW3 KeyCallback())
if (currentKeyState[exitKey] == 1) windowShouldClose = true;
// Check screen capture key
if (currentKeyState[301] == 1) TakeScreenshot(); // raylib key: KEY_F12 (GLFW_KEY_F12)
// Check screen capture key (raylib key: KEY_F12)
if (currentKeyState[301] == 1)
{
TakeScreenshot(FormatText("screenshot%03i.png", screenshotCounter));
screenshotCounter++;
}
}
// Restore default keyboard input

View file

@ -1541,11 +1541,11 @@ RayHitInfo GetCollisionRayTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3)
result.hit = true;
result.distance = t;
result.hit = true;
result.hitNormal = VectorCrossProduct(edge1, edge2);
VectorNormalize(&result.hitNormal);
result.normal = VectorCrossProduct(edge1, edge2);
VectorNormalize(&result.normal);
Vector3 rayDir = ray.direction;
VectorScale(&rayDir, t);
result.hitPosition = VectorAdd(ray.position, rayDir);
result.position = VectorAdd(ray.position, rayDir);
}
return result;
@ -1568,8 +1568,8 @@ RayHitInfo GetCollisionRayGround(Ray ray, float groundHeight)
VectorScale(&rayDir, t);
result.hit = true;
result.distance = t;
result.hitNormal = (Vector3){ 0.0, 1.0, 0.0 };
result.hitPosition = VectorAdd(ray.position, rayDir);
result.normal = (Vector3){ 0.0, 1.0, 0.0 };
result.position = VectorAdd(ray.position, rayDir);
}
}

View file

@ -316,10 +316,12 @@ static void FindIncidentFace(Vector2 *v0, Vector2 *v1, PhysicsShape ref, Physics
static int Clip(Vector2 normal, float clip, Vector2 *faceA, Vector2 *faceB); // Calculates clipping based on a normal and two faces
static bool BiasGreaterThan(float valueA, float valueB); // Check if values are between bias range
static Vector2 TriangleBarycenter(Vector2 v1, Vector2 v2, Vector2 v3); // Returns the barycenter of a triangle given by 3 points
static void InitTimer(void); // Initializes hi-resolution timer
static double GetCurrentTime(void); // Get current time in milliseconds
static int GetRandomNumber(int min, int max); // Returns a random number between min and max (both included)
// Math functions
static void MathClamp(double *value, double min, double max); // Clamp a value in a range
static Vector2 MathCross(float value, Vector2 vector); // Returns the cross product of a vector and a value
static float MathCrossVector2(Vector2 v1, Vector2 v2); // Returns the cross product of two vectors
@ -327,8 +329,10 @@ static float MathLenSqr(Vector2 vector);
static float MathDot(Vector2 v1, Vector2 v2); // Returns the dot product of two vectors
static inline float DistSqr(Vector2 v1, Vector2 v2); // Returns the square root of distance between two vectors
static void MathNormalize(Vector2 *vector); // Returns the normalized values of a vector
#if defined(PHYSAC_STANDALONE)
static Vector2 Vector2Add(Vector2 v1, Vector2 v2); // Returns the sum of two given vectors
static Vector2 Vector2Subtract(Vector2 v1, Vector2 v2); // Returns the subtract of two given vectors
#endif
static Mat2 Mat2Radians(float radians); // Creates a matrix 2x2 from a given radians value
static void Mat2Set(Mat2 *matrix, float radians); // Set values from radians to a created matrix 2x2
@ -1978,6 +1982,7 @@ static void MathNormalize(Vector2 *vector)
vector->y *= ilength;
}
#if defined(PHYSAC_STANDALONE)
// Returns the sum of two given vectors
static inline Vector2 Vector2Add(Vector2 v1, Vector2 v2)
{
@ -1988,7 +1993,7 @@ static inline Vector2 Vector2Add(Vector2 v1, Vector2 v2)
static inline Vector2 Vector2Subtract(Vector2 v1, Vector2 v2)
{
return (Vector2){ v1.x - v2.x, v1.y - v2.y };
}
#endif
// Creates a matrix 2x2 from a given radians value
static inline Mat2 Mat2Radians(float radians)

View file

@ -479,8 +479,8 @@ typedef struct Ray {
typedef struct RayHitInfo {
bool hit; // Did the ray hit something?
float distance; // Distance to nearest hit
Vector3 hitPosition; // Position of nearest hit
Vector3 hitNormal; // Surface normal of hit
Vector3 position; // Position of nearest hit
Vector3 normal; // Surface normal of hit
} RayHitInfo;
// Wave type, defines audio wave data
@ -656,15 +656,15 @@ extern "C" { // Prevents name mangling of functions
// Window and Graphics Device Functions (Module: core)
//------------------------------------------------------------------------------------
#if defined(PLATFORM_ANDROID)
RLAPI void InitWindow(int width, int height, void *state); // Init Android Activity and OpenGL Graphics (struct android_app)
RLAPI void InitWindow(int width, int height, void *state); // Initialize Android activity
#elif defined(PLATFORM_DESKTOP) || defined(PLATFORM_RPI) || defined(PLATFORM_WEB)
RLAPI void InitWindow(int width, int height, const char *title); // Initialize Window and OpenGL Graphics
RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context
#endif
RLAPI void CloseWindow(void); // Close Window and Terminate Context
RLAPI bool WindowShouldClose(void); // Detect if KEY_ESCAPE pressed or Close icon pressed
RLAPI bool IsWindowMinimized(void); // Detect if window has been minimized (or lost focus)
RLAPI void ToggleFullscreen(void); // Fullscreen toggle (only PLATFORM_DESKTOP)
RLAPI void CloseWindow(void); // Close window and unload OpenGL context
RLAPI bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed
RLAPI bool IsWindowMinimized(void); // Check if window has been minimized (or lost focus)
RLAPI void ToggleFullscreen(void); // Toggle fullscreen mode (only PLATFORM_DESKTOP)
RLAPI void SetWindowIcon(Image image); // Set icon for window (only PLATFORM_DESKTOP)
RLAPI void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP)
RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode)
@ -675,29 +675,29 @@ RLAPI int GetScreenHeight(void); // Get current
#if !defined(PLATFORM_ANDROID)
RLAPI void ShowCursor(void); // Shows cursor
RLAPI void HideCursor(void); // Hides cursor
RLAPI bool IsCursorHidden(void); // Returns true if cursor is not visible
RLAPI void EnableCursor(void); // Enables cursor
RLAPI void DisableCursor(void); // Disables cursor
RLAPI bool IsCursorHidden(void); // Check if cursor is not visible
RLAPI void EnableCursor(void); // Enables cursor (unlock cursor)
RLAPI void DisableCursor(void); // Disables cursor (lock cursor)
#endif
RLAPI void ClearBackground(Color color); // Sets Background Color
RLAPI void BeginDrawing(void); // Setup drawing canvas to start drawing
RLAPI void EndDrawing(void); // End canvas drawing and Swap Buffers (Double Buffering)
RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color)
RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing
RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering)
RLAPI void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera
RLAPI void End2dMode(void); // Ends 2D mode custom camera usage
RLAPI void Begin3dMode(Camera camera); // Initializes 3D mode for drawing (Camera setup)
RLAPI void Begin2dMode(Camera2D camera); // Initialize 2D mode with custom camera (2D)
RLAPI void End2dMode(void); // Ends 2D mode with custom camera
RLAPI void Begin3dMode(Camera camera); // Initializes 3D mode with custom camera (3D)
RLAPI void End3dMode(void); // Ends 3D mode and returns to default 2D orthographic mode
RLAPI void BeginTextureMode(RenderTexture2D target); // Initializes render texture for drawing
RLAPI void EndTextureMode(void); // Ends drawing to render texture
RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Returns a ray trace from mouse position
RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position from a 3d world space position
RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Returns the screen space position for a 3d world space position
RLAPI Matrix GetCameraMatrix(Camera camera); // Returns camera transform matrix (view matrix)
RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum)
RLAPI int GetFPS(void); // Returns current FPS
RLAPI float GetFrameTime(void); // Returns time in seconds for one frame
RLAPI float GetFrameTime(void); // Returns time in seconds for last frame drawn
RLAPI Color GetColor(int hexValue); // Returns a Color struct from hexadecimal value
RLAPI int GetHexValue(Color color); // Returns hexadecimal value for a Color
@ -708,18 +708,21 @@ RLAPI float *MatrixToFloat(Matrix mat); // Converts Ma
RLAPI int GetRandomValue(int min, int max); // Returns a random value between min and max (both included)
RLAPI Color Fade(Color color, float alpha); // Color fade-in or fade-out, alpha goes from 0.0f to 1.0f
RLAPI void ShowLogo(void); // Activates raylib logo at startup (can be done with flags)
RLAPI void SetConfigFlags(char flags); // Setup some window configuration flags
RLAPI void ShowLogo(void); // Activate raylib logo at startup (can be done with flags)
RLAPI void SetConfigFlags(char flags); // Setup window configuration flags (view FLAGS)
RLAPI void TraceLog(int logType, const char *text, ...); // Show trace log messages (INFO, WARNING, ERROR, DEBUG)
RLAPI void TakeScreenshot(void); // Takes a screenshot and saves it in the same folder as executable
RLAPI bool IsFileExtension(const char *fileName, const char *ext);// Check file extension
RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (saved a .png)
RLAPI bool IsFileDropped(void); // Check if a file have been dropped into window
RLAPI char **GetDroppedFiles(int *count); // Retrieve dropped files into window
RLAPI bool IsFileExtension(const char *fileName, const char *ext);// Check file extension
RLAPI const char *GetDirectoryPath(const char *fileName); // Get directory for a given fileName (with path)
RLAPI const char *GetWorkingDirectory(void); // Get current working directory
RLAPI bool ChangeDirectory(const char *dir); // Change working directory, returns true if success
RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window
RLAPI char **GetDroppedFiles(int *count); // Get dropped files names
RLAPI void ClearDroppedFiles(void); // Clear dropped files paths buffer
RLAPI void StorageSaveValue(int position, int value); // Storage save integer value (to defined position)
RLAPI int StorageLoadValue(int position); // Storage load integer value (from defined position)
RLAPI void StorageSaveValue(int position, int value); // Save integer value to storage file (to defined position)
RLAPI int StorageLoadValue(int position); // Load integer value from storage file (from defined position)
//------------------------------------------------------------------------------------
// Input Handling Functions (Module: core)
@ -877,7 +880,7 @@ RLAPI void DrawTextEx(SpriteFont spriteFont, const char* text, Vector2 position,
RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font
RLAPI Vector2 MeasureTextEx(SpriteFont spriteFont, const char *text, float fontSize, int spacing); // Measure string size for SpriteFont
RLAPI void DrawFPS(int posX, int posY); // Shows current FPS on top-left corner
RLAPI void DrawFPS(int posX, int posY); // Shows current FPS
RLAPI const char *FormatText(const char *text, ...); // Formatting of text with variables to 'embed'
RLAPI const char *SubText(const char *text, int position, int length); // Get a piece of a text string

View file

@ -1052,6 +1052,7 @@ void rlglInit(int width, int height)
// NOTE: On OpenGL 3.3 VAO and NPOT are supported by default
vaoSupported = true;
texNPOTSupported = true;
texFloatSupported = true;
// We get a list of available extensions and we check for some of them (compressed textures)
// NOTE: We don't need to check again supported extensions but we do (GLAD already dealt with that)
@ -1425,7 +1426,7 @@ unsigned int rlglLoadTexture(void *data, int width, int height, int format, int
case UNCOMPRESSED_R5G5B5A1: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5_A1, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, (unsigned short *)data); break;
case UNCOMPRESSED_R4G4B4A4: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, (unsigned short *)data); break;
case UNCOMPRESSED_R8G8B8A8: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (unsigned char *)data); break;
case UNCOMPRESSED_R32G32B32: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, height, 0, GL_RGB, GL_FLOAT, (float *)data); break;
case UNCOMPRESSED_R32G32B32: if (texFloatSupported) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, width, height, 0, GL_RGB, GL_FLOAT, (float *)data); break;
case COMPRESSED_DXT1_RGB: if (texCompDXTSupported) LoadCompressedTexture((unsigned char *)data, width, height, mipmapCount, GL_COMPRESSED_RGB_S3TC_DXT1_EXT); break;
case COMPRESSED_DXT1_RGBA: if (texCompDXTSupported) LoadCompressedTexture((unsigned char *)data, width, height, mipmapCount, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT); break;
case COMPRESSED_DXT3_RGBA: if (texCompDXTSupported) LoadCompressedTexture((unsigned char *)data, width, height, mipmapCount, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT); break;

View file

@ -213,9 +213,13 @@ Image LoadImage(const char *fileName)
FILE *imFile = fopen(fileName, "rb");
stbi_set_flip_vertically_on_load(true);
// Load 32 bit per channel floats data
image.data = stbi_loadf_from_file(imFile, &image.width, &image.height, &imgBpp, 0);
stbi_set_flip_vertically_on_load(false);
fclose(imFile);
image.mipmaps = 1;
@ -381,7 +385,7 @@ Texture2D LoadTextureFromImage(Image image)
texture.mipmaps = image.mipmaps;
texture.format = image.format;
TraceLog(INFO, "[TEX %i] Parameters: %ix%i, %i mips, format %i", texture.id, texture.width, texture.height, texture.mipmaps, texture.format);
TraceLog(DEBUG, "[TEX ID %i] Parameters: %ix%i, %i mips, format %i", texture.id, texture.width, texture.height, texture.mipmaps, texture.format);
return texture;
}

View file

@ -14,18 +14,19 @@
<!-- Facebook metatags for sharing -->
<meta property="og:title" content="raylib HTML5 GAME">
<meta property="og:image:type" content="image/png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta property="og:url" content="http://www.raylib.com/games">
<meta property="og:site_name" content="raylib.com">
<meta property="og:description" content="New hmtl5 videogame, developed using raylib videogames library">
<!-- Twitter metatags for sharing -->
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@emegemegames">
<meta name="twitter:site" content="@raysan5">
<meta name="twitter:title" content="raylib HTML5 GAME">
<meta name="twitter:description" content="New HTML5 videogame, developed using raylib videogames library">
<meta name="twitter:image" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/img/raylib_logo.png">
<meta name="twitter:image" content="http://www.raylib.com/common/img/raylib_logo.png">
<meta name="twitter:url" content="http://www.raylib.com/common/img/raylib_logo.png">
<!--<link rel="stylesheet" href="./Koala Seasons by emegeme_files/main.css">-->
<link rel="shortcut icon" href="http://www.raylib.com/favicon.ico">