From ed41804a7f945a6b320ae7e299d5cb0e39fd81da Mon Sep 17 00:00:00 2001 From: Michael Fogleman Date: Sat, 11 Jan 2014 23:05:35 -0500 Subject: [PATCH 01/38] alpha stuff --- src/item.c | 9 ++++++++- src/item.h | 2 ++ src/main.c | 38 ++++++++++++++++++++++++++++++++------ textures/texture.png | Bin 35751 -> 35757 bytes 4 files changed, 42 insertions(+), 7 deletions(-) diff --git a/src/item.c b/src/item.c index 907c4c30b..4efc40908 100644 --- a/src/item.c +++ b/src/item.c @@ -56,7 +56,8 @@ const int items[] = { COLOR_28, COLOR_29, COLOR_30, - COLOR_31 + COLOR_31, + WATER }; const int item_count = sizeof(items) / sizeof(int); @@ -127,6 +128,7 @@ const int blocks[256][6] = { {205, 205, 205, 205, 205, 205}, // 61 {206, 206, 206, 206, 206, 206}, // 62 {207, 207, 207, 207, 207, 207}, // 63 + {255, 255, 255, 255, 255, 255}, // 64 }; const int plants[256] = { @@ -182,12 +184,17 @@ int is_transparent(int w) { case EMPTY: case GLASS: case LEAVES: + case WATER: return 1; default: return 0; } } +int is_alpha(int w) { + return w == WATER; +} + int is_destructable(int w) { switch (w) { case EMPTY: diff --git a/src/item.h b/src/item.h index ed801cf15..0d9226e28 100644 --- a/src/item.h +++ b/src/item.h @@ -57,6 +57,7 @@ #define COLOR_29 61 #define COLOR_30 62 #define COLOR_31 63 +#define WATER 64 extern const int items[]; extern const int item_count; @@ -66,6 +67,7 @@ extern const int plants[256]; int is_plant(int w); int is_obstacle(int w); int is_transparent(int w); +int is_alpha(int w); int is_destructable(int w); #endif diff --git a/src/main.c b/src/main.c index 038cad029..d6738f92f 100644 --- a/src/main.c +++ b/src/main.c @@ -39,11 +39,13 @@ typedef struct { int p; int q; int faces; + int alpha_faces; int sign_faces; int dirty; int miny; int maxy; GLuint buffer; + GLuint alpha_buffer; GLuint sign_buffer; } Chunk; @@ -823,6 +825,7 @@ void gen_chunk_buffer(Chunk *chunk) { // second pass - count exposed faces int faces = 0; + int alpha_faces = 0; MAP_FOR_EACH(map, e) { if (e->w <= 0) { continue; @@ -840,12 +843,19 @@ void gen_chunk_buffer(Chunk *chunk) { if (is_plant(e->w)) { total = total ? 4 : 0; } - faces += total; + if (is_alpha(e->w)) { + alpha_faces += total; + } + else { + faces += total; + } } END_MAP_FOR_EACH; // third pass - generate geometry GLfloat *data = malloc_faces(9, faces); + GLfloat *alpha_data = malloc_faces(9, alpha_faces); int offset = 0; + int alpha_offset = 0; MAP_FOR_EACH(map, e) { if (e->w <= 0) { continue; @@ -873,6 +883,7 @@ void gen_chunk_buffer(Chunk *chunk) { make_plant( data + offset, e->x, e->y, e->z, 0.5, e->w, rotation); + offset += total * 54; } else { int index = 0; @@ -886,17 +897,29 @@ void gen_chunk_buffer(Chunk *chunk) { } float ao[6][4]; occlusion(neighbors, ao); - make_cube( - data + offset, ao, - f1, f2, f3, f4, f5, f6, - e->x, e->y, e->z, 0.5, e->w); + if (is_alpha(e->w)) { + make_cube( + alpha_data + alpha_offset, ao, + f1, f2, f3, f4, f5, f6, + e->x, e->y, e->z, 0.5, e->w); + alpha_offset += total * 54; + } + else { + make_cube( + data + offset, ao, + f1, f2, f3, f4, f5, f6, + e->x, e->y, e->z, 0.5, e->w); + offset += total * 54; + } } - offset += total * 54; } END_MAP_FOR_EACH; del_buffer(chunk->buffer); + del_buffer(chunk->alpha_buffer); chunk->buffer = gen_faces(9, faces, data); + chunk->alpha_buffer = gen_faces(9, alpha_faces, alpha_data); chunk->faces = faces; + chunk->alpha_faces = alpha_faces; gen_sign_buffer(chunk); @@ -912,9 +935,11 @@ void create_chunk(Chunk *chunk, int p, int q) { chunk->p = p; chunk->q = q; chunk->faces = 0; + chunk->alpha_faces = 0; chunk->sign_faces = 0; chunk->dirty = 1; chunk->buffer = 0; + chunk->alpha_buffer = 0; chunk->sign_buffer = 0; Map *map = &chunk->map; SignList *signs = &chunk->signs; @@ -950,6 +975,7 @@ void delete_chunks() { map_free(&chunk->map); sign_list_free(&chunk->signs); del_buffer(chunk->buffer); + del_buffer(chunk->alpha_buffer); del_buffer(chunk->sign_buffer); Chunk *other = chunks + (--count); memcpy(chunk, other, sizeof(Chunk)); diff --git a/textures/texture.png b/textures/texture.png index 20d033bdc65c4d752e3dc9ee65422eebf06ae40d..c2b6c34d0710d2b3932369fc9f891dafd380489c 100644 GIT binary patch delta 31669 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%0DG^00I(^4tDke=P{mBIZV13~!r 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 Y*_gHzxjr9#xXN$j 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 delta 31663 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 Date: Tue, 16 Feb 2021 19:39:14 -0500 Subject: [PATCH 02/38] merge deps --- deps/glfw/examples/particles | Bin 0 -> 161296 bytes deps/glfw/src/glfw3Config.cmake | 29 +++++++++ deps/glfw/src/glfw3ConfigVersion.cmake | 51 ++++++++++++++++ deps/glfw/src/glfw_config.h | 81 +++++++++++++++++++++++++ deps/glfw/tests/cursor | Bin 0 -> 136536 bytes deps/glfw/tests/empty | Bin 0 -> 142080 bytes deps/glfw/tests/monitors | Bin 0 -> 136552 bytes deps/glfw/tests/msaa | Bin 0 -> 136584 bytes 8 files changed, 161 insertions(+) create mode 100755 deps/glfw/examples/particles create mode 100644 deps/glfw/src/glfw3Config.cmake create mode 100644 deps/glfw/src/glfw3ConfigVersion.cmake create mode 100644 deps/glfw/src/glfw_config.h create mode 100755 deps/glfw/tests/cursor create mode 100755 deps/glfw/tests/empty create mode 100755 deps/glfw/tests/monitors create mode 100755 deps/glfw/tests/msaa diff --git a/deps/glfw/examples/particles b/deps/glfw/examples/particles new file mode 100755 index 0000000000000000000000000000000000000000..70d3fd1dc7c5af901fac25c884c2ad107498e547 GIT binary patch literal 161296 zcmeFa3v?94_CDH^2LvSc1VK?jf({xKBvBBeMl&RVi3SZMU=T12$pmu9i)4m}3M3{0 z#ux;ZBfh~WN971Ail~r)ynGzPOF1GKRHS1-11JUra=%?w-BZ)1fB$>$`mg`G>n{78 zPS^KU)vjH;c0IcX=cS|#53$)4{R&lXQwZ5#=S-rANG}QzAw@}4hANTx+grIp=>Rqi zccO?jKlh1j`ZGeL3&oT2^`JmI&z_uC^rx;NJt?2nmG0#+`ctuUO!>koSWbU%m9xLb z(-Xx@(4TTXR^D=|1ts-Bm$frLS zi{$!Kw< z+%)L=vf}G+U@DMaR0jFfh`YupXqGzSgc(^|bQ753i>@8wSzgh)HTCJ+`z@Hzb;w0= zm*1(&pfV{9U6fxmF~eK%_bBdY+!x?}SXua((>AHYwU>5D3QK%84H&j&Ek{`;9zA7X;i|n#ujGlV(q>vY+oZHgaKyLIXi=Iq<~ zu?YKorTpDxd5PC9?9)N9DV?CSy>r$4uw4t?%D8m5GG9>|V`KYQR6EPV>|tR&q9Z1E zfTqgOK8oFzNVfO|_pi8*TBDi_a(@T|mLE%1Etq%;chX1g!@t4OK?Ai z`w84jaWBLD6z*qm)Ag))K9A>e5q?oTU&8Zc5vH`SAp9Ece+lk&Jm0|mZ`^O;ej7Jk zYw=u%d%eIPi{}PBH;V8kJh$N9Ch&GVci{e1;LpYLKX{6vP-#GTm*9Cx{O@jXdvSk_ zdmrxq;{FEre%uFf-?!$cO}3xf&WtQ|9_l<{{v(%!99(&2-=g1k4_!NDMeh2d0>|NR z?_3sp@9D7DO1^!eH1ftz{^+{(VAcmu4EpB7Q6rwW7d?IS+i&099RJF9_wDX+(zQ9V zVo&GKd>@{^?cIqhhwa;Pc-+D_zI-cUUrolpa|`DE{(9^Ax19@Kf9-+C#@vGf}A zuNd%a_l&hWK0kK$w&cFrvp0VAR95~UhfXbB_}Q}C<2Pm>ePs2&b_{Tz_79oXDe0^C zFB|(y(!dudk9?-|z0D8g+_w3Hhx#sSnKfzEGs(VRF2C^M6X#beLn3}W;BI-S)VJl! z1-EX#w9~B8%Dz|UZs>IR)%`DdW8w8?>4OuBvI#v|{YyXdZOKl8u%?&F1TrM&ji@mE`?$8W!^*oD>&3!eWnVSEJu+s;(3clo_4==G+;!ES z@3rn8o3q0bh*`dNnUz4`fN@lU;c>#H5ZuG`zP>d?_;?~Zz; za_F>MMqPOJqK1nfi&Ky7xFF@OCr^KC%icP>WkNx>{+4JFd_B(yw*XNe(&3D&6S)oq; z?ZTCd>fZUI>m@(GUw>|Y-)UXCegAyNU1dqN&z6r*&VTmul))DU;gX|pM<@ZP`&29o>#1XrPGDo&hNf@jlKD*Z@&29`ItWQvU~q? z^S^q0|M>Nnp3`34u{F-*tEXa?wggIn@0cf>dB-L`4? zH20~3tPj+u_bfQ{b5!J?p7qB*%&8pW-zN8cbNDD04PDJ7@QoIHG8PT(rGFLcp7waJ zMf%K6?Wg|)3!wJov{g`EFJwx52Wh5Siacef{hyM_Gd3)@eBjfFo{ zTIlnUMLS*tpN?+F&+oU;hvww=^xtFAj*~6?YORHx*IASsW>K%FEaWFx@ck|1_$~BV zY@yHN7WM6H;hz^-wBs6!cDcZ!Ur$3@wP*j%7X7iCg`aG+u+Q@rc35R$w_1yO^|#P} zm4*C$7WJyP=tqBA@S83Cvx7x@xh(3{!$MAPi*lc~=-0Ux<_Hyj`sL@7VSIF z!r%5-*nfkCKBFz<{M&**Z^2(=Vb5zV>~qkfe^pxOf2~FO=Pb%ivalP(DABmh*HMdl z{b!u}I2(x+Sa+X0Jy)PxGP=RbQa>{ekRf4qe~Z-V@2v(bQQ&)Z(P zi!ADOiN*Nyu0^@WEbR7)g`5zJ`hE&s+tV}J!k%DpvG7~3h5yX4@Y`b+^>SM1^M^${+AZY7TiB<>!v32r%Du#5 zoP5B-KD#aaXNiUW*ITs9M;7`Vu+XQ_LVk=zKf2e#-%>2>GuT4Umo4ny*Fyh~Ec|4M zg`5bhao$4Datr%sS@_`%7IMC~@Shtk?Ek%mKU{5*ew0Oh>n!*=7WRMIBK_AE{&1;< zKRjcRezk=iPFmEr%_98>3;tCL``m2dKXk_2-uU^ag+C`*_}e!Y`af%7pG*sVvMuy~ zz@omBEy_J=VgE}k7WTJWv~RkFp3hs@XNiR!Hdy%KL5un}TGTh!LeHfZew%5b{|gp;rG-6j zx6pr!g+5^x_OG$<=R=p1-`bV(1}KKBl|PhcdU3w702y&zCHSj)<9#M_l#7>N`up+E zFBWpX1JH7D3HBqEr2Kl59-mo$zPVfsa<9y<$oHz!% z&^3zH*RHfsN5-Xp=P{x?Prtg6(aJ#nQ2MEyZwce_bv+*y`qY{9e-(C)QZ7~O(Qsf~ za2s|t3pw^ij_>9V<p_l7r{%=>(KjJ(f zyZpjW?DUcr*8uicQJg}b@^3itvEZ*1`mYY*>1kh0*CNp_c6#}W>o)cmFZqT4G&XX= zDfnO6ykl2Z@8g7?{tqF)WjE*jBK_OC9D2cxYZQMd=Y*U|w6MpujQz#?dC^`it(>@2 z@DuUT1=+bp*ngzpXA3`x{eu&wLjK2kyW2RS>-nYN>vr<=$j+{{x_yNHdb!Rkc)62~ z^K?T*`agx8(@%0DPVj3*yQB;I@UK7MUn0Hz98Y+JyRWhh_P4{I72(f9j54AJFIUOr z`d=^7eQCLyLdL`oapc66~aD(pC;WSG3EdxjcQcNPkGk-}4IRb@}&+adpx`o-j+K|3>ItItKhC=vZgx7%ScKGX?+)9ZDcuz$1|pW*iGx>wjCQSeIzZx?>PdM79JcHAT6 zM~m@XFL$44_vj75=}U$GC+_FGo<3b~m&L*D9wFM-ewwF;+U$B(_-&$SN4;Jbpd!>R zt3|&?^Req*j8|8Ru>5#Hj90OtyxcDQp0NoESW9w(ELq6g>AiKH>yEX3OShvF%VTaY>!FHP~%5B`r z)Bl4%lvcsF^ylgQf^QM^T`tBwyu1rgTfXGDia(SF;pZjaapFF~KPvpBQRq`7_{pNZT0Z84-tNPNKO~BIN^h?r z!v5^zI%J`5!037b{z>bBZl?9XXOK_*-6i@vwmIy&QXgkb^HdknAInYs>#X1##rUAN zW2RVVt`_4@rI5czv`e~JcU>*`fnt1!KFf(F!Ee^MZ1@u=5pqWa^LB|{h?$% zC-nA;)cKD%A1%_4M7ywgQ}BBFd!RqHOR{MkzEIe+@dGYE_p3_bw{>En^sMOE0*~in1;Xrv%_~E1toc~_<)vuRx{mTb%0^2BdwF>(*&T`2kK$68vT{?v)5T+$8uJ@GCZto9z67K5u@= z6T&^%wN})(MEHNc;0Fjj)9J%mTw=IY_KN=1BGxl{x!(%?>*9HOVQ%F;p=aIiT(E~n zD{-Q|8c%XwZ2J|PXy3-2oL|BpNl}~s&7b? zu#ahtV@q&L9cC*7z%=7FnG44$g{ZXH1-xqdn5%!rNjnR#7(bUsa5*~!|1TlG?t0FD zDfn1nhgi{G0|ftXv@gkTxt*u47yJlOuf-p6B2VzI3%|9C_4XXWpA_ZBivBo7@Ckx1 zImC%!Vw~?U#?N#y9$qcdKPCLRM4W#f=D z*2Zr=#5kWQ#<%%goKi0M#RGZD>QEl>rKs<6G2itO=`%$760tAP^~o1@OBCmmr$u@N zzrQM^pIhCeWT$41%+B?cdZy%;c|E0>Ba;e>i#(a`$ps!IJ9|oDaZz@e*Inw(&gMzm zO;}PqQz^?YqC2O!jHGA9#c}yrNySAoJf+?YPk|@Ln_pa{WM#N#c))r+v%E^y2#@!k z{G#0AnNF{_G=H+s>nTGDkRx6BMP7tU3&#}YPxpC7`P`+`lq_dKL2*t-{{0>ijr=L4 zrNyP0Oxm=`!%ID$q=I};k$0rKM9E4kd3n9Yj2(=&T=vAZ-E@g@01QvXQ^}~p-7||Qet3beY$_E|<}EFrZ6ussl%tnx z)DmUs@nec|J$d;>o+MvsSuvy}O?4Md@%+^WNu?gQ*E1Y;(o?dk6&DnjLM>sVy9g8r zQ}7&mIj|u!jLTh=TR`fLES}*R?J0xl^dw1BJvq}dXP0<#MfFGdJf*XZ`ZH4-?Leg~ zS-}EQi}JmhQ=w?C-e|D2w>YP`fa9bBcUc)}hiVoSmw8f0Dp{#y+#;v9xDXbk#u9cw zL#B=#>n`w-18}1RnvH3inkUrEEOi%^6~H=4#l@w$`9%mJPg-&DG+#*uyoee#!&9W! z%ID1+8XTGK@k|r4M!WON41$}{AWVJCx zQ)Hi~7Gai2c6;51Z>J_HS!N-mTylO{Nr4;PiuXGqa(I3LnpoJEj1PtG87Uewp9)RQ zDK5&-GrA1(4MSFPQ1_TN8M%|uhjY9%COLiH;?bTGbPYJPyM(n~F6-8k)+|^Cg?%2x zaqCeP#uSxFjR?6xjRdQ53kKYd^?-mAV_YloGIyu3EmlD|H~SwLE|i?2-0XaG1`L^= z($b>hYz$IvHrf?>XJvcy3q84DrYYXCvTW$U(&zGVLlGjg3o-T~ZRu>5GMLrVQaNS$ zQ;OULMz$#)Z&`^a2R@U-#OJaRPoZ*sMM0vNrn+3TKyLO-H&kY|@XSKUh+{(!Q1EQ!Hlg7NFhCNULBYBV-Je{Zn6|a{=1CEh}RfO4| zjKfr=z~s_mcW#cm%*!lcwkpe{izCrYfL{M;p4ljiCJv(%u1ip=K>Zob%xJ1TnmW)n zi85%C#WLiAe>?)G^x zn57ow6%#|F2J(7}FoqZVN^__qjvhUxB$o}OMS1yCe5KrHL9^aI7NZawFj(ebX>8~& z_2%f(`GCa69TLlWj-d>SPC{CSY3>&4aEa-q`GxLM3?l8Rh}of(&CD#4gy;pD$0J_l zc4~-zPWh6GsfwZ$LmR>(0oRtyirKl;UFasm#wj{7mnRaXmN~JknSm+^f~DhX@Rd-$ zSO}#C+ccG1jE_}p$uui(=uI=&vJ9mTA9~Z+{9H^1SomO4mPYSD49v=u9_=oq8OX>X z^W5BlI8-)}hbo)H=3h})4pIxYnK=Ep^YPbi<3Muo9Ep1xUtZC;18rhP!hpBgOIuWlYbX z^&C;gRmLX$X(a_spcZ zA3;=+BJ<0H0frS|86mQaF80Dm6wfNe^kyq1ls?0gYt)HpgH*$?UN6FPcqtZ$qDFUl zW{PT3qon4d-{fP>YZS?s#Tir($n@fZ*;9&(gc(t>bT^zHV_qp)0GKVVZXg?xIBs-8 z!?4mpG&LN#ZEgWI`3*{LK@KhP@TBz&raP<;@W6D4RW8!y@NSS_RP4pn&j#E$OqV5C zu6gsabEZyHXjsq9FI6y^6y?C9i%YyH3iK4uEKd&7=9d-c#K&ismF2jL@__Tu>Ry(W z6-{}OI1ghSBC%`9nMRS>dG7oIMK8Cs5OahVV{jQ;K~bT!qfn-Jye0X$VltfW!vqU8 za(yL`gf%Q&l8XW9EuKbk-eM%lnd-^So}KS0$W^eiBRPmcvvN5+0u2675jkZgXfux& z6(jAXsuy|+b4q3_G@c`7Mp=;@#|4u;sfNh!DVjkQ%_-(aa+gklbnM|umHgryZvjDaD#4LhQ#gdzFF zC&uaQ?3`KdZ0v8`1vJj<^A?PqN9{>Ek|Cft9^5ywv&lQeF0;@Lx6bxpPI99flWDm` zyH8N8^W@DOA&+0#Qws8CW|S1naYX&O4b^_^%nAr37x7pHtw;CiBr)D7=j4812C@R5rE!_Ty8la7UKy zug=QFWK1pg738x0k!%{~$SLfUBFGk~2+yZG1_+$Q=vymc9MN`gdr>Xg@dmq(6vG83 zV?8uQWYEoKc&c8SL1gB8>G+7sGZLeUY(krXp*1K*ZmxhryjWKA(Vpoz6rdTD^$xyH z6F``W#+o3Z!i{-!a1`g*P976(P%czJ9wc<##}rLP7ZtLoVBHJS(Z;koB@WdXkw&Lo zXmlRVhc8Dq++dP=*?>Lm)0JQ>DFE5 z$x5O1fPN+=bk`*Zbw1sd#aThHcpM2}G%<6mE@rg@t6fnVT9~#Ja!XOWW4JNoWvAYa zc?U;4*%+ftK7w^qfmpP&qG+sVWr#IeQ2BwONB5-^{TN1^37N&i&^Uj{apva2x5|Ru zlQ$kWNIqrErg>7#kfL_z?vkTY#oFw3QPvf-SmFT#zdnT zXXck;7{(0 zU^8DoAB5-8PL#w+&Sa7sm(TS;0XwO^^+do_CkP?2ds33oWLW zzKGI0VW5)CPP`Wfr-fCyN^HyvWZ-L@;lrd_8%g<@ziwFW8Z z$S$M9by3|w$7VXy(S7jf5>yqVOs1Kzp=D3QysJz*;eFegz{Cq#CI=o@Amn+J}s|+z|3B$BEzcb$m zZm^N=Y5HpzF(m2@fic9H>!#Iua1Qtk*H)U}X@uc(9$PCiYti8|Pe_d!q&KI>=9lHO z7fh5~Un+@(D0>ZL$_2w&&!qZ@!j4;m3PZMlPr2zN&YR7SxVTQtPPFL6d95)|ng#rI zPSHm<)8r4M>0Us!GW;#j9gLwiFsBEVCXLFB4_=DvZXc*oQ08D4B@K+>IJgDK3HiC6 zw1Ciy;ya|g;wjm9hl71PD}t3Ayr3fa?Ydx)PAEzrECU;r_WeDe6)P=h2<1C9P~L8k)q*yU<{6WQBGEmK9iCo+fPawX&{MrBg(cqE zY+VqnJykV$(ZsY&!uf+++Lwt=E9M-r5Du!3sgOX22wH9E3ewQh&f*31$YQKi_-fH; z9I8Y+LmDfe?SJJ(8YPAt(;&qL1ilIv%OHJGMCoN?8{2L!fi2^MG(lp0oM1jC3dCq* zPA1ib`5l+|myI6;3T^dw*(1_Yhb3j-aQzL}4_1tDyb+8GuyKP7HV_J=9Ad=Yczqx~ zPNr|rKOE4X;zJJOUu4yJ{-jv?vWA}Y4O|D@`W33sS2AJvUkGkJM*a?mc=}&(KAwVq z2%&!uq{}2({Lrav&__t*Blw4>13pNG+bZVduT)M86UY0J8r|ZlFalI+X z_j|qJbi?eK0=u;d35Fw;BLa8J&xa#kpqvo+QieM# zX9d25;f_j&XkMQ8Qqr%3Vi)*HCNEs+DKOV3OwuPr8G-?abfv45>dGu?a#OrN9ag7qMkB`J_63@qHVil!D;`OnZ z_*RJ*pMDaJe|VbLo^;ViQlcXyo{y%)!q+4opBx%j4~f@(lp>=gKFUaqf4^Gd@rj>t z#Y(*RbeP2rm3VwoYFvpDk54#_%O&ypx6c%rF7f!J(YUfC9-kr_*CdJ8zs;n`sS>Y$ zJ5PLx#N*RcI*Gqp;)#*~A0hDrSwjBDF7dGv-$UZ{Z)qtyTH@uUW{kw&D9MSH_(2jsRN@Cq ze4@nPB=IhZA0qMT60d(FOwm~qf3uW+lEmL4@lz%KR*5f>_ymccCGodOe7VHmF7XQ` zK2hQqOT1I!mr49EiC-@9NfN(O;*%wQwZx}L{5pvrF7b5|KSJWSOT0_s8zeqe;`d4X z9TMLt@pnqRCh=(!-y-oNCB9YS?~-`s^1%3ix5P(Ce7eNjC4Q8|_mKF}5+5z`84@2O z@tG1IEAe9`eyGIXBk_q6pC$1wi61BN=@Ngh#AiwTc!{4R@e?F|s>Dx}_!5b~PvU1u ze73}wOZ+5>UnucziC--7ITF82;&UZ_xx{-Uex=0cN&ISwpCa+=Bz~&I*GYW7#BZ1Q ze@J|T#7~p>eG*?F@r@E+DDj%a7fF1J#1~6^tHhT`ywWq^|I;NtLgGs$-Y)TF65m7O zy%HZS@ji)< zSK><~exAh7lK66oFPHcViC-x34@vxDiLaFSWfET{@yjK?TH;qq{CtUDE%6H^ex1ZG zl=wP{_e=bCiGNt)8zjC);`d4XBNE>z@wF1KN&F&-Z;|*%CB9YS7fZY%e)vr5pCu9> zA@Pq%yj|iSm-rqM|AfRxOZ-xakCFI)N_?!uKPmA;C4QO2CrbQN67Q1urzJjJ;-8WD zEQxp{#kCpiMC4Q*Huao#h ziT^<2T@t@u;?pJmLy6Cl_>UxhlEi;3@lz#!gT$9e{6>kNCGm9o%Ow62iC-@9TO@v^#BY`O)e^r=;@3(1c8RZ(_#G0zUE)8L_y&ppOyc)R{O1zi zDDhuNye9Ggk@yyg|5D;xCB8x86>HkC6CX5^tCI-4fqJ;`c~=w8Za~_!x=* zO5$TB{%eUJD)IXyK2hTTEAcLg|3>1|C4RreXG#3G5~g>lf`T$M*7Ts7f4 zUa%>y>N;;oTZ60elL)>mZyWrNWj5tRTic$9%VGwd|*1q{a-xC_I5 z3>?XDlz}f~*k)jr;p6A^`q~*jWZ)=xWd4f zFg)GBJs5Ty_)>;P8Tc}Wod&*~;Wz{LWVnxkdodhk;42um8MrsY$It2Yk7oFgf%`DL z)4*3UTyNm37+zyw2g552+?U}c2ELl%3Ikum@N@&mFzhyPKZZvc_*#aY2ELBrI0N@* zxQ~GcFdSvz>lwBgcp$^a&+7G$W%!VR;~3s);2RjOH}H)NuQBi-hF2JPFvCj>d=tYJ z1|GujbOR4%*lpl=hDRCrW`>;xzJ=j91K-MU9|I>a9A)6!7`7Ssc7~7tsnq zW4MojM=~5`;JX;M8Tf97kDt-&pU&_h1CL^Or-4T^TyNkEhSwN4li?Kx9>eew1CM36 z!oc@1Jl()q47&|Hj^R-TzL#OAfyXl(XW$78_c8E9hNBF8AHy~SXES{Kv|j&73?DME zo8g@Xp3HE)fpZvMW8hqdR~XpC@Dc;(F|G}`+z|$Cx zGjIXJeGFX4aFl_I7`7R>nBn8Cdi_fnK4jqO4DU2>DZ}*!E@OC&fxQf`FtCr|B?g|s zaD{);JFOj3_OqFGfaC@F4>)VR)y3A7i-Qz>hP$#=uW7yu!ds8D3)G ze==NQ;3pZLZs27MyAAvl!=nuRG{a5P3k)CsU9bOg zh7TEd1;aZH{365k27Za*H3oi};S~mch2bRzewE=01HZ=bbOWzs*lpl{F+9q^uQTj4 z@EZ)r8Td_x`xtl?!%+tQH^Vjqzs2zJ-}L&gX84eS*D$=(z;82LZ{T+rUSr^Q8D3%F zwG1yY@Ounb82EjLryF=3!)^nA!0;#ouV>h4;13y&Gw??Y_c8Ft3`ZGw1H(20Z)EuR zNxlAc3?DLZJ;OTh5jGQ88kyBMxF@NS0J7339mBYS4{Xh6JBb@neqCOpQ3 zN1AYo2`8BFU=to-!hKD+mkD<_;Ybq>H{o*&gWL0W6Fz3bhfVl^3GX%GFHCrg34d(D zYfX5S3BO{(&zbO26RtJkY7?Gg!afr&G+~bkPc-2%COp!FQ%pF)ga@1O02A(O!o5tm zy9q~{aJUJd!*7G+{{6cNA2Z>@CVaqz_nPn*CcMRjKQ`gDCcMgoUoqk5On9jY*P3v( z3C}TMp9vS5u*ZZan(!DC9%;fUCY)fxgH3pV3HLSOUMAe#gd@ zCVaqz_nPn*CcMRjKQ`gDCcMgoUoqk5On9jY*P3v(3C}TMp9vS5u*ZZan(!DC9%;fU zCY)fxgH3pV3HLSOUMAe#gd339mBYS4{Xh6JBb@neqCOpQ3N1AYo2`8BFU=to-!hKD+mkD<_;Ybq>H{o-YruH}CV3j$JijeO=g&suu)8 zdDpAGtH9yEj>6u5I`46gb&g4^9WXuArZ_WG;(i?CKbPV1pLA6mjj<_8E@h2Da+kl# z(E~(WooidNgTyM@v>Ozqx=yX4J#w1=XP5t=|5t5mw4zkDwy9OWf~{=LQ>*9*sIqmc z?^{>x;3*+CWh2Buj`ko9DL@rTR6eIX5;c}n1rn9Ssox|jmQ#_v0^)mdDosk&nNyh( z^#@K0m_pEG9C+yUBdEAGZ519`Ylfnv`afyvg%_%>nuI3&Cv04`SRvRH_Fq@jTCve* z*|oVyKC=2pwaOMs);OX?j#W@qdx%m~65;Z1)<%w3l$x?G8$&>8i452`h7!1ufo>aB z0#_5brKT(_C9W>be+Z@h7p3_hbR_z{j%4kU`$(Z}c-gI1{U=0G)`upBLYLT3w9qy! ze=wEZrp2MjxLVr~Le&~B;1NToFnGKxho^5LnCVD%)p{L?l=Gg+D89gvTrHs`)4|PyMwH_l}e5wVQE&aZ#b%xD{b?*e!ij;Plw{S;+G2r0{w+=172oC`I$n~1YrjdY5^U1@MO zgS!x1O56_Tx(M>FQ|TYjbA6{vg=|-C_#<%f^r^OP_~ks&+F59TuLYv@=5K+j+DwS4 z8GP8#dPK0+%W$x~-WII&6R-~F0$P_dE?DaVg9~V#1rA!roni)nl1I?kqn+#QQ2qn@ zlg_FjX+2zM?W#?<1^=9ccGESi6IOqV`fdoh9Mz2oL*;(O3Frni7n(PrxiVDQ7M_Z~ zbh);L-xmmuN3ghS<;~l|#|cua>cMi20oE46P>?X2!Vj|WgAP}k{|s6@G781ST!y}_ z*}M;Gzg(}oocC9%Q(fGS4UOpO8_S^uy!fIvMZw6CND$9tiqlfz?82L?li@GuV)OA| z(L(ay&Z9bFpm_Wj^u$Gm{BDqcQniPlg{hhKjH`JF(nJ8<&} z6-jgv?%E$RvFl@FW4P5P)70{_I1c%DUX^Lh8^ZsvLCi zs>W=h1QDngxLikn7s{p+QMxFs@gNJgNMSTIyR?-p7;h9Os`kq<8hI{3s0txh?MJKx zZ2^Y3jSA6)ptUTdKcU)_N$YXp!!W>UKD-;mCo|V046E!%Y~LFYMtm--Te8Cr3+)CU zekG-GsYTmSxhmwWQQiQQDf!(Xtt{i8G?P0 z*hoW!U>_lt&*#XjB{ae2Ar!iiLX=4BN1=3Thu##LM4|2oZJ>X)YomwYdw|rNJ756X zIGLC#cn!w81Al_ZBO(WmTA6Tm4#rcpsxSW5B>Xnprc}47)saAa;{62;y}@=7{+Xw3 z{_wqs*4{)mZi+DY1je`zAyGSp9?GpO*rmia5^K8{!iXh(?mq{*Nn@iOCSQB^b7#pr z>b1Q`P!kMxinbq%5yV7hASre2xHj}-N^&J+5JB0tB3m3w)*s2#n9Z6fq1T&;L8={; ztsXhGW>ki{D6;i>RL>UvJ1h57?F+$Sng66qNj zvL;~*{&U%6s{J-$Dp&1*C8x!9 zhD(LM+GD%@h);J*^G6O z8xVrzG)I3{-)LGW&V^6$rtXGVV)|bJqg*mkQJTCMnYHIoX!Ba_pLjGK#4OD{g^7PSVUobO4_NdQSDt0k5M*@C(^HA=?6bekACM}{uWpLFSonuTSHy8 zt*)Ktz1<*Sj1Umf)|kiM3+VYtzw(4th*o^pjd4{b+(1E>|F9R1m~az-w&MpFE*C0p z4X*~aO+;R!e9GT66Olq6!ejh9{lCYxW%zgdPsE*~uVJ+mSO<+2egNx`>iynJ;EX%S zg{1}ic64w!VfdNZ*fvyt5;2~YlcB~msxeIv5{<}i4*Z$m2&-%hQx`d*C}a*^3YmB& z)UqdB8eU8*19;+D+`p?a+dw?%=%L2^2LZ36i(r?@#2L!1x zTZIZ2aajYt=CK71^bMNqAt_Mc1`Msd3?Z!7n>;ye08whpXOPy@p>4%rgmfqre_2gY z(l%`#&(8GBb#$YB1<4tYe5hU1V&qa|&ZwCQTOn1AY4QIFaTqStm_I?TVMTGn!4&pe zQGq>b%mFns{GSw+Or0KDZ%TIbw5gd5>X>cn*iCB8UNy73kE>aS*i3BE)y!|4>X-&~ z>~6^E_3bHU5Ev(GlR9vpI{zm0aeyNyoobebdR1<=QERM2I{$afUfqBPtYrD3(i{;` z1avN${s01KL2WmBGlYY~Ul5cLg990)8x%jFH)n+QFFj=hOT+vH&4?mkf0z|@qy}fw zskLBL&4)ade}*&BB$6Vl=7D5w`diaCr~&I&{OrP+IVJ;#74)wXx+=Rk6omJ6roN61 zEn5UeyZq-izKS^s@-c!1ooH;w_60ls7rBFEV#`Yv!#*2-d#(PR@}Oc^cx^(Uz>$f+ zxsKeE>V&UgLnu6sTrrt!gZ?xDRms|7kmwp{v`K1AE27Y-S=2+&>h@manc#6~pmA_2 zCgVY}Nfg?TDcO@rjnV!=Bk=b$ot8Axw1&ZGV+c*V(=l1pL_XjPRjPNWRjrt2(`w&z zlp`KH$$r<;2>P?Dc7h{TI|9GNz@;Inb|)k?55b^Rg@lR{AD#zx-cX#|V2r)+5L@MJ z1m*I7@J+`Je*E@tD5i|kjRU5GmH_<4AZ}|&W4#4Q}{L0 zaaa)^g#@V|Vas$o-D!Tzfl+;rdPAY+hs&`laDB`)Kpbj1U_T<7FIRVp8NBK!Zw{P<3XIxsQ}VRim5JSO~Np!FCOsp0N~`Oqi3EX;J==&G!n z1auMZT!-DYEpa&&Ni#4^z8!1V}$3N31`6CDE%PB`Lz6UWau1{OS9^ zWxcD$90dG^!k;*?Ed}^5f$abYWU*AAt1(DHE;j)kEh_6Z4gdy8Kf$e|ihT>A&HRs}+9|&teIXqApsB{xht$+gdUQyoFYdWO?liI2+m!jYW-6 z{Q#1|ao#F}<4neG2H`RazlyNPrc2QtBR}<)!!cc$-Z##o&}|f&L7_nuV&^+QA4G`x zb0dYwpSAfv(%fI=pstwfx-pEMHu^@mDn8is^9E_l=dT2&O6>Z^(+m`9tMu&U6WL{E|C%gWO>Z%6Fa=zE;X^Y?f!uQ-qWm*P9h zI#*NENLulV{!!EYG6;;T3!JLJBcG`2x78nRLqyXfC?qei1c826oT1ayRR1|PC{-RU zkp`P&$JDqwRxT_#4*98nrfcuR{>|}>uL=KVdMJ8j1OCpvf%nQ;s2KJh{U|-}m06-! zHfRrG&w_2T_FEeDN^c#7H5OK@(>vfZV@%YuAPaUIK+m+=zJC0tzX5wq$8%)uyAJA$ z=$a2YhGMd6QwRR4&VLK$;P#=85cy>bO;?909KH=ya*oibr zL?$C`vKsR<%|cLNk{w;}bA-nIh(B4AFeQ@L+g)7%qX?3;aS)XiLE<1ID?K7v9jE~j zlOCbYr}Y&H8{CW|YNXzAGKJ(}Li`*lkE`>4fWGR$6YBhL5CA`JGgXD;X>3t3VH1() z>@)>LC4NhltiBvlh27LF>XyB_6wr%-M2PCO1SOS@fU><7AOsu6ATAF31oFcgJB@VD zqpZp;HY%y&+&YZZz9Yz(h2&+lrs}l;|CMoF{)D4?b1k@schiWHP^B__X>q7x)855C z2R=qXYel%Jh9=M6%C^K9l%X``A`92+j5?q4Q*B^Hn2QZ#yn1!09u=Gz(R3rrpty2q zV*?)Z^&nSm@+uhb-px4sz*GUU04HU&$tfVCdPPCm)Y_g^2v49>F3edt^-F@oCh|!+ zLOY02fyDJ~Q>hiMh1_xBg}+cZD?Fb)qmsI5?~7!vT5J#4q#l$ZnI*ipPAmRiY{qb; zGcMc)vuTf@>!S}mNT)pG5>6o{TMy9b);6t}MM8Bzwm#m4ZCV;F8Sc$=xS&hq@5i7E z+~iI;(YWqMfDp&DTtG3<@-y}v7ru=@wF+M?DcoxGGwyFbZx=g}QL?2^QiVZBqIIQGPLOj-OS=eaP zx-E;g*--#d2qe>#jIMOtsSZ4i3A~<4qh`)3gXN>jF!UV9aX)g>1_-N)tWP1ly9dJ6 zfjeiU14K?>;6F2xkRm*TE0%p9dK`eI%J$@jzd z$d;c;_7BC#6DD- zP}zK%nd(0~CIjyyE05ZPX443~iNq0o7_CcR#M-s;hX`MS%l`|#dK>*;Rt^ei{R;2$ z>ZaB49S4Mm)x1ZSzP z^TAVYQM{L~qaMzkhL(t%vEJa*47Fe%@+*|AyXWS0 z{|8!DZ=Ve4Oro@Tuo>RC3g^|L;n~!FV_g2<$>n?e#aI15Y12@ae>1tGua~RlR)?#) z&D#;(q73%q)u}$_4fRh%PYZI@j;KlxoY82X!f^sUjLO48la=WIGY%C#8XZ(@4``2K z2kmCfSN$Rxtme)Lr~eaI&E>B3U;dHt!z<5x679MUdw17$Jsqx!`rlwxSN{IQVJg;} z+gia&2h)ZG5$ZyPD-s%WN%_8nQA$Iko7|DEIW04%> zdI5iH8Uou&?c4NqLl9>D@#Id+{L&c%8ntG?GB-~CwuNuWV=EfGRec8pUE9L_A{2j4 zt;MM-mP=bw{a>g0u`BMjg_7V?imfg`S{6>DR(%DgeCPnR`U?cq_gpsG$=4(7^q;Fd zJwUB`j%DdJ!-J(i&hf@2s~fILsru2Io=j)aZOQ(=m!m{&J{i9DP8$A>|o@8^?X4#rw;qA38{4lc6rQ>6{9Qz}moMcm) z-(!6FtPn-59*5Sd9b@x%pMw}Z{l_A`^CQHzHP7d~KXM7=3ay?;5@_XH0WmjwYy6Q3 z$X`1q#2Np^+!UH>BK$j3Ymz&l_lMt$Y)w8$;^p#cP2>WcAK{Dv?_u1CZn_MA(D;13 zMLYEp^}u&6{+-V9+i!NNOFtP=oBQ(3O;=OWKxY!;Z%}*3B-adhEt@s?9^C*qsB!rR zIb449nKXa0qsO-J#YjSzlUn}Y2&YoZ?{U@iM00|g4k0GGG zmt?Ed20(;et*!upO?U{ldZ&Iw5ZSJP`=`}-;Vu3xsWrFJSTO|ENWt3~y?%cBMsS$Wpx9f8;Fb~2I^`-^1%fIauw6xi1ecZktv zZ`xnGY6dxQ2v5Bcryt)3qMA-%Cynv7CJn1H?BXs=^S8RLLkr>L8^4A~tr=l=*4%@r zI`1^U-IWtwiV|EkT^t({sMH#o{BNyK^>1<2_GCRl+etIdF>f!l?c5yl?>g@g?0js% zMZis?(Kw62u48SR3}wkqO}9{+87mBQC42Ld%5yfg`btEI+MSwcQ<87N;m({J(cv8M zq#o4aAh{bPue+H{pP~!=8DkAu2ie=2Gyy0{Qv*PtDCT$i{9Mzqc5z$V*|y3vHg!Qq zw0F%tVKsM0B-rrZYx4dBd$~njL83b^?2IQ;`8wg)L8UinV7;9x&xG)=qiRNUL&Yx~ zV6$WM)(T;FFkwB|Tu{Bst5*DMOGgxyb2p;UFqlh?`cp~UnM`$I9iF13aP`r*843~Q zzRXZ)qWZ+v%G059J0(_~QmbivK)caMMDYV`(L#p~Oy`ifU760*yD5EDIs&xf8a(3% z97586Hb;B2Gaa5bkzOv&fkg$@Do#2Um4X?^DAD^a;ct;PFoe$G>(+&;K!x zpJ~LCKhVzoEG$+#tj&2(O585zhp-05{;;!mno*g-4R$L4lQuDPp!3f$(Wn&Cs^M-25HOs<*N zC2m(rb=%x7$u+}S5Npp($u%?WDb=UucC4Ihw^i;^lHpw`)pdls5v~~#0~7^uG5-4G zemiVCljFCmckisZJGOcUrHW;#I^t_2e7@)HbX^B0(y4E4uNe`>iQ!@DTXjxbea(mn zK}2vOuFhH6hAhec*6W6MA+GX#oA-j`>t@(f)VEG0+ghBI0mSfbAnKBBb&DYM5=*f7g`Xp8&M|x?MJKT6E!j8+ z#79%(kqBwZ(Iwe_fR@T<*%B{rG2TJb+IH!ea4`R78Z!sbX2Mr-}i2Y&@(DKQKX0|JesDJ=>#D#VD6HA9>Id+0YfptM6A(-g8F&JI&?Y(O!9l zB7F~hsj6k6NV3FL{$D3HU1!eUIVe9gqW=Kb#HN!t6w~K>dVAFF)-pVtm&3F|;?%KK(znJ+46t-)s0ji>piaf4?yT^}tyC z{Xy(R`l2>*bZI% z>91qXfdRy~j>t)yuzmWsK5oL2Y>0k6j1~P)&a)iNe#5_*K4fw2A(pOb8U{msT)rEs zvubD_9(flcwWj~DPE`d>4S$?-Z>Tbc91{L~PMh*RDgjlmg;o=rIzg>KdAgr!U71Mi z3HdnB+g&>wiaKZkA0+<`TJL4K@R=r&idkd7voZHw;!% z3v0Ao0kxY`WKivPMn%?w+J<(e|MC|d;a4glBrLoVJbhnOo~IVn(;;4r zHV=hv41ouT2BL}j4dlfOv<67SH_3GR5xqVVS<`CYq2VO0_6>4F_(dm3Z;p1=_#)W1 z9o472gIxYUXx*xf*a20s&~y1WVeoMIyE(L%w-VLOfwumf>ly-GQ*C?V>PGro)BMNT z%f!Lwa2ihIjb{tnEmf^TS(P7h$A7dAYE*ov*Hf)x%az)M%bh!qi7(Ek41FBUYKvsgA1&6aLB%DBL+P%mrxuW+5>RUZG{uv~KEMuemXF>ZqZ>wws zpmh`TN9qJFsT2H4;wwMN3aoB1+;V?I3tma3R-pr+rC6_H>my{5>Q?PQ)7Df{#c5T) zXfR1cTlCy`1r)#uRG@Y%@v>=a>?j@+_4^Gh zZyvHw+g7=c(nrI2Y7;*AFVsusrL1<~H;@e9 zy9|y)d+=U|19BSC4@mh@KoS-3;~CaokMg2Jc+s~}%%?0yt(rhZ4`5l7$-k+b5Gp4L zT%bSJp~OdFQC=cOODb_1Pl9}vt)Xf)ZNn-*B=@zci!NoI2BvIkMk?s@!akImDN5Z= z9BmBCXGN0F05+|{AHDu4t->fx<)xiNTWXJg%Ele)?-=cazZH&cp zb1wfQ4i`dc_+mGmJs)vo;aOGZO{7mNCn2o%d&E(~o=-T++4EV)V)lI5v79~MbgX92 zcO7-?iO+QLl*X7UM+^wekTu<(8ADqktSH&mAHBBFRa@my`jCI&yW>=U%LfY5x@a$y zR*S)Xy-gwb9VLrJ%m#|afD%E+YIt^uW%0>4)}QwYHR|k$tyPZRNQCWK_x@Cz|6nsV z6y;!)+UmBp^Ek+hP#08CirUCeVNO?0ScS{B{kFD7*!LL_IKSQH!V6ncJ8*_G9xrS) zFgT_{x=Z0L&0is~i~?UE@ID1FW)1#|0v{r9jskBZ&=W$N|Ajyw3M@w;grc4#h60PU zUEASSY<)F`b!v9PhK~&9bXt#9$Y+$*EW4HKTnLrN^xXBFosK;X=t zuAHsaJA4DmAMBW`cxRN)OH{m*wkCJX4MjRv&4NiNidF@K@XejEKgI^ucU`jjURuXo zN@`>0(av&g#gn%O^7uYSrOTnIvJeTI-wx!bOiJ?#V?5g&bX=6k*5|duD=J%~XQbgA z76-qT=X=kHhv*WhgLS+AGtvqFCMAyVu1rOjnJU!mKAyd&z|vdRS9ng)_kIwTB{H@9 zJz?efjx&41+E@7-(sH&ATbSH&0N&zE#=$O+@RZcUKag;$a@iT zxkRr1lndiCPHT6qC&T2a*KbmvsZ&!nVeGpU=u-n-AT=4@1dnjx&)w;G&q|@FyVILr z3)qwSOU;7x|EWGu1E-3tE!(Xx?Jcl;%Eu%}OTt?#&WFT8{mhEMhujE2&nUWMQW0ofza6?iFfct(gT)^!`P2UEq{ltv*7d8NMqVA6VD& zeVKM8ay2*9KGe1mr&3sxETDrYR3mKEw`2@x7KnO|Dj*BQ?(O zaCcvV@K3R`!M*k=u8tMz( zN;={oFTTO|YvRJ0iA^^l2OpQ2JRHEv@_KN2ndS2)g!;m^j+mg7&zs0X6A`+Ph3-Qr zn}xCwn#4kr5OTAS8==W8G#R0sP+!E>5jhxQ5)~BhWXCF}Lvn8o_3A!~2~Xd1cSQ|_yThMZU$_JRkQ46;A|3EAMZo(?t0+-V79lPe9>GtV8hj4V3>_pa{MEuXgF>`vQ?X zAIhI#Sw1F}j;?Lk$HU|p=Mcv5fN*WNN9Z)Pf{$Uo-ZTSsLSwSArvoMLMu>)^5WF93 zdS))oJ;rz_tc5k{_rL4w3&@QWa`81wIMv$~zmB?%7Xtzx2aNLa)Na_Vjc}R!W7A_y zUekV*C(Rkmp0(kt?&P+N*5BMw8*8^eLEbeD6R-FjJ5f4!87Avj$n&dJ$bp~iLJEGc ziyu@}JqwK0ND6dLt$CLH^oL#?U97jKD}LHg?;Z5&4=*53(60XJ$1zV~UScbZ_$^)! zU$^)-xoS}DExzAfHF#O)|JCIWp~%=z0;Ui%e+S1l6rs|~mm(wE^8{B07&zc>tT&nB5w~~3&{Ees#y#YguVxBYn7N;}X z*Z6_JUlLV85{W!QDX4!ozpv|S==xPE(^ajSgQT?!+Fm%@h8KCQ;WJ%KW2U>73Y~R* zpF`!^)mM9b2~+m&fF4j3cCEue_R^Q4ACW581}Urir(u6e(h*6-`#PcjT5O4$Ul#hq z$9r+by>`sKY#rr)pB{K0ghnuIqiw)X*o-lyoa`a|`GAWz66I$L9RK_DFz2V=N4J~* zIVnFaoLv6*>0!=)n^pdaQhv7Z@xM|NHbX=fBM=|3oQ2TRZvRr-wQJ`IdI;&pX9~gFdV-?W`j7b+HRs!qF5=*P>L}= z;Wu`li&8L6j|>PC3ia{A2j}mT(BO{9T9&l7Bjdx3OfO zxrTjUoxYOXrPgxqXL9xWivIJQkR8$V%px{F8U45E4x|qZks^Jek^WDfKDeJ=EEONf zOXG*gKfuU8o*4)0HTtGVobhX4;rCy(XrbnjcRYOmjq&1GGPgw{HUf3`U+Igc9Wp(7$f z$3}#Xu!oMdV=|}H}Ts60AxGNAkOB>1U}(aco|<=Fwa)D3uz2P_4QJ^FJ+DNP?^8#ye_mjnOU{#ZKh*>pUYj zVTyLuT%>b)>38_M#iUkl`@h(G_xPxaGk$mz5(qa>RM6BCS?ks&DmGE5NfFJ$1~$5A zRKN&`XaGS0Q`iU!NaF4a$HOWL6l%3%>#bE36_txX!X*K`6sQ-}T7%a)MlPZPUNGqze6tF^0c1xR| zIflI__s_Uithjj=r7VtOCj=@QehQ$+h*qNg1J<=UrSRvx`*C@hkrlw5D%R9&>qP64 zjDU4hH*Q56QLf|pBS!$eh_Nv8BY+37DaMUyZ0KcxD6`QYAJ9S{5MpS9e?rX z#+>Uxt+8-pY4Jv5&ZU3>_>F~|0>#@(jK!P%(J#VTs6^~SM9Ct9-`r7Z?y}Dz8sq>I zS)ZK0r9_nlEAa|;ttL;fC_EHvDZ&&r1A0NU&~s1gjL;Y(nYI+PUL(zP&(#nK_uLES z!+9xNF$+2)zsRPdq(p0bT({e)ZoAD-wA-YPH0bNuZqOVFSBsLhpu0sJFUsP9dfj5p zzn%|gIU{O<=(0$CPN*2`MJ`SZ8=(O||i zJN@;C(Fl!!{KittpY6}zUutgBE!9+--_$>TL5ET+&7Z%Wt_OqS8QI7KE%AA&`G!vQ zVQKz{{^IYaMK#~i4wF%G01dK`Eg2o-%Z9&1@tek+YY`5As(|?csA= z*no9|BeDMcuahEMn!hC>udn&*k3e2+h#l&kRch|ma{X#){;QPN(zH#GSIVg{XRE^? zNXBK|{D*dw7Jq2W38RMaM%pa$ISMaYJ~s!7U-27@Hj&M2%{aEKLoH$aZY}S9Mc(IP2er&>NR{`j zguJ)>|0nPJk0I|`%nc~#GP6#1@{g0cIYq$H%j=w8eme9OL?wJ{S)>kq99+e^2sTK| z&|S>~kZjc4j|;d;tswe%T_FEQh^Bc6&9k+>rDx%fc(L8_ibnRpy(rw+`b3W@eiS-&>++;-8LG8kYvQ@2gjm$%> ztKv7m)nmv%1Nr}C#nVv9BGfzoZPptV3#2ie{gHKfz^%*OPF=EC7f7bmWroy6CF^n{ z0(4WAq5=sSZ8>IBp?>u_&1faaC+ky*_Rw8!H_ioq%PK(`qoJUQ{{T(w*P8esx{a0p+!K@W@!=S&sVI)V{R>$P|GfcB7Q-i2GShiM*%fOxnD#eGO1^vc-jiu2;WY4bfA8`&@>xgD6 zA!7&si;U_1(n`K8EQ5>kbL0zJz>zO#f&Z`N3mVOlFV{jjrq-5WsrgrIH;zAH&Cu73 z=zp**-d0nKRf1`1>j6lcBdrFY%V8&C1Ok({>2bHs00eoNw#YF>rp=PgG^*hMeZ#B|<79sauKr0>!UMFV~}JCh8Qv)2)DQ)6UaM>hClF|JQf| zjnLex_lJr%8_`R!?4BG*tSaayXB2^cYCDRw?frq`x28z%=ivW{zxW+3-uuEJ^@DI~ z?+=Qk+kG%pJN8}Sd&gD;oUG?G_hQze(&AlHLx8FWx%LcgJLrKRjv++nW91#rYGT)Q zu%=~T9s=g(zfQYETyh)eAM8K0ot^&~cK-UHxeGQ{^C~swaT=g{z3Bh#dQ7Cni}_?F zbo}Aqgt}ovhYn?f2kVtLkY8t}!NoY#CA zvmU3NCP0&HZ^3CozuETVVh%+h z4y`06oz+#CaN^L5t{3LH-PEuFWPM%uEzWaswkI*qorIgI^gMUL-vC)NvemYS2*9+! z`8*^YkZoR>(|o_%|B`zp_q{_N*)>o?>ZC`&TWLQ>o|gT#9k%Vrp_4-K8+yR2Tb+Po zE-(k=EGp#))``y5szh4FJM?vRG7fUB@M|nm7rHtt%BrZ!@51BU0p zzO7hy*5|ab^!&jJ#LRgRF}Rq3hv&PN!R-Q$IEC-gK@-=sjoN~K&sA1z31fbQop;<{ zFe>vOKveHPN{@i6GatnZa3#7T^QEU*&TljCLFlwu2aL1p#+d<}(1d>!jyuAu*Hirr zU3YP|3ETf@gdi4`u_QjR4zu$-#vA#Vz$*G1H0Nmj0KYcm=B$USv2RnTbd{6-bp7E^ zN3O`Gsg|FW5T};5r5mwc2(@p;PlC_t1Z3I#r26y2sq7Z{(YwXml(FXIA$#=E?%*(v z_=Il=nyb0d&CW1{qETYJcyPouEloAEMy46jTvVlI)-`~RAW_Y%QGnhT=vqK*lp34> z)V_-~v#tX)OTw;C3y-OpRf%J0%#-ecjd!pZ{;{YGeA{h%;d}c2AM*4X6cn~|^7sCa_#DJH4C=xIrQt5A{%NVBZHm5s z|4gljMnjgio+W;lT$LJU+?;tA4x$C)x8=b90$zrV{i_h}31V%Q2eJT}{l^Daa#>M^ z^!^oT_-p7t5?-18vm5&tF-_wg^YII&w`@$vw|(v#5NwfWj0D#>%oFp5}^4>)GGM{xR*eH=7IW9G_c*(89WUyB)oV?I=>h zQ6>zpy7!T9u=q*pGU!Wm`yN3=T9M_<4QWQ>h{e%7JdlEoY??)uU;GT_J=W&I}&A-IIN-Pe`6?He?eAZ{*`5VnA0;$Im4dyt23|hz-A`DA&jj`MgH{Q@$F!@bGk=k-tJN4mR><`U;GE z+`Y%6#m34sbk&A{@ANc`bUrV(2Ym&wS3>3?H4`rEQEUT+kYZgEsMJ0+-~3r-X%6SP zr<)_2xv`Vo?6MJPle^KWDnL(ZmYm&eov#*0Al&kbNX z5zwy)bu?ZI_F<`?2hzim#M#ZdSo_9rq2-=rp-(*PJtZi=WuXts2#G&a0U%MHzOe9&%!CzTM3*8Vy$!q2!a!+R>eP$j zWQfZIXw4vywvf3UeuZh<5!yw26*>X(vV~V!!((lSpBD}V)rA$*(K26gJirphhY^Ec z7;bjhM9#qYbT?=mKR432R3@wYXi1iW%;q(a&zhOO(>&p4@i?9J2oF-ho3^zZ=UcJVr#~(D+pf2q9 zt>+c(kr$*MM#E2xU%4(m{6z&n*$=n9mTEvb~SZT zPIjL`%mo&7vfL|}k2}82a#H36BeM%|@d1cfIkCpG_F|qc? z4p2L{`)c>5d134Pm^JM**g-d9sDPdHoVJr(`fybu($1Focb{h-cgzO$C{9=5{AuBQ zazvu|F2tde;p`lHrQwZOq#+FH2_Y1P#EXbM@avWtM`>LcclJ2v2f z{ZmIev34aVCR>@oSzb~JX7)fK<`JxMm6@Md%SoA2AkI6hhvu>QL#BaH-AvJs;F29*!wy7d8lyzk8K+;>LRg4K990A7pyF~c^ZccX?u zYq}TaBQNI)nB%hp=ICx#JL8!F8Mv|Ig2J6nyTTN`x1I4~?|bW;a_T?L?zrE0F??^j zex%iZn$>Z?nX%Yv7ldCKaf`Rl#=*dYUr{^FE3(v9dsBU3} z!TV49$-8m|Hs@vFvqUwZxbR>rp5`E&JcTz^P`+K1&03josWjh~6NdWUEAz9$o$3>; zl?1I7KH`9fz4di`S>Pda->5#h+p+tkeO>=B9<;(a?v!=lB6xA$dJiQ-J!c}zc? zWK|=S8DVYn$p9+nH{sn}z~5l~haH0L<|~3$e^~4hf@zW!cr=?|XqyQk!<5fH4A!Uh9c>&YRMjBl7MhW`?Y>2F3C>G`Z zNuF5GYZgeA)gvg*D(CzKC$wS%Pa-{i7C(aVo!3l&%NsY~g9MQPGvK@=0}i6eLgykF z^hfbfx7{g6(__C!^E)X*@yHTMVJ(!$g8B03^YT)p|LzW*ew&e!-WtgijgbmG&?j-E zMZjR(8lrP3m&fxVJk%CpMGzonhOsjxW=#&zR+RuX*jNXx(}J11Lyb6`_W9ru=GyDk zr}+4FSG+aT|B^(BXcE@P_lz-Lc%chQ%Uj zZ`76-7(jRe=8tMDnBWxGE8fCm?gi7jl~rb7-r9s!r=-p^_j1Wl^+~2TH%E@#X54Kc zL(o&ZryVS=+9N-ZpgE&X#Zq=<#?zs+{m5k{sT|kej0%0Jl*b05#`<7*yw9+uWP-x^;3gEd&C&GfMZqDk{fDL7${O94xE32aC zgA-i($L(J&;Y{^JZ6assN}nNHH8okB1ime0MY6y?byb_VMje;UxV~-T*627Y4%M?w z+~0MamvQad#5L%+JjQ)ywI;Ae$2GCvz0xLbl8#f1d!|j?2pzYdaSPhSU9RH}Gj3Wk z&SmvQI@&{WDvpjmQ%5f$cJa~C-F5U*MxSzYbUPjW1f#!C>Jhi>eGjn#Bg+~6@1vtX z(9tUyz4qwntvb4n(SJEQdWDYO!syvYNB>nvZ)fyqMnhE-e&kz$_j>^6K(|0=#m1k2 zmz!qt9F!6J>Ug<1hs!f?4t8#hG-99jpb%~fw!YGECB9kav3FyALiS7Sw*l#S-%4Ju zW;Z6@ogTnZD-Z6{DDafoy7cQ&U@(4^9&vhnQk~#RmhaKo*cWjU?rdN?d9K4m2pdnE zu>`0dg_83dFHY)GYP?w8HBj`8G3Ot+r>x8>E#T+n&I`r+t^YGMQRZ5CbX|i7PO)*~ z5{h?!P6Bh6GZ2To&Cijou8-fs72H@VJ0Ghpyb*F0w>q#qb>3Hxtr`u`SX|eGYB72` zijzo5*NEuC)aZ;>(f>sBxv9~gbWFv58`0?e$;=yCMSp=o~V2 z4ytzoxt~UU!9{*nBR`{&mkIJPjr0$mv+c?v8yiE$kP!aC5Hv8`xJTPR^eep zf1!~VF$~D76UbL-BiG%zd0Mz-g zJaP}>VMHI&$iH@wOA^Rf+ats3UF5YId5uP1CCJxnu&J)r$b%3e$O8ncyI&r;7vW(<6?PQS*s~Z0WHW(0R3mpn zgdn#UtnL}|$W6xs%0VNSG7QL}1ag^1er>UXycGZ#)+mqM&3G8m$r`zW* z&3BRKY2>>!@?1eK)W~l#3?=WxnFuW;B~FgZw4{)cIfX$lZa55xq?# z_i~VbnLzey`AUs^Eh2>M5rWnIYI)>dg@+OK zXymmF1M z$WOS)k7(q-YUHJYT&9t`JIJ4l^+nkZYUG<-P+X!Z6f%ZUVW#M(&6RVOXYM zb#Et++%!CJN(v?n7`BXIK)xh_jCCeT*sJ$B$Xft_VGZ)g-Gqk`#aCvCTku8mEYUDYBT%eKrImkP1cZK9^jeLcRe5pnbY2=Fq`75MB$x(u!T0I2g$dE{=#BRmVG{>ec+HGw!%BR=FJ z{#hgbNh2;MVgQI^9mG#&Iduh(Zjv-zC*XnE8cG|Zk*>$%7hA{G?*6MMVy8LlOXJLW zH*vO$I|I}F#e0qTpT+<6O_@80MawS?eG0nplt380kKe-5WFf)+3yx)D-kPwh7c8ZQ zX^cF82V@XDeV(9dH$%REU_`Tk&=8r2ur!-r)6{mYgRj0oMYw+P9AX+GHInKv!0!6r z$`TN3A3`3EeedV{XUX?+zQ3J(=cR;pWAdHn7wngk?*YC)o_rs`_r=Ng{(PU4eCNl> z>}kpOAm49Dz7OL2Rmpc=ZD+6c+^8AMMYX)K93%MY7)_L=9!XN{CjEy@3!FkG+!6 zRfL`B zeI=E=UBWPq75484amcaHCPdrF{uLpPVRjB74u$q{ggBzw8H7p+eYY1-fY5$I)Q0w_ zghmtkHzC>`_D(|VNA?y%G-T{`glKWwD+oPIh#!bv$#KM9N~oC79|;u^nn&n-LU$1Q z9ii!j`Vg8-s5hZ8gw7*0oY1+1$_W(`8c2vU3i|>=R15aGgs5HYJVKmA*ryVry0W_w z;s9lLBIG6HA(TmhI=BbW2tr>Fx{A<;goY8?MTouHex1Lbnt89icFxK7?*0)SJ*~Lgx`0M(A8ZAwq?O`V*p#wu=b; zme4tb&LQL@)Qiw5gw7_EO^6q0+U*IQN$7_!0P&7L`v9RlLWpl98HC;-^lL)f z2>A%r5jvgFi-dkf=qW;?H2zBH5{4}yG?>ucgf1l%B}6Y2`!+(dtWZTr6w)|CqKZZm z5+!m4AyF4WLZV16BqS=KHz83TXA%-M~#W;buS?g!U5p zC83WAbtUvJq0WT16Y4~$flwBqmkII0KKnUB9SJ=_r~{$D5b8o`A)#Lox{FW`LN$cw zt7G3ns2!n+goYEk9?<-tRg&Y51y+H|g^w!L`9n6GJ67O_-Zl)l52D-}RlUAy6{+31K*xw3 z9wBS1>hg(9ITMNCtQGqss%-N|k9(0dCEy)y#P=yOlKTSCn}D5h9dtenI^EU$Z~g)7 zR`kk#Zax9ZgL7#ZwVx8z*s(7&CF%sQvE>VYSt-ajR7;X4S=#b zp$)i_Jd2hAd9k7c0%ACWd@XV=+{v}}8la(qxBvl1prapQRie!5@~;;y_7R&#{e9F*yR2O81f}(bL5Ww?zSf&dVL_c+V2YjooBpsGIpJ!+0vN!u)yc| z63vk9SUI8=NwYL*d|`7S0N{ zkV6QPc6tlv(A!}4(3lhl{;AVlqytB%P1k8%X;6n?OxhVgax=S4uF*SDqA8t4)AB0q zPIi>sWRtp#tYYHEMBmW}e|8X}C$ta~LiRe{0$a273XSPjTa9x|IT=Wf9JFe)b2Nfm zTU}IvTNJ*#B1J_rfQ}w@a*Dh;`sB_hASlP|SD(bB%4Ckt_MJcIDo3-S$d2ltSNv2y zf7ki2Q zlhn9LvfO+hg6?XQ*00mfb<_U4iVaZ0je9dPUg$uFw2Lq*9IIVcM5P|Cw$Sxhf;>cJ zbZ|r&yz(iGO{?8@Bi#4$)$6`A42oB&d~?aL8L=jU>& z2pLHZ$c^k$9yg;8z&Yfg@9lBusZHRw;ZTOAhuqZkth(8$9<4$r@zL}gm&nhh=dDPR z9`ajNxf$KVt_Y6~)Q43tqBRI`YBp_;UB$Q7O*|5LL4Fca@M|Zl*q7-2GM=3o;C`96anW*B|! zyQA8_79yeB%bpJKC-mcAb^fk+>imn`{I8;_ql#G%4%uaRgMHabZ}isqE}u01;Ym&d z^0s`z-v?CtMQD+>_~BZqUq!3>t#t9fK((ZP2e4ZS5$Fv6d@YZ+TrPFPMU)+%oo&I{S7Vca?ryuH)VTX>g}}miL2SPg1|ZNVfwI5GP{N1xPqP5W;Ps| zCLKbx>H6-tGC7_-+NWo+Vs5t;g|Oio-AF#*&>fB-_3+W3KN~*p_`D%a?Zp0Z^;GN~ zd-c&uZAY89nAhB4k57(E19|V%^xw*X!60twrIS7W?L2^&ZT#7R1B2Ueg0P+k1MM=w zghp$?Hzdmm5BWwKB;C+X$I;9 z=d#Fp*j{K3^GG$Xp~o3IeLr0rH=g&$vD%Ajm{j)+5Q5EOHAF1<)QG~Z0V{~FN0ns3 z)gxr?wMu;Dex7ge`dh-jyz-V8SfaXQG;$OseWqpu=JH<$hBd~7B9@dw&(Z!`A>8}_ z4O$K7Nb<_8rzvL;j2`0g#mnJ}3g6Qwwf!~gq}oRGoOCEg>qRyve2p-%;))9NIV$G_ zms#tW5o>ni7=%{N@~+F0g(vonZXd;B1K4-J4MkJ!8B` z$ItT6|HmrDe03xao#2XAT?jslvP*SCo8g)gFbT%d-4~*(;Wm-N_Xg98ZnMTi?S!b1 z`C~AC_WR6JP|a(hOe50^KyAGddj+UvR++cVx-}2%F7=wPo8OJ&h27CQL;*s#cu^AF zild}md@BDLR(oh(2p`jfwcPtF@2H%qs$tN=^l;-(NaGQmppj+r3Z^I$ge(*!RVhx(CiR2JMoaL zzxW!TanC!@zPQk1Fx@R1;i{ktMp3lD{xtSVufMo7+qh?jq}r$cb`2$&^I{&8Ixn)8XJWEE)t5LDC5^AIe3az@^)a) z*RcTUOY)f)W;F$f&70MeVapMb@7`SK6MtzhL`Cf(P#cq_LC!yqM!b~`~n*8&HM^lvIyVQ82e><>bW*F zTw$F+!8d?Fw;{KC};G(n>8A zUGXuErIZWa^irr7<49UXf&wFU2$xMkDlRqdW;57;Yp*(m)&Wux2R zTQn5r*cz@AhL>Wt&<17Y3oN{lyoT8~0%426%6)2O&H>JD3T2$(MKqaN>QQhI#L5hcg#L z``kv>!R;HlYzaoz&P8=R)t$?%VGz4Td@F@LRtf`*#NcNy?r=P9FZm%Rf!mC$*sJ~4 zrM}BS|D`YlZppj6aBI05h+;`4j-Sz7dRt{WbWLIe==$a=5b+I^nmP-r$-a|HNch=G zzJk1^UixqlKDQ6=Y14;`3hVT39{!q_eOlT&6VzI0Xd~B`J?nDtqYr(0Xp^!p;1j#h zBs*Y2Qxa2kcbu)l!KtZh}MsV zdy)xgdOQF|2#LYU>E#&bVDqWI;&TQX(&rw0m%M0 z6|Km}%NMC-KFN8BD7G#5$K;s?l@wu9z z-?Q-!E%CX!iSOuP5sZ`eiR9o`(2%gtq<^Jw4<=x*;O9`+$w6FmYoN<5ekaSFK8&0H zUn-kSXTNx*+g_-!b$gB)Iz;${3z%_i1rvzP!L*&K4je#!Ww?_%Xid#x(6U4jtm>)R z47#6_2giPJ*u{GOYbb(28D!EKx$cD}kU0OUP$gV+gN((9f$^o~le4DenZi@=?)~o_{!Z>6G?!?(xg+Q$8d6=wTAj^7C zFfpo4CZ*iNoWV3&{eYDP24P!A&6m;X1y(G8ajBa#gA7nr;Jphvb(XpWy`^T2Os(Kn zDH$%{x^Bp_s6X++6(jaI0c!zQVfY^9hlMzeFTm&6auCOBK~AsX6sj?(kD<_=8Y2_G z#ghuSoL|QruO1fLX93ruPzpuk`OyO7%htRu+Oy(;jY5PlhZ@pVStIix-0D*&hnIMpkC4b2ktWX}_NPfCozvB~ z7`q*Aq%ujqZfFU&k)`_E6-*_s*jjW}wZH@HCxYYB^HbLOoRqlfZB=`61vGH^$Kw~r zfE&~NL(~CupNipj7t#1&hOCp}98DD@1LtTa%45NJc|1Rc;!-CJm2}+u^si*`aPL_H zg`?%oUVtH9`bBDUf?d*nVP91$XB=iaB@6Egce>1yc1$!Xfbk?h*ckQI;7M53v)<=} zeDyYY1=vML)1IADB_^Jr|RRy~CFj@YdieUc6hje8^TL6{m!r!_viu#UpV$ zZ7!ELIA739FxB0dg5RXB0iBQ&%ut*Et;V3bq|bkqbd1E6BEoUHDTJ)4B_XR4##Z7u zUerhL5FD6CP zp4)L!z=LcuM0$`^AI2Jto1+(Q7+m}r6l~T8BQ_ZlS{C`Crx6_ksFbHg2juYLk-Twb z#^kryk){f`sc`3DTQ=j1en-5vfB_!U)mc46lP0d3C>;B2xLaaEqGH=9xphA^G zGAdk_hAgT1aOW=e8e}A22HwR=Z9*=<2l*TM`XRgiXsLl7Q+d-^31gsIr{?MMka*K7 zl!jVCd)}ByDG8Q0n_|Z-@=8n0$P1YVxy)K5Qv_9sp6(FB=@Z1F2#p!`a~i;tp^m&< zY;|e6I6kBapFY67@(UZwivNj6LrK=5>XE_7w>`tdoR4*tMK+}mF8*}d>m(~^U0H%^ zqblG7%ZGf4<|4c=Vq)ZC9Y!Q9Ng z2+gSNRSK|_JCf6=7WKnrEJNBhWbQ84MWKECS26b-yC?P6$*`7E^_OF>QF&2Hg4XQR zz8;nDW}v(BdtUI_@Tj+K6cX=M)r6ZBmW>9xaOUnrPyy9CpK>S*{Tn!dG)5S}KU%Yw zmEsv$!=cnujWeRp*D$qX`^FAd_gBkg)X^oTNcW$adF>_=r==U}A>`P3_*z}|>f(d~%|Fx3l$149AD z@rA=layfRydzBqT69!OCJ^sqd7yIDnw3%K712O3?urhp+!>5KTB8Pj1&x;(+t$qvT z%8tzagGp*khG%kSt&E>Iuv~~uq~>Q5e2S5dAZ{-&sJ`D}fW13GC*6pvz60qqP*c@# zxl6y;|HD8&F3EG($%6O_DJ)0-e=t^a$ONfgG7@=@=5I8Ow9EEcpa2y&chNlwn9i$;?r0e=0U48l7j~A`i_kE6- zQvZ~p3WFTSDQJT-YZ1q%GA(QVVbqOX%K2sGY_Vd-W(-nAPWD?=RdQEsZry z4yo;-6f^X?aZaN1RP%~MuRA7eOynz<7`hx`A>E{q95oz;aL|Qn&c?F`p4}>jH!o1T zQPISHU-;kYxSwjjxx=YT0KRS7q*LZVQYlS4!u~f}G{wXaeB5^ifdEHpzgU8*9?cCs zDvHU}1?2?I58ZXLYanQ>bq7$El~V04tae*trxR2L3&4G5$_L`bei({Dk9UabOV?_@ zplKDdp4mkW5YK%O$0<^p1z#aVGze*RI31fG9(83ID8X2lg91QdOjMbPv5$el*)^3O zHGeIVm`$b7=-35mokw}$&hc4!5L7guzops(6WJ>5R*pV!R}feN&zB3y>0#1Q!IN$MCsccOleigH5Dx!rJP-RQwD&}D7_pT@=#I%Fb1s8OrYMCeMm ze-(8r|8S&G|Z*t_vmpXvuc$|8e31z4E(;$IF9 zl=?CN`0%fXTc|U6z%=~}2pdb=G=K#`C@?EGVxvHR%^Ldf zv5B)!g=CRVDA#@xx>{-sTOqk`-3K4Irs}xSvzlfS`)b!ClUawZ={Lh%fT7!`JplDo zf3|syqh7`EV0_UdQqdQd@`2*sXL0dG59rV(PUvSp&~H_EI8P)Fy|;_3o*OY-jKiUi z(TSlizzS*hLoZaVW`j8F$Ao1IGGb<`2F$mQbL^9Np90V;i?r&hHL{(5ujs$1uZbnI z_2&RhE)8&V*L)7f7fKp6n=qu7YF=WOL-{+%ApfVE`P`hgwWGjw2iTh;m{U#bu9{Uv_fPTu&2@ve3 zKsw>>fPaZ7G`KSn$CdB${(J>F$sY7Q*d2=NdOIrs?v!x_Hvhl_&ib9HW9x1kG#C1^ zkOC7&jei<>2V0#SM-WFbB#^fF|n${c`mvdovKVouVRs++pE2Zbz4EofTWu+`#1t<9PH3^h@?n zUkU0xAz5#bGhfS$l*-yV1v)b4$T#>{gE;c#8?wqD~gkwA8SQvhI^;jS*nZZ1>}(! zU=8_(y-Zpin}q9Zu=5MJqJ{gpKO(bJtwpY7(TrF7&;e+Lpg-5l$ijH~HNGJmJ{zQT zCn>Fv@KxD>`Js9lDE7@_UDl8(TlO=#C3PjHSLG)M~({J!20#+={<6=EBI^9c04TRM!Jcbq;!P z*^PVDSwtwNThd&oXi|#YbLH8?{ zzHUd;w?lfdLthjXBwyY1AMZS>KJ^@mbZ;7A4{4Pit0u?(MErxy#$AogcCD^yQZnqp zU~z<_AXYm#O{I~khpFn0sDu|w%p*3c)hH>cuSuVO2PI z?hZC)_=Jnraxb;Dc|hH?hqbr>GJH7gmQKhha#1^eZ$s_u%LrtU=!w;k!%euTig(tl z^Q6Lhz5V~d&U|DC2}szP-=O(nPK`{Ls?Kv)(VW_LMok^ta--S?=CrAA@_wk=FE|RI zF9sxk81cNG79^)EQptD%Ia*tTDr2;Oav=|@arJ9d2Af0$jaUP7tKGy*U6WosKR`SE zAj-@)R40fRL=((jG?zT&z`dAS2-o1r}$7PvY!7roz96 zo|%!CEspPIJC4hnMG9jA!OztrsAv2flA-*Acr&^+O*_6!8vjhAGta+_#Z;h}1I9?G-QVt-vKWf*iLnXAq;Ey${{f(RX^SzxIpmOc>A2`DdF+$QFbb)|Ht}vOysiEC;RU*p&)* z@}B<&;g@Iz<0QGl2>pmG;`*8wEGqEgMR}46K?OwhwpnOFH?G}8BG8S$LIR9q?7xZm z8hu@kF?EHn3%c<2uTyn!#S8ia_lWX3|CPIt8Hem1vJ&i-U!P1g^SEN~Q$4_E>JCoo z47w-c^9N9pXv9*8?t9_m5@Fd0(>_s&{!rZksQ6UlMpY`*VjLyC@O#`rbps;?vs`*X z!c5=z8dpIV3)2poi(dxw%sDiwf|ht06mGpDWbWhytRqb)_ zI@f+tM9g^ZB;?wvGv~2UWW~9}(Ycu*2A z|1t7insMjD;2oBbMR&@fEl>FP!h;;DUxMnxJ!(*XC6U9Y8!;{rI~m~u=?r|X6+Od< z7ImWB?^R1+d%5FZWKUYP6}04raPqus?W~G+CGB7}pU|0^M18D5g2P6v>j?<1-NgE) zXdDo)$Ga5j0$5&I2uh3?mb74CW9inNr-m^t)+15K#KH`m2s5A#*uN$+DU2a3=3--R z6yESs68Y}*Y29(L5IhWVz1W;k+TjaZn#4}(yMTAj8L{5P11tW0A^OvA@Z#8ibjXXH zjCT$V<7Lv?k#BwFdORaq(goG&8(9j)XGHg*AL6A>UM6Qt%oBWxy~!A;sNNxS8~jT` zW;b8RdPIf+^^3h!V*BdwZ)?cv=Hq~4y!6Ids6@Sjl%BcmEO>|l3t*i(3&XuT$v|Sx zJ2)%g%I|b%)`9EUQ79~3Mx4gBH1#}$6N@~Am05RCZjplX2(P5jI{?sbKX7niCy7L1m5>gH2le8TqW=8K8K%r;_wBLk5F z%kqdGjCMF??Vg{GW=hm=`~P+QDrt3qa@NkREM8ebN1||B-EYuyoHupT1sJ*aq#3cl zVzObMfJ*88LC8uS>LO8d7>d_)((HP#gvDQci})|1dR3b2GE>!8UVwZKk{)Jrn=Gw0i*Oofzb*H80|o~W(|*Ld$6ykhZcvKm{hvT_6qzs?Ubn3L=3v9m$5!7)iN`DiJEQnM?ON$-gRsCuE4rx8rC&?7h5L>H@3&r zqbwr5$pf1q$B15o>X!C>u1+N2J!qp+tY*bdp;|(>m|kj16gu)2q>zE|I1oskjt$bf zRinWym;+7^4PcYf8#2Kg8IQX`k#o2eZu!jyWLU%xXM5pDU_}3pE)-Gek)|U?Y&E8~ zs34CrVFi`y8Cvje9xw`-KHp&Ttq{I%kr%Kg`f~Wyset)D?I>I}h%+_#7LmiR`cK=J z!I95=8|RhM8YI@Nuiae-8f(9;!EgBe$anY%&I0r&7?(qFPe#DB&Ck#3y^;=p-O&y> zCKEgh6Og{3Vdg_2%jZLx-VlEBLVZD;5jBLU&(!1RqOsEP0{^oAt9}lHT=(-3m@WO> zKnKKh$%vjQJwMZkUMWC(d=XxN4n{N&091giD^qxyszAmJ?A}q24e`y?CVp17gFX(Y!frnM zml!BOAMM71LY6Pn3N&%_S-56lYB#365qk_^h(n2E;L+AAvu+8hUIjAwoKES0N%wJh zGOZ-2mh6G!@q6YxANAKbZOMK@(MNPZ<+5U@e%7D|O%ZjBd8?h5Xl6^9M*n=oai$Jzr zfNY%#GZeMCu$Pu1tgh}yA95ng^juMu_tCL-3<_DKQfC%qW*>o2XbG4wx{Q4x=myOw z_1RfO#4ET-T}W05KS2u11&7r~u;ghLs^OeRh}M{oEE8;nO2LW|G#<$xHVGyE0ntLm zIxqwR_qJNk;Nb|y$I#rcCmA*nVXbRA)WN@!Hs7icew-a3k@y=uEpnQ1m|BIRI7JoVcplkEpOiwMK7hBrvYlo` z$3i{hg_~+dY$0N>_BsZ>FUHLiec0}EEq}aYI)vYuSjOi@gOUG;GbNB4uo3f!uLjic zV?ymI0u~z0g*ZeY8(K zD|@M@EMA)4{11-9g)RDk7J73I$}tac%rqO!42=97IME9`qLn};J3P*Yh0iB*{ZNA~ z;9(BF#{Cu?jlOa1Ir!?Lw{Ol;1E?d4KdIi!CO}p>sJk@FnT$Y~-GH{kK-0DC0tzBO z5cRfNHUW*w>$wn-$xFScP8qR~5tr$Rt`F%5!I;4aUe860A8{>~i*Y?8auHEh`J*Fo zvfK)_cmqZyk^udNZ4|0|%qih*hl4nq9CJvW2r_Z}2Fl$vbT+W7S8gDpSV9S7=bjT0 zWB(05oIg_M4g56%9^Ok0a~r%HTf!%(=Qm-rd~!5&LK<@jPfqlLt#>1F7>ThZvnye| z(LrDVU00m$K3LEBgC@^#b26)V6<76rPi+)_A3Qy_B52b|%KpW%4fUM79Y2C(NDLpO45lZz% z@mTs671nA4O(WTtoFnA`@7Y#(?F4TC2b1t{jv&o->@V&f5tlRLnYRPwr$!A~>%^$B zoJ9{)5$4B*O_$avg4w#MJAn>O=L=0WjMx0a{)~CZe9PRXLJuGtF1`%N8euFt+CQJ^ z@r|R=?L1dPx`XETksmXsbq1;J&?EsXV>!Sru(<;CnG_P0`720@40_C!_3acev2!DO z6^;2YR=2gEz_r(jO)vt{h)vKJw59>=V0Am~UpfKVJ9*m=BJUJ;AHBX^JG(;Kjp@1f zRs@8QHD@j)%8>))MnB+T&@2t=?;LNne2lOkz?K2qff3mhJU1dD5yGz&f1Y^mdoPh1 zy{PjH+5jdaz7`QfYOsF4bT<(__P0es!V+|_Y-mfh{isALj+P1b71xjIE?oa~`7i>E zT6!ryui_kg!v}~9M?3yeerNv&XH$mqqlet!LACv$tkqiaVYIjQ`pV*Zk(XYxa2Aee zEs#nq*YUHJ2gJB5s?M+n<I+@!O){gS6{fj*P36Q?YR!7(lmYKYEH;wG0$-(XCu$V;^h?cdx9^9S_v-P;q* z1)sllteqNsy7c$mTz16j>_L2h7sJeGYSHqL`K6k*131{dl10cYwYMj;z}64bmpg5* z6zc2L7HMG}LxYuJ3>u7&%*Te}B{lM(tmO7NdoYB$qX%v!ca2IUuz3VruUp7i3PBl} zhger4>|2nTvJsRRpV{BgrDm;g&;Q{2M=wy~#Gk+I_m)mYS+YfZ)cKzTzU~JQD@Q*- z(In3g{pXrv;l~FxMGlX;WlVeyBo3bb*WPlqdHC00Z%aS?q=j!N0o7cg5dM`RJBk1mgW$5Py4<^Ocf~ z=3z%KRPqz7ry>vIrNDfCtXL6b$mrOyibw4GUQmwu1pB2(2>bsw`qn>ghXTdFheEJ=p=I;}hY z#xxeY1aVL3xP3jK+}GjTrKGE~xo_PGNaBazqmJJ0M0XAv>t-SYXdn2<#Fik|+^Fv3 z0BfxKUhFF5S%Y9T3xWQ|7{v;#AsO=l+N;seVW?k=4DF`@uVGg5HS9G8A@1@9R}P(g z)8w0{O%~%6XTD@@%jDW8w6B*x_#|w=SHhoi{*2~N6;Ec=AQL|4JI|%gbGh@ZbDrcY z(=|EI{mzrb+J7fuq*@Lctw9TW>|P8*|Ml3X6GB})_AdxQN@OkRMmy{2g zg^K@OjV~g8QL)-n0 z%EQ$?ob$aXp7(DV@1K~S5vR!ttZx7$h zZ7B4kXOL@r30poCU(WKJ`?WR}l@IG@xvoA=m-fpbNX14KS$k&ro7@Ql)`U<;zUm2q^Pr${X zUm3?|+|~Rf#y{frM0CzLESdH27>hE}n-?HFGRt$K5gR9i6b{)!r>TyoqC9Ixlk#X_ zzdDpFA&1po08&ol02&J(eVzR3OAv4dNoA^>Yy8 zySL1=S9L>n!eQLVeFJ8<>lnaGakA8O8D9yVgY~E+tBZT!)|3&DG!PRAJ!Xt;BkM!dUS{KJUK9&!YCq-^Vjq~XAKVl?cO_qE z`VS(5@wJo}^-fQbgVe3Af#iHkjnL`8CN1&qe@>*2_bEp1L9-rcbATqa+1IwP+Xqmc(>319 z8m}@1?_t0i?=s-o6WR7}BDLV@`3mm;dMe#xS?qnhE9+C}S8IU`%kVy0!ncSsD#tFC zH)l|e{Q%`=MK~s-Ysa3JHyM%fhDi<rPD1XyiCK(2|ujim4p`&A7dr( zhw!~r<5v*ARi_(Ic#?*v6TVKvHH3!}e-|XdTGNB?nHt|qxLBtvAlysCC4^7YaFB3! z;@>6syl_@+?k06sgul%Z_%Pu;8qOllZVhJ>eiN{Lf#5&IbTN&;obW20u8#0B4R0s> zu!eULUPS!8M@WB|@1+`lI^kP&y19fWX?O|Y>omNS@KECaMer}+d#1)OAzZA}l@soz z;n9Ro)9`r0-HCsx;AilCGv+X8|184ao-A+<;XNA8BfML~1%%%OY}1X~TJtLUj^Z2$ z_}dAu(&?HAFVpaT!VhcsFyTeSe_HSt^1W2!FCl!ZPWJ@iNg7^B_&N>O5gtl>`bSu6 zM)EyVtkYEy?xo=x!l!9?F5&LPKSA()eBXS6(4R;6+mi$?BD_b#LBhK=Tu%5+ zz&3C7wAOq9ougtJe?Q?>I-Q59!D_q~TqJ zuhVc7;i1IO6MP!bDpTW&4O*$WB{R=|JeaFggiO!F8`|13yM159#!JxhFc;p=KzW7nFvQ+_R-N6E;!>JS=ia}U>+`&ke z1uxS(NLuyjD3gwZ955s9eT#OmV?B{@AtUZv+^m+M^Skq9hn}LsgYd#&RbZcGw_*Xj zE7ci7SJxJtCgKYEOBaJ56R;#i4j_Pd-~+aCN7a%Hc%;_DK$v=__H@nP5H#;~8I(M@ zfU5%{n~I!qh>ol}wXyo}Ma{3Muh2ssd80i93%eGjqov|2OK63C1&hgV)`=NW3e$<) z&e}L%?3kXQPunrMgA)rFdVVkUjc4{jUY2BJp9$5O950>t?uf^UXeY^M$0f#1C;pqi zCGhX>+7_Q{jBg+T6k;8W4SgJW05x=DgaP~;VNb#6r{z!2dEh=Rm;N~Gb+Cl7Nq~dd zDUIP?b`rD(dO1CW*J@q33xs()Yz+y3qv&vytmmZG`dui=-?DfY3S9-J(Omsa86QJ@ zL9Ex*(FN#b_Jeh=M%O>ZQCo zauc*#>^<&q;jX5MzL2p9-(W1P!_Jpq?t`SfW;vzd5bo;EH6G8!R*(HSuYmHlqdZ=# z5<*KF(YsKal%&TaX)@VCq=M(uxYlX1k4{tF8OO2C_ZTtWSTDx~$|^U@B#UPx;u&>L z5uvyb!fHEIkO;gvajS)CAkpM0Ng=aMf==KEi31}tj-7(@UMEG?u~Tr}#7WWR*eN(; zc2Z;?I|XObPKs{FPQir+Cq>S&Q)DMo^f-2kL2*;$xp~a= zg|KPW(T`Q=vtbG|K1Bc^cN9tr36^0)Sih2#MNH|hS$`$t!@o*Fc=*mVDI!TB+oxch zKeB$vQHh`PYI<5H?p+2KjS@fhKXKO=mMp{Q3-_E4gDHS>?$}<0BRZ}#;HqsNh*g;v zp?6buyRqkRUo>cqFHui-L@+KMcnk_8LEm1~B?n|sCeg)fcTqlx%lU@Cb{0-kw(}U# z4^cgA1a|>wAO$KqjIb=gkGgXGZCu(QVXS+NXVr;^gra7h8)*}GGO;* zAvLqQdcy4@ujA0~;BKNqV_U;#0kcA9_81b?ew&s}I<^U%F7Uqr7jBKbo`EX?xi`!5 zhYL!K`IcIx8N7DYFV2Z_?zM79a7kleVfnq_GA?5cn1N_{+@H?CX!(5%^y7ZCfH{Q0 znGk}LgO%GDJFonVdojq*M0o#pkqzl+^<>mSAevz}Du}h=B}w+OI8+sra;%ea_1-If z7A%m#;C>J!>vJP!L{ulZAG?A4w&uJHHbv^X`itjqm%@mZGuUCF5#vW{cyTFKN@dcf z8z^=bg4vv2hlo1l&9jBVY%#yZYronaTgwnfGB1f6f5JwMQHV_9LYZ z!n{%h%KpUXI_T)lnP#M-MfW}{zF{6+SHkyQ-!RNn>a zp6>5bUWi0Ee=Fl;Vm>RiyNAR|?fMC^_N5$4Wj#QT|BPo1Rj!W5##L(kKLd#8cih#H zfRusm>BjH0e}!p5!d^4Cm2y>_x4+oGC3g?9>q)cArHduTqK34C{nEVbDvtoOu%%x* zUU>IQT8n)jLiD~Sb%Od!ChLvk=xSjnWT+3@3jb=qOD}Kd376D?b6)j(aCwfbyKHXlRNklbpe|nXEiGqV@pw>7Ha&WF?viZT4!|w2SuERg>PC!P{ zN9e)tvCm+M5_`olVzUsdt_7b`jCaZ}?IGDNharIswXO3~2C~8x>MQ|&*!a}F>|nSj z?6_6f+Hm%3TjuXacSBNXe^9N20I6MX!wB{ZrhI6t92S`rEHmc;V5A3$= zfM47-b{|Yjv^>CJ%?UdVVPfwizdk~PbNo`arCXMI(AOm1Kg4hTpibb-Cf>C(Qr4`x z9B~+9aOEoZS>O@uhu5#1+X-5=MTo>V?4`V#RaZ#TlLNeDtF{C${*e-?+oxt#xx{C} zKX!JfUhH8@MXCXc8I0!w|BYGFkqx@bLCuOG|GcBjS z-AjQVwC?aSJ;sfWJk3&roEVs=1FM@u)*WK6;wB)o(Y}I>?eIe`V^>vQ)8yU+WBYg- z+q}(|cgAV?j`us^BG`xg`jvVdCNXT_?MrAx3o2hZym8VBlMtzw?kF>F7z zO2^Q)55^a)1X02G^BlIoKDK4c0#;iZ%82%6r_??RNW4NPUXDl00dyN!q9yjC1pP_-mjWrqn)rE4h->rCc{Eb*c(D!zlRuBBw^tW z4H24ZxRtTr0}MVb5lo|u!GB?Jr$q2jCwM7?zk&iH0sL?qlFlnZ*as5EjA^$phX)zF zB@s;9h{2CBm?{;rkJKDh8GI`;)>r+ig*yA_=_tJ+LYoH8Z%G+X^haR5)DM|a)q~&c z-y+!A7(p5$?E7gpv>%jD6dVvzM=^a^r)LM3^si#vZirA9q}g>cq$kq1XZnCnPt_vn z=Sq62p)`AD>-0;QzMD=TbkozbpdmtwG0lE0CB3?dLr}a=6+G8uh~xn}S<64r4~SNAi?tCA$3{fnS~*Di4V z7pytd-iiHt&h?Z22cv)s<%Whpf*SIZ`cTe8eh+^6hn1Oc`G?BP87g}yws^ik@Rgzb zBg{wb+xufnu>MH9aL>Z`9DKQFX)m;`zopv;yo*0r{64;~h7#QU5MEoC9D`WiMyFg^ zhafE^9Qc_7KXc$`4*bl4pE>X|2Y%+j&m8!f1OGpAAPu`m1FxGf zaqJjx_-5~f$rHj8uA4aFwz1wpp@CO*@(i7N-3?=Z@2$FSN_ax$#IaMoBYIswZv511 zI(aUu3QxFs^3>mV@_2iV^Lo8kR8I!FcU<+viQcJ|Q^t;+%$V_r2~3z;HSxMzz2Wf_ zrh3PZomkb$Q$FS98>U=0$vdTba(Kd|vEIs?Cx@rpJW+DH3Mk$oH{Wo>#IfFK6Q+zE zhlFFjlWra}78#aKt@L_Jr%wobt8^BfJmbcD${q5&rIT-%FnMfBg+R!4|4(~w1Kvh) z^^fjKYuS;l#V)i22vl+65Fj`b36Ri0{QZ&Gv9X=Rlz^<*vMnN8LXz{*rmfr1{L{XH znwGvz-#4@d0t5(Pz5@g>Um<`21EB;6U?6-4Fc2V=5dD8==Bz9!TH5#C|GoEl?!!JF zpWWY_IWu!+=FFMd)oxT)2Ew}Af-C3-EDq<%5iT?fa(W}qh`*b1jdmhcn{#TLuie`d zh&oYh=%y!vm=!^ejhr9_Rn~aQo0~ilA5?^#Jdu#EwI|>Wds>5mV3>01#Wts+{Qi>3 zbN@8HY;OP2H=kA57Xl`6gEIa=rf1h#mDbJ&kYw)3x1RR^r9s*UfXzkR{UpmsV@@R( z{r|7O{#E2pyiX0)ob}repFIoMSx*fOoi$^|ZG!&SU%#G9IM|E81HPOhO7~xXJ*r4i z25~*DsJ(qV=p4ikL0%DXDnC)hpg1j}_%n?ldHRYG5kDZ42`bGjCCt!;3R)t?Bf;rpesI(tpm-Qv0@$JI1zmDgw!vFuq8e_Vm7ewRO=ln;ePu%NiAy5r3yXjkJ%BLxtcMGKg1$0~+U1qQ z9zTQn4|t0qQ}i=x>*$9&kVg&jpuW&c>EdmStXJV^^u@lp4}U=?FCY&(?w)%B z!Bh9}^`~=x{M!%D-g?|eR3;os(S>K)U%V>x#oRZ3cEnAUZ)6ooiKBC&FC5P!A37!% z38FL&&c3|i%8J)7o%{ARfBpH5x7{#zyX*XAQ$DzEuF|nVE$a@FC3KV3X8^{ zT-Nl>#K-4SLs}428KG2nFNZyEbG8QjzV4{AxV}0L)rEZBl{L=gzHkJV+*#l+EbymB z!Z@~La)7lLyycB2m)1HHuWAymoJvQa(ig4nj`})$;pOtGF&c(d#d&GK=M5_bZH3}5 zG19NViWWDNc-nkRdpbP9o@l5iYGAFwu8=qCU+NF|qpJ)s99-HHiFW%U5kklSCnNK# z8eo7?j+IeQd!Q%MDXuWXD5Vmm>4Pd3aeBi(XRtf4$_Z+~Op@1~AUn zK$q|pzAHgF9D-HOP|%M~%O&;(NWV+N!DYT~rKyu=^?-kA*b7!fbq6t5$32)fk+Y#+ zZ@8nUi$(x7udlnOi+mb57Ezy=q?Pi9hPs9`oC_DsUr@Jrfm2*Mo9gD5FL2fuH#U}+ z;lkMwXkSqt4hO^BsgVPfBka4d#}|ppzSHFu4nt43cRAcD?@|mNI*Og}fuhK~>tu2f z{O$f$r;kKAgRQMS;jm8@H$~pqsEun6^-PqVoPPp;3SV7M)ER7dcKN!3;Z^Zo1KZH! z6Dk?g1|(ug2z5F|$)GfDDb%C0AQme^xEA4W2!BRckFW;eX9yP}7&`ZNV;rY+)1Ghy zbtZ2vUWjGBu>y4k$<12Y6O9JD;|!4~1|J3+6$h!~_yxgL5xAwx;sE)QLfiCj@_X5Z zc_l_!I=o$7UZ<$9f+^=$f^8&NM06zfNs+-PokV9R`dwTsV-dK;shBs4p@ZUzY&X`& zVwWPUMWD}ogb;iPKSiiRC_|Wya6G~U1UtgD2zMadScjjtA^aWTQiL@KJqR5LMF^)N zoQOd2KSszyup;bV5Q}|)(AFG_EkS5Ps6i-0_zA)(2qz*05WZa;i|s@B7~yS%*Adnu zyo69O=C`w>9C5aKyJ<)*CGUGVcToJ8K}ie+ku#hH5v8oUvA(AG9A$B>r@o=CsjjrH zrjahn%4^D-$~}v#7nId4Ry?(JP1O}1;8oQNni`enYU&~7h8DWxr?w561`l+u<`+EPkeN@+_eZ7HQKp=2eLtb~%4P_hzARzk^2 zC|L<5E1_g1NLDhxu|}zBtZY&|3(A{3jSK7R>l&J>7gUmBN~_9C=O;y!m&r>+Ha6ka z)X7(#;*z>WsaVCrnwrMahVt?Sapo}yjj*7)sji_h9=D*lc1%KbY25-(5>j71R)TsI zQ>H5}ZK_^0*0NNSiUtUx*|?kV0k9ZN-?xec}ug4yFRa>Vpxif?uE~MCnm-2Kj`Tr*D^2mG*x*28JiZDJ9i)A6~$N75*%{Z?@n1wJE zA+fwW5WgxEi)oPcefVAn-}iy<`vCQUAZ)@v&rjBc&%{og3;b-8IFdDTZnB*JKlHIm z)b~t;83-pJ{21Yf2-yfK!oO3;uY!{ABc?{0w^FVR{Qm?cTmRDkMfuPCi*%17{$7Mz z5UxeI9N|w0zeD&H0+qi9bQz!jJN5B`cQNzVGA;cdq)*IaHquQ;C_p#{ArB!F;oENf z-V@<{gx3*XKzI`2L4>;yZbY~W;jajPK=>`f&k-&}=s-9Rp%I}PVJ<>qp5JwTDtJ#q zn22yBf&+p0t)SFS2K~A#7W)L@yJY=O;@*a=cYUaTTl(;7nz-kIJ&y1I!W{@VAY6g) z7lexu)*!4x2qO3p&P6yIf%2#XJriLDUz_Fo{}g@#^8GQw4-@jw#(5^n_H8T1E6%^d z`9}zEA-sg}48o%b_afYaa4o{+2!BHO9m1~=dJvW&co7yO)FPB3%tn}wP=Ig@0y&n# zUzL7nR}gzQ*c?dfgbKb|=Ai8ZXTTr9#zd#Ly8{k4-(yO3fBE*0T)->s!PcJ0VsRHp zkvk=PAvP+cZ{CW{siNTr2hp;IYd?@Ks~K zgm!qaZ;6dnY`Y}f6^pN~Y1at1x3B|ALZY46H{zN{oaKvas}d6>tOs~AqRZQjJ9A-Y zCvIDLc~i`3zT|THyFvjUEgnRfeuCX7u}v8E34dSQn!`e(C%%0$y))S5o8E>!#J1^W zzR0p@Ff_d}*dC?zk_WfhrdNi8Jt5ER>7`+BdlV~xP-Hr7k4=w+Tc@vdyFId;g{_Ht z8C&mg!=&!)9HQr?K5VdJgLXwX>Iy}o*+NT$v=z&0fMN1Pvb@RBwp zxm+z9V=)T*uZ+c<2>qL|R_Kq#>aV~xfs*Q0-ze8WtQbVU3ATgD|~E7R~%{I0*n zVgm>ph+Zz!^>P_jK~5RUwE+QlY!tfb5dUa9V~T%{JPSF2~L*Qh^LuTxvp>(%qs8`L&+i@Hj^ zN&SU-v-)%O7Bxe?Rei;Bn_8mYp`NAQsh+Fer9Ni4TlK2_Ano79I@i~6WKTiveO)E#P$`h+@O9a4{0pHX#nSj|e=dk^&ItUHK=~0UZ@^aTh*BQlI04^6!jX*Wc50WOTEEzoVvv_Q@zDU7pr$zPf+i)&Qb5N9S zs3TTYeb+i&-D^Ek{lt2b`l+=-{mfdcer`Qo{n{E)zqR_+gVts0FSWCrS7;X3m0FJL zD$U{Aq^Yi}wQpS4XrH;R)vj=D)~<40r(Ny3Uc1(HgLa*3i}sf5M(u6aP1?Jzo3)2s z1KI)CE!vf?TeVHD+q7$3w`-eScWBqU?$mB@-KE{=+N#~`x?8)&b&qzN>t5{+*Ea1g z*L~XEuKTrnT@PsYxdycdTn}mwx*pOVaXqYUcRix*a6PI$;o7b}>3U2Xa_!Kbay_m+ z?Rr9c#`UE3oNGvX!S$53%k{MOit8EeHP^8Ay6ahO#Pyu^hUuv)GYW0bWK6dWXSi(7X1Hz7Wt?JrK4XS$XU0t13mK={{*iH-?Zu4KZM!mN*ZPutGap0S;! z4cq2w&)Vv==WIpV^R{Abr>#VL!B(pM!*-hXqU{uIm#s#7$u?hm*><}2imgi9ZL8H@ zwN-1c*($ZyZS%AdTcP%bEmwQfmZ!aCo1*Qp9ihE#`=R!ZZL;>R?QrcqTY>hzZM^n@ z?I`U-+tJ!y+cDZlwh7wDwqvzVY{zM%wjXPs+NNut*__(vwu#z4TfX*%ZIbq-?MK>I zwjXHwZPT=`Z6|5}v>mB^W1FfSu$`=ZYdb+ZXggku*-q51$Xsi^GIO2vs?6V6H)a0b zdUfXY)@w7@TQ_H3V!bZ&2I~!(f3V(^`CIGFnLl*ilDWltYvzsC+cIym-ky20^^VLZ ztaoPiS?|gmvTn_M%6fO^lh%7O2dwvIK5cz4^HS?WnSZoCocSl~Bbk?3AI$90xSf9(h z%DOXill6tntF8aYyvF)s=C#&cnVYRIWnO1}Bl8yPo0+#--^#qrx+n8?>)V-kSl`LK z)B0}aUDo$9w_4xNyxaOg<~`OAGw-$T&D>`FDDyt+$C>wAKgoQ+I+{6X{WSAI>t~q{ zTR+cy$ht4{5$hM3k6ORX+;06U^D*oG%pKORGat8Jk#*OkE3{U7a;? z(luF@f@`y`n6x?Ts!7*nZJKm_)-{uE$olU|Te2>nbYs@vCf$_PKk4SI&65VQwoKZV z)s}x>R!jcd<0ii~E@$$dagNDvkF!sHZ`|a`?~lu#{K2^K1s{&f zE!aCQr{JS;M-+TKZcf1`I_};{pN>-sJ{z}f(&yvuo3wA-gn}=|O)mIy+{}Wn z#!V~OKh9Ech284B(r$5HW!IdW>>19h?U~MN>{-rh?cyxqQd;vM$piFex1nRu7|rxUl@GbY|^|ABLx{e(&P z+fSVIu>IVLkJy(?eAIs4#O?O;Cq8b^pZJ9R@F_#~2MeCE-&OFm{mFu7>^Bz-+s8Yf zwIAht&OX8Uy!}|`PWy2a|6xDH`J#P>^CkPS$G>9VQn1@TSn#U-&VtwM&lJ3Fzo}rv z{!YOg_8SV`wBK0pmi@MZJ@)$w-nQGOykpOIzH7g};63}T1@GIp6?|ZyFy%x0aZ~o% zTc>5kJ^0i%` z@=yB@Cw*f-a^eB|Ea$iOqn!us$2qUco}*loeU`F0dusl5*~jM(X5Xwllznyn!`Ua~ zKay>qv_0FSJdr&bcjlLgObXHEJ?_KEqsve)Floc){p-Pu>>AIQEc z|Mi?Bog+EJ8E@n~oAGAOa~W^tJfE>AXJ^LSIWJ_qlk<;^cXM9McrRyH#``%hWqgqH za>j=_uVn1a*`4uG&Z`+8=e(BjNzUsTqd6lPpXR)g@mbEB8K398m9Z~pPsSHHZ)bd& z^G?QBIqzod&v`H7>zwy9{+aVZ#uW}#ztUmRuX0%RO%6@J+L57O9;z5px@>=T)*9MgnozPhx(n4 zAL(~Fj?}k0#_M-Gj?(XO9IfB$I7Z**n4sV1I99*kah(2uK>$n5aMG$k!is zOwu25Ox7QD6zJO>Q}o9i$Ll*BQ}xFkC+JT&PSl@toTLvqrs+>PPS&4x6zb17rt8BF zm;S87tv}~DMStEgL*MC`slVVjRsVH03mEd3?NZ2e`&8T#vvx%!BsNPojo ztiS0f(cf~E>U$hz`rD3j{T)Yz{;s1^f6q~+zwfBlKXA;`KXlC3_d06yj~uo7sH0y0 z)N!`{nWI7f+|j7-b2RB+I2P((Iu_|)ITq{t9nJdJj&t-YbhrCT{S^0A`V99beWv?r z{Z#ig`f2WK_0!#(^;z!g^x5v~^)uWz=s$69(dW2t)X#L^q@U%!S)c13(2Lx+=*8|^ z^%D1Oda3(%z07@wUhckAuW;X`SGu?ARqng>YWF?*Joml&eD^lJ#(ke&>%L!K;C?`_ za}VnE?g#a=-4E#v?uYe8_al0f`%!(Nd%M2K{g}Sky+dzyKdztSenS7L`$_#=_mIBC z{gi&5`)U1r_cOZ3J*>C5pVhtY=k%rS=k-?iPJMIU3;K0=|In|`dr`k3Zmd=-l*Px z_)2w)bBnV#=2Y&(`<1Vcov7RpJ4x9Ro2J|tJ6X9YR;b(@o30GRT*@smw{mOj6y>(q z4CVINOy!Q)smh(P)0Denrz=}yvy{7IvlVe~N34&hk;f=O-iboNQ+xqm>LAShx7NN&Q_*Sz? zKJ*|C7VLN!qr)e@_=~O@b9qynt4elm@%o{T&f{ilrxv2aIIw zAxmKvq~Lj$%9_GRu+S|Tq1cW#e7LOn>SSlX#;>S~v?rggCICg{GKo-eo zz9EbCG-FhNq#&X`9BeIaYr_tRQNsiTPlL(o)7{3g2bJh?1o8L~MalekZ9YitHMoJmKLNCn7~HlPlx#MNaYXb9Qv6I`Oe3 z(iqAsAELuRPk6>J;c+TM_MwXUZn?$X#uI!-_J@}De;|_-Cd(UtP+s0w2bg?Uo%s@Q zr@L?lRi1bI_$e>JCtFjD8l(LaA7d2F6z^Fns^xk~IrRKvN_>Lqu?KXF^(XX3&krGT z&cMOgWjNn<|H0Tc&>_&BpmXq}|MAD+`9IKp&?TVs7T0MnAB?R={DfBy#`b~+K#u@E z;kARYS)es<9*of&UAKVtgKonIqigUMv;&|~(Dff2jBN(p2)Ye)8|Y5ZA<*|g_kt?e zV9ogu`GZaab%D+SEdyNwx&(AJXcTlK=z7p0&@B|d_h4*4XaF<^uTEPH>I7X6IumpY zXbtFuj}FFGg67~S{#)o8bP#k7=q}J2(7m8bKoz`TZ8hiw(7@=ySSRTE&kn|hKsW9? z7&`#E1>b3?!E4qIfCfMVUmc8X0^JC@6?8Y~Flf&HgRwoJOF*;m(zOF$AB@cbUGmR^ zu@=ypg9l@`gXZ9=w7sAkL8sx>Ya3NOj{rIZx*BvhXdmbS&`lI?!9FEjgYE;JV8ycy zxsVGw0dxq|1-cis3^Yf>^A4aJLDzvEu*G6qKv!pCPm-=dH9Q_3$ij0HphKY3Ky&a$ zvS!e|pqoH9;ypzBK$m1A{s*`QEd$*Rx&(AWP7GfYLOketiU-|9@u1r%9d3S_8TfbUoVAm)L7PCQ_$^&;y_=DgJcy7toEMn?SdL zZUx;7Is`gl7RpOFsPh=enT`5_9spejnsXl71#~0me$XwTITO$hxL5B2-Gcjv>p|zV z#$vlcmw=9f9sr$lEUs~{Ydz?;4zv&K-)=wp8R!H&2ecpb0BF;Xkv@QYL05xb1Udw| z0dz0u7SNm!`WNVK(5X)FU5I`NIuwN*&0p0j3 z=n-^pFUmg&e4u5ZOMVT#fo=o62y`!KKjFWD{z2D+j#4~m&SdnLHAoM-1+)ot!bRwx zpfzjJZlHTXM?g3JFSJtuu0iL3PQ$&3e$XYL+lb;G#rP?Z4>}X{0B95FG~C1JBph@- z=mgx?c!c6{|0DN!)T` zy_|@2pf#X#?nS$TE&=T&9CQolv~9824$uJTZqRLmvDgtOp?;v#Km!lL-hslTh(rBZ zgQBj?RgcNZ%<5Amj&7!Ge(oSvT{y}zVQukrGQv!R{>=wty|DX=o?D@hpLbaHimYB` z?$KwQIAbzeU#4FIy8q6DF_Dl!9F$)aVH9|X((^%b*CR}Q{$Q+@uyQ?jt))^Qzs5RG zcSiN`#d>bBo~1Yubvr^m_-?S^1o#@uJl%!+5OzJcT+f=HT@QE{!ft$B{savtC3@~3 zEG7E*OROcj^J1+;pSnJySa+?p73;IsWLD~1oi%#jY1YTAc6}D`Vtp$3z>jn#dR7Uh zSB2_8uk7547Y;SyoQ^VtB48SP4SKt{QlaNwLit>5E!UmvHON^@`K+;(>HVtp4Vzte zmFiQA6J!^Y>=uM|kP~?1VC*5x(Ih9aywz0RGAeH=m3N*#VzJ(1(ciNy)<-Sn`hJ97 zYc){I9|6_?oRAi1<*J^_DVy z{8}r@y+*6hU6uyB?nFvx9@?qS7P_fIn%zh<3IZ6*x7Uw0rANZaW8H8^Iz85(4QIcKHvgsvD`+z5wV-K*=G%^kV-=79Q z!U~yhB$u1=nFc%yIEItRv(c_+m1kEYXIvuGAbvdJ*HAq4b}<@e{Cd*wTIvgHGHP_! z&+VcEKz*`vm1aZA)KZ~Pi4>;zU1 z%t;8^c@63b69k`1rf+9_EwwAPzsqvA-RJ@6kuJoK$GF)D8E+A<=mRM7TB^$$ty(X# z+=D)V)UppC4V9$^X`10r8)c@lv;b=Ymf8na0$-BAOX=6Aq{sBG^ruM=Sm>MH1xNY4 ziGH0rW>Us@nO<*s7^53?O&Q%4*-8tN)BEcVymc^^2VMP3SuK_~O)N!C+B_<=m1z(g zKptD)J{Yr89_X`{U!Vic&$e6#Qki{D!hh%zEE~bU;oXBVdM&PUHra%_xDBf!n@~wM zp^R*T^{=pguCipqRgvAPXFa@q=&7flQK=z#7S(besdhkp@IW~+# z#9u)1W8+@5xuq06q*RRfdD-X+h{oWTcCifU29XZar#PtHn}O{H<|br`p4-IZlfG7< zVeMq_IuU&lFefl!_fgNamb&eFRtud};Y9RD`bt6#c>cm|z1|}Fqp(TTf%hibq_S*< zK>4!ZDckf#)NPjeptheX8|C=sC?C0V^mE(qj{3 z_I+|teyeuO&Q|IhFwbl#s?mE(tVNJRqX%=Em;>e@-Fl=O|0&yDkq%R<7@zfV=F05V zIEVI;usr*0LxwU7>4%WM6Y2L;QAGPy#qD;Llz=v?$hHi`FUpO%jlTRb4QoZCU1&Vg z7e}gq8RMBS`r1etFf3ifL0B2EdSI6_MrENdoa_d64q*#u4iW7IL$^k|!2U3*upK>U zNYARF-XzUP8Tu;8y9{ZS&kx4nj*Ek^&A@Vi(eFg*AZ#13S-{!_BC%m$m!+iL1FSy* zqp`Rj*cM>FqqG={aws;5@lc8X#o5qUR#kQt`kxalQ=x<$tf5voy#nVXvrR~oGUe!|8Bp5dmEhf&!0QEXW%i-GRL@P|9R+VU$;Cm~R$w() zt1lFYlsN=!1F*9Q6XQtO_e$MaYxI-yhqt3>h~5w0E#Q5Qco)UnM~?MYYM^3npt|g4 zVMUs$>DF4&kn!GwaYlBE_B)EOPjDm2Lce1l2tE}1K%^=tU@D}?y{d}rg(-*_Lo|La zgS>voyN~5@-$822Pmy<-Fg@kjW9L=b!iN|_x~bTwm`&;0q|G5)v=8>td1b`or~eS!e@eAU#nq` zTay8Yvt9HYm6Rc}HK$u|sgB#a9>bs@Zal&s@b-dNtYgI3^^0*xaS9x# z%Me#g=ksWeSVmKh$YTQHb|6mJ9F#555AHDfA(GK}ssitB@Rs~L{zE+;l)^MpdWbUu zdjnaQLDmTN*EWKh&q-q5uhc`jbudcyW+i+AG`yEVb{f1U>{j zF~6zc?*p!35A6vOFgACV!R4%zc1KKnVk~R}?`H7MCEi+UADZ9Gv#B4t0PRNn4#Y2^ zc+q}h4uT!IAi<0*jJG7^pNl=oeMlqblm?Os^EsbZmYAz5vlq(~xdxsC-dWhs^QG}g zD)kW!kH{r@CFF7_MF>%(3+2XQVM-_J$bPu973BheDwbqh;7i6m1WOq%U=k{*exz&K zL*0@WOPV8xfNf2|Mu0t%g3-R~a0*6yu)9+*+K+t?*hJ(<2jxq9v)T`0v0n;AVzf^i z0(LC*eH?QTXwP=_5qJilfQ2-!j5=D#fhm3%wZuRx&z6e_)Og;*+v_pKSiy-T8<2k5 z5Aj?(kEcWC6tS*`mQ`!1MY_I;>uRBE>VG4Uv-8O0{s&0ekADY%8+MMcoIKcz@yVDI z*i2xF{d^{{7GM=fLkFd;0=6-QZwas+z)llfk}m{oUkcwvz??_Lq@T+2HUJ9%ODx|O zVCzz_L13GJCFZdc*l+?i4Km*Yb^uro^*MAT%X$oz;%qpUXoGp;Ke`ys5lwm%sys!Op4178%@pElv* z>VU0XpwF7G7ZvMO6?%QO?(!rvKosd<8t$8nFU9YL{++cVbnr9`Q`(6cvZ#)$A+H&q zEx~OTaZr2q0c!*HXF{OoL+oA^?I+TnQKGpk&9*E`cCV?tyCG{UWSvd=8tYeRc;1hy z)LUo?GqpBB8Q72bOGYG*cXth}1 zs+Q`5>H_SK$~{VCqa^P|BWg|NTHE@Ji?vIvf1s>Mche9i+>E^xP&!C=Lnz<6>R9aP z?<^ntO}(lmlD2u~XHOOq4=G2lSvmf8(^xr*ke2R?Ip@RYV!a>IhCFu_Szvfw=#`00 zIbZhU4Ro)p2ESjUvW&GIIOA>SYES9MrPcEvA;zcSZ>`Z_$1K)!ll&oc+86cB z*e@TjRDc$P19lKe>Hc4CJ$|o;bE^A##2fq1^U!N7{fTZ>arR8G?Le9>NF!`0T&OkJ z953?dRaJU@h2C7Dw^Znz#d@etFIp3-xulyU>Sy_;uELaMFTzowWi;dA8+uIIYBKJxBhMqgp|$!Hhw;&N?3q^T__q zLfC+E4K>DM^SCcxO!pOdP7rnsrLkBpPigP!>=4q@{mhYtvDlY5C;eSw!9LK%bnj!m z2E)IW?j@|TdGuK&dQpj9Rif9|>#o%Gc@?$=XI1J&u#D)g=Zo`&hB<=?i7(_~!;noC zHh2Sz#`^0eq{l<@tkmlxqBZLE=3>1b)lTjH#n?}8Zq!@O6%4SqkWKehMlo>HDFwUaeeThdV}n*!3Q_&^lf2iWH2|?p>7&2}@FBadkqq%ku zumNCVJub!uWR+y~{ zJ=Cbz0n0l$K*kG@s9c{Sx;>IBLsWzmmUlEJF$m9AD z-x>BeelL2^Lhd>gK$bD_HgtLR5s)6=_F$24LNc|v(>sOVNy|q_8 z+mTtO_x)P6UXy+{#ZEBw>5Y(^^{ZIyo47q3n^T~i_`UTO%fou-d_B~rcb4fbX(koi zz9hm&OY{(J_E{W1T|SEMVJ!!PO84^-X&IXGa1bMUXDrfDZ#7t6!UtO>NwZxIKuw zg$9|hQE)8SMwO>Nr!i=;{*Bg^hYk)}qKLePA+M>A_bY|2Eb}QdswX{{v;lE-IETGN zyU{#2FMA#ss7^UBCOZ(1VIdCcGfrSTfvqJ(jCs1Nvxsh9(32+kUzJ^h^iPN7;(5Jd$JnXI$-lPTnO31KEksPm#SOt~j^~f98F3i(`v$L|BLM6II>^_3 zOC(>6uW1QI$0%P9HOuR-`P!(5ME}qI-_PxmD$&&|ks_w`Ok0?SnD#R5W7^MjfaxI9 zVWuNYN0}YCZ)XCJvw1{av(-x*7roBx2nD#RrU^>WjnCS@9QKrgoIDe*2rY@#M zOzWApFby&7W!lHIpXmV8L8ik@N0^Q>Rn~C+Or1L06sq$OSpQ)3ni)j(l zdZsN*Lri;__A%{eI>2<0=`hm~rlU+1u`z;ubEZzFE~Z6H>zTGN4KeLy+Q+n?=>XF~ zro&7}n2s`4{ukGusgtRTX%W+UrY%fEOnaI3G3{qMz;ux5Fw+sHqfC``oIg`1Qy0@B zru9r)n1-14GVNp9&vbz4Ak$%{BTPq`D!=3WnL3%em=-auXWGIv#I%=bAJcxO155{* z4l^BLI?7b}J?GEV$<)QPh-p337N#Mly-fR<_A?z|I>>aG=?K$NrpkYC{!E=rT}+FZ z)-!Ek8e-bZw2x^&(*dS~Ooy3{Fdbzoezb-nW;()jl&Nwt*Pp4Asf%e5(|V>YOhZh2nf5X5XF9-ikm)ef5vHR|l}k8(rcS0V zrbSHanYJ(uG3{mA$5cxD_y1=(ErMCa|H{(RGn`WwF2$Qrdz`ZiXB4_lcAwrOF5SO8 z#Z~B! zbbg){UaR33C-cLr=YE-tAFVjk;)d5h#!a=+luu)0h&($C#DZP=zLRBr#j|k0PGsEB zr(Lqs$L9q9iL7S>_X1BRzl-^m8>E0*Nt9nOUeCDr?JY2BRw|EjlVlXXx5eq75LB#Q z2D!fdRyj_o7{u?oRq{7UqFm2-ALCl4jJO|!c!Cz*4 z9phQVjN=^y;=d?G{#T6mrr_C7yNZ6;a)s1?h=kxchVhXU`~=|X^gI(d>7j@!o^YJT zcqj$0X53f@8%aFCsr;Q>PF#wkTi}QG=RdO?V_j{?p<=68{iTkJLE!1i|1`_#zgtQ; zl?AExe)?vf7Q&vHU3a3{fjS@6@j z{0$~@3QTYp%jwNT!En%hKswH3JTy+?%OtEUFp+aE^S8{A{H4qvWPE^edX$5XUdD$R z7th=Qzs!(REaiyj+JMt|rTX?$N5UbVfdZx9QB!{&xKH9n`L{E^gYj&U3irJk?@QtT z0C+k*?`MAHektFHDTNM;NxL5ooXV+ODEY;+3E-c?_+V7x;#mXWvrXhwnBWa2xY;;u z0l$i;C<5Xk1Sbo;8)VjM-SVmUWd+WzZUWjok#v6@S~LRPAD+pxQcPZ?=hkV zM7}>fWd3@P@zim>Q^+}VUb_UUx1^c(Uj_dU&@Q9DnG#{5<|R8-&4HVHTxcQD?^cst`q3Y;$z$Ry?;ut@o* zaoj14k1m(EF&&lz&qL0GS4q5x`4<^-QpQn4;0YP>>BT1a8+d|M`)?(cctV9)o|n3ICbQKaetx8W~rrq#Sln zl`a!Gmzdz!nc%mW;D0$%)_3?NS5&XHzNKop{n0L-+e3bS4JLV6X$Y0I;xnE1hqnQ6cP51|x-<87umgp7f1$wn zB7yXp;D2H{gI`EypUg(-H{rk41b@r~f5im%lu2Ctz6M1; zOW+9=<kgLxsuXPGn=f$AEP+gC{(gEn9FEx>S8T$6HuDd#{tZ98lX2HqQh@jkJWhXUBIimI ze82?1pXCpx_>I?Ni!I%}zZ3j4f3;jG>t)!JJuGMRHCayan>d_)W0J33PcQ#i6MVJ_ zUT1tYpMAA&!j0((COAfy19n@pIfJ{6!{sEz1d|_#yO;+I0Qlx6D7v^L{Ot^FJ9M z=6#;2j1Mrba6f5b{4vH|DgOT+gP+HpF^={NoD(OI46Mh69b-M8&vALcoe6x#>B)lM zxEiB#SS ze4BwcO8ghh{}ON~pC^*fnP0h2qP)yj4g$|jv;UI~C8X2C(E`VQ4)3cN0K7o|3_EK zep1963iK|Ebn^dbf^T6t1H5mrhRd+kg#S?!{B4#~v`m)gYnEd2gD4tL0o#vun zrS$WF3IA_Q@QuK!JQt;uhu(>vu7BQRg6|YKM(yXafD5>spP2Cfllh0a0WVhMix_crLf2(a--V zaLJqa|4I}5P7|Eo#gVSQBLYYN*&(I>MRs@PD--?<-j`_M{VTZN;>cy(m9oCb7dSH| zkU1v!d=tEx$V65xu8w2V3?d#0n&;I{Jmh&a!&J;bXn4pE-=KHOynSX-7`67Xw%KRhTK^Acw zeZzp{^s_xN_5oT<6N`IQO(;S*&4Q7R?>m&`w%@uFW#9NkqMB?9M*1X5>$pUZLv z_Dg0%PLT0FUY8m6>h~sc{%C?=I!IQ)v|WqAz!cue>&VE*AnGT$4xUKaru>$?K!!5V(- zrOZFV{=lWo|98Rv17&y0ymJHd_p{%-j`;@#&KC*fDdu*p*dm)B)R zz5c{_i0#AKobR=a*YA?RLdNNRFX`kz&io_Xf6izAJ&gAbOMr)y@|lU8OgunB^Fl8_ zSBY(NaTG8<%H?^E@zVv)7YU>sIO(T8W&K`f!ry9wM+A=Y@VJ9{7sqNLAJ5To|E%JM zr{|=|&TlR>T14{y#zg)lCis<{uk(OR|Gp&3?Tq)nECKFz%2OtCb}@eu&-;I7IiH*G ztIqW8s|y@@;Q89{PmVX?KivecFy!#~HRLQb;SV!^?zf6K#CvFQwnpF*OZ@+z0>}PL zN_$-)@I+2|euu!Ze==9vp9h)cDaMt5O2Bxh?rz3=Q~b1#1ul6L|63=f*XNM}$MeJ6 zC3iI^I?05;7&zI(7WN--TU;CqSx(FS^7>6xQhMi2x^a2|^Vjn_+OR*rFya5B34SHZ zDLPdZ8H#sN;_P=0%28jM`NGi?e`><-H^HMO_+>1=p7*`QyLXVs zX2wUS$%_7t^L@ZX&XdgV;`Lw!^S{P;3;TgTV*FbZInK#aZ}o$cQG9;}r_%(^i4(}F z%-`~<1W)I<8pa1WU-3RA#CaHZv7d7}^Z(pL{(qR@{|%h_LqGQiV;}oQmLKB#*MDI7 zPnpR1g!z@-lF{(D?FH%W#<2p=Rq7v;{D$40X~JJ=f-ht_EhAEnVIP(;KEfT`Xvfti za{5f>uS*O$>>wC^``>|+-g;B@W+MLy6Z{nu{9S=#{la#S-Erk>6aGvnknB|z+bhGK z>%i05?ITU_=_dHyP%qhmBJOApu_HBC@MFG9xexnO##>&K?b0lX(rqGtE%O(>A{mYT z^H)O-?+dM9Ia?T~r?}}b=ADNaA1spiM&?&my4{|xV7DJ%*Dh>Tmiybff^9zf40J7M zb$5HP&>snV3tft*BhbF0kv|NoBr%;ypR*f--I#)&ftr1VO z6QAO3^K^Or-Ab3g+vDx<;d9JEqzlpqs&RsHK~~g*;uW6an(dmU2X$3wxqnp4LFH+ZRzhp0*%V z6kO^Jc-o-Mh{xNrQlT#<2YgXqTj4C%Y0zOhCJ#OW?e}=YVecvrzU3WWrHHRkd)j)s zx>g}c!j*@<(w@W`^>?pol`28WNI7ku6=82Egu=D=bhk$R!EU9)7Y&A@h{yldo^S-( z5v^Gs4hO@fMr(+#$Ad|Hg?J^{-X8HqBZa5TJay)2P*QzEc~jFlo{EJFN}HRX@9tUYF}^r2l;rE47hDxVw_R2yzCW*of`Nbm ziE>8(Mf@v0QGXZ4fpHO_PTmn%X?!LcR~}DALvd}nr+h(~$AhcN1q(gpRSZ^@H7K6S zn!1wW8c$tCMPqrBr>VH4rkog?YD?pZ+9E-ZR0<-Jx&X#sA`ppUv?-pla~2fWR+pkE z?JF=OE4^J^-Ue@1h{td!;E$Hn*DL%9b1y(AE8ASPDQA#_#VKjUs-V>Ys-9B_3ulR<2 zqv#k=I1hYu=19ob>TmbA78O<2RF{-`PANR4@Kn57e%5K|wA6(lbga@`&5B@ml#AM2 zfxZ?Oh!3^5dD_s!!ogKz5@!^iB1%r5WmlS)ErrN34CGevo%Z6MXt2Q-Lho0a8yZNO zEMn`La}vu*+lWZ)hkE1cI$Xg~n!trh#F&h_2#epcpkd^dAqrvWoBIXR=O5`riE(l^` z?FhgH=#Ex+TWNB|Fz*bm;3}|+{Bb!LnmosQs119oO09 zF&WRXy1GwSnne#O4R|AwDnDim%zdFSPTD=Koy*2JXB5tqnm2UJ%`4|1(e1+im0~LK zcsja*-5y~VVShUUW&Vg5(V|i-yrB}&Z!uoQP$b8p>yWY08SDwPl?E`5l;)aXa9K~N zF^Xb!B=!c8cR5XF$wh;{r4}%P<4x5{7ANBG==LVGH5nWj^GL9D_H0ii((3JQAFJ}| zD0*qYhb{+)2}WovhPsGh8oPSX0N!Xce5g4iHjf92^@XFJcCSAnV;NJO zX4Iv+c9A!L*_b>D{3REI%}}%34K0TP-c_ROP%1erF|{{0c>NK>E{+Yh6ca)Y3w4fQ zdz&}GB#VN^2d-3W8Kw#009N|CYv7ZiCF6!v+OK8|`{k&0+@DBpAXv1q1`@r(0Gj+! znEs^EL$hBsHS%)!he1*?>^7{fQx~29v%ws)_7P+j=l?lzoUA(e} zdKFo_cnuc$!g2kf0;xSZwND6*#0Rc02-M?+^EB2@WD}@9Vu+CW=xy0j%y8r$HwAG5?>Nz;LX|{&kQ*s_ zMRVLkEXB&LP0ZqCM&X_ts$peG`8+xdr?b>BwXh=Sc33od!yP?cLgB(iS%9TOyy#K{ zna~bjG~`dyYA7E~hjEPxQz%^HF>R9l;4*P*u_ihKH9>D%bsKW`V*sWOY@Nn#C&3SaNasjUpLyICli8 zCvMkx-W*AuP8@5l3;DVe%{0m_6zHjLs>SqStZ=amq4jN(;RdIS)>Ku+`-q`vc#C1E z)#wt@NW=qw9`lLP65vgX0i=({Ubq4~9q^^t+$41ghc5|f#G|AoJGZwl>%% zY&lTF8a_~B)B7nQwPV^=6kc8=;PYWU=xKw#qZ^(*<6Z_H%qD+5gpy= zN`@;U8##IGVSejw^M{i`%4RWEjI8+Po@o25Bqs|70-FxWiQ>7CBSn2?ESgMae0QhK z-`R5*TvNq92lgpCSQHn#Mz$&?j6D~5hvr!yj**+ zF?W$)uh7O2wD%nas2ZEAlL`jK$M>9sF_0c|yx)zv*m0{MdJ9?HS{{^sF=v!u5~Aj# zrHELFH;9c#)>dN6klmNM5IHUl$x z+hev8sXGNm1e%{oIkfHciDQeZ|V)m-n{^7 zk(Mw?_p*nkbSF87VndP|HaQECxH^KxfZv$zVdCYsMVSvptMx|Y!a2dHlJQ4J7YzzU z8s)>RPU~-@k4gUx?HLVXBR8V-2ve1uJ?vDPUIr9@$(*E%G-g%K_}HJoLb07!z!&zw zsb}3K7z9Jlv_ejn-CQjOsNwlFH+q*F8yQBY6_zC4UE|A7xMG+T8);od^F%b5x*Vfo z$Ts2L2|ojyq+&gu)Nt`>du%&I%%Q1F2^FGd=n&0N?_cQ)G}7jUADuICjL7z-Wt((A zFpT2XCP_5fQHmB0ujpf#bZ84XSyv*F+>ELyiFXyTZ6(teW7+CoYUp3qnjF3`c7HJz z+s6Dum_fP$5LpG|M0$b>#@r6ENTqU1V=A&G2R_-0A{9tOdC2fiP?Wzr7=?cB#wWfzm! zg}D2WGCDf~VxiYmg#GM8a+eF!twZ zBer?5Hykp004y9?f8jWA7sObU5@<9FEZJpU8exHXYf9JF}qs$K3JRJY3+ z)368OE^HP@TRX>^gOw&ah3ulWFdew_)?DxNElV@sA}`5DO7W6M8uf^NBa0*i(S9?A zN_<_MT3E4MYo=91ldy;>+BN)?_&x@$_^NBA5fXbJa_UK$*~j{dVM=(}!%c1&KiQ^Z zRzL1@kL^1ceY=&sblP4YQ<&K7q^#n7VQdK?>dBTQF;nVx!UrUs8M{~2kz(BAT%O{l zr5e=s6>+zl_N>~`AI8c;mM~Sfsrv)%D~tk(63|)+ZohHwrajofH=VH1$UCxNXf}bOPsmXxo80svq-Lnm^xA`l;CX1n|;QJ z3{S`yC|E2UI#P%?$=z%VV6Q2;&NQ%lx`mR+ zj@5`oJ`6o>`eB=m_rQ6{i7wKO;bZJwN*&Q`BlHBXhWs1W+}LibbT_bHj;@rv<0yO> zp}u7QRuP{5A*&y3N?=M$E`Eo&-;Vr+)uIV1kb2KYtRBeJMM5d<4VyzZu6RMiyHQX= zd;%8r0>Dig_b%n#6DmIMdw@sGP{!U7jK1j>RBC@o-7J)Qim;lr5J_T2E@KlVDHwK3 zY%{`R4AET@*jvAE1?|=(EsD8MOJR-ThDvq!n5!=DuoxypE=8zABx@R;;GqL9sd&lb zHeL;}HpD&d^jnEzy7u^Jha}B3oxJNnHiSBM!rHbu+=ctx7xwth?(v3~2?tu-{Ah~{ zqvd+5*bGaqlumk#u4q!7#*A4<01B@N1iew38evX@k!X2WD7wmY&Pm*jOV)0i z-2O=}i|oqq*U*s7Vy6dFh$u`ce0*=hZBL$l;*GC$V1d-fEV(4I3Nba4+hfkNUt2LBxx5+(IXf&PY2A!um zUP9jytOt9HO}pawEp+x)sC|&PG(}<#lWT)RZ|%Zml3V(`V`Xe(NlTTofnfNPa1oR1 zN|w{u1EsuC>Uh5pNdzM|V$Q$VfE?E$#6K+D?YClTdL<^~q6hha%WJy;!9bwyo-> zn}_w6G(HOFD`8T9rZ=SzOXXVc-r5 z^Hb>S6@)G#-MoYHtEok zt`voyhfPesn$sK9nZlo%elg;|#J6^g{EhDs8FU{B$6=Es{{14pRJ=IBtGwdnH@;V7 zP=$XuL}EyHM*YX*oDM$%71_w&cwfFjXE+g=aHQ)0Ld4OxgpBmYd-V-E$oeqKZ}1uP zmq<_FCNi##_wO4tmoudDlkSZ2<5V0M<3Hg>dgDF)2IZe$AEG~_{(s^0B|;i~CtaSz zDc(y!2bG`F82KCNuK-3xH0r1H;)0G|@n50-op?}L6AyZRHZi@kSH>E&S5M@o-vr3R zpx5FuF}?8}0fQQRh7{x4paUuCjqeQ@H1sd>r{|Uv^Eck3Z_rcucMYle8`lq{q&L1_ zU{Hs_$TU@dk8*mW{f+k@8T75`$pW0om&#Kq>5cCp7_^PYpOGvze|nsn>Tl$4d^f?M zQzsiKB{lkwfxe9sQZWyc_##0MCR}MG1P>iXdV|vII1D0MevAWVlwGEj|C=kM)R(3tqGS0QXdX_|rFVD9^hX;7= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "3.1.2") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("3.1.2" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + else() + set(CVF_VERSION_MAJOR "3.1.2") + endif() + + if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed project requested no architecture check, don't perform the check +if("FALSE") + return() +endif() + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/deps/glfw/src/glfw_config.h b/deps/glfw/src/glfw_config.h new file mode 100644 index 000000000..dd3ef5448 --- /dev/null +++ b/deps/glfw/src/glfw_config.h @@ -0,0 +1,81 @@ +//======================================================================== +// GLFW 3.1 - www.glfw.org +//------------------------------------------------------------------------ +// Copyright (c) 2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== +// As glfw_config.h.in, this file is used by CMake to produce the +// glfw_config.h configuration header file. If you are adding a feature +// requiring conditional compilation, this is where to add the macro. +//======================================================================== +// As glfw_config.h, this file defines compile-time option macros for a +// specific platform and development environment. If you are using the +// GLFW CMake files, modify glfw_config.h.in instead of this file. If you +// are using your own build system, make this file define the appropriate +// macros in whatever way is suitable. +//======================================================================== + +// Define this to 1 if building GLFW for X11 +#define _GLFW_X11 +// Define this to 1 if building GLFW for Win32 +/* #undef _GLFW_WIN32 */ +// Define this to 1 if building GLFW for Cocoa +/* #undef _GLFW_COCOA */ +// Define this to 1 if building GLFW for Wayland +/* #undef _GLFW_WAYLAND */ +// Define this to 1 if building GLFW for Mir +/* #undef _GLFW_MIR */ + +// Define this to 1 if building GLFW for EGL +/* #undef _GLFW_EGL */ +// Define this to 1 if building GLFW for GLX +#define _GLFW_GLX +// Define this to 1 if building GLFW for WGL +/* #undef _GLFW_WGL */ +// Define this to 1 if building GLFW for NSGL +/* #undef _GLFW_NSGL */ + +// Define this to 1 if building as a shared library / dynamic library / DLL +/* #undef _GLFW_BUILD_DLL */ + +// Define this to 1 to force use of high-performance GPU on hybrid systems +/* #undef _GLFW_USE_HYBRID_HPG */ + +// Define this to 1 if the XInput X11 extension is available +#define _GLFW_HAS_XINPUT +// Define this to 1 if the Xxf86vm X11 extension is available +#define _GLFW_HAS_XF86VM + +// Define this to 1 if glfwInit should change the current directory +/* #undef _GLFW_USE_CHDIR */ +// Define this to 1 if glfwCreateWindow should populate the menu bar +/* #undef _GLFW_USE_MENUBAR */ +// Define this to 1 if windows should use full resolution on Retina displays +/* #undef _GLFW_USE_RETINA */ + +// Define this to 1 if using OpenGL as the client library +#define _GLFW_USE_OPENGL +// Define this to 1 if using OpenGL ES 1.1 as the client library +/* #undef _GLFW_USE_GLESV1 */ +// Define this to 1 if using OpenGL ES 2.0 as the client library +/* #undef _GLFW_USE_GLESV2 */ + diff --git a/deps/glfw/tests/cursor b/deps/glfw/tests/cursor new file mode 100755 index 0000000000000000000000000000000000000000..0d55e90f9ab3064f54f2001ebb265f48c34e37b5 GIT binary patch literal 136536 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

TGnE}A3+=ksR*xIpSkJN4Y!qh1I(Q~K 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 };& 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 E0};CY>Hq)$ literal 0 HcmV?d00001 From 9f4388d3a32187f15e6f6e830403fb73ed755572 Mon Sep 17 00:00:00 2001 From: DavidLandes Date: Thu, 18 Feb 2021 20:31:20 -0500 Subject: [PATCH 03/38] Create UserStories file and add stories 001-003 --- UserStories | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 UserStories diff --git a/UserStories b/UserStories new file mode 100644 index 000000000..a46a6d825 --- /dev/null +++ b/UserStories @@ -0,0 +1,3 @@ +US001 - As a player of Craft, the mouse control should be less sensitive to movement so the game is more user friendly. +US002 - As a player of Craft, certain blocks should be affected by gravity to make the game have a more realistic environment. +US003 - As a player of Craft, the cloud's shading should reflect the time of day in the game to create a more realistic environment. From b8a60cf91a0f1a5d54a841dc94c93ce0b5ef4f3b Mon Sep 17 00:00:00 2001 From: Nathan Johns <47930805+NathanJohns307@users.noreply.github.com> Date: Thu, 18 Feb 2021 20:37:32 -0500 Subject: [PATCH 04/38] Update UserStories --- UserStories | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UserStories b/UserStories index a46a6d825..e6b977545 100644 --- a/UserStories +++ b/UserStories @@ -1,3 +1,5 @@ US001 - As a player of Craft, the mouse control should be less sensitive to movement so the game is more user friendly. US002 - As a player of Craft, certain blocks should be affected by gravity to make the game have a more realistic environment. US003 - As a player of Craft, the cloud's shading should reflect the time of day in the game to create a more realistic environment. +US004 - As a player of Craft, I want randomly spawning buildings or structures to create a more diverse playing environment. +US005 - As a player of Craft, I want randomly generated lava pools to create a more diverse playing environment. From dfc774d038b402decce68b5ab663f8b9061a1ff2 Mon Sep 17 00:00:00 2001 From: Nathan Johns <47930805+NathanJohns307@users.noreply.github.com> Date: Thu, 18 Feb 2021 20:59:33 -0500 Subject: [PATCH 05/38] Update UserStories --- UserStories | 1 + 1 file changed, 1 insertion(+) diff --git a/UserStories b/UserStories index e6b977545..f4f30b49b 100644 --- a/UserStories +++ b/UserStories @@ -3,3 +3,4 @@ US002 - As a player of Craft, certain blocks should be affected by gravity to ma US003 - As a player of Craft, the cloud's shading should reflect the time of day in the game to create a more realistic environment. US004 - As a player of Craft, I want randomly spawning buildings or structures to create a more diverse playing environment. US005 - As a player of Craft, I want randomly generated lava pools to create a more diverse playing environment. +US006 - As a player of Craft, I want periodic weather (rain) so that the environment is more dynamic and realistic. From 66b19079e7cee595832c53edc40bab44ad0e2533 Mon Sep 17 00:00:00 2001 From: DavidLandes Date: Thu, 18 Feb 2021 21:05:45 -0500 Subject: [PATCH 06/38] Create backlog & add Tasks 001-004 --- Backlog | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Backlog diff --git a/Backlog b/Backlog new file mode 100644 index 000000000..3b6f2c204 --- /dev/null +++ b/Backlog @@ -0,0 +1,4 @@ +US001 Task001 - Modify mouse input to move the player's view less. The mouse should be less sensitive. Points 3 +US002 Task002 - Sand blocks should fall to the ground if there is no block underneath. Points 5 +US002 Task003 - Gravel blocks should fall to the ground if there is no block underneath. Points 5 +US003 Task004 - Cloud color should change to a dark grey at night, and stay white during daytime. Points 2 From b8d428166522dbf637dd345779c1eb90b903bd99 Mon Sep 17 00:00:00 2001 From: Nathan Johns <47930805+NathanJohns307@users.noreply.github.com> Date: Thu, 18 Feb 2021 21:24:25 -0500 Subject: [PATCH 07/38] Update Backlog --- Backlog | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Backlog b/Backlog index 3b6f2c204..de634b4a9 100644 --- a/Backlog +++ b/Backlog @@ -2,3 +2,10 @@ US001 Task001 - Modify mouse input to move the player's view less. The mouse sho US002 Task002 - Sand blocks should fall to the ground if there is no block underneath. Points 5 US002 Task003 - Gravel blocks should fall to the ground if there is no block underneath. Points 5 US003 Task004 - Cloud color should change to a dark grey at night, and stay white during daytime. Points 2 +US004 Task005 - Design the layout and structure of the buildings to be spawned. Points 5 +US004 Task006 - Create generation function and spawn conditions for buildings. Points 5 +US005 Task007 - Create lava block model. Points 3 +US005 Task008 - Create generation function and spawn conditions for lava pools. Points 5 +US006 Task009 - Create rain drop block model. Points 3 +US006 Task010 - Create spawn conditions for rain drop blocks. Points 3 +US006 Task011 - Rain drop blocks should have no collision and be effected by gravity. Points 3 From 64d3bc35fbde9ca7f65ac7d8657c4404b07bf85e Mon Sep 17 00:00:00 2001 From: DavidLandes Date: Tue, 23 Feb 2021 20:14:46 -0500 Subject: [PATCH 08/38] Add documentation support with doxygen. --- Doxyfile | 2579 +++++++++++++++++ html/annotated.html | 89 + html/bc_s.png | Bin 0 -> 676 bytes html/bdwn.png | Bin 0 -> 147 bytes html/classbuilder_1_1Client-members.html | 89 + html/classbuilder_1_1Client.html | 122 + html/classbuilder_1_1Client__coll__graph.dot | 9 + ...classbuilder_1_1Client__inherit__graph.dot | 9 + html/classes.html | 105 + html/classserver_1_1Handler-members.html | 99 + html/classserver_1_1Handler.html | 152 + html/classserver_1_1Handler__coll__graph.dot | 9 + ...classserver_1_1Handler__inherit__graph.dot | 9 + html/classserver_1_1Model-members.html | 124 + html/classserver_1_1Model.html | 227 ++ html/classserver_1_1Model__coll__graph.dot | 9 + html/classserver_1_1Model__inherit__graph.dot | 9 + html/classserver_1_1RateLimiter-members.html | 89 + html/classserver_1_1RateLimiter.html | 122 + ...lassserver_1_1RateLimiter__coll__graph.dot | 9 + ...sserver_1_1RateLimiter__inherit__graph.dot | 9 + html/classserver_1_1Server-members.html | 85 + html/classserver_1_1Server.html | 106 + html/classserver_1_1Server__coll__graph.dot | 11 + .../classserver_1_1Server__inherit__graph.dot | 11 + html/classworld_1_1World-members.html | 89 + html/classworld_1_1World.html | 122 + html/classworld_1_1World__coll__graph.dot | 9 + html/classworld_1_1World__inherit__graph.dot | 9 + html/closed.png | Bin 0 -> 132 bytes html/doc.png | Bin 0 -> 746 bytes html/doxygen.css | 1771 +++++++++++ html/doxygen.png | Bin 0 -> 3779 bytes html/dynsections.js | 120 + html/folderclosed.png | Bin 0 -> 616 bytes html/folderopen.png | Bin 0 -> 597 bytes html/graph_legend.dot | 23 + html/graph_legend.html | 136 + html/hierarchy.html | 93 + html/index.html | 76 + html/inherit_graph_0.dot | 16 + html/inherit_graph_1.dot | 10 + html/inherit_graph_2.dot | 12 + html/inherits.html | 86 + html/jquery.js | 35 + html/md_LICENSE.html | 81 + html/md_README.html | 208 ++ html/menu.js | 50 + html/menudata.js | 29 + html/nav_f.png | Bin 0 -> 153 bytes html/nav_g.png | Bin 0 -> 95 bytes html/nav_h.png | Bin 0 -> 98 bytes html/open.png | Bin 0 -> 123 bytes html/pages.html | 82 + html/search/all_0.html | 30 + html/search/all_0.js | 5 + html/search/all_1.html | 30 + html/search/all_1.js | 4 + html/search/all_2.html | 30 + html/search/all_2.js | 4 + html/search/all_3.html | 30 + html/search/all_3.js | 4 + html/search/all_4.html | 30 + html/search/all_4.js | 4 + html/search/all_5.html | 30 + html/search/all_5.js | 4 + html/search/all_6.html | 30 + html/search/all_6.js | 4 + html/search/classes_0.html | 30 + html/search/classes_0.js | 4 + html/search/classes_1.html | 30 + html/search/classes_1.js | 4 + html/search/classes_2.html | 30 + html/search/classes_2.js | 4 + html/search/classes_3.html | 30 + html/search/classes_3.js | 4 + html/search/classes_4.html | 30 + html/search/classes_4.js | 4 + html/search/classes_5.html | 30 + html/search/classes_5.js | 4 + html/search/close.png | Bin 0 -> 273 bytes html/search/mag_sel.png | Bin 0 -> 465 bytes html/search/nomatches.html | 12 + html/search/pages_0.html | 30 + html/search/pages_0.js | 4 + html/search/pages_1.html | 30 + html/search/pages_1.js | 4 + html/search/search.css | 271 ++ html/search/search.js | 814 ++++++ html/search/search_l.png | Bin 0 -> 567 bytes html/search/search_m.png | Bin 0 -> 158 bytes html/search/search_r.png | Bin 0 -> 553 bytes html/search/searchdata.js | 21 + html/splitbar.png | Bin 0 -> 314 bytes html/sync_off.png | Bin 0 -> 853 bytes html/sync_on.png | Bin 0 -> 845 bytes html/tab_a.png | Bin 0 -> 142 bytes html/tab_b.png | Bin 0 -> 169 bytes html/tab_h.png | Bin 0 -> 177 bytes html/tab_s.png | Bin 0 -> 184 bytes html/tabs.css | 1 + 101 files changed, 8769 insertions(+) create mode 100644 Doxyfile create mode 100644 html/annotated.html create mode 100644 html/bc_s.png create mode 100644 html/bdwn.png create mode 100644 html/classbuilder_1_1Client-members.html create mode 100644 html/classbuilder_1_1Client.html create mode 100644 html/classbuilder_1_1Client__coll__graph.dot create mode 100644 html/classbuilder_1_1Client__inherit__graph.dot create mode 100644 html/classes.html create mode 100644 html/classserver_1_1Handler-members.html create mode 100644 html/classserver_1_1Handler.html create mode 100644 html/classserver_1_1Handler__coll__graph.dot create mode 100644 html/classserver_1_1Handler__inherit__graph.dot create mode 100644 html/classserver_1_1Model-members.html create mode 100644 html/classserver_1_1Model.html create mode 100644 html/classserver_1_1Model__coll__graph.dot create mode 100644 html/classserver_1_1Model__inherit__graph.dot create mode 100644 html/classserver_1_1RateLimiter-members.html create mode 100644 html/classserver_1_1RateLimiter.html create mode 100644 html/classserver_1_1RateLimiter__coll__graph.dot create mode 100644 html/classserver_1_1RateLimiter__inherit__graph.dot create mode 100644 html/classserver_1_1Server-members.html create mode 100644 html/classserver_1_1Server.html create mode 100644 html/classserver_1_1Server__coll__graph.dot create mode 100644 html/classserver_1_1Server__inherit__graph.dot create mode 100644 html/classworld_1_1World-members.html create mode 100644 html/classworld_1_1World.html create mode 100644 html/classworld_1_1World__coll__graph.dot create mode 100644 html/classworld_1_1World__inherit__graph.dot create mode 100644 html/closed.png create mode 100644 html/doc.png create mode 100644 html/doxygen.css create mode 100644 html/doxygen.png create mode 100644 html/dynsections.js create mode 100644 html/folderclosed.png create mode 100644 html/folderopen.png create mode 100644 html/graph_legend.dot create mode 100644 html/graph_legend.html create mode 100644 html/hierarchy.html create mode 100644 html/index.html create mode 100644 html/inherit_graph_0.dot create mode 100644 html/inherit_graph_1.dot create mode 100644 html/inherit_graph_2.dot create mode 100644 html/inherits.html create mode 100644 html/jquery.js create mode 100644 html/md_LICENSE.html create mode 100644 html/md_README.html create mode 100644 html/menu.js create mode 100644 html/menudata.js create mode 100644 html/nav_f.png create mode 100644 html/nav_g.png create mode 100644 html/nav_h.png create mode 100644 html/open.png create mode 100644 html/pages.html create mode 100644 html/search/all_0.html create mode 100644 html/search/all_0.js create mode 100644 html/search/all_1.html create mode 100644 html/search/all_1.js create mode 100644 html/search/all_2.html create mode 100644 html/search/all_2.js create mode 100644 html/search/all_3.html create mode 100644 html/search/all_3.js create mode 100644 html/search/all_4.html create mode 100644 html/search/all_4.js create mode 100644 html/search/all_5.html create mode 100644 html/search/all_5.js create mode 100644 html/search/all_6.html create mode 100644 html/search/all_6.js create mode 100644 html/search/classes_0.html create mode 100644 html/search/classes_0.js create mode 100644 html/search/classes_1.html create mode 100644 html/search/classes_1.js create mode 100644 html/search/classes_2.html create mode 100644 html/search/classes_2.js create mode 100644 html/search/classes_3.html create mode 100644 html/search/classes_3.js create mode 100644 html/search/classes_4.html create mode 100644 html/search/classes_4.js create mode 100644 html/search/classes_5.html create mode 100644 html/search/classes_5.js create mode 100644 html/search/close.png create mode 100644 html/search/mag_sel.png create mode 100644 html/search/nomatches.html create mode 100644 html/search/pages_0.html create mode 100644 html/search/pages_0.js create mode 100644 html/search/pages_1.html create mode 100644 html/search/pages_1.js create mode 100644 html/search/search.css create mode 100644 html/search/search.js create mode 100644 html/search/search_l.png create mode 100644 html/search/search_m.png create mode 100644 html/search/search_r.png create mode 100644 html/search/searchdata.js create mode 100644 html/splitbar.png create mode 100644 html/sync_off.png create mode 100644 html/sync_on.png create mode 100644 html/tab_a.png create mode 100644 html/tab_b.png create mode 100644 html/tab_h.png create mode 100644 html/tab_s.png create mode 100644 html/tabs.css diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 000000000..95929b43f --- /dev/null +++ b/Doxyfile @@ -0,0 +1,2579 @@ +# Doxyfile 1.8.17 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "My Project" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all generated output in the proper direction. +# Possible values are: None, LTR, RTL and Context. +# The default value is: None. + +OUTPUT_TEXT_DIRECTION = None + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines (in the resulting output). You can put ^^ in the value part of an +# alias to insert a newline as if a physical newline was in the original file. +# When you need a literal { or } or , in the value part of an alias you have to +# escape them by means of a backslash (\), this can lead to conflicts with the +# commands \{ and \} for these it is advised to use the version @{ and @} or use +# a double escape (\\{ and \\}) + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, +# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is +# Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See https://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up +# to that level are automatically included in the table of contents, even if +# they do not have an id attribute. +# Note: This feature currently applies only to Markdown headings. +# Minimum value: 0, maximum value: 99, default value: 5. +# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. + +TOC_INCLUDE_HEADINGS = 5 + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# If one adds a struct or class to a group and this option is enabled, then also +# any nested class or struct is added to the same group. By default this option +# is disabled and one has to add nested compounds explicitly via \ingroup. +# The default value is: NO. + +GROUP_NESTED_COMPOUNDS = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# declarations. If set to NO, these declarations will be included in the +# documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# (including Cygwin) ands Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. If +# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when +# a warning is encountered. +# The default value is: NO. + +WARN_AS_ERROR = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING +# Note: If this tag is empty the current directory is searched. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: https://www.gnu.org/software/libiconv/) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# read by doxygen. +# +# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, +# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, +# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, +# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), +# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen +# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.idl \ + *.ddl \ + *.odl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.cs \ + *.d \ + *.php \ + *.php4 \ + *.php5 \ + *.phtml \ + *.inc \ + *.m \ + *.markdown \ + *.md \ + *.mm \ + *.dox \ + *.doc \ + *.txt \ + *.py \ + *.pyw \ + *.f90 \ + *.f95 \ + *.f03 \ + *.f08 \ + *.f \ + *.for \ + *.tcl \ + *.vhd \ + *.vhdl \ + *.ucf \ + *.qsf \ + *.ice + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. +# +# Note that for custom extensions or not directly supported extensions you also +# need to set EXTENSION_MAPPING for the extension otherwise the files are not +# properly processed by doxygen. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# entity all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see https://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +# If clang assisted parsing is enabled you can provide the clang parser with the +# path to the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files +# were built. This is equivalent to specifying the "-p" option to a clang tool, +# such as clang-check. These options will then be passed to the parser. +# Note: The availability of this option depends on whether or not doxygen was +# generated with the -Duse_libclang=ON option for CMake. + +CLANG_DATABASE_PATH = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# https://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML +# documentation will contain a main index with vertical navigation menus that +# are dynamically created via JavaScript. If disabled, the navigation index will +# consists of multiple levels of tabs that are statically embedded in every HTML +# page. Disable this option to support browsers that do not have JavaScript, +# like the Qt help browser. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_MENUS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: https://developer.apple.com/xcode/), introduced with OSX +# 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANSPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. + +FORMULA_MACROFILE = + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# https://www.mathjax.org) which uses client side JavaScript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from https://www.mathjax.org before deployment. +# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

+ +
+
+ + +
+ +
+ +
+
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + + + + + +
 Nbuilder
 CClient
 Nserver
 CHandler
 CModel
 CRateLimiter
 CServer
 Nworld
 CWorld
+
+
+ +
+ + diff --git a/html/bc_s.png b/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/html/bdwn.png b/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
builder.Client Member List
+
+
+ +

This is the complete list of members for builder.Client, including all inherited members.

+ + + + + + + +
__init__(self, host, port) (defined in builder.Client)builder.Client
authenticate(self) (defined in builder.Client)builder.Client
bitmap(self, sx, sy, sz, d1, d2, data, lookup) (defined in builder.Client)builder.Client
conn (defined in builder.Client)builder.Client
set_block(self, x, y, z, w) (defined in builder.Client)builder.Client
set_blocks(self, blocks, w) (defined in builder.Client)builder.Client
+ + + + diff --git a/html/classbuilder_1_1Client.html b/html/classbuilder_1_1Client.html new file mode 100644 index 000000000..af81c5c5d --- /dev/null +++ b/html/classbuilder_1_1Client.html @@ -0,0 +1,122 @@ + + + + + + + +My Project: builder.Client Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
builder.Client Class Reference
+
+
+
+Inheritance diagram for builder.Client:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for builder.Client:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + +

+Public Member Functions

+def __init__ (self, host, port)
 
+def authenticate (self)
 
+def set_block (self, x, y, z, w)
 
+def set_blocks (self, blocks, w)
 
+def bitmap (self, sx, sy, sz, d1, d2, data, lookup)
 
+ + + +

+Public Attributes

conn
 
+
The documentation for this class was generated from the following file:
    +
  • builder.py
  • +
+
+ + + + diff --git a/html/classbuilder_1_1Client__coll__graph.dot b/html/classbuilder_1_1Client__coll__graph.dot new file mode 100644 index 000000000..622f77e43 --- /dev/null +++ b/html/classbuilder_1_1Client__coll__graph.dot @@ -0,0 +1,9 @@ +digraph "builder.Client" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classbuilder_1_1Client__inherit__graph.dot b/html/classbuilder_1_1Client__inherit__graph.dot new file mode 100644 index 000000000..622f77e43 --- /dev/null +++ b/html/classbuilder_1_1Client__inherit__graph.dot @@ -0,0 +1,9 @@ +digraph "builder.Client" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classes.html b/html/classes.html new file mode 100644 index 000000000..ac1c130de --- /dev/null +++ b/html/classes.html @@ -0,0 +1,105 @@ + + + + + + + +My Project: Class Index + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Index
+
+
+
c | h | m | r | s | w
+ + + + + + + + + + + + + + + + + + + + +
  c  
+
  m  
+
  s  
+
Client (builder)   Model (server)   Server (server)   
  h  
+
  r  
+
  w  
+
Handler (server)   RateLimiter (server)   World (world)   
+
c | h | m | r | s | w
+
+ + + + diff --git a/html/classserver_1_1Handler-members.html b/html/classserver_1_1Handler-members.html new file mode 100644 index 000000000..190a2f4df --- /dev/null +++ b/html/classserver_1_1Handler-members.html @@ -0,0 +1,99 @@ + + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
server.Handler Member List
+
+
+ +

This is the complete list of members for server.Handler, including all inherited members.

+ + + + + + + + + + + + + + + + + +
client_id (defined in server.Handler)server.Handler
finish(self) (defined in server.Handler)server.Handler
handle(self) (defined in server.Handler)server.Handler
limiter (defined in server.Handler)server.Handler
nick (defined in server.Handler)server.Handler
position_limiter (defined in server.Handler)server.Handler
queue (defined in server.Handler)server.Handler
run(self) (defined in server.Handler)server.Handler
running (defined in server.Handler)server.Handler
send(self, *args) (defined in server.Handler)server.Handler
send_raw(self, data) (defined in server.Handler)server.Handler
setup(self) (defined in server.Handler)server.Handler
start(self) (defined in server.Handler)server.Handler
stop(self) (defined in server.Handler)server.Handler
user_id (defined in server.Handler)server.Handler
version (defined in server.Handler)server.Handler
+ + + + diff --git a/html/classserver_1_1Handler.html b/html/classserver_1_1Handler.html new file mode 100644 index 000000000..17e257d2e --- /dev/null +++ b/html/classserver_1_1Handler.html @@ -0,0 +1,152 @@ + + + + + + + +My Project: server.Handler Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
server.Handler Class Reference
+
+
+
+Inheritance diagram for server.Handler:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for server.Handler:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + +

+Public Member Functions

+def setup (self)
 
+def handle (self)
 
+def finish (self)
 
+def stop (self)
 
+def start (self)
 
+def run (self)
 
+def send_raw (self, data)
 
+def send (self, *args)
 
+ + + + + + + + + + + + + + + + + +

+Public Attributes

position_limiter
 
limiter
 
version
 
client_id
 
user_id
 
nick
 
queue
 
running
 
+
The documentation for this class was generated from the following file:
    +
  • server.py
  • +
+
+ + + + diff --git a/html/classserver_1_1Handler__coll__graph.dot b/html/classserver_1_1Handler__coll__graph.dot new file mode 100644 index 000000000..5fe38b826 --- /dev/null +++ b/html/classserver_1_1Handler__coll__graph.dot @@ -0,0 +1,9 @@ +digraph "server.Handler" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="SocketServer::BaseRequest\lHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1Handler__inherit__graph.dot b/html/classserver_1_1Handler__inherit__graph.dot new file mode 100644 index 000000000..5fe38b826 --- /dev/null +++ b/html/classserver_1_1Handler__inherit__graph.dot @@ -0,0 +1,9 @@ +digraph "server.Handler" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="SocketServer::BaseRequest\lHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1Model-members.html b/html/classserver_1_1Model-members.html new file mode 100644 index 000000000..86d21e9e9 --- /dev/null +++ b/html/classserver_1_1Model-members.html @@ -0,0 +1,124 @@ + + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
server.Model Member List
+
+
+ +

This is the complete list of members for server.Model, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
__init__(self, seed) (defined in server.Model)server.Model
clients (defined in server.Model)server.Model
commands (defined in server.Model)server.Model
commit(self) (defined in server.Model)server.Model
connection (defined in server.Model)server.Model
create_tables(self) (defined in server.Model)server.Model
dequeue(self) (defined in server.Model)server.Model
enqueue(self, func, *args, **kwargs) (defined in server.Model)server.Model
execute(self, *args, **kwargs) (defined in server.Model)server.Model
get_block(self, x, y, z) (defined in server.Model)server.Model
get_default_block(self, x, y, z) (defined in server.Model)server.Model
last_commit (defined in server.Model)server.Model
next_client_id(self) (defined in server.Model)server.Model
on_authenticate(self, client, username, access_token) (defined in server.Model)server.Model
on_block(self, client, x, y, z, w) (defined in server.Model)server.Model
on_chunk(self, client, p, q, key=0) (defined in server.Model)server.Model
on_connect(self, client) (defined in server.Model)server.Model
on_data(self, client, data) (defined in server.Model)server.Model
on_disconnect(self, client) (defined in server.Model)server.Model
on_goto(self, client, nick=None) (defined in server.Model)server.Model
on_help(self, client, topic=None) (defined in server.Model)server.Model
on_list(self, client) (defined in server.Model)server.Model
on_position(self, client, x, y, z, rx, ry) (defined in server.Model)server.Model
on_pq(self, client, p, q) (defined in server.Model)server.Model
on_sign(self, client, x, y, z, face, *args) (defined in server.Model)server.Model
on_spawn(self, client) (defined in server.Model)server.Model
on_talk(self, client, *args) (defined in server.Model)server.Model
on_version(self, client, version) (defined in server.Model)server.Model
patterns (defined in server.Model)server.Model
queue (defined in server.Model)server.Model
run(self) (defined in server.Model)server.Model
send_block(self, client, p, q, x, y, z, w) (defined in server.Model)server.Model
send_disconnect(self, client) (defined in server.Model)server.Model
send_nick(self, client) (defined in server.Model)server.Model
send_nicks(self, client) (defined in server.Model)server.Model
send_position(self, client) (defined in server.Model)server.Model
send_positions(self, client) (defined in server.Model)server.Model
send_sign(self, client, p, q, x, y, z, face, text) (defined in server.Model)server.Model
send_talk(self, text) (defined in server.Model)server.Model
start(self) (defined in server.Model)server.Model
world (defined in server.Model)server.Model
+ + + + diff --git a/html/classserver_1_1Model.html b/html/classserver_1_1Model.html new file mode 100644 index 000000000..8c5b1927a --- /dev/null +++ b/html/classserver_1_1Model.html @@ -0,0 +1,227 @@ + + + + + + + +My Project: server.Model Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
server.Model Class Reference
+
+
+
+Inheritance diagram for server.Model:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for server.Model:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

+def __init__ (self, seed)
 
+def start (self)
 
+def run (self)
 
+def enqueue (self, func, *args, **kwargs)
 
+def dequeue (self)
 
+def execute (self, *args, **kwargs)
 
+def commit (self)
 
+def create_tables (self)
 
+def get_default_block (self, x, y, z)
 
+def get_block (self, x, y, z)
 
+def next_client_id (self)
 
+def on_connect (self, client)
 
+def on_data (self, client, data)
 
+def on_disconnect (self, client)
 
+def on_version (self, client, version)
 
+def on_authenticate (self, client, username, access_token)
 
+def on_chunk (self, client, p, q, key=0)
 
+def on_block (self, client, x, y, z, w)
 
+def on_sign (self, client, x, y, z, face, *args)
 
+def on_position (self, client, x, y, z, rx, ry)
 
+def on_talk (self, client, *args)
 
+def on_spawn (self, client)
 
+def on_goto (self, client, nick=None)
 
+def on_pq (self, client, p, q)
 
+def on_help (self, client, topic=None)
 
+def on_list (self, client)
 
+def send_positions (self, client)
 
+def send_position (self, client)
 
+def send_nicks (self, client)
 
+def send_nick (self, client)
 
+def send_disconnect (self, client)
 
+def send_block (self, client, p, q, x, y, z, w)
 
+def send_sign (self, client, p, q, x, y, z, face, text)
 
+def send_talk (self, text)
 
+ + + + + + + + + + + + + + + +

+Public Attributes

world
 
clients
 
queue
 
commands
 
patterns
 
connection
 
last_commit
 
+
The documentation for this class was generated from the following file:
    +
  • server.py
  • +
+
+ + + + diff --git a/html/classserver_1_1Model__coll__graph.dot b/html/classserver_1_1Model__coll__graph.dot new file mode 100644 index 000000000..9b847f2e4 --- /dev/null +++ b/html/classserver_1_1Model__coll__graph.dot @@ -0,0 +1,9 @@ +digraph "server.Model" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1Model__inherit__graph.dot b/html/classserver_1_1Model__inherit__graph.dot new file mode 100644 index 000000000..9b847f2e4 --- /dev/null +++ b/html/classserver_1_1Model__inherit__graph.dot @@ -0,0 +1,9 @@ +digraph "server.Model" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1RateLimiter-members.html b/html/classserver_1_1RateLimiter-members.html new file mode 100644 index 000000000..97abe98ed --- /dev/null +++ b/html/classserver_1_1RateLimiter-members.html @@ -0,0 +1,89 @@ + + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
server.RateLimiter Member List
+
+
+ +

This is the complete list of members for server.RateLimiter, including all inherited members.

+ + + + + + + +
__init__(self, rate, per) (defined in server.RateLimiter)server.RateLimiter
allowance (defined in server.RateLimiter)server.RateLimiter
last_check (defined in server.RateLimiter)server.RateLimiter
per (defined in server.RateLimiter)server.RateLimiter
rate (defined in server.RateLimiter)server.RateLimiter
tick(self) (defined in server.RateLimiter)server.RateLimiter
+ + + + diff --git a/html/classserver_1_1RateLimiter.html b/html/classserver_1_1RateLimiter.html new file mode 100644 index 000000000..74b4706da --- /dev/null +++ b/html/classserver_1_1RateLimiter.html @@ -0,0 +1,122 @@ + + + + + + + +My Project: server.RateLimiter Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
server.RateLimiter Class Reference
+
+
+
+Inheritance diagram for server.RateLimiter:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for server.RateLimiter:
+
+
Collaboration graph
+
[legend]
+ + + + + + +

+Public Member Functions

+def __init__ (self, rate, per)
 
+def tick (self)
 
+ + + + + + + + + +

+Public Attributes

rate
 
per
 
allowance
 
last_check
 
+
The documentation for this class was generated from the following file:
    +
  • server.py
  • +
+
+ + + + diff --git a/html/classserver_1_1RateLimiter__coll__graph.dot b/html/classserver_1_1RateLimiter__coll__graph.dot new file mode 100644 index 000000000..16f8ac429 --- /dev/null +++ b/html/classserver_1_1RateLimiter__coll__graph.dot @@ -0,0 +1,9 @@ +digraph "server.RateLimiter" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1RateLimiter__inherit__graph.dot b/html/classserver_1_1RateLimiter__inherit__graph.dot new file mode 100644 index 000000000..16f8ac429 --- /dev/null +++ b/html/classserver_1_1RateLimiter__inherit__graph.dot @@ -0,0 +1,9 @@ +digraph "server.RateLimiter" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1Server-members.html b/html/classserver_1_1Server-members.html new file mode 100644 index 000000000..1303a7510 --- /dev/null +++ b/html/classserver_1_1Server-members.html @@ -0,0 +1,85 @@ + + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
server.Server Member List
+
+
+ +

This is the complete list of members for server.Server, including all inherited members.

+ + + +
allow_reuse_address (defined in server.Server)server.Serverstatic
daemon_threads (defined in server.Server)server.Serverstatic
+ + + + diff --git a/html/classserver_1_1Server.html b/html/classserver_1_1Server.html new file mode 100644 index 000000000..6d2e50cbc --- /dev/null +++ b/html/classserver_1_1Server.html @@ -0,0 +1,106 @@ + + + + + + + +My Project: server.Server Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
server.Server Class Reference
+
+
+
+Inheritance diagram for server.Server:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for server.Server:
+
+
Collaboration graph
+
[legend]
+ + + + + + +

+Static Public Attributes

+bool allow_reuse_address = True
 
+bool daemon_threads = True
 
+
The documentation for this class was generated from the following file:
    +
  • server.py
  • +
+
+ + + + diff --git a/html/classserver_1_1Server__coll__graph.dot b/html/classserver_1_1Server__coll__graph.dot new file mode 100644 index 000000000..8e546c4f2 --- /dev/null +++ b/html/classserver_1_1Server__coll__graph.dot @@ -0,0 +1,11 @@ +digraph "server.Server" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="SocketServer::ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="SocketServer::TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classserver_1_1Server__inherit__graph.dot b/html/classserver_1_1Server__inherit__graph.dot new file mode 100644 index 000000000..8e546c4f2 --- /dev/null +++ b/html/classserver_1_1Server__inherit__graph.dot @@ -0,0 +1,11 @@ +digraph "server.Server" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="SocketServer::ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node3 [label="SocketServer::TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classworld_1_1World-members.html b/html/classworld_1_1World-members.html new file mode 100644 index 000000000..031933493 --- /dev/null +++ b/html/classworld_1_1World-members.html @@ -0,0 +1,89 @@ + + + + + + + +My Project: Member List + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
world.World Member List
+
+
+ +

This is the complete list of members for world.World, including all inherited members.

+ + + + + + + +
__init__(self, seed=None, cache_size=64) (defined in world.World)world.World
cache (defined in world.World)world.World
cache_size (defined in world.World)world.World
create_chunk(self, p, q) (defined in world.World)world.World
get_chunk(self, p, q) (defined in world.World)world.World
seed (defined in world.World)world.World
+ + + + diff --git a/html/classworld_1_1World.html b/html/classworld_1_1World.html new file mode 100644 index 000000000..26ace4ede --- /dev/null +++ b/html/classworld_1_1World.html @@ -0,0 +1,122 @@ + + + + + + + +My Project: world.World Class Reference + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
world.World Class Reference
+
+
+
+Inheritance diagram for world.World:
+
+
Inheritance graph
+
[legend]
+
+Collaboration diagram for world.World:
+
+
Collaboration graph
+
[legend]
+ + + + + + + + +

+Public Member Functions

+def __init__ (self, seed=None, cache_size=64)
 
+def create_chunk (self, p, q)
 
+def get_chunk (self, p, q)
 
+ + + + + + + +

+Public Attributes

seed
 
cache
 
cache_size
 
+
The documentation for this class was generated from the following file:
    +
  • world.py
  • +
+
+ + + + diff --git a/html/classworld_1_1World__coll__graph.dot b/html/classworld_1_1World__coll__graph.dot new file mode 100644 index 000000000..f99d99c59 --- /dev/null +++ b/html/classworld_1_1World__coll__graph.dot @@ -0,0 +1,9 @@ +digraph "world.World" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/classworld_1_1World__inherit__graph.dot b/html/classworld_1_1World__inherit__graph.dot new file mode 100644 index 000000000..f99d99c59 --- /dev/null +++ b/html/classworld_1_1World__inherit__graph.dot @@ -0,0 +1,9 @@ +digraph "world.World" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node1 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; + Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; +} diff --git a/html/closed.png b/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/html/doc.png b/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/html/doxygen.css b/html/doxygen.css new file mode 100644 index 000000000..73ecbb2cb --- /dev/null +++ b/html/doxygen.css @@ -0,0 +1,1771 @@ +/* The standard CSS for doxygen 1.8.17 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, p.intertd, p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; +} + +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} + +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #FFFFFF; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; +} + +dl.citelist dd { + margin:2px 0; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +/* +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTableHead tr { +} + +table.markdownTableBodyLeft td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft { + text-align: left +} + +th.markdownTableHeadRight { + text-align: right +} + +th.markdownTableHeadCenter { + text-align: center +} +*/ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/html/doxygen.png b/html/doxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff17d807fd8aa003bed8bb2a69e8f0909592fd1 GIT binary patch literal 3779 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 literal 0 HcmV?d00001 diff --git a/html/dynsections.js b/html/dynsections.js new file mode 100644 index 000000000..ea0a7b39a --- /dev/null +++ b/html/dynsections.js @@ -0,0 +1,120 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (la9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/html/graph_legend.dot b/html/graph_legend.dot new file mode 100644 index 000000000..4d6ac8c61 --- /dev/null +++ b/html/graph_legend.dot @@ -0,0 +1,23 @@ +digraph "Graph Legend" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + Node9 [shape="box",label="Inherited",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",fillcolor="grey75",style="filled" fontcolor="black"]; + Node10 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node10 [shape="box",label="PublicBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; + Node11 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node11 [shape="box",label="Truncated",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="red"]; + Node13 -> Node9 [dir="back",color="darkgreen",fontsize="10",style="solid",fontname="Helvetica"]; + Node13 [shape="box",label="ProtectedBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; + Node14 -> Node9 [dir="back",color="firebrick4",fontsize="10",style="solid",fontname="Helvetica"]; + Node14 [shape="box",label="PrivateBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; + Node15 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node15 [shape="box",label="Undocumented",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="grey75"]; + Node16 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node16 [shape="box",label="Templ< int >",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; + Node17 -> Node16 [dir="back",color="orange",fontsize="10",style="dashed",label="< int >",fontname="Helvetica"]; + Node17 [shape="box",label="Templ< T >",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; + Node18 -> Node9 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label="m_usedClass",fontname="Helvetica"]; + Node18 [shape="box",label="Used",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; +} diff --git a/html/graph_legend.html b/html/graph_legend.html new file mode 100644 index 000000000..7042904ac --- /dev/null +++ b/html/graph_legend.html @@ -0,0 +1,136 @@ + + + + + + + +My Project: Graph Legend + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+ + + + diff --git a/html/hierarchy.html b/html/hierarchy.html new file mode 100644 index 000000000..956d3e358 --- /dev/null +++ b/html/hierarchy.html @@ -0,0 +1,93 @@ + + + + + + + +My Project: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+
+

Go to the graphical class hierarchy

+This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 12]
+ + + + + + + + + + + +
 CBaseRequestHandler
 Cserver.Handler
 Cobject
 Cbuilder.Client
 Cserver.Model
 Cserver.RateLimiter
 Cworld.World
 CTCPServer
 Cserver.Server
 CThreadingMixIn
 Cserver.Server
+
+
+ + + + diff --git a/html/index.html b/html/index.html new file mode 100644 index 000000000..6473b4e2e --- /dev/null +++ b/html/index.html @@ -0,0 +1,76 @@ + + + + + + + +My Project: Main Page + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
My Project Documentation
+
+
+
+ + + + diff --git a/html/inherit_graph_0.dot b/html/inherit_graph_0.dot new file mode 100644 index 000000000..3540b9d90 --- /dev/null +++ b/html/inherit_graph_0.dot @@ -0,0 +1,16 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node4 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node4 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node0 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classbuilder_1_1Client.html",tooltip=" "]; + Node4 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node6 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Model.html",tooltip=" "]; + Node4 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node7 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1RateLimiter.html",tooltip=" "]; + Node4 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node8 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classworld_1_1World.html",tooltip=" "]; +} diff --git a/html/inherit_graph_1.dot b/html/inherit_graph_1.dot new file mode 100644 index 000000000..3d940f8af --- /dev/null +++ b/html/inherit_graph_1.dot @@ -0,0 +1,10 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node9 [label="BaseRequestHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node9 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node0 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Handler.html",tooltip=" "]; +} diff --git a/html/inherit_graph_2.dot b/html/inherit_graph_2.dot new file mode 100644 index 000000000..a00223c37 --- /dev/null +++ b/html/inherit_graph_2.dot @@ -0,0 +1,12 @@ +digraph "Graphical Class Hierarchy" +{ + // LATEX_PDF_SIZE + edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; + node [fontname="Helvetica",fontsize="10",shape=record]; + rankdir="LR"; + Node3 [label="TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node3 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; + Node0 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Server.html",tooltip=" "]; + Node1 [label="ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; + Node1 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; +} diff --git a/html/inherits.html b/html/inherits.html new file mode 100644 index 000000000..4c56d263f --- /dev/null +++ b/html/inherits.html @@ -0,0 +1,86 @@ + + + + + + + +My Project: Class Hierarchy + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Class Hierarchy
+
+
+ + + + +
+
+
+
+
+ + + + diff --git a/html/jquery.js b/html/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/html/md_LICENSE.html b/html/md_LICENSE.html new file mode 100644 index 000000000..b642c60d6 --- /dev/null +++ b/html/md_LICENSE.html @@ -0,0 +1,81 @@ + + + + + + + +My Project: LICENSE + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
LICENSE
+
+
+

Copyright (C) 2013 Michael Fogleman

+

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+
+
+ + + + diff --git a/html/md_README.html b/html/md_README.html new file mode 100644 index 000000000..be06a5a85 --- /dev/null +++ b/html/md_README.html @@ -0,0 +1,208 @@ + + + + + + + +My Project: Craft + + + + + + + + + +
+
+ + + + + + +
+
My Project +
+
+
+ + + + + + + + +
+
+ + +
+ +
+ +
+
+
+
Craft
+
+
+

Minecraft clone for Windows, Mac OS X and Linux. Just a few thousand lines of C using modern OpenGL (shaders). Online multiplayer support is included using a Python-based server.

+

http://www.michaelfogleman.com/craft/

+

+

+Features

+
    +
  • Simple but nice looking terrain generation using perlin / simplex noise.
  • +
  • More than 10 types of blocks and more can be added easily.
  • +
  • Supports plants (grass, flowers, trees, etc.) and transparency (glass).
  • +
  • Simple clouds in the sky (they don't move).
  • +
  • Day / night cycles and a textured sky dome.
  • +
  • World changes persisted in a sqlite3 database.
  • +
  • Multiplayer support!
  • +
+

+Download

+

Mac and Windows binaries are available on the website.

+

http://www.michaelfogleman.com/craft/

+

See below to run from source.

+

+Install Dependencies

+

+Mac OS X

+

Download and install CMake if you don't already have it. You may use Homebrew to simplify the installation:

brew install cmake
+

+Linux (Ubuntu)

+
sudo apt-get install cmake libglew-dev xorg-dev
+sudo apt-get build-dep glfw
+

+Windows

+

Download and install CMake and MinGW. Add C:\MinGW\bin to your PATH.

+

Download and install cURL so that CURL/lib and CURL/include are in your Program Files directory.

+

Use the following commands in place of the ones described in the next section.

cmake -G "MinGW Makefiles"
+mingw32-make
+

+Compile and Run

+

Once you have the dependencies (see above), run the following commands in your terminal.

git clone https://github.com/fogleman/Craft.git
+cd Craft
+cmake .
+make
+./craft
+

+Multiplayer

+

Register for an account!

+

https://craft.michaelfogleman.com/

+

+Client

+

You can connect to a server with command line arguments...

./craft michaelfogleman.com
+

Or, with the "/online" command in the game itself.

/online michaelfogleman.com
+

+Server

+

You can run your own server or connect to mine. The server is written in Python but requires a compiled DLL so it can perform the terrain generation just like the client.

gcc -std=c99 -O3 -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
+python server.py [HOST [PORT]]
+

+Controls

+
    +
  • WASD to move forward, left, backward, right.
  • +
  • Space to jump.
  • +
  • Left Click to destroy a block.
  • +
  • Right Click or Cmd + Left Click to create a block.
  • +
  • 1-9 to select the block type to create.
  • +
  • E to cycle through the block types.
  • +
  • Tab to toggle between walking and flying.
  • +
  • ZXCVBN to move in exact directions along the XYZ axes.
  • +
  • Left shift to zoom.
  • +
  • F to show the scene in orthographic mode.
  • +
  • O to observe players in the main view.
  • +
  • P to observe players in the picture-in-picture view.
  • +
  • Arrow keys emulate mouse movement.
  • +
  • Enter emulates mouse click.
  • +
+

+Chat Commands

+
/goto [NAME]
+

Teleport to another user. If NAME is unspecified, a random user is chosen.

/list
+

Display a list of connected users.

/login NAME
+

Switch to another registered username. The login server will be re-contacted. The username is case-sensitive.

/logout
+

Unauthenticate and become a guest user. Automatic logins will not occur again until the /login command is re-issued.

/offline [FILE]
+

Switch to offline mode. FILE specifies the save file to use and defaults to "craft".

/online HOST [PORT]
+

Connect to the specified server.

/pq P Q
+

Teleport to the specified chunk.

/spawn
+

Teleport back to the spawn point.

+

+Screenshot

+

+

+Implementation Details

+

+Terrain Generation

+

The terrain is generated using Simplex noise - a deterministic noise function seeded based on position. So the world will always be generated the same way in a given location.

+

The world is split up into 32x32 block chunks in the XZ plane (Y is up). This allows the world to be “infinite” (floating point precision is currently a problem at large X or Z values) and also makes it easier to manage the data. Only visible chunks need to be queried from the database.

+

+Rendering

+

Only exposed faces are rendered. This is an important optimization as the vast majority of blocks are either completely hidden or are only exposing one or two faces. Each chunk records a one-block width overlap for each neighboring chunk so it knows which blocks along its perimeter are exposed.

+

Only visible chunks are rendered. A naive frustum-culling approach is used to test if a chunk is in the camera’s view. If it is not, it is not rendered. This results in a pretty decent performance improvement as well.

+

Chunk buffers are completely regenerated when a block is changed in that chunk, instead of trying to update the VBO.

+

Text is rendered using a bitmap atlas. Each character is rendered onto two triangles forming a 2D rectangle.

+

“Modern” OpenGL is used - no deprecated, fixed-function pipeline functions are used. Vertex buffer objects are used for position, normal and texture coordinates. Vertex and fragment shaders are used for rendering. Matrix manipulation functions are in matrix.c for translation, rotation, perspective, orthographic, etc. matrices. The 3D models are made up of very simple primitives - mostly cubes and rectangles. These models are generated in code in cube.c.

+

Transparency in glass blocks and plants (plants don’t take up the full rectangular shape of their triangle primitives) is implemented by discarding magenta-colored pixels in the fragment shader.

+

+Database

+

User changes to the world are stored in a sqlite database. Only the delta is stored, so the default world is generated and then the user changes are applied on top when loading.

+

The main database table is named “block” and has columns p, q, x, y, z, w. (p, q) identifies the chunk, (x, y, z) identifies the block position and (w) identifies the block type. 0 represents an empty block (air).

+

In game, the chunks store their blocks in a hash map. An (x, y, z) key maps to a (w) value.

+

The y-position of blocks are limited to 0 <= y < 256. The upper limit is mainly an artificial limitation to prevent users from building unnecessarily tall structures. Users are not allowed to destroy blocks at y = 0 to avoid falling underneath the world.

+

+Multiplayer

+

Multiplayer mode is implemented using plain-old sockets. A simple, ASCII, line-based protocol is used. Each line is made up of a command code and zero or more comma-separated arguments. The client requests chunks from the server with a simple command: C,p,q,key. “C” means “Chunk” and (p, q) identifies the chunk. The key is used for caching - the server will only send block updates that have been performed since the client last asked for that chunk. Block updates (in realtime or as part of a chunk request) are sent to the client in the format: B,p,q,x,y,z,w. After sending all of the blocks for a requested chunk, the server will send an updated cache key in the format: K,p,q,key. The client will store this key and use it the next time it needs to ask for that chunk. Player positions are sent in the format: P,pid,x,y,z,rx,ry. The pid is the player ID and the rx and ry values indicate the player’s rotation in two different axes. The client interpolates player positions from the past two position updates for smoother animation. The client sends its position to the server at most every 0.1 seconds (less if not moving).

+

Client-side caching to the sqlite database can be performance intensive when connecting to a server for the first time. For this reason, sqlite writes are performed on a background thread. All writes occur in a transaction for performance. The transaction is committed every 5 seconds as opposed to some logical amount of work completed. A ring / circular buffer is used as a queue for what data is to be written to the database.

+

In multiplayer mode, players can observe one another in the main view or in a picture-in-picture view. Implementation of the PnP was surprisingly simple - just change the viewport and render the scene again from the other player’s point of view.

+

+Collision Testing

+

Hit testing (what block the user is pointing at) is implemented by scanning a ray from the player’s position outward, following their sight vector. This is not a precise method, so the step rate can be made smaller to be more accurate.

+

Collision testing simply adjusts the player’s position to remain a certain distance away from any adjacent blocks that are obstacles. (Clouds and plants are not marked as obstacles, so you pass right through them.)

+

+Sky Dome

+

A textured sky dome is used for the sky. The X-coordinate of the texture represents time of day. The Y-values map from the bottom of the sky sphere to the top of the sky sphere. The player is always in the center of the sphere. The fragment shaders for the blocks also sample the sky texture to determine the appropriate fog color to blend with based on the block’s position relative to the backing sky.

+

+Ambient Occlusion

+

Ambient occlusion is implemented as described on this page:

+

http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/

+

+Dependencies

+
    +
  • GLEW is used for managing OpenGL extensions across platforms.
  • +
  • GLFW is used for cross-platform window management.
  • +
  • CURL is used for HTTPS / SSL POST for the authentication process.
  • +
  • lodepng is used for loading PNG textures.
  • +
  • sqlite3 is used for saving the blocks added / removed by the user.
  • +
  • tinycthread is used for cross-platform threading.
  • +
+
+
+ + + + diff --git a/html/menu.js b/html/menu.js new file mode 100644 index 000000000..433c15b8f --- /dev/null +++ b/html/menu.js @@ -0,0 +1,50 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/html/menudata.js b/html/menudata.js new file mode 100644 index 000000000..e8f2d51c0 --- /dev/null +++ b/html/menudata.js @@ -0,0 +1,29 @@ +/* +@licstart The following is the entire license notice for the +JavaScript code in this file. + +Copyright (C) 1997-2019 by Dimitri van Heesch + +This program is free software; you can redistribute it and/or modify +it under the terms of version 2 of the GNU General Public License as published by +the Free Software Foundation + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +@licend The above is the entire license notice +for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"inherits.html"}]}]} diff --git a/html/nav_f.png b/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/html/nav_g.png b/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +My Project: Related Pages + + + + + + + + + +
    +
    + + + + + + +
    +
    My Project +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    + + + +
     LICENSE
     Craft
    +
    +
    + + + + diff --git a/html/search/all_0.html b/html/search/all_0.html new file mode 100644 index 000000000..26dd244fd --- /dev/null +++ b/html/search/all_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_0.js b/html/search/all_0.js new file mode 100644 index 000000000..549099ef9 --- /dev/null +++ b/html/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['client_0',['Client',['../classbuilder_1_1Client.html',1,'builder']]], + ['craft_1',['Craft',['../md_README.html',1,'']]] +]; diff --git a/html/search/all_1.html b/html/search/all_1.html new file mode 100644 index 000000000..8eb215b90 --- /dev/null +++ b/html/search/all_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_1.js b/html/search/all_1.js new file mode 100644 index 000000000..9b9dc466d --- /dev/null +++ b/html/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handler_2',['Handler',['../classserver_1_1Handler.html',1,'server']]] +]; diff --git a/html/search/all_2.html b/html/search/all_2.html new file mode 100644 index 000000000..b26d91650 --- /dev/null +++ b/html/search/all_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_2.js b/html/search/all_2.js new file mode 100644 index 000000000..4908ab22e --- /dev/null +++ b/html/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_3',['LICENSE',['../md_LICENSE.html',1,'']]] +]; diff --git a/html/search/all_3.html b/html/search/all_3.html new file mode 100644 index 000000000..b61b96f83 --- /dev/null +++ b/html/search/all_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_3.js b/html/search/all_3.js new file mode 100644 index 000000000..22b95fddb --- /dev/null +++ b/html/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['model_4',['Model',['../classserver_1_1Model.html',1,'server']]] +]; diff --git a/html/search/all_4.html b/html/search/all_4.html new file mode 100644 index 000000000..06de1550e --- /dev/null +++ b/html/search/all_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_4.js b/html/search/all_4.js new file mode 100644 index 000000000..6c6a96b33 --- /dev/null +++ b/html/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ratelimiter_5',['RateLimiter',['../classserver_1_1RateLimiter.html',1,'server']]] +]; diff --git a/html/search/all_5.html b/html/search/all_5.html new file mode 100644 index 000000000..2544c4e5b --- /dev/null +++ b/html/search/all_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_5.js b/html/search/all_5.js new file mode 100644 index 000000000..385590538 --- /dev/null +++ b/html/search/all_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['server_6',['Server',['../classserver_1_1Server.html',1,'server']]] +]; diff --git a/html/search/all_6.html b/html/search/all_6.html new file mode 100644 index 000000000..43f14eab3 --- /dev/null +++ b/html/search/all_6.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/all_6.js b/html/search/all_6.js new file mode 100644 index 000000000..b6edfc1b2 --- /dev/null +++ b/html/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_7',['World',['../classworld_1_1World.html',1,'world']]] +]; diff --git a/html/search/classes_0.html b/html/search/classes_0.html new file mode 100644 index 000000000..f7e4c14e1 --- /dev/null +++ b/html/search/classes_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_0.js b/html/search/classes_0.js new file mode 100644 index 000000000..06502aa4a --- /dev/null +++ b/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['client_8',['Client',['../classbuilder_1_1Client.html',1,'builder']]] +]; diff --git a/html/search/classes_1.html b/html/search/classes_1.html new file mode 100644 index 000000000..c7ff4b311 --- /dev/null +++ b/html/search/classes_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_1.js b/html/search/classes_1.js new file mode 100644 index 000000000..866a72a35 --- /dev/null +++ b/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handler_9',['Handler',['../classserver_1_1Handler.html',1,'server']]] +]; diff --git a/html/search/classes_2.html b/html/search/classes_2.html new file mode 100644 index 000000000..0d1e8a0cd --- /dev/null +++ b/html/search/classes_2.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_2.js b/html/search/classes_2.js new file mode 100644 index 000000000..e6b29a3c2 --- /dev/null +++ b/html/search/classes_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['model_10',['Model',['../classserver_1_1Model.html',1,'server']]] +]; diff --git a/html/search/classes_3.html b/html/search/classes_3.html new file mode 100644 index 000000000..21025456b --- /dev/null +++ b/html/search/classes_3.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_3.js b/html/search/classes_3.js new file mode 100644 index 000000000..07247c42d --- /dev/null +++ b/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ratelimiter_11',['RateLimiter',['../classserver_1_1RateLimiter.html',1,'server']]] +]; diff --git a/html/search/classes_4.html b/html/search/classes_4.html new file mode 100644 index 000000000..095ab5952 --- /dev/null +++ b/html/search/classes_4.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_4.js b/html/search/classes_4.js new file mode 100644 index 000000000..7f21fc0b9 --- /dev/null +++ b/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['server_12',['Server',['../classserver_1_1Server.html',1,'server']]] +]; diff --git a/html/search/classes_5.html b/html/search/classes_5.html new file mode 100644 index 000000000..fc9cdc996 --- /dev/null +++ b/html/search/classes_5.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/classes_5.js b/html/search/classes_5.js new file mode 100644 index 000000000..6473e8276 --- /dev/null +++ b/html/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_13',['World',['../classworld_1_1World.html',1,'world']]] +]; diff --git a/html/search/close.png b/html/search/close.png new file mode 100644 index 0000000000000000000000000000000000000000..9342d3dfeea7b7c4ee610987e717804b5a42ceb9 GIT binary patch literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN literal 0 HcmV?d00001 diff --git a/html/search/mag_sel.png b/html/search/mag_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7 GIT binary patch literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB literal 0 HcmV?d00001 diff --git a/html/search/nomatches.html b/html/search/nomatches.html new file mode 100644 index 000000000..437732089 --- /dev/null +++ b/html/search/nomatches.html @@ -0,0 +1,12 @@ + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/html/search/pages_0.html b/html/search/pages_0.html new file mode 100644 index 000000000..9a6a29ad3 --- /dev/null +++ b/html/search/pages_0.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/pages_0.js b/html/search/pages_0.js new file mode 100644 index 000000000..c3d0b094d --- /dev/null +++ b/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['craft_14',['Craft',['../md_README.html',1,'']]] +]; diff --git a/html/search/pages_1.html b/html/search/pages_1.html new file mode 100644 index 000000000..132ee038e --- /dev/null +++ b/html/search/pages_1.html @@ -0,0 +1,30 @@ + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/html/search/pages_1.js b/html/search/pages_1.js new file mode 100644 index 000000000..f0cf884ba --- /dev/null +++ b/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_15',['LICENSE',['../md_LICENSE.html',1,'']]] +]; diff --git a/html/search/search.css b/html/search/search.css new file mode 100644 index 000000000..3cf9df94a --- /dev/null +++ b/html/search/search.css @@ -0,0 +1,271 @@ +/*---------------- Search Box */ + +#FSearchBox { + float: left; +} + +#MSearchBox { + white-space : nowrap; + float: none; + margin-top: 8px; + right: 0px; + width: 170px; + height: 24px; + z-index: 102; +} + +#MSearchBox .left +{ + display:block; + position:absolute; + left:10px; + width:20px; + height:19px; + background:url('search_l.png') no-repeat; + background-position:right; +} + +#MSearchSelect { + display:block; + position:absolute; + width:20px; + height:19px; +} + +.left #MSearchSelect { + left:4px; +} + +.right #MSearchSelect { + right:5px; +} + +#MSearchField { + display:block; + position:absolute; + height:19px; + background:url('search_m.png') repeat-x; + border:none; + width:115px; + margin-left:20px; + padding-left:4px; + color: #909090; + outline: none; + font: 9pt Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; +} + +#FSearchBox #MSearchField { + margin-left:15px; +} + +#MSearchBox .right { + display:block; + position:absolute; + right:10px; + top:8px; + width:20px; + height:19px; + background:url('search_r.png') no-repeat; + background-position:left; +} + +#MSearchClose { + display: none; + position: absolute; + top: 4px; + background : none; + border: none; + margin: 0px 4px 0px 0px; + padding: 0px 0px; + outline: none; +} + +.left #MSearchClose { + left: 6px; +} + +.right #MSearchClose { + right: 2px; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; +} + +.SRResult { + display: none; +} + +DIV.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/html/search/search.js b/html/search/search.js new file mode 100644 index 000000000..a554ab9cb --- /dev/null +++ b/html/search/search.js @@ -0,0 +1,814 @@ +/* + @licstart The following is the entire license notice for the + JavaScript code in this file. + + Copyright (C) 1997-2017 by Dimitri van Heesch + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + @licend The above is the entire license notice + for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches.html'; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName == 'DIV' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName == 'DIV' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/html/search/search_r.png b/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/html/search/searchdata.js b/html/search/searchdata.js new file mode 100644 index 000000000..896490494 --- /dev/null +++ b/html/search/searchdata.js @@ -0,0 +1,21 @@ +var indexSectionsWithContent = +{ + 0: "chlmrsw", + 1: "chmrsw", + 2: "cl" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Pages" +}; + diff --git a/html/splitbar.png b/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/html/sync_off.png b/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/html/sync_on.png b/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/html/tab_a.png b/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/html/tab_b.png b/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/html/tabs.css b/html/tabs.css new file mode 100644 index 000000000..7d45d36c1 --- /dev/null +++ b/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} From 49942a09714894f228ba8860e8f4cd817206c8fb Mon Sep 17 00:00:00 2001 From: NathanJohns307 Date: Sun, 7 Mar 2021 10:10:57 -0800 Subject: [PATCH 09/38] Added lava/rain textures and mapped them to blocks placeable by player --- src/item.c | 7 +++++-- src/item.h | 2 ++ textures/texture.png | Bin 35757 -> 31757 bytes 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/item.c b/src/item.c index 4efc40908..eaf130e4b 100644 --- a/src/item.c +++ b/src/item.c @@ -25,6 +25,8 @@ const int items[] = { SUN_FLOWER, WHITE_FLOWER, BLUE_FLOWER, + LAVA, + RAIN, COLOR_00, COLOR_01, COLOR_02, @@ -88,8 +90,8 @@ const int blocks[256][6] = { {0, 0, 0, 0, 0, 0}, // 21 {0, 0, 0, 0, 0, 0}, // 22 {0, 0, 0, 0, 0, 0}, // 23 - {0, 0, 0, 0, 0, 0}, // 24 - {0, 0, 0, 0, 0, 0}, // 25 + {240, 240, 240, 240, 240, 240}, // 24 lava + {17, 17, 18, 19, 17, 17}, // 25 rain {0, 0, 0, 0, 0, 0}, // 26 {0, 0, 0, 0, 0, 0}, // 27 {0, 0, 0, 0, 0, 0}, // 28 @@ -185,6 +187,7 @@ int is_transparent(int w) { case GLASS: case LEAVES: case WATER: + case RAIN: return 1; default: return 0; diff --git a/src/item.h b/src/item.h index 0d9226e28..2a84ce901 100644 --- a/src/item.h +++ b/src/item.h @@ -25,6 +25,8 @@ #define SUN_FLOWER 21 #define WHITE_FLOWER 22 #define BLUE_FLOWER 23 +#define LAVA 24 +#define RAIN 25 #define COLOR_00 32 #define COLOR_01 33 #define COLOR_02 34 diff --git a/textures/texture.png b/textures/texture.png index c2b6c34d0710d2b3932369fc9f891dafd380489c..dddb0669b70acf58c31a768030d01880d23ed80d 100644 GIT binary patch literal 31757 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 V{yC%CL!9r8q@th!YLGJv|33~)XA}Sc literal 35757 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 YKd#OB0j7>I@c;k-07*qoM6N<$f+(0q<^TWy From ebdae2101fbb0c26245d11ae09b26383a400ae56 Mon Sep 17 00:00:00 2001 From: Brad Date: Sun, 7 Mar 2021 22:06:42 -0500 Subject: [PATCH 10/38] Variable mouse sensitivity --- .vscode/settings.json | 6 ++++++ src/main.c | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..01b798c58 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.associations": { + "cube.h": "c" + }, + "cmake.configureOnOpen": true +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index c079478a9..13d4c2412 100644 --- a/src/main.c +++ b/src/main.c @@ -33,6 +33,8 @@ #define MODE_OFFLINE 0 #define MODE_ONLINE 1 +#define MOUSE_SENSITIVITY 0.001; + typedef struct { Map map; SignList signs; @@ -91,6 +93,7 @@ typedef struct { typedef struct { GLFWwindow *window; + float sensitivity; Chunk chunks[MAX_CHUNKS]; int chunk_count; int create_radius; @@ -1959,13 +1962,12 @@ void handle_mouse_input() { if (exclusive && (px || py)) { double mx, my; glfwGetCursorPos(g->window, &mx, &my); - float m = 0.0025; - s->rx += (mx - px) * m; + s->rx += (mx - px) * g->sensitivity; if (INVERT_MOUSE) { - s->ry += (my - py) * m; + s->ry += (my - py) * g->sensitivity; } else { - s->ry -= (my - py) * m; + s->ry -= (my - py) * g->sensitivity; } if (s->rx < 0) { s->rx += RADIANS(360); @@ -2000,6 +2002,8 @@ void handle_movement(double dt) { if (glfwGetKey(g->window, GLFW_KEY_RIGHT)) s->rx += m; if (glfwGetKey(g->window, GLFW_KEY_UP)) s->ry += m; if (glfwGetKey(g->window, GLFW_KEY_DOWN)) s->ry -= m; + if (glfwGetKey(g->window, GLFW_KEY_M)) g->sensitivity *= 1.1; + if (glfwGetKey(g->window, GLFW_KEY_N)) g->sensitivity *= 0.9; } float vx, vy, vz; get_motion_vector(g->flying, sz, sx, s->rx, s->ry, &vx, &vy, &vz); @@ -2306,6 +2310,7 @@ int main(int argc, char **argv) { Player *me = g->players; State *s = &g->players->state; + g->sensitivity = MOUSE_SENSITIVITY; me->id = 0; me->name[0] = '\0'; me->buffer = 0; From b0d2c1385e79f9ea4bbb23d7b691b83e0c69b757 Mon Sep 17 00:00:00 2001 From: Brad Date: Thu, 11 Mar 2021 20:28:41 -0500 Subject: [PATCH 11/38] Added user stories and updated backlog --- Backlog | 12 +++++++++--- UserStories | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/Backlog b/Backlog index de634b4a9..4c61b6752 100644 --- a/Backlog +++ b/Backlog @@ -1,11 +1,17 @@ -US001 Task001 - Modify mouse input to move the player's view less. The mouse should be less sensitive. Points 3 +-- US001 Task001 - Modify mouse input to move the player's view less. The mouse should be less sensitive. Points 3 US002 Task002 - Sand blocks should fall to the ground if there is no block underneath. Points 5 US002 Task003 - Gravel blocks should fall to the ground if there is no block underneath. Points 5 US003 Task004 - Cloud color should change to a dark grey at night, and stay white during daytime. Points 2 US004 Task005 - Design the layout and structure of the buildings to be spawned. Points 5 US004 Task006 - Create generation function and spawn conditions for buildings. Points 5 -US005 Task007 - Create lava block model. Points 3 +-- US005 Task007 - Create lava block model. Points 3 US005 Task008 - Create generation function and spawn conditions for lava pools. Points 5 -US006 Task009 - Create rain drop block model. Points 3 +-- US006 Task009 - Create rain drop block model. Points 3 US006 Task010 - Create spawn conditions for rain drop blocks. Points 3 US006 Task011 - Rain drop blocks should have no collision and be effected by gravity. Points 3 +US007 Task012 - Water blocks should not be transparent. Points 2 +US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 +US007 Task014 - Lava blocks should have no collision. Points 1 +US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 +US009 Task016 - Add the ability to double jump while not flying. Points 3 +US010 Task017 - Add bodies of water to terrain generation. Points 5 diff --git a/UserStories b/UserStories index f4f30b49b..a934707f9 100644 --- a/UserStories +++ b/UserStories @@ -4,3 +4,7 @@ US003 - As a player of Craft, the cloud's shading should reflect the time of day US004 - As a player of Craft, I want randomly spawning buildings or structures to create a more diverse playing environment. US005 - As a player of Craft, I want randomly generated lava pools to create a more diverse playing environment. US006 - As a player of Craft, I want periodic weather (rain) so that the environment is more dynamic and realistic. +US007 - As a player of Craft, I want fluid blocks to slow player movement. +US008 - As a player of Craft, I want to be able to sprint. +US009 - As a player of Craft, I want to be able to double jump +US010 - As a player of Craft, I want bodies of water to be generated in the map. From 15aeb64c3ffe08ad7e3c090c45e06ee241a2d6f3 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 18 Mar 2021 20:39:05 -0400 Subject: [PATCH 12/38] commit generated doxy files --- CMakeDoxyfile.in | 280 ++++++++++++++++ CMakeDoxygenDefaults.cmake | 672 +++++++++++++++++++++++++++++++++++++ 2 files changed, 952 insertions(+) create mode 100644 CMakeDoxyfile.in create mode 100644 CMakeDoxygenDefaults.cmake diff --git a/CMakeDoxyfile.in b/CMakeDoxyfile.in new file mode 100644 index 000000000..848a3c819 --- /dev/null +++ b/CMakeDoxyfile.in @@ -0,0 +1,280 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@ +PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ +PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ +PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@ +PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@ +OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ +CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@ +ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@ +OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@ +OUTPUT_TEXT_DIRECTION = @DOXYGEN_OUTPUT_TEXT_DIRECTION@ +BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@ +REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@ +ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@ +ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@ +INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@ +FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@ +STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@ +STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@ +SHORT_NAMES = @DOXYGEN_SHORT_NAMES@ +JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@ +JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@ +QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@ +MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@ +INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@ +SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@ +TAB_SIZE = @DOXYGEN_TAB_SIZE@ +ALIASES = @DOXYGEN_ALIASES@ +TCL_SUBST = @DOXYGEN_TCL_SUBST@ +OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@ +OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@ +OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@ +OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@ +OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@ +EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@ +MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@ +TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@ +AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@ +BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@ +CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@ +SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@ +IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@ +DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@ +GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@ +SUBGROUPING = @DOXYGEN_SUBGROUPING@ +INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@ +INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@ +TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@ +LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@ +EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@ +EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@ +EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@ +EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@ +EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@ +EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@ +EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@ +EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@ +HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@ +HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@ +HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@ +HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@ +INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@ +CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@ +HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@ +HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@ +SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@ +SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@ +FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@ +INLINE_INFO = @DOXYGEN_INLINE_INFO@ +SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@ +SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@ +SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@ +SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@ +SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@ +STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@ +GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@ +GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@ +GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@ +GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@ +ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@ +MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@ +SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@ +SHOW_FILES = @DOXYGEN_SHOW_FILES@ +SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@ +FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@ +LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@ +CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@ +QUIET = @DOXYGEN_QUIET@ +WARNINGS = @DOXYGEN_WARNINGS@ +WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@ +WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@ +WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@ +WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@ +WARN_FORMAT = @DOXYGEN_WARN_FORMAT@ +WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@ +INPUT = @DOXYGEN_INPUT@ +INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@ +FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ +RECURSIVE = @DOXYGEN_RECURSIVE@ +EXCLUDE = @DOXYGEN_EXCLUDE@ +EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@ +EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@ +EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@ +EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@ +EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@ +EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@ +IMAGE_PATH = @DOXYGEN_IMAGE_PATH@ +INPUT_FILTER = @DOXYGEN_INPUT_FILTER@ +FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@ +FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@ +FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@ +USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@ +SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@ +INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@ +STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@ +REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@ +REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@ +REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@ +SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@ +USE_HTAGS = @DOXYGEN_USE_HTAGS@ +VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@ +CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@ +CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@ +CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@ +ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@ +COLS_IN_ALPHA_INDEX = @DOXYGEN_COLS_IN_ALPHA_INDEX@ +IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@ +GENERATE_HTML = @DOXYGEN_GENERATE_HTML@ +HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@ +HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@ +HTML_HEADER = @DOXYGEN_HTML_HEADER@ +HTML_FOOTER = @DOXYGEN_HTML_FOOTER@ +HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@ +HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@ +HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@ +HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@ +HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@ +HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@ +HTML_TIMESTAMP = @DOXYGEN_HTML_TIMESTAMP@ +HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@ +HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@ +HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@ +GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@ +DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@ +DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@ +DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@ +DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@ +GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ +CHM_FILE = @DOXYGEN_CHM_FILE@ +HHC_LOCATION = @DOXYGEN_HHC_LOCATION@ +GENERATE_CHI = @DOXYGEN_GENERATE_CHI@ +CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@ +BINARY_TOC = @DOXYGEN_BINARY_TOC@ +TOC_EXPAND = @DOXYGEN_TOC_EXPAND@ +GENERATE_QHP = @DOXYGEN_GENERATE_QHP@ +QCH_FILE = @DOXYGEN_QCH_FILE@ +QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@ +QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@ +QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@ +QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@ +QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@ +QHG_LOCATION = @DOXYGEN_QHG_LOCATION@ +GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@ +ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@ +DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@ +GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@ +ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@ +TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@ +EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@ +FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@ +FORMULA_TRANSPARENT = @DOXYGEN_FORMULA_TRANSPARENT@ +FORMULA_MACROFILE = @DOXYGEN_FORMULA_MACROFILE@ +USE_MATHJAX = @DOXYGEN_USE_MATHJAX@ +MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@ +MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@ +MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@ +MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@ +SEARCHENGINE = @DOXYGEN_SEARCHENGINE@ +SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@ +EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@ +SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@ +SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@ +EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@ +EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@ +GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@ +LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@ +LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@ +MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@ +LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@ +COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@ +PAPER_TYPE = @DOXYGEN_PAPER_TYPE@ +EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@ +LATEX_HEADER = @DOXYGEN_LATEX_HEADER@ +LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@ +LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@ +LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@ +PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@ +USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@ +LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@ +LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@ +LATEX_SOURCE_CODE = @DOXYGEN_LATEX_SOURCE_CODE@ +LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@ +LATEX_TIMESTAMP = @DOXYGEN_LATEX_TIMESTAMP@ +LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@ +GENERATE_RTF = @DOXYGEN_GENERATE_RTF@ +RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@ +COMPACT_RTF = @DOXYGEN_COMPACT_RTF@ +RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@ +RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@ +RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@ +RTF_SOURCE_CODE = @DOXYGEN_RTF_SOURCE_CODE@ +GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ +MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@ +MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@ +MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@ +MAN_LINKS = @DOXYGEN_MAN_LINKS@ +GENERATE_XML = @DOXYGEN_GENERATE_XML@ +XML_OUTPUT = @DOXYGEN_XML_OUTPUT@ +XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@ +XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@ +GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@ +DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@ +DOCBOOK_PROGRAMLISTING = @DOXYGEN_DOCBOOK_PROGRAMLISTING@ +GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@ +GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@ +PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@ +PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@ +PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@ +ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@ +MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@ +EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@ +SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@ +INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@ +INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@ +PREDEFINED = @DOXYGEN_PREDEFINED@ +EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@ +SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@ +TAGFILES = @DOXYGEN_TAGFILES@ +GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@ +ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@ +EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@ +EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@ +CLASS_DIAGRAMS = @DOXYGEN_CLASS_DIAGRAMS@ +DIA_PATH = @DOXYGEN_DIA_PATH@ +HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@ +HAVE_DOT = @DOXYGEN_HAVE_DOT@ +DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@ +DOT_FONTNAME = @DOXYGEN_DOT_FONTNAME@ +DOT_FONTSIZE = @DOXYGEN_DOT_FONTSIZE@ +DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@ +CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@ +COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@ +GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@ +UML_LOOK = @DOXYGEN_UML_LOOK@ +UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@ +TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@ +INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@ +INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@ +CALL_GRAPH = @DOXYGEN_CALL_GRAPH@ +CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@ +GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@ +DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@ +DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@ +INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@ +DOT_PATH = @DOXYGEN_DOT_PATH@ +DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@ +MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@ +DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@ +PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@ +PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@ +PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@ +DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@ +MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@ +DOT_TRANSPARENT = @DOXYGEN_DOT_TRANSPARENT@ +DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@ +GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@ +DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@ diff --git a/CMakeDoxygenDefaults.cmake b/CMakeDoxygenDefaults.cmake new file mode 100644 index 000000000..db28798f1 --- /dev/null +++ b/CMakeDoxygenDefaults.cmake @@ -0,0 +1,672 @@ +# +# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! +# + +if(NOT DEFINED DOXYGEN_DOXYFILE_ENCODING) + set(DOXYGEN_DOXYFILE_ENCODING UTF-8) +endif() +if(NOT DEFINED DOXYGEN_PROJECT_NAME) + set(DOXYGEN_PROJECT_NAME "My Project") +endif() +if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS) + set(DOXYGEN_CREATE_SUBDIRS NO) +endif() +if(NOT DEFINED DOXYGEN_ALLOW_UNICODE_NAMES) + set(DOXYGEN_ALLOW_UNICODE_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_OUTPUT_LANGUAGE) + set(DOXYGEN_OUTPUT_LANGUAGE English) +endif() +if(NOT DEFINED DOXYGEN_OUTPUT_TEXT_DIRECTION) + set(DOXYGEN_OUTPUT_TEXT_DIRECTION None) +endif() +if(NOT DEFINED DOXYGEN_BRIEF_MEMBER_DESC) + set(DOXYGEN_BRIEF_MEMBER_DESC YES) +endif() +if(NOT DEFINED DOXYGEN_REPEAT_BRIEF) + set(DOXYGEN_REPEAT_BRIEF YES) +endif() +if(NOT DEFINED DOXYGEN_ABBREVIATE_BRIEF) + set(DOXYGEN_ABBREVIATE_BRIEF "The $name class" + "The $name widget" + "The $name file" + is + provides + specifies + contains + represents + a + an + the) +endif() +if(NOT DEFINED DOXYGEN_ALWAYS_DETAILED_SEC) + set(DOXYGEN_ALWAYS_DETAILED_SEC NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_INHERITED_MEMB) + set(DOXYGEN_INLINE_INHERITED_MEMB NO) +endif() +if(NOT DEFINED DOXYGEN_FULL_PATH_NAMES) + set(DOXYGEN_FULL_PATH_NAMES YES) +endif() +if(NOT DEFINED DOXYGEN_SHORT_NAMES) + set(DOXYGEN_SHORT_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_JAVADOC_AUTOBRIEF) + set(DOXYGEN_JAVADOC_AUTOBRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_JAVADOC_BANNER) + set(DOXYGEN_JAVADOC_BANNER NO) +endif() +if(NOT DEFINED DOXYGEN_QT_AUTOBRIEF) + set(DOXYGEN_QT_AUTOBRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_MULTILINE_CPP_IS_BRIEF) + set(DOXYGEN_MULTILINE_CPP_IS_BRIEF NO) +endif() +if(NOT DEFINED DOXYGEN_INHERIT_DOCS) + set(DOXYGEN_INHERIT_DOCS YES) +endif() +if(NOT DEFINED DOXYGEN_SEPARATE_MEMBER_PAGES) + set(DOXYGEN_SEPARATE_MEMBER_PAGES NO) +endif() +if(NOT DEFINED DOXYGEN_TAB_SIZE) + set(DOXYGEN_TAB_SIZE 4) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_FOR_C) + set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_JAVA) + set(DOXYGEN_OPTIMIZE_OUTPUT_JAVA NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_FOR_FORTRAN) + set(DOXYGEN_OPTIMIZE_FOR_FORTRAN NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_VHDL) + set(DOXYGEN_OPTIMIZE_OUTPUT_VHDL NO) +endif() +if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_SLICE) + set(DOXYGEN_OPTIMIZE_OUTPUT_SLICE NO) +endif() +if(NOT DEFINED DOXYGEN_MARKDOWN_SUPPORT) + set(DOXYGEN_MARKDOWN_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_TOC_INCLUDE_HEADINGS) + set(DOXYGEN_TOC_INCLUDE_HEADINGS 5) +endif() +if(NOT DEFINED DOXYGEN_AUTOLINK_SUPPORT) + set(DOXYGEN_AUTOLINK_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_BUILTIN_STL_SUPPORT) + set(DOXYGEN_BUILTIN_STL_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_CPP_CLI_SUPPORT) + set(DOXYGEN_CPP_CLI_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_SIP_SUPPORT) + set(DOXYGEN_SIP_SUPPORT NO) +endif() +if(NOT DEFINED DOXYGEN_IDL_PROPERTY_SUPPORT) + set(DOXYGEN_IDL_PROPERTY_SUPPORT YES) +endif() +if(NOT DEFINED DOXYGEN_DISTRIBUTE_GROUP_DOC) + set(DOXYGEN_DISTRIBUTE_GROUP_DOC NO) +endif() +if(NOT DEFINED DOXYGEN_GROUP_NESTED_COMPOUNDS) + set(DOXYGEN_GROUP_NESTED_COMPOUNDS NO) +endif() +if(NOT DEFINED DOXYGEN_SUBGROUPING) + set(DOXYGEN_SUBGROUPING YES) +endif() +if(NOT DEFINED DOXYGEN_INLINE_GROUPED_CLASSES) + set(DOXYGEN_INLINE_GROUPED_CLASSES NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_SIMPLE_STRUCTS) + set(DOXYGEN_INLINE_SIMPLE_STRUCTS NO) +endif() +if(NOT DEFINED DOXYGEN_TYPEDEF_HIDES_STRUCT) + set(DOXYGEN_TYPEDEF_HIDES_STRUCT NO) +endif() +if(NOT DEFINED DOXYGEN_LOOKUP_CACHE_SIZE) + set(DOXYGEN_LOOKUP_CACHE_SIZE 0) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_ALL) + set(DOXYGEN_EXTRACT_ALL NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PRIVATE) + set(DOXYGEN_EXTRACT_PRIVATE NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PRIV_VIRTUAL) + set(DOXYGEN_EXTRACT_PRIV_VIRTUAL NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_PACKAGE) + set(DOXYGEN_EXTRACT_PACKAGE NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_STATIC) + set(DOXYGEN_EXTRACT_STATIC NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_CLASSES) + set(DOXYGEN_EXTRACT_LOCAL_CLASSES YES) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_METHODS) + set(DOXYGEN_EXTRACT_LOCAL_METHODS NO) +endif() +if(NOT DEFINED DOXYGEN_EXTRACT_ANON_NSPACES) + set(DOXYGEN_EXTRACT_ANON_NSPACES NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_MEMBERS) + set(DOXYGEN_HIDE_UNDOC_MEMBERS NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_CLASSES) + set(DOXYGEN_HIDE_UNDOC_CLASSES NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_FRIEND_COMPOUNDS) + set(DOXYGEN_HIDE_FRIEND_COMPOUNDS NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_IN_BODY_DOCS) + set(DOXYGEN_HIDE_IN_BODY_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_INTERNAL_DOCS) + set(DOXYGEN_INTERNAL_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_CASE_SENSE_NAMES) + set(DOXYGEN_CASE_SENSE_NAMES YES) +endif() +if(NOT DEFINED DOXYGEN_HIDE_SCOPE_NAMES) + set(DOXYGEN_HIDE_SCOPE_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_HIDE_COMPOUND_REFERENCE) + set(DOXYGEN_HIDE_COMPOUND_REFERENCE NO) +endif() +if(NOT DEFINED DOXYGEN_SHOW_INCLUDE_FILES) + set(DOXYGEN_SHOW_INCLUDE_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_GROUPED_MEMB_INC) + set(DOXYGEN_SHOW_GROUPED_MEMB_INC NO) +endif() +if(NOT DEFINED DOXYGEN_FORCE_LOCAL_INCLUDES) + set(DOXYGEN_FORCE_LOCAL_INCLUDES NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_INFO) + set(DOXYGEN_INLINE_INFO YES) +endif() +if(NOT DEFINED DOXYGEN_SORT_MEMBER_DOCS) + set(DOXYGEN_SORT_MEMBER_DOCS YES) +endif() +if(NOT DEFINED DOXYGEN_SORT_BRIEF_DOCS) + set(DOXYGEN_SORT_BRIEF_DOCS NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_MEMBERS_CTORS_1ST) + set(DOXYGEN_SORT_MEMBERS_CTORS_1ST NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_GROUP_NAMES) + set(DOXYGEN_SORT_GROUP_NAMES NO) +endif() +if(NOT DEFINED DOXYGEN_SORT_BY_SCOPE_NAME) + set(DOXYGEN_SORT_BY_SCOPE_NAME NO) +endif() +if(NOT DEFINED DOXYGEN_STRICT_PROTO_MATCHING) + set(DOXYGEN_STRICT_PROTO_MATCHING NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TODOLIST) + set(DOXYGEN_GENERATE_TODOLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TESTLIST) + set(DOXYGEN_GENERATE_TESTLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_BUGLIST) + set(DOXYGEN_GENERATE_BUGLIST YES) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DEPRECATEDLIST) + set(DOXYGEN_GENERATE_DEPRECATEDLIST YES) +endif() +if(NOT DEFINED DOXYGEN_MAX_INITIALIZER_LINES) + set(DOXYGEN_MAX_INITIALIZER_LINES 30) +endif() +if(NOT DEFINED DOXYGEN_SHOW_USED_FILES) + set(DOXYGEN_SHOW_USED_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_FILES) + set(DOXYGEN_SHOW_FILES YES) +endif() +if(NOT DEFINED DOXYGEN_SHOW_NAMESPACES) + set(DOXYGEN_SHOW_NAMESPACES YES) +endif() +if(NOT DEFINED DOXYGEN_QUIET) + set(DOXYGEN_QUIET NO) +endif() +if(NOT DEFINED DOXYGEN_WARNINGS) + set(DOXYGEN_WARNINGS YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_UNDOCUMENTED) + set(DOXYGEN_WARN_IF_UNDOCUMENTED YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_IF_DOC_ERROR) + set(DOXYGEN_WARN_IF_DOC_ERROR YES) +endif() +if(NOT DEFINED DOXYGEN_WARN_NO_PARAMDOC) + set(DOXYGEN_WARN_NO_PARAMDOC NO) +endif() +if(NOT DEFINED DOXYGEN_WARN_AS_ERROR) + set(DOXYGEN_WARN_AS_ERROR NO) +endif() +if(NOT DEFINED DOXYGEN_WARN_FORMAT) + set(DOXYGEN_WARN_FORMAT "$file:$line: $text") +endif() +if(NOT DEFINED DOXYGEN_INPUT_ENCODING) + set(DOXYGEN_INPUT_ENCODING UTF-8) +endif() +if(NOT DEFINED DOXYGEN_FILE_PATTERNS) + set(DOXYGEN_FILE_PATTERNS *.c + *.cc + *.cxx + *.cpp + *.c++ + *.java + *.ii + *.ixx + *.ipp + *.i++ + *.inl + *.idl + *.ddl + *.odl + *.h + *.hh + *.hxx + *.hpp + *.h++ + *.cs + *.d + *.php + *.php4 + *.php5 + *.phtml + *.inc + *.m + *.markdown + *.md + *.mm + *.dox + *.doc + *.txt + *.py + *.pyw + *.f90 + *.f95 + *.f03 + *.f08 + *.f + *.for + *.tcl + *.vhd + *.vhdl + *.ucf + *.qsf + *.ice) +endif() +if(NOT DEFINED DOXYGEN_RECURSIVE) + set(DOXYGEN_RECURSIVE NO) +endif() +if(NOT DEFINED DOXYGEN_EXCLUDE_SYMLINKS) + set(DOXYGEN_EXCLUDE_SYMLINKS NO) +endif() +if(NOT DEFINED DOXYGEN_EXAMPLE_PATTERNS) + set(DOXYGEN_EXAMPLE_PATTERNS *) +endif() +if(NOT DEFINED DOXYGEN_EXAMPLE_RECURSIVE) + set(DOXYGEN_EXAMPLE_RECURSIVE NO) +endif() +if(NOT DEFINED DOXYGEN_FILTER_SOURCE_FILES) + set(DOXYGEN_FILTER_SOURCE_FILES NO) +endif() +if(NOT DEFINED DOXYGEN_SOURCE_BROWSER) + set(DOXYGEN_SOURCE_BROWSER NO) +endif() +if(NOT DEFINED DOXYGEN_INLINE_SOURCES) + set(DOXYGEN_INLINE_SOURCES NO) +endif() +if(NOT DEFINED DOXYGEN_STRIP_CODE_COMMENTS) + set(DOXYGEN_STRIP_CODE_COMMENTS YES) +endif() +if(NOT DEFINED DOXYGEN_REFERENCED_BY_RELATION) + set(DOXYGEN_REFERENCED_BY_RELATION NO) +endif() +if(NOT DEFINED DOXYGEN_REFERENCES_RELATION) + set(DOXYGEN_REFERENCES_RELATION NO) +endif() +if(NOT DEFINED DOXYGEN_REFERENCES_LINK_SOURCE) + set(DOXYGEN_REFERENCES_LINK_SOURCE YES) +endif() +if(NOT DEFINED DOXYGEN_SOURCE_TOOLTIPS) + set(DOXYGEN_SOURCE_TOOLTIPS YES) +endif() +if(NOT DEFINED DOXYGEN_USE_HTAGS) + set(DOXYGEN_USE_HTAGS NO) +endif() +if(NOT DEFINED DOXYGEN_VERBATIM_HEADERS) + set(DOXYGEN_VERBATIM_HEADERS YES) +endif() +if(NOT DEFINED DOXYGEN_CLANG_ASSISTED_PARSING) + set(DOXYGEN_CLANG_ASSISTED_PARSING NO) +endif() +if(NOT DEFINED DOXYGEN_ALPHABETICAL_INDEX) + set(DOXYGEN_ALPHABETICAL_INDEX YES) +endif() +if(NOT DEFINED DOXYGEN_COLS_IN_ALPHA_INDEX) + set(DOXYGEN_COLS_IN_ALPHA_INDEX 5) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_HTML) + set(DOXYGEN_GENERATE_HTML YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_OUTPUT) + set(DOXYGEN_HTML_OUTPUT html) +endif() +if(NOT DEFINED DOXYGEN_HTML_FILE_EXTENSION) + set(DOXYGEN_HTML_FILE_EXTENSION .html) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_HUE) + set(DOXYGEN_HTML_COLORSTYLE_HUE 220) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_SAT) + set(DOXYGEN_HTML_COLORSTYLE_SAT 100) +endif() +if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_GAMMA) + set(DOXYGEN_HTML_COLORSTYLE_GAMMA 80) +endif() +if(NOT DEFINED DOXYGEN_HTML_TIMESTAMP) + set(DOXYGEN_HTML_TIMESTAMP NO) +endif() +if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_MENUS) + set(DOXYGEN_HTML_DYNAMIC_MENUS YES) +endif() +if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_SECTIONS) + set(DOXYGEN_HTML_DYNAMIC_SECTIONS NO) +endif() +if(NOT DEFINED DOXYGEN_HTML_INDEX_NUM_ENTRIES) + set(DOXYGEN_HTML_INDEX_NUM_ENTRIES 100) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DOCSET) + set(DOXYGEN_GENERATE_DOCSET NO) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_FEEDNAME) + set(DOXYGEN_DOCSET_FEEDNAME "Doxygen generated docs") +endif() +if(NOT DEFINED DOXYGEN_DOCSET_BUNDLE_ID) + set(DOXYGEN_DOCSET_BUNDLE_ID org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_ID) + set(DOXYGEN_DOCSET_PUBLISHER_ID org.doxygen.Publisher) +endif() +if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_NAME) + set(DOXYGEN_DOCSET_PUBLISHER_NAME Publisher) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_HTMLHELP) + set(DOXYGEN_GENERATE_HTMLHELP NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_CHI) + set(DOXYGEN_GENERATE_CHI NO) +endif() +if(NOT DEFINED DOXYGEN_BINARY_TOC) + set(DOXYGEN_BINARY_TOC NO) +endif() +if(NOT DEFINED DOXYGEN_TOC_EXPAND) + set(DOXYGEN_TOC_EXPAND NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_QHP) + set(DOXYGEN_GENERATE_QHP NO) +endif() +if(NOT DEFINED DOXYGEN_QHP_NAMESPACE) + set(DOXYGEN_QHP_NAMESPACE org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_QHP_VIRTUAL_FOLDER) + set(DOXYGEN_QHP_VIRTUAL_FOLDER doc) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_ECLIPSEHELP) + set(DOXYGEN_GENERATE_ECLIPSEHELP NO) +endif() +if(NOT DEFINED DOXYGEN_ECLIPSE_DOC_ID) + set(DOXYGEN_ECLIPSE_DOC_ID org.doxygen.Project) +endif() +if(NOT DEFINED DOXYGEN_DISABLE_INDEX) + set(DOXYGEN_DISABLE_INDEX NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_TREEVIEW) + set(DOXYGEN_GENERATE_TREEVIEW NO) +endif() +if(NOT DEFINED DOXYGEN_ENUM_VALUES_PER_LINE) + set(DOXYGEN_ENUM_VALUES_PER_LINE 4) +endif() +if(NOT DEFINED DOXYGEN_TREEVIEW_WIDTH) + set(DOXYGEN_TREEVIEW_WIDTH 250) +endif() +if(NOT DEFINED DOXYGEN_EXT_LINKS_IN_WINDOW) + set(DOXYGEN_EXT_LINKS_IN_WINDOW NO) +endif() +if(NOT DEFINED DOXYGEN_FORMULA_FONTSIZE) + set(DOXYGEN_FORMULA_FONTSIZE 10) +endif() +if(NOT DEFINED DOXYGEN_FORMULA_TRANSPARENT) + set(DOXYGEN_FORMULA_TRANSPARENT YES) +endif() +if(NOT DEFINED DOXYGEN_USE_MATHJAX) + set(DOXYGEN_USE_MATHJAX NO) +endif() +if(NOT DEFINED DOXYGEN_MATHJAX_FORMAT) + set(DOXYGEN_MATHJAX_FORMAT HTML-CSS) +endif() +if(NOT DEFINED DOXYGEN_MATHJAX_RELPATH) + set(DOXYGEN_MATHJAX_RELPATH https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/) +endif() +if(NOT DEFINED DOXYGEN_SEARCHENGINE) + set(DOXYGEN_SEARCHENGINE YES) +endif() +if(NOT DEFINED DOXYGEN_SERVER_BASED_SEARCH) + set(DOXYGEN_SERVER_BASED_SEARCH NO) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_SEARCH) + set(DOXYGEN_EXTERNAL_SEARCH NO) +endif() +if(NOT DEFINED DOXYGEN_SEARCHDATA_FILE) + set(DOXYGEN_SEARCHDATA_FILE searchdata.xml) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_LATEX) + set(DOXYGEN_GENERATE_LATEX YES) +endif() +if(NOT DEFINED DOXYGEN_LATEX_OUTPUT) + set(DOXYGEN_LATEX_OUTPUT latex) +endif() +if(NOT DEFINED DOXYGEN_MAKEINDEX_CMD_NAME) + set(DOXYGEN_MAKEINDEX_CMD_NAME makeindex) +endif() +if(NOT DEFINED DOXYGEN_LATEX_MAKEINDEX_CMD) + set(DOXYGEN_LATEX_MAKEINDEX_CMD makeindex) +endif() +if(NOT DEFINED DOXYGEN_COMPACT_LATEX) + set(DOXYGEN_COMPACT_LATEX NO) +endif() +if(NOT DEFINED DOXYGEN_PAPER_TYPE) + set(DOXYGEN_PAPER_TYPE a4) +endif() +if(NOT DEFINED DOXYGEN_PDF_HYPERLINKS) + set(DOXYGEN_PDF_HYPERLINKS YES) +endif() +if(NOT DEFINED DOXYGEN_USE_PDFLATEX) + set(DOXYGEN_USE_PDFLATEX YES) +endif() +if(NOT DEFINED DOXYGEN_LATEX_BATCHMODE) + set(DOXYGEN_LATEX_BATCHMODE NO) +endif() +if(NOT DEFINED DOXYGEN_LATEX_HIDE_INDICES) + set(DOXYGEN_LATEX_HIDE_INDICES NO) +endif() +if(NOT DEFINED DOXYGEN_LATEX_SOURCE_CODE) + set(DOXYGEN_LATEX_SOURCE_CODE NO) +endif() +if(NOT DEFINED DOXYGEN_LATEX_BIB_STYLE) + set(DOXYGEN_LATEX_BIB_STYLE plain) +endif() +if(NOT DEFINED DOXYGEN_LATEX_TIMESTAMP) + set(DOXYGEN_LATEX_TIMESTAMP NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_RTF) + set(DOXYGEN_GENERATE_RTF NO) +endif() +if(NOT DEFINED DOXYGEN_RTF_OUTPUT) + set(DOXYGEN_RTF_OUTPUT rtf) +endif() +if(NOT DEFINED DOXYGEN_COMPACT_RTF) + set(DOXYGEN_COMPACT_RTF NO) +endif() +if(NOT DEFINED DOXYGEN_RTF_HYPERLINKS) + set(DOXYGEN_RTF_HYPERLINKS NO) +endif() +if(NOT DEFINED DOXYGEN_RTF_SOURCE_CODE) + set(DOXYGEN_RTF_SOURCE_CODE NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_MAN) + set(DOXYGEN_GENERATE_MAN NO) +endif() +if(NOT DEFINED DOXYGEN_MAN_OUTPUT) + set(DOXYGEN_MAN_OUTPUT man) +endif() +if(NOT DEFINED DOXYGEN_MAN_EXTENSION) + set(DOXYGEN_MAN_EXTENSION .3) +endif() +if(NOT DEFINED DOXYGEN_MAN_LINKS) + set(DOXYGEN_MAN_LINKS NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_XML) + set(DOXYGEN_GENERATE_XML NO) +endif() +if(NOT DEFINED DOXYGEN_XML_OUTPUT) + set(DOXYGEN_XML_OUTPUT xml) +endif() +if(NOT DEFINED DOXYGEN_XML_PROGRAMLISTING) + set(DOXYGEN_XML_PROGRAMLISTING YES) +endif() +if(NOT DEFINED DOXYGEN_XML_NS_MEMB_FILE_SCOPE) + set(DOXYGEN_XML_NS_MEMB_FILE_SCOPE NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_DOCBOOK) + set(DOXYGEN_GENERATE_DOCBOOK NO) +endif() +if(NOT DEFINED DOXYGEN_DOCBOOK_OUTPUT) + set(DOXYGEN_DOCBOOK_OUTPUT docbook) +endif() +if(NOT DEFINED DOXYGEN_DOCBOOK_PROGRAMLISTING) + set(DOXYGEN_DOCBOOK_PROGRAMLISTING NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_AUTOGEN_DEF) + set(DOXYGEN_GENERATE_AUTOGEN_DEF NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_PERLMOD) + set(DOXYGEN_GENERATE_PERLMOD NO) +endif() +if(NOT DEFINED DOXYGEN_PERLMOD_LATEX) + set(DOXYGEN_PERLMOD_LATEX NO) +endif() +if(NOT DEFINED DOXYGEN_PERLMOD_PRETTY) + set(DOXYGEN_PERLMOD_PRETTY YES) +endif() +if(NOT DEFINED DOXYGEN_ENABLE_PREPROCESSING) + set(DOXYGEN_ENABLE_PREPROCESSING YES) +endif() +if(NOT DEFINED DOXYGEN_MACRO_EXPANSION) + set(DOXYGEN_MACRO_EXPANSION NO) +endif() +if(NOT DEFINED DOXYGEN_EXPAND_ONLY_PREDEF) + set(DOXYGEN_EXPAND_ONLY_PREDEF NO) +endif() +if(NOT DEFINED DOXYGEN_SEARCH_INCLUDES) + set(DOXYGEN_SEARCH_INCLUDES YES) +endif() +if(NOT DEFINED DOXYGEN_SKIP_FUNCTION_MACROS) + set(DOXYGEN_SKIP_FUNCTION_MACROS YES) +endif() +if(NOT DEFINED DOXYGEN_ALLEXTERNALS) + set(DOXYGEN_ALLEXTERNALS NO) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_GROUPS) + set(DOXYGEN_EXTERNAL_GROUPS YES) +endif() +if(NOT DEFINED DOXYGEN_EXTERNAL_PAGES) + set(DOXYGEN_EXTERNAL_PAGES YES) +endif() +if(NOT DEFINED DOXYGEN_CLASS_DIAGRAMS) + set(DOXYGEN_CLASS_DIAGRAMS YES) +endif() +if(NOT DEFINED DOXYGEN_HIDE_UNDOC_RELATIONS) + set(DOXYGEN_HIDE_UNDOC_RELATIONS YES) +endif() +if(NOT DEFINED DOXYGEN_HAVE_DOT) + set(DOXYGEN_HAVE_DOT YES) +endif() +if(NOT DEFINED DOXYGEN_DOT_NUM_THREADS) + set(DOXYGEN_DOT_NUM_THREADS 0) +endif() +if(NOT DEFINED DOXYGEN_DOT_FONTNAME) + set(DOXYGEN_DOT_FONTNAME Helvetica) +endif() +if(NOT DEFINED DOXYGEN_DOT_FONTSIZE) + set(DOXYGEN_DOT_FONTSIZE 10) +endif() +if(NOT DEFINED DOXYGEN_CLASS_GRAPH) + set(DOXYGEN_CLASS_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_COLLABORATION_GRAPH) + set(DOXYGEN_COLLABORATION_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_GROUP_GRAPHS) + set(DOXYGEN_GROUP_GRAPHS YES) +endif() +if(NOT DEFINED DOXYGEN_UML_LOOK) + set(DOXYGEN_UML_LOOK NO) +endif() +if(NOT DEFINED DOXYGEN_UML_LIMIT_NUM_FIELDS) + set(DOXYGEN_UML_LIMIT_NUM_FIELDS 10) +endif() +if(NOT DEFINED DOXYGEN_TEMPLATE_RELATIONS) + set(DOXYGEN_TEMPLATE_RELATIONS NO) +endif() +if(NOT DEFINED DOXYGEN_INCLUDE_GRAPH) + set(DOXYGEN_INCLUDE_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_INCLUDED_BY_GRAPH) + set(DOXYGEN_INCLUDED_BY_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_CALL_GRAPH) + set(DOXYGEN_CALL_GRAPH NO) +endif() +if(NOT DEFINED DOXYGEN_CALLER_GRAPH) + set(DOXYGEN_CALLER_GRAPH NO) +endif() +if(NOT DEFINED DOXYGEN_GRAPHICAL_HIERARCHY) + set(DOXYGEN_GRAPHICAL_HIERARCHY YES) +endif() +if(NOT DEFINED DOXYGEN_DIRECTORY_GRAPH) + set(DOXYGEN_DIRECTORY_GRAPH YES) +endif() +if(NOT DEFINED DOXYGEN_DOT_IMAGE_FORMAT) + set(DOXYGEN_DOT_IMAGE_FORMAT png) +endif() +if(NOT DEFINED DOXYGEN_INTERACTIVE_SVG) + set(DOXYGEN_INTERACTIVE_SVG NO) +endif() +if(NOT DEFINED DOXYGEN_DOT_GRAPH_MAX_NODES) + set(DOXYGEN_DOT_GRAPH_MAX_NODES 50) +endif() +if(NOT DEFINED DOXYGEN_MAX_DOT_GRAPH_DEPTH) + set(DOXYGEN_MAX_DOT_GRAPH_DEPTH 0) +endif() +if(NOT DEFINED DOXYGEN_DOT_TRANSPARENT) + set(DOXYGEN_DOT_TRANSPARENT NO) +endif() +if(NOT DEFINED DOXYGEN_DOT_MULTI_TARGETS) + set(DOXYGEN_DOT_MULTI_TARGETS NO) +endif() +if(NOT DEFINED DOXYGEN_GENERATE_LEGEND) + set(DOXYGEN_GENERATE_LEGEND YES) +endif() +if(NOT DEFINED DOXYGEN_DOT_CLEANUP) + set(DOXYGEN_DOT_CLEANUP YES) +endif() From 6fcc0c87328b773f40a30a47233d693ee8498ce4 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 18 Mar 2021 20:40:05 -0400 Subject: [PATCH 13/38] make water blocks visible & not obstacles --- src/item.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/item.c b/src/item.c index eaf130e4b..b26bf4a95 100644 --- a/src/item.c +++ b/src/item.c @@ -168,6 +168,7 @@ int is_obstacle(int w) { switch (w) { case EMPTY: case CLOUD: + case WATER: return 0; default: return 1; @@ -195,7 +196,7 @@ int is_transparent(int w) { } int is_alpha(int w) { - return w == WATER; + return 0; } int is_destructable(int w) { From 32a679996927e572615daab08a15b29793da9585 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 18 Mar 2021 22:14:23 -0400 Subject: [PATCH 14/38] Add is slowing property to items --- src/item.c | 13 +++++++++++++ src/item.h | 1 + 2 files changed, 14 insertions(+) diff --git a/src/item.c b/src/item.c index eaf130e4b..14d1a68bb 100644 --- a/src/item.c +++ b/src/item.c @@ -207,3 +207,16 @@ int is_destructable(int w) { return 1; } } + +int is_slowing(int w) { + // The player must be able to pass through the item for it to slow them. + if (is_obstacle(w)) return 0; + + switch (w) { + case WATER: + case LAVA: + return 1; + default: + return 0; + } +} diff --git a/src/item.h b/src/item.h index 2a84ce901..9ea2f4070 100644 --- a/src/item.h +++ b/src/item.h @@ -71,5 +71,6 @@ int is_obstacle(int w); int is_transparent(int w); int is_alpha(int w); int is_destructable(int w); +int is_slowing(int w); #endif From 89e68bee1f9897e6a64afd71f056dfa085acc149 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 18 Mar 2021 22:17:05 -0400 Subject: [PATCH 15/38] Slow player speed when intersecting slowing blocks --- src/main.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 13d4c2412..1da98f4a3 100644 --- a/src/main.c +++ b/src/main.c @@ -111,6 +111,7 @@ typedef struct { int observe1; int observe2; int flying; + int slowed; int item_index; int scale; int ortho; @@ -1985,6 +1986,54 @@ void handle_mouse_input() { } } +// Returns 1 if player intersects a MapEntry x where is_slowing(x)==1, +// otherwise return 0. +int is_movement_slowed(Player* player) { + int height = 2; + float *x = &player->state.x; + float *y = &player->state.y; + float *z = &player->state.z; + + int result = 0; + int p = chunked(*x); + int q = chunked(*z); + Chunk *chunk = find_chunk(p, q); + if (!chunk) { + return result; + } + Map *map = &chunk->map; + int nx = roundf(*x); + int ny = roundf(*y); + int nz = roundf(*z); + float px = *x - nx; + float py = *y - ny; + float pz = *z - nz; + float pad = 0.25; + for (int dy = 0; dy < height; dy++) { + // Check if player is intersecting with an item that is slowing. + if ( px < -pad && is_slowing(map_get(map, nx - 1, ny - dy, nz)) + || px > pad && is_slowing(map_get(map, nx + 1, ny - dy, nz)) + || py < -pad && is_slowing(map_get(map, nx, ny - dy - 1, nz)) + || py > pad && is_slowing(map_get(map, nx, ny - dy + 1, nz)) + || pz < -pad && is_slowing(map_get(map, nx, ny - dy, nz - 1)) + || pz > pad && is_slowing(map_get(map, nx, ny - dy, nz + 1)) + ) { + result = 1; + } + } + return result; +} + +// Calculates the current movement speed of the player. +// Returns the movement speed of the player. +float handle_player_speed() { + g->slowed = is_movement_slowed(&g->players); + + // Only slow movement if the player is not flying. + float speed = g->flying ? 20 : (g->slowed ? 1 : 5); + return speed; +} + void handle_movement(double dt) { static float dy = 0; State *s = &g->players->state; @@ -2017,7 +2066,7 @@ void handle_movement(double dt) { } } } - float speed = g->flying ? 20 : 5; + float speed = handle_player_speed(); int estimate = roundf(sqrtf( powf(vx * speed, 2) + powf(vy * speed + ABS(dy) * 2, 2) + @@ -2137,6 +2186,7 @@ void reset_model() { g->observe1 = 0; g->observe2 = 0; g->flying = 0; + g->slowed = 0; g->item_index = 0; memset(g->typing_buffer, 0, sizeof(char) * MAX_TEXT_LENGTH); g->typing = 0; From e0f6aa557778fe0dbe4f84112d25eaaca02da4d6 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 25 Mar 2021 20:07:18 -0400 Subject: [PATCH 16/38] Add new tasks --- Backlog | 4 ++++ UserStories | 3 +++ 2 files changed, 7 insertions(+) diff --git a/Backlog b/Backlog index 4c61b6752..4c980b0c4 100644 --- a/Backlog +++ b/Backlog @@ -15,3 +15,7 @@ US007 Task014 - Lava blocks should have no collision. Points 1 US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 US009 Task016 - Add the ability to double jump while not flying. Points 3 US010 Task017 - Add bodies of water to terrain generation. Points 5 +US011 Task018 - Give players a health value. points 2 +US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 +US011 Task020 - Add to the player's health periodically if it is not full. points 4 +US012 Task021 - Hold the space key to float to the top of a water body. points 3 \ No newline at end of file diff --git a/UserStories b/UserStories index a934707f9..5e6305e82 100644 --- a/UserStories +++ b/UserStories @@ -8,3 +8,6 @@ US007 - As a player of Craft, I want fluid blocks to slow player movement. US008 - As a player of Craft, I want to be able to sprint. US009 - As a player of Craft, I want to be able to double jump US010 - As a player of Craft, I want bodies of water to be generated in the map. +US011 - As a player of Craft, I want the player to have limited, regenerating health, to make a more realistic environment. +US012 - As a player of Craft, I want to be able to swim wherever there are water blocks, to make the game more realistic. + From a4030ec76bcae100f5f54e9b7deac815fbfd9647 Mon Sep 17 00:00:00 2001 From: NathanJohns307 Date: Fri, 26 Mar 2021 02:53:47 -0700 Subject: [PATCH 17/38] rain drop blocks now spawn one block below clouds --- src/world.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/world.c b/src/world.c index 8ca739821..63d7d5a95 100644 --- a/src/world.c +++ b/src/world.c @@ -71,6 +71,13 @@ void create_world(int p, int q, world_func func, void *arg) { func(x, y, z, 16 * flag, arg); } } + for (int y = 64; y < 72; y++) { + if (simplex3( + x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75) + { + func(x, y-1, z, 25 * flag, arg); + } + } } } } From 324fd5e6b1f8fe41f16381ebaedb0053876168d3 Mon Sep 17 00:00:00 2001 From: NathanJohns307 Date: Fri, 26 Mar 2021 02:59:52 -0700 Subject: [PATCH 18/38] rain and lava now have no collision --- src/item.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/item.c b/src/item.c index eaf130e4b..e0eb0c339 100644 --- a/src/item.c +++ b/src/item.c @@ -168,6 +168,8 @@ int is_obstacle(int w) { switch (w) { case EMPTY: case CLOUD: + case LAVA: + case RAIN: return 0; default: return 1; From 6d3eecccf7a6282ff4fe58390f3ed6facf8ab881 Mon Sep 17 00:00:00 2001 From: David Landes Date: Fri, 26 Mar 2021 08:15:36 -0400 Subject: [PATCH 19/38] update assigned and completed tasks. --- Backlog | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Backlog b/Backlog index 4c980b0c4..b8cd88e25 100644 --- a/Backlog +++ b/Backlog @@ -1,21 +1,21 @@ --- US001 Task001 - Modify mouse input to move the player's view less. The mouse should be less sensitive. Points 3 +--COMPLETE-- US001 Task001 - Modify mouse input to move the player's view less. The mouse should be less sensitive. Points 3 US002 Task002 - Sand blocks should fall to the ground if there is no block underneath. Points 5 US002 Task003 - Gravel blocks should fall to the ground if there is no block underneath. Points 5 -US003 Task004 - Cloud color should change to a dark grey at night, and stay white during daytime. Points 2 +--COMPLETE-- US003 Task004 - Cloud color should change to a dark grey at night, and stay white during daytime. Points 2 US004 Task005 - Design the layout and structure of the buildings to be spawned. Points 5 US004 Task006 - Create generation function and spawn conditions for buildings. Points 5 --- US005 Task007 - Create lava block model. Points 3 -US005 Task008 - Create generation function and spawn conditions for lava pools. Points 5 --- US006 Task009 - Create rain drop block model. Points 3 -US006 Task010 - Create spawn conditions for rain drop blocks. Points 3 +--COMPLETE-- US005 Task007 - Create lava block model. Points 3 +--ASSIGNED-- US005 Task008 - Create generation function and spawn conditions for lava pools. Points 5 +--COMPLETE-- US006 Task009 - Create rain drop block model. Points 3 +--COMPLETE-- US006 Task010 - Create spawn conditions for rain drop blocks. Points 3 US006 Task011 - Rain drop blocks should have no collision and be effected by gravity. Points 3 -US007 Task012 - Water blocks should not be transparent. Points 2 -US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 -US007 Task014 - Lava blocks should have no collision. Points 1 -US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 -US009 Task016 - Add the ability to double jump while not flying. Points 3 -US010 Task017 - Add bodies of water to terrain generation. Points 5 -US011 Task018 - Give players a health value. points 2 +--COMPLETE-- US007 Task012 - Water blocks should not be transparent. Points 2 +--ASSIGNED-- US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 +--COMPLETE-- US007 Task014 - Lava blocks should have no collision. Points 1 +--ASSIGNED-- US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 +--ASSIGNED-- US009 Task016 - Add the ability to double jump while not flying. Points 3 +--ASSIGNED-- US010 Task017 - Add bodies of water to terrain generation. Points 5 +--ASSIGNED-- US011 Task018 - Give players a health value. points 2 US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 US011 Task020 - Add to the player's health periodically if it is not full. points 4 -US012 Task021 - Hold the space key to float to the top of a water body. points 3 \ No newline at end of file +--ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 \ No newline at end of file From 86997fd37a82ac8be346e5788bdd3012bc361a1c Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 21:26:20 -0400 Subject: [PATCH 20/38] Give players a health value --- src/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.c b/src/main.c index 1da98f4a3..c4e1345f9 100644 --- a/src/main.c +++ b/src/main.c @@ -35,6 +35,8 @@ #define MOUSE_SENSITIVITY 0.001; +#define MAX_PLAYER_HEALTH 10 + typedef struct { Map map; SignList signs; @@ -70,6 +72,7 @@ typedef struct { typedef struct { int id; char name[MAX_NAME_LENGTH]; + float health; State state; State state1; State state2; @@ -2363,6 +2366,7 @@ int main(int argc, char **argv) { g->sensitivity = MOUSE_SENSITIVITY; me->id = 0; me->name[0] = '\0'; + me->health = MAX_PLAYER_HEALTH; me->buffer = 0; g->player_count = 1; From 6c18bf6e4d2d78390d097f7b4cf2296cb593b86a Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 21:28:07 -0400 Subject: [PATCH 21/38] Display player health value. --- src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index c4e1345f9..d3a70f293 100644 --- a/src/main.c +++ b/src/main.c @@ -2461,10 +2461,10 @@ int main(int argc, char **argv) { hour = hour ? hour : 12; snprintf( text_buffer, 1024, - "(%d, %d) (%.2f, %.2f, %.2f) [%d, %d, %d] %d%cm %dfps", + "(%d, %d) (%.2f, %.2f, %.2f) [%d, %d, %d] %d%cm %dfps -- Player Health: %.2f", chunked(s->x), chunked(s->z), s->x, s->y, s->z, g->player_count, g->chunk_count, - face_count * 2, hour, am_pm, fps.fps); + face_count * 2, hour, am_pm, fps.fps, g->players->health); render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts, text_buffer); ty -= ts * 2; } From ea3f9c0415a8ac8bc6b7d468c8d1a0ab636d4447 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 21:36:05 -0400 Subject: [PATCH 22/38] Respawn player if health reaches 0 --- src/main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main.c b/src/main.c index d3a70f293..ccaa25816 100644 --- a/src/main.c +++ b/src/main.c @@ -2027,6 +2027,19 @@ int is_movement_slowed(Player* player) { return result; } +// This function looks at the current player's health, and performs actions based on the value. +void handle_player_health() { + // If player has no more health... + if (g->players->health <= 0) { + // Reset the player health. + g->players->health = MAX_PLAYER_HEALTH; + // Respawn. + g->players->state.x = 0; + g->players->state.y = highest_block(0, 0) + 2; // Player's vertical position should be the highest block at position(0, 0) plus 2 for the player's height. + g->players->state.z = 0; + } +} + // Calculates the current movement speed of the player. // Returns the movement speed of the player. float handle_player_speed() { @@ -2397,6 +2410,8 @@ int main(int argc, char **argv) { // HANDLE MOVEMENT // handle_movement(dt); + handle_player_health(); + // HANDLE DATA FROM SERVER // char *buffer = client_recv(); if (buffer) { From 1caf80e69f01aa312da7c64f39023f7f0b087ebb Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 21:41:29 -0400 Subject: [PATCH 23/38] take fall damage based on velocity of collision. --- src/main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main.c b/src/main.c index ccaa25816..58aa83b13 100644 --- a/src/main.c +++ b/src/main.c @@ -2050,6 +2050,16 @@ float handle_player_speed() { return speed; } +// Calculate the amount of damage that should be taken, based on a downward velocity at the point of collision. +// Parameter: dy - the rate of change on the y axis. +void handle_fall_damage(float dy) { + // If a player's downward velocity is 15 or more... + if (dy <= -15) { + float damage = dy / -5.75; + g->players->health -= damage; + } +} + void handle_movement(double dt) { static float dy = 0; State *s = &g->players->state; @@ -2092,6 +2102,7 @@ void handle_movement(double dt) { vx = vx * ut * speed; vy = vy * ut * speed; vz = vz * ut * speed; + float dyAtCollision = 0; for (int i = 0; i < step; i++) { if (g->flying) { dy = 0; @@ -2104,9 +2115,13 @@ void handle_movement(double dt) { s->y += vy + dy * ut; s->z += vz; if (collide(2, &s->x, &s->y, &s->z)) { + if (!dyAtCollision) + dyAtCollision = dy; dy = 0; } } + handle_fall_damage(dyAtCollision); + if (s->y < 0) { s->y = highest_block(s->x, s->z) + 2; } From 7ea4907ca8b964e7ec8355dd7b0a08e9d18b2aa6 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 21:42:59 -0400 Subject: [PATCH 24/38] Increase fall damage --- src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 58aa83b13..407e0f5ba 100644 --- a/src/main.c +++ b/src/main.c @@ -2055,7 +2055,7 @@ float handle_player_speed() { void handle_fall_damage(float dy) { // If a player's downward velocity is 15 or more... if (dy <= -15) { - float damage = dy / -5.75; + float damage = dy / -5.25; g->players->health -= damage; } } @@ -2121,7 +2121,7 @@ void handle_movement(double dt) { } } handle_fall_damage(dyAtCollision); - + if (s->y < 0) { s->y = highest_block(s->x, s->z) + 2; } From e3f21b9f80e205d97603f022ea0494b73dbf4055 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 22:27:33 -0400 Subject: [PATCH 25/38] Take gradual damage while in lava --- src/main.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/src/main.c b/src/main.c index 407e0f5ba..93cf7a0a9 100644 --- a/src/main.c +++ b/src/main.c @@ -2038,16 +2038,30 @@ void handle_player_health() { g->players->state.y = highest_block(0, 0) + 2; // Player's vertical position should be the highest block at position(0, 0) plus 2 for the player's height. g->players->state.z = 0; } + + handle_lava_damage(g->players); } -// Calculates the current movement speed of the player. -// Returns the movement speed of the player. -float handle_player_speed() { - g->slowed = is_movement_slowed(&g->players); +// If player is in lava, inflict a small amount of damage. +void handle_lava_damage() { + int p = chunked(g->players->state.x); + int q = chunked(g->players->state.z); + Chunk *chunk = find_chunk(p, q); + if (!chunk) { + return; + } + Map *map = &chunk->map; + int rx = roundf(g->players->state.x); + int ry = roundf(g->players->state.y); + int rz = roundf(g->players->state.z); + + int chunkTypeUpperBody = map_get(map, rx, ry, rz); + int chunkTypeLowerBody = map_get(map, rx, ry-1, rz); + + if (chunkTypeUpperBody == LAVA || chunkTypeLowerBody == LAVA) { + inflict_damage(.05); + } - // Only slow movement if the player is not flying. - float speed = g->flying ? 20 : (g->slowed ? 1 : 5); - return speed; } // Calculate the amount of damage that should be taken, based on a downward velocity at the point of collision. @@ -2056,10 +2070,26 @@ void handle_fall_damage(float dy) { // If a player's downward velocity is 15 or more... if (dy <= -15) { float damage = dy / -5.25; - g->players->health -= damage; + inflict_damage(damage); } } +// Take damage from a player's health value. +// Parameter: damage - A positive float that will be subtracted from player's health. +void inflict_damage(float damage) { + g->players->health -= damage; +} + +// Calculates the current movement speed of the player. +// Returns the movement speed of the player. +float handle_player_speed() { + g->slowed = is_movement_slowed(&g->players); + + // Only slow movement if the player is not flying. + float speed = g->flying ? 20 : (g->slowed ? 1 : 5); + return speed; +} + void handle_movement(double dt) { static float dy = 0; State *s = &g->players->state; From 265137ca17fe9b13e70ceb524c3762e9c5446e8b Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 1 Apr 2021 22:27:57 -0400 Subject: [PATCH 26/38] Mark tasks completed. --- Backlog | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Backlog b/Backlog index b8cd88e25..82b04c63d 100644 --- a/Backlog +++ b/Backlog @@ -15,7 +15,7 @@ US006 Task011 - Rain drop blocks should have no collision and be effected by gra --ASSIGNED-- US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 --ASSIGNED-- US009 Task016 - Add the ability to double jump while not flying. Points 3 --ASSIGNED-- US010 Task017 - Add bodies of water to terrain generation. Points 5 ---ASSIGNED-- US011 Task018 - Give players a health value. points 2 -US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 +--COMPLETE-- US011 Task018 - Give players a health value. points 2 +--COMPLETE-- US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 US011 Task020 - Add to the player's health periodically if it is not full. points 4 --ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 \ No newline at end of file From 4478000d7d56d2213c0d9e370030baf94b132b24 Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 2 Apr 2021 21:16:25 -0400 Subject: [PATCH 27/38] resolved merge conflict between task 18 and 15 --- src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main.c b/src/main.c index 93cf7a0a9..066fcc7dd 100644 --- a/src/main.c +++ b/src/main.c @@ -2087,6 +2087,9 @@ float handle_player_speed() { // Only slow movement if the player is not flying. float speed = g->flying ? 20 : (g->slowed ? 1 : 5); + if(glfwGetKey(g->window, GLFW_KEY_LEFT_CONTROL) && !g->flying) { + speed *= 2; + } return speed; } From 9a81e180bd02bd10c511fb4b4d7dbacd8c35691c Mon Sep 17 00:00:00 2001 From: Brad Date: Fri, 2 Apr 2021 21:21:33 -0400 Subject: [PATCH 28/38] lowered sprint multiplier --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 066fcc7dd..7282b2715 100644 --- a/src/main.c +++ b/src/main.c @@ -2088,7 +2088,7 @@ float handle_player_speed() { // Only slow movement if the player is not flying. float speed = g->flying ? 20 : (g->slowed ? 1 : 5); if(glfwGetKey(g->window, GLFW_KEY_LEFT_CONTROL) && !g->flying) { - speed *= 2; + speed *= 1.5f; } return speed; } From 9cfcc013a523d4554337eb59340308089eb05f97 Mon Sep 17 00:00:00 2001 From: Brad Date: Thu, 8 Apr 2021 18:22:16 -0400 Subject: [PATCH 29/38] heals the player a small amount every frame --- .../api/v1/query/client-vscode/query.json | 1 + .../reply/cache-v2-801e44c97f6f72a4ef2a.json | 3755 +++++++++++++++++ .../codemodel-v2-81f67bb4a3241e69caef.json | 130 + .../reply/index-2021-04-08T22-09-14-0049.json | 87 + ...rget-craft-Debug-0140d1a7546de7bb871f.json | 342 ++ ...arget-glfw-Debug-fbda2121b6eb34d0f0b6.json | 300 ++ ...-uninstall-Debug-dfdf9778e882d6cea4f6.json | 66 + build/compile_commands.json | 177 + build/deps/glfw/cmake_uninstall.cmake | 29 + build/deps/glfw/docs/Doxyfile | 1871 ++++++++ build/deps/glfw/src/config.h | 84 + build/deps/glfw/src/glfw3.pc | 13 + build/deps/glfw/src/glfwConfig.cmake | 10 + build/deps/glfw/src/glfwConfigVersion.cmake | 12 + src/main.c | 6 + 15 files changed, 6883 insertions(+) create mode 100644 build/.cmake/api/v1/query/client-vscode/query.json create mode 100644 build/.cmake/api/v1/reply/cache-v2-801e44c97f6f72a4ef2a.json create mode 100644 build/.cmake/api/v1/reply/codemodel-v2-81f67bb4a3241e69caef.json create mode 100644 build/.cmake/api/v1/reply/index-2021-04-08T22-09-14-0049.json create mode 100644 build/.cmake/api/v1/reply/target-craft-Debug-0140d1a7546de7bb871f.json create mode 100644 build/.cmake/api/v1/reply/target-glfw-Debug-fbda2121b6eb34d0f0b6.json create mode 100644 build/.cmake/api/v1/reply/target-uninstall-Debug-dfdf9778e882d6cea4f6.json create mode 100644 build/compile_commands.json create mode 100644 build/deps/glfw/cmake_uninstall.cmake create mode 100644 build/deps/glfw/docs/Doxyfile create mode 100644 build/deps/glfw/src/config.h create mode 100644 build/deps/glfw/src/glfw3.pc create mode 100644 build/deps/glfw/src/glfwConfig.cmake create mode 100644 build/deps/glfw/src/glfwConfigVersion.cmake diff --git a/build/.cmake/api/v1/query/client-vscode/query.json b/build/.cmake/api/v1/query/client-vscode/query.json new file mode 100644 index 000000000..7730820e6 --- /dev/null +++ b/build/.cmake/api/v1/query/client-vscode/query.json @@ -0,0 +1 @@ +{"requests":[{"kind":"cache","version":2},{"kind":"codemodel","version":2}]} \ No newline at end of file diff --git a/build/.cmake/api/v1/reply/cache-v2-801e44c97f6f72a4ef2a.json b/build/.cmake/api/v1/reply/cache-v2-801e44c97f6f72a4ef2a.json new file mode 100644 index 000000000..898a1f366 --- /dev/null +++ b/build/.cmake/api/v1/reply/cache-v2-801e44c97f6f72a4ef2a.json @@ -0,0 +1,3755 @@ +{ + "entries" : + [ + { + "name" : "BUILD_SHARED_LIBS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build shared libraries" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "CMAKE_ADDR2LINE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/addr2line" + }, + { + "name" : "CMAKE_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/ar" + }, + { + "name" : "CMAKE_BUILD_TYPE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "STRING", + "value" : "Debug" + }, + { + "name" : "CMAKE_CACHEFILE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "This is the directory where this CMakeCache.txt was created" + } + ], + "type" : "INTERNAL", + "value" : "/home/brad/Desktop/Craft/build" + }, + { + "name" : "CMAKE_CACHE_MAJOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Major version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_CACHE_MINOR_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Minor version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "16" + }, + { + "name" : "CMAKE_CACHE_PATCH_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Patch version of cmake used to create the current loaded cache" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_COLOR_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Enable/Disable color output during build." + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "CMAKE_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake executable." + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/cmake" + }, + { + "name" : "CMAKE_CPACK_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to cpack program executable." + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/cpack" + }, + { + "name" : "CMAKE_CTEST_COMMAND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to ctest program executable." + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/ctest" + }, + { + "name" : "CMAKE_CXX_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "FILEPATH", + "value" : "/bin/g++-9" + }, + { + "name" : "CMAKE_CXX_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/bin/gcc-ar-9" + }, + { + "name" : "CMAKE_CXX_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/bin/gcc-ranlib-9" + }, + { + "name" : "CMAKE_CXX_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_CXX_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_CXX_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_CXX_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the CXX compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_C_COMPILER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "FILEPATH", + "value" : "/bin/gcc-9" + }, + { + "name" : "CMAKE_C_COMPILER_AR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/bin/gcc-ar-9" + }, + { + "name" : "CMAKE_C_COMPILER_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + } + ], + "type" : "FILEPATH", + "value" : "/bin/gcc-ranlib-9" + }, + { + "name" : "CMAKE_C_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_C_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "-g" + }, + { + "name" : "CMAKE_C_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "-Os -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "-O3 -DNDEBUG" + }, + { + "name" : "CMAKE_C_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the C compiler during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "-O2 -g -DNDEBUG" + }, + { + "name" : "CMAKE_DLLTOOL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "CMAKE_DLLTOOL-NOTFOUND" + }, + { + "name" : "CMAKE_EXECUTABLE_FORMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Executable file format" + } + ], + "type" : "INTERNAL", + "value" : "ELF" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_EXPORT_COMPILE_COMMANDS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "No help, variable specified on the command line." + } + ], + "type" : "BOOL", + "value" : "TRUE" + }, + { + "name" : "CMAKE_EXTRA_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of external makefile project generator." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator." + } + ], + "type" : "INTERNAL", + "value" : "Unix Makefiles" + }, + { + "name" : "CMAKE_GENERATOR_INSTANCE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generator instance identifier." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_PLATFORM", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator platform." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_GENERATOR_TOOLSET", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Name of generator toolset." + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HAVE_CONNECT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function connect" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HAVE_GETHOSTBYNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function gethostbyname" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HAVE_LIBC_PTHREAD", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Test CMAKE_HAVE_LIBC_PTHREAD" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HAVE_PTHREADS_CREATE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have library pthreads" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "CMAKE_HAVE_PTHREAD_CREATE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have library pthread" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HAVE_PTHREAD_H", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have include pthread.h" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HAVE_REMOVE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function remove" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HAVE_SHMAT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function shmat" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_HOME_DIRECTORY", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Source directory with the top level CMakeLists.txt file for this project" + } + ], + "type" : "INTERNAL", + "value" : "/home/brad/Desktop/Craft" + }, + { + "name" : "CMAKE_INSTALL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install path prefix, prepended onto install directories." + } + ], + "type" : "PATH", + "value" : "/usr/local" + }, + { + "name" : "CMAKE_INSTALL_SO_NO_EXE", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Install .so files without execute permission." + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_LIB_ICE_HAS_ICECONNECTIONNUMBER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have library ICE" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_LINKER", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/ld" + }, + { + "name" : "CMAKE_MAKE_PROGRAM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/make" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of modules during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_NM", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/nm" + }, + { + "name" : "CMAKE_NUMBER_OF_MAKEFILES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "number of local generators" + } + ], + "type" : "INTERNAL", + "value" : "3" + }, + { + "name" : "CMAKE_OBJCOPY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/objcopy" + }, + { + "name" : "CMAKE_OBJDUMP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/objdump" + }, + { + "name" : "CMAKE_PLATFORM_INFO_INITIALIZED", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Platform information initialized" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "CMAKE_PROJECT_DESCRIPTION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_HOMEPAGE_URL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "" + }, + { + "name" : "CMAKE_PROJECT_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "craft" + }, + { + "name" : "CMAKE_RANLIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/ranlib" + }, + { + "name" : "CMAKE_READELF", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/readelf" + }, + { + "name" : "CMAKE_ROOT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Path to CMake installation." + } + ], + "type" : "INTERNAL", + "value" : "/usr/share/cmake-3.16" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of shared libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_SKIP_INSTALL_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when installing shared libraries, but are added when building." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_SKIP_RPATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If set, runtime paths are not added when using shared libraries." + } + ], + "type" : "BOOL", + "value" : "NO" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during all build types." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during DEBUG builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during MINSIZEREL builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELEASE builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Flags used by the linker during the creation of static libraries during RELWITHDEBINFO builds." + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "CMAKE_STRIP", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a program." + } + ], + "type" : "FILEPATH", + "value" : "/bin/strip" + }, + { + "name" : "CMAKE_UNAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "uname command" + } + ], + "type" : "INTERNAL", + "value" : "/usr/bin/uname" + }, + { + "name" : "CMAKE_VERBOSE_MAKEFILE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "If this value is on, makefiles will be generated without the .SILENT directive, and all commands will be echoed to the console during the make. This is useful for debugging only. With Visual Studio IDE projects all commands are done without /nologo." + } + ], + "type" : "BOOL", + "value" : "FALSE" + }, + { + "name" : "CURL_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include/x86_64-linux-gnu" + }, + { + "name" : "CURL_LIBRARY_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "CURL_LIBRARY_DEBUG-NOTFOUND" + }, + { + "name" : "CURL_LIBRARY_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libcurl.so" + }, + { + "name" : "DOXYGEN_EXECUTABLE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Doxygen documentation generation tool (http://www.doxygen.org)" + } + ], + "type" : "FILEPATH", + "value" : "DOXYGEN_EXECUTABLE-NOTFOUND" + }, + { + "name" : "FIND_PACKAGE_MESSAGE_DETAILS_CURL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Details about finding CURL" + } + ], + "type" : "INTERNAL", + "value" : "[/usr/lib/x86_64-linux-gnu/libcurl.so][/usr/include/x86_64-linux-gnu][c ][v7.68.0()]" + }, + { + "name" : "FIND_PACKAGE_MESSAGE_DETAILS_OpenGL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Details about finding OpenGL" + } + ], + "type" : "INTERNAL", + "value" : "[/usr/lib/x86_64-linux-gnu/libOpenGL.so][/usr/lib/x86_64-linux-gnu/libGLX.so][/usr/include][c ][v()]" + }, + { + "name" : "FIND_PACKAGE_MESSAGE_DETAILS_Threads", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Details about finding Threads" + } + ], + "type" : "INTERNAL", + "value" : "[TRUE][v()]" + }, + { + "name" : "FIND_PACKAGE_MESSAGE_DETAILS_X11", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Details about finding X11" + } + ], + "type" : "INTERNAL", + "value" : "[/usr/include][/usr/lib/x86_64-linux-gnu/libX11.so][c ][v()]" + }, + { + "name" : "FREETYPE_INCLUDE_DIR_freetype2", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include/freetype2" + }, + { + "name" : "FREETYPE_INCLUDE_DIR_ft2build", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include/freetype2" + }, + { + "name" : "FREETYPE_LIBRARY_DEBUG", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "FREETYPE_LIBRARY_DEBUG-NOTFOUND" + }, + { + "name" : "FREETYPE_LIBRARY_RELEASE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libfreetype.so" + }, + { + "name" : "Fontconfig_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "Fontconfig_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libfontconfig.so" + }, + { + "name" : "GLFW_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/brad/Desktop/Craft/build/deps/glfw" + }, + { + "name" : "GLFW_BUILD_EXAMPLES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build the GLFW example programs" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "GLFW_BUILD_TESTS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Build the GLFW test programs" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "GLFW_DOCUMENT_INTERNALS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Include internals in documentation" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "GLFW_INSTALL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Generate installation target" + } + ], + "type" : "BOOL", + "value" : "ON" + }, + { + "name" : "GLFW_LIBRARIES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Dependencies of GLFW" + } + ], + "type" : "STRING", + "value" : "/usr/lib/x86_64-linux-gnu/libX11.so;-lpthread;/usr/lib/x86_64-linux-gnu/libXrandr.so;/usr/lib/x86_64-linux-gnu/libXi.so;/usr/lib/x86_64-linux-gnu/libXxf86vm.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/libGL.so" + }, + { + "name" : "GLFW_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/brad/Desktop/Craft/deps/glfw" + }, + { + "name" : "GLFW_USE_EGL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Use EGL for context creation" + } + ], + "type" : "BOOL", + "value" : "OFF" + }, + { + "name" : "LIB_SUFFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Takes an empty string or 64. Directory where lib will be installed: lib or lib64" + } + ], + "type" : "STRING", + "value" : "" + }, + { + "name" : "MATH_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libm.so" + }, + { + "name" : "OPENGL_EGL_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "OPENGL_GLX_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "OPENGL_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "OPENGL_egl_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libEGL.so" + }, + { + "name" : "OPENGL_gl_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libGL.so" + }, + { + "name" : "OPENGL_glu_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libGLU.so" + }, + { + "name" : "OPENGL_glx_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libGLX.so" + }, + { + "name" : "OPENGL_opengl_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libOpenGL.so" + }, + { + "name" : "OPENGL_xmesa_INCLUDE_DIR", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "OPENGL_xmesa_INCLUDE_DIR-NOTFOUND" + }, + { + "name" : "PC_CURL_CFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-I/usr/include/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_CFLAGS_I", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_CFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_FOUND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "PC_CURL_INCLUDEDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_LDFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-lcurl" + }, + { + "name" : "PC_CURL_LDFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/lib/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_LIBRARIES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "curl" + }, + { + "name" : "PC_CURL_LIBRARY_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_LIBS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_LIBS_L", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_LIBS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_LIBS_PATHS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_MODULE_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "libcurl" + }, + { + "name" : "PC_CURL_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr" + }, + { + "name" : "PC_CURL_STATIC_CFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-I/usr/include/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_STATIC_CFLAGS_I", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_CFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include/x86_64-linux-gnu" + }, + { + "name" : "PC_CURL_STATIC_LDFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-L/usr/lib/x86_64-linux-gnu/mit-krb5;-lcurl;-lnghttp2;-lidn2;-lrtmp;-lssh;-lpsl;-lssl;-lcrypto;-lssl;-lcrypto;-Wl,-Bsymbolic-functions;-Wl,-z,relro;-lgssapi_krb5;-lkrb5;-lk5crypto;-lcom_err;-llber;-lldap;-llber;-lbrotlidec;-lz" + }, + { + "name" : "PC_CURL_STATIC_LDFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-Wl,-Bsymbolic-functions;-Wl,-z,relro" + }, + { + "name" : "PC_CURL_STATIC_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_LIBRARIES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "curl;nghttp2;idn2;rtmp;ssh;psl;ssl;crypto;ssl;crypto;gssapi_krb5;krb5;k5crypto;com_err;lber;ldap;lber;brotlidec;z" + }, + { + "name" : "PC_CURL_STATIC_LIBRARY_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/lib/x86_64-linux-gnu/mit-krb5" + }, + { + "name" : "PC_CURL_STATIC_LIBS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_LIBS_L", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_LIBS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_STATIC_LIBS_PATHS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "7.68.0" + }, + { + "name" : "PC_CURL_libcurl_INCLUDEDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_libcurl_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_libcurl_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PC_CURL_libcurl_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_CONFIG_EXECUTABLE", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "pkg-config executable" + } + ], + "type" : "FILEPATH", + "value" : "/usr/bin/pkg-config" + }, + { + "name" : "PKG_FONTCONFIG_CFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-I/usr/include/uuid;-I/usr/include/freetype2;-I/usr/include/libpng16" + }, + { + "name" : "PKG_FONTCONFIG_CFLAGS_I", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_CFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_FOUND", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "PKG_FONTCONFIG_INCLUDEDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include" + }, + { + "name" : "PKG_FONTCONFIG_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include/uuid;/usr/include/freetype2;/usr/include/libpng16" + }, + { + "name" : "PKG_FONTCONFIG_LDFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-lfontconfig;-lfreetype" + }, + { + "name" : "PKG_FONTCONFIG_LDFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/lib/x86_64-linux-gnu" + }, + { + "name" : "PKG_FONTCONFIG_LIBRARIES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "fontconfig;freetype" + }, + { + "name" : "PKG_FONTCONFIG_LIBRARY_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_LIBS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_LIBS_L", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_LIBS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_LIBS_PATHS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_MODULE_NAME", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "fontconfig" + }, + { + "name" : "PKG_FONTCONFIG_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_CFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-I/usr/include/uuid;-I/usr/include/freetype2;-I/usr/include/libpng16" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_CFLAGS_I", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_CFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_INCLUDE_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "/usr/include/uuid;/usr/include/freetype2;/usr/include/libpng16" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LDFLAGS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "-lfontconfig;-luuid;-lexpat;-lfreetype;-lpng16;-lm;-lz;-lm;-lz" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LDFLAGS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBRARIES", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "fontconfig;uuid;expat;freetype;png16;m;z;m;z" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBRARY_DIRS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBS_L", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBS_OTHER", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_STATIC_LIBS_PATHS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "2.13.1" + }, + { + "name" : "PKG_FONTCONFIG_fontconfig_INCLUDEDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_fontconfig_LIBDIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_fontconfig_PREFIX", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "PKG_FONTCONFIG_fontconfig_VERSION", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "RT_LIBRARY", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/librt.so" + }, + { + "name" : "X11_ICE_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_ICE_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libICE.so" + }, + { + "name" : "X11_LIBRARIES", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "(This variable does not exist and should not be used)" + } + ], + "type" : "UNINITIALIZED", + "value" : "" + }, + { + "name" : "X11_LIB_X11_SOLO", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have library /usr/lib/x86_64-linux-gnu/libX11.so;/usr/lib/x86_64-linux-gnu/libXext.so" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "X11_SM_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_SM_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libSM.so" + }, + { + "name" : "X11_X11_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_X11_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libX11.so" + }, + { + "name" : "X11_XRes_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_XRes_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXRes.so" + }, + { + "name" : "X11_XShm_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_XSync_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xaccessrules_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xaccessstr_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xau_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xau_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXau.so" + }, + { + "name" : "X11_Xcomposite_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xcomposite_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXcomposite.so" + }, + { + "name" : "X11_Xcursor_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xcursor_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXcursor.so" + }, + { + "name" : "X11_Xdamage_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xdamage_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXdamage.so" + }, + { + "name" : "X11_Xdmcp_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xdmcp_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXdmcp.so" + }, + { + "name" : "X11_Xext_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xext_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXext.so" + }, + { + "name" : "X11_Xfixes_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xfixes_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXfixes.so" + }, + { + "name" : "X11_Xft_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xft_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXft.so" + }, + { + "name" : "X11_Xi_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xi_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXi.so" + }, + { + "name" : "X11_Xinerama_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xinerama_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXinerama.so" + }, + { + "name" : "X11_Xkb_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xkblib_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xlib_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xmu_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xmu_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXmu.so" + }, + { + "name" : "X11_Xpm_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xpm_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXpm.so" + }, + { + "name" : "X11_Xrandr_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xrandr_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXrandr.so" + }, + { + "name" : "X11_Xrender_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xrender_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXrender.so" + }, + { + "name" : "X11_Xshape_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xss_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xss_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXss.so" + }, + { + "name" : "X11_Xt_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xt_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXt.so" + }, + { + "name" : "X11_Xtst_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xtst_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXtst.so" + }, + { + "name" : "X11_Xutil_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xv_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xv_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXv.so" + }, + { + "name" : "X11_Xxf86misc_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "X11_Xxf86misc_INCLUDE_PATH-NOTFOUND" + }, + { + "name" : "X11_Xxf86misc_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "X11_Xxf86misc_LIB-NOTFOUND" + }, + { + "name" : "X11_Xxf86vm_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_Xxf86vm_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libXxf86vm.so" + }, + { + "name" : "X11_dpms_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_xkbfile_INCLUDE_PATH", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a file." + } + ], + "type" : "PATH", + "value" : "/usr/include" + }, + { + "name" : "X11_xkbfile_LIB", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libxkbfile.so" + }, + { + "name" : "_GLFW_HAS_GLXGETPROCADDRESS", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function glXGetProcAddress" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "_GLFW_HAS_GLXGETPROCADDRESSARB", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function glXGetProcAddressARB" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "_GLFW_HAS_GLXGETPROCADDRESSEXT", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Have function glXGetProcAddressEXT" + } + ], + "type" : "INTERNAL", + "value" : "" + }, + { + "name" : "__pkg_config_arguments_PC_CURL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "QUIET;libcurl" + }, + { + "name" : "__pkg_config_arguments_PKG_FONTCONFIG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "QUIET;fontconfig" + }, + { + "name" : "__pkg_config_checked_PC_CURL", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "__pkg_config_checked_PKG_FONTCONFIG", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "1" + }, + { + "name" : "craft_BINARY_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/brad/Desktop/Craft/build" + }, + { + "name" : "craft_SOURCE_DIR", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "Value Computed by CMake" + } + ], + "type" : "STATIC", + "value" : "/home/brad/Desktop/Craft" + }, + { + "name" : "pkgcfg_lib_PC_CURL_curl", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libcurl.so" + }, + { + "name" : "pkgcfg_lib_PKG_FONTCONFIG_fontconfig", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libfontconfig.so" + }, + { + "name" : "pkgcfg_lib_PKG_FONTCONFIG_freetype", + "properties" : + [ + { + "name" : "ADVANCED", + "value" : "1" + }, + { + "name" : "HELPSTRING", + "value" : "Path to a library." + } + ], + "type" : "FILEPATH", + "value" : "/usr/lib/x86_64-linux-gnu/libfreetype.so" + }, + { + "name" : "prefix_result", + "properties" : + [ + { + "name" : "HELPSTRING", + "value" : "" + } + ], + "type" : "INTERNAL", + "value" : "SSL;IPv6;UnixSockets;libz;brotli;AsynchDNS;IDN;GSS-API;PSL;SPNEGO;Kerberos;NTLM;NTLM_WB;TLS-SRP;HTTP2;HTTPS-proxy" + } + ], + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/build/.cmake/api/v1/reply/codemodel-v2-81f67bb4a3241e69caef.json b/build/.cmake/api/v1/reply/codemodel-v2-81f67bb4a3241e69caef.json new file mode 100644 index 000000000..d6dd27a51 --- /dev/null +++ b/build/.cmake/api/v1/reply/codemodel-v2-81f67bb4a3241e69caef.json @@ -0,0 +1,130 @@ +{ + "configurations" : + [ + { + "directories" : + [ + { + "build" : ".", + "childIndexes" : + [ + 1 + ], + "hasInstallRule" : true, + "minimumCMakeVersion" : + { + "string" : "2.8" + }, + "projectIndex" : 0, + "source" : ".", + "targetIndexes" : + [ + 0 + ] + }, + { + "build" : "deps/glfw", + "childIndexes" : + [ + 2 + ], + "hasInstallRule" : true, + "minimumCMakeVersion" : + { + "string" : "2.8" + }, + "parentIndex" : 0, + "projectIndex" : 1, + "source" : "deps/glfw", + "targetIndexes" : + [ + 2 + ] + }, + { + "build" : "deps/glfw/src", + "hasInstallRule" : true, + "minimumCMakeVersion" : + { + "string" : "2.8" + }, + "parentIndex" : 1, + "projectIndex" : 1, + "source" : "deps/glfw/src", + "targetIndexes" : + [ + 1 + ] + } + ], + "name" : "Debug", + "projects" : + [ + { + "childIndexes" : + [ + 1 + ], + "directoryIndexes" : + [ + 0 + ], + "name" : "craft", + "targetIndexes" : + [ + 0 + ] + }, + { + "directoryIndexes" : + [ + 1, + 2 + ], + "name" : "GLFW", + "parentIndex" : 0, + "targetIndexes" : + [ + 1, + 2 + ] + } + ], + "targets" : + [ + { + "directoryIndex" : 0, + "id" : "craft::@6890427a1f51a3e7e1df", + "jsonFile" : "target-craft-Debug-0140d1a7546de7bb871f.json", + "name" : "craft", + "projectIndex" : 0 + }, + { + "directoryIndex" : 2, + "id" : "glfw::@c7b1059c348ca70b25fe", + "jsonFile" : "target-glfw-Debug-fbda2121b6eb34d0f0b6.json", + "name" : "glfw", + "projectIndex" : 1 + }, + { + "directoryIndex" : 1, + "id" : "uninstall::@9f6bdc1e5386c9c3898b", + "jsonFile" : "target-uninstall-Debug-dfdf9778e882d6cea4f6.json", + "name" : "uninstall", + "projectIndex" : 1 + } + ] + } + ], + "kind" : "codemodel", + "paths" : + { + "build" : "/home/brad/Desktop/Craft/build", + "source" : "/home/brad/Desktop/Craft" + }, + "version" : + { + "major" : 2, + "minor" : 0 + } +} diff --git a/build/.cmake/api/v1/reply/index-2021-04-08T22-09-14-0049.json b/build/.cmake/api/v1/reply/index-2021-04-08T22-09-14-0049.json new file mode 100644 index 000000000..8a84a74d2 --- /dev/null +++ b/build/.cmake/api/v1/reply/index-2021-04-08T22-09-14-0049.json @@ -0,0 +1,87 @@ +{ + "cmake" : + { + "generator" : + { + "name" : "Unix Makefiles" + }, + "paths" : + { + "cmake" : "/usr/bin/cmake", + "cpack" : "/usr/bin/cpack", + "ctest" : "/usr/bin/ctest", + "root" : "/usr/share/cmake-3.16" + }, + "version" : + { + "isDirty" : false, + "major" : 3, + "minor" : 16, + "patch" : 3, + "string" : "3.16.3", + "suffix" : "" + } + }, + "objects" : + [ + { + "jsonFile" : "codemodel-v2-81f67bb4a3241e69caef.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "cache-v2-801e44c97f6f72a4ef2a.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + } + ], + "reply" : + { + "client-vscode" : + { + "query.json" : + { + "requests" : + [ + { + "kind" : "cache", + "version" : 2 + }, + { + "kind" : "codemodel", + "version" : 2 + } + ], + "responses" : + [ + { + "jsonFile" : "cache-v2-801e44c97f6f72a4ef2a.json", + "kind" : "cache", + "version" : + { + "major" : 2, + "minor" : 0 + } + }, + { + "jsonFile" : "codemodel-v2-81f67bb4a3241e69caef.json", + "kind" : "codemodel", + "version" : + { + "major" : 2, + "minor" : 0 + } + } + ] + } + } + } +} diff --git a/build/.cmake/api/v1/reply/target-craft-Debug-0140d1a7546de7bb871f.json b/build/.cmake/api/v1/reply/target-craft-Debug-0140d1a7546de7bb871f.json new file mode 100644 index 000000000..ecc5f2e59 --- /dev/null +++ b/build/.cmake/api/v1/reply/target-craft-Debug-0140d1a7546de7bb871f.json @@ -0,0 +1,342 @@ +{ + "artifacts" : + [ + { + "path" : "craft" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_executable", + "target_link_libraries", + "include_directories" + ], + "files" : + [ + "CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 7, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 42, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 19, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 20, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 21, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 22, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 23, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 24, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -std=c99 -O3" + } + ], + "includes" : + [ + { + "backtrace" : 3, + "path" : "/home/brad/Desktop/Craft/deps/glew/include" + }, + { + "backtrace" : 4, + "path" : "/home/brad/Desktop/Craft/deps/glfw/include" + }, + { + "backtrace" : 5, + "path" : "/home/brad/Desktop/Craft/deps/lodepng" + }, + { + "backtrace" : 6, + "path" : "/home/brad/Desktop/Craft/deps/noise" + }, + { + "backtrace" : 7, + "path" : "/home/brad/Desktop/Craft/deps/sqlite" + }, + { + "backtrace" : 8, + "path" : "/home/brad/Desktop/Craft/deps/tinycthread" + } + ], + "language" : "C", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + } + ], + "dependencies" : + [ + { + "backtrace" : 2, + "id" : "glfw::@c7b1059c348ca70b25fe" + } + ], + "id" : "craft::@6890427a1f51a3e7e1df", + "link" : + { + "commandFragments" : + [ + { + "fragment" : "-g", + "role" : "flags" + }, + { + "fragment" : "-rdynamic", + "role" : "flags" + }, + { + "fragment" : "-ldl", + "role" : "libraries" + }, + { + "backtrace" : 2, + "fragment" : "deps/glfw/src/libglfw3.a", + "role" : "libraries" + }, + { + "fragment" : "-lX11", + "role" : "libraries" + }, + { + "fragment" : "-lpthread", + "role" : "libraries" + }, + { + "fragment" : "-lXrandr", + "role" : "libraries" + }, + { + "fragment" : "-lXi", + "role" : "libraries" + }, + { + "fragment" : "-lXxf86vm", + "role" : "libraries" + }, + { + "fragment" : "-lrt", + "role" : "libraries" + }, + { + "fragment" : "-lm", + "role" : "libraries" + }, + { + "fragment" : "-lGL", + "role" : "libraries" + }, + { + "fragment" : "-lcurl", + "role" : "libraries" + } + ], + "language" : "C" + }, + "name" : "craft", + "nameOnDisk" : "craft", + "paths" : + { + "build" : ".", + "source" : "." + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/auth.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/client.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/cube.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/db.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/item.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/main.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/map.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/matrix.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/ring.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/sign.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/util.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "src/world.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glew/src/glew.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/lodepng/lodepng.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/noise/noise.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/sqlite/sqlite3.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/tinycthread/tinycthread.c", + "sourceGroupIndex" : 0 + } + ], + "type" : "EXECUTABLE" +} diff --git a/build/.cmake/api/v1/reply/target-glfw-Debug-fbda2121b6eb34d0f0b6.json b/build/.cmake/api/v1/reply/target-glfw-Debug-fbda2121b6eb34d0f0b6.json new file mode 100644 index 000000000..8026d63a6 --- /dev/null +++ b/build/.cmake/api/v1/reply/target-glfw-Debug-fbda2121b6eb34d0f0b6.json @@ -0,0 +1,300 @@ +{ + "archive" : {}, + "artifacts" : + [ + { + "path" : "deps/glfw/src/libglfw3.a" + } + ], + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_library", + "install", + "include_directories" + ], + "files" : + [ + "deps/glfw/src/CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 48, + "parent" : 0 + }, + { + "command" : 1, + "file" : 0, + "line" : 83, + "parent" : 0 + }, + { + "command" : 2, + "file" : 0, + "line" : 2, + "parent" : 0 + } + ] + }, + "compileGroups" : + [ + { + "compileCommandFragments" : + [ + { + "fragment" : "-g -std=c99 -O3 -Wall" + } + ], + "defines" : + [ + { + "define" : "_GNU_SOURCE" + } + ], + "includes" : + [ + { + "backtrace" : 3, + "path" : "/home/brad/Desktop/Craft/deps/glfw/src" + }, + { + "backtrace" : 3, + "path" : "/home/brad/Desktop/Craft/build/deps/glfw/src" + } + ], + "language" : "C", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + } + ], + "id" : "glfw::@c7b1059c348ca70b25fe", + "install" : + { + "destinations" : + [ + { + "backtrace" : 2, + "path" : "lib" + } + ], + "prefix" : + { + "path" : "/usr/local" + } + }, + "name" : "glfw", + "nameOnDisk" : "libglfw3.a", + "paths" : + { + "build" : "deps/glfw/src", + "source" : "deps/glfw/src" + }, + "sourceGroups" : + [ + { + "name" : "Source Files", + "sourceIndexes" : + [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17 + ] + }, + { + "name" : "Header Files", + "sourceIndexes" : + [ + 18, + 19, + 20, + 21, + 22, + 23 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/clipboard.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/context.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/gamma.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/init.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/input.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/joystick.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/monitor.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/time.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/window.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_clipboard.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_gamma.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_init.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_joystick.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_monitor.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_time.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_window.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/x11_unicode.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "compileGroupIndex" : 0, + "path" : "deps/glfw/src/glx_context.c", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 1, + "path" : "build/deps/glfw/src/config.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "deps/glfw/src/internal.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "deps/glfw/include/GLFW/glfw3.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "deps/glfw/include/GLFW/glfw3native.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "deps/glfw/src/x11_platform.h", + "sourceGroupIndex" : 1 + }, + { + "backtrace" : 1, + "path" : "deps/glfw/src/glx_platform.h", + "sourceGroupIndex" : 1 + } + ], + "type" : "STATIC_LIBRARY" +} diff --git a/build/.cmake/api/v1/reply/target-uninstall-Debug-dfdf9778e882d6cea4f6.json b/build/.cmake/api/v1/reply/target-uninstall-Debug-dfdf9778e882d6cea4f6.json new file mode 100644 index 000000000..1566cb2ac --- /dev/null +++ b/build/.cmake/api/v1/reply/target-uninstall-Debug-dfdf9778e882d6cea4f6.json @@ -0,0 +1,66 @@ +{ + "backtrace" : 1, + "backtraceGraph" : + { + "commands" : + [ + "add_custom_target" + ], + "files" : + [ + "deps/glfw/CMakeLists.txt" + ], + "nodes" : + [ + { + "file" : 0 + }, + { + "command" : 0, + "file" : 0, + "line" : 443, + "parent" : 0 + } + ] + }, + "id" : "uninstall::@9f6bdc1e5386c9c3898b", + "name" : "uninstall", + "paths" : + { + "build" : "deps/glfw", + "source" : "deps/glfw" + }, + "sourceGroups" : + [ + { + "name" : "", + "sourceIndexes" : + [ + 0 + ] + }, + { + "name" : "CMake Rules", + "sourceIndexes" : + [ + 1 + ] + } + ], + "sources" : + [ + { + "backtrace" : 1, + "isGenerated" : true, + "path" : "build/deps/glfw/CMakeFiles/uninstall", + "sourceGroupIndex" : 0 + }, + { + "backtrace" : 0, + "isGenerated" : true, + "path" : "build/deps/glfw/CMakeFiles/uninstall.rule", + "sourceGroupIndex" : 1 + } + ], + "type" : "UTILITY" +} diff --git a/build/compile_commands.json b/build/compile_commands.json new file mode 100644 index 000000000..5b996f8c9 --- /dev/null +++ b/build/compile_commands.json @@ -0,0 +1,177 @@ +[ +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/auth.c.o -c /home/brad/Desktop/Craft/src/auth.c", + "file": "/home/brad/Desktop/Craft/src/auth.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/client.c.o -c /home/brad/Desktop/Craft/src/client.c", + "file": "/home/brad/Desktop/Craft/src/client.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/cube.c.o -c /home/brad/Desktop/Craft/src/cube.c", + "file": "/home/brad/Desktop/Craft/src/cube.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/db.c.o -c /home/brad/Desktop/Craft/src/db.c", + "file": "/home/brad/Desktop/Craft/src/db.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/item.c.o -c /home/brad/Desktop/Craft/src/item.c", + "file": "/home/brad/Desktop/Craft/src/item.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/main.c.o -c /home/brad/Desktop/Craft/src/main.c", + "file": "/home/brad/Desktop/Craft/src/main.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/map.c.o -c /home/brad/Desktop/Craft/src/map.c", + "file": "/home/brad/Desktop/Craft/src/map.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/matrix.c.o -c /home/brad/Desktop/Craft/src/matrix.c", + "file": "/home/brad/Desktop/Craft/src/matrix.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/ring.c.o -c /home/brad/Desktop/Craft/src/ring.c", + "file": "/home/brad/Desktop/Craft/src/ring.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/sign.c.o -c /home/brad/Desktop/Craft/src/sign.c", + "file": "/home/brad/Desktop/Craft/src/sign.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/util.c.o -c /home/brad/Desktop/Craft/src/util.c", + "file": "/home/brad/Desktop/Craft/src/util.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/src/world.c.o -c /home/brad/Desktop/Craft/src/world.c", + "file": "/home/brad/Desktop/Craft/src/world.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/deps/glew/src/glew.c.o -c /home/brad/Desktop/Craft/deps/glew/src/glew.c", + "file": "/home/brad/Desktop/Craft/deps/glew/src/glew.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/deps/lodepng/lodepng.c.o -c /home/brad/Desktop/Craft/deps/lodepng/lodepng.c", + "file": "/home/brad/Desktop/Craft/deps/lodepng/lodepng.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/deps/noise/noise.c.o -c /home/brad/Desktop/Craft/deps/noise/noise.c", + "file": "/home/brad/Desktop/Craft/deps/noise/noise.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/deps/sqlite/sqlite3.c.o -c /home/brad/Desktop/Craft/deps/sqlite/sqlite3.c", + "file": "/home/brad/Desktop/Craft/deps/sqlite/sqlite3.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build", + "command": "/bin/gcc-9 -I/home/brad/Desktop/Craft/deps/glew/include -I/home/brad/Desktop/Craft/deps/glfw/include -I/home/brad/Desktop/Craft/deps/lodepng -I/home/brad/Desktop/Craft/deps/noise -I/home/brad/Desktop/Craft/deps/sqlite -I/home/brad/Desktop/Craft/deps/tinycthread -g -std=c99 -O3 -o CMakeFiles/craft.dir/deps/tinycthread/tinycthread.c.o -c /home/brad/Desktop/Craft/deps/tinycthread/tinycthread.c", + "file": "/home/brad/Desktop/Craft/deps/tinycthread/tinycthread.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/clipboard.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/clipboard.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/clipboard.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/context.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/context.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/context.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/gamma.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/gamma.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/gamma.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/init.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/init.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/init.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/input.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/input.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/input.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/joystick.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/joystick.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/joystick.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/monitor.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/monitor.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/monitor.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/time.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/time.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/time.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/window.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/window.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/window.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_clipboard.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_clipboard.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_clipboard.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_gamma.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_gamma.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_gamma.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_init.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_init.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_init.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_joystick.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_joystick.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_joystick.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_monitor.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_monitor.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_monitor.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_time.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_time.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_time.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_window.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_window.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_window.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/x11_unicode.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/x11_unicode.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/x11_unicode.c" +}, +{ + "directory": "/home/brad/Desktop/Craft/build/deps/glfw/src", + "command": "/bin/gcc-9 -D_GNU_SOURCE -I/home/brad/Desktop/Craft/deps/glfw/src -I/home/brad/Desktop/Craft/build/deps/glfw/src -g -std=c99 -O3 -Wall -o CMakeFiles/glfw.dir/glx_context.c.o -c /home/brad/Desktop/Craft/deps/glfw/src/glx_context.c", + "file": "/home/brad/Desktop/Craft/deps/glfw/src/glx_context.c" +} +] \ No newline at end of file diff --git a/build/deps/glfw/cmake_uninstall.cmake b/build/deps/glfw/cmake_uninstall.cmake new file mode 100644 index 000000000..62323f756 --- /dev/null +++ b/build/deps/glfw/cmake_uninstall.cmake @@ -0,0 +1,29 @@ + +if (NOT EXISTS "/home/brad/Desktop/Craft/build/deps/glfw/install_manifest.txt") + message(FATAL_ERROR "Cannot find install manifest: \"/home/brad/Desktop/Craft/build/deps/glfw/install_manifest.txt\"") +endif() + +file(READ "/home/brad/Desktop/Craft/build/deps/glfw/install_manifest.txt" files) +string(REGEX REPLACE "\n" ";" files "${files}") + +foreach (file ${files}) + message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") + if (EXISTS "$ENV{DESTDIR}${file}") + exec_program("/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval) + if (NOT "${rm_retval}" STREQUAL 0) + MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") + endif() + elseif (IS_SYMLINK "$ENV{DESTDIR}${file}") + EXEC_PROGRAM("/usr/bin/cmake" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" + OUTPUT_VARIABLE rm_out + RETURN_VALUE rm_retval) + if (NOT "${rm_retval}" STREQUAL 0) + message(FATAL_ERROR "Problem when removing symlink \"$ENV{DESTDIR}${file}\"") + endif() + else() + message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") + endif() +endforeach() + diff --git a/build/deps/glfw/docs/Doxyfile b/build/deps/glfw/docs/Doxyfile new file mode 100644 index 000000000..860a5a132 --- /dev/null +++ b/build/deps/glfw/docs/Doxyfile @@ -0,0 +1,1871 @@ +# Doxyfile 1.8.3.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" "). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or sequence of words) that should +# identify the project. Note that if you do not use Doxywizard you need +# to put quotes around the project name if it contains spaces. + +PROJECT_NAME = "GLFW" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 3.0.3 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "A multi-platform library for OpenGL, window and input" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = /home/brad/Desktop/Craft/build/deps/glfw/docs + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = NO + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = YES + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. Note that you specify absolute paths here, but also +# relative paths, which will be relative from the directory where doxygen is +# started. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding +# "class=itcl::class" will allow you to use the command class in the +# itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, +# and language is one of the parsers supported by doxygen: IDL, Java, +# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, +# C++. For instance to make doxygen treat .inc files as Fortran files (default +# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note +# that for custom extensions you also need to set FILE_PATTERNS otherwise the +# files are not read by doxygen. + +EXTENSION_MAPPING = + +# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all +# comments according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you +# can mix doxygen, HTML, and XML commands with Markdown formatting. +# Disable only in case of backward compatibilities issues. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented classes, +# or namespaces to their corresponding documentation. Such a link can be +# prevented in individual cases by by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES (the +# default) will make doxygen replace the get and set methods by a property in +# the documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and +# unions with only public data fields will be shown inline in the documentation +# of the scope in which they are defined (i.e. file, namespace, or group +# documentation), provided this scope is documented. If set to NO (the default), +# structs, classes, and unions are shown on a separate page (for HTML and Man +# pages) or section (for LaTeX and RTF). + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be +# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given +# their name and scope. Since this can be an expensive process and often the +# same symbol appear multiple times in the code, doxygen keeps a cache of +# pre-resolved symbols. If the cache is too small doxygen will become slower. +# If the cache is too large, memory is wasted. The cache size is given by this +# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if section-label ... \endif +# and \cond section-label ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = NO + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files +# containing the references data. This must be a list of .bib files. The +# .bib extension is automatically appended if omitted. Using this command +# requires the bibtex tool to be installed. See also +# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style +# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this +# feature you need bibtex and perl available in the search path. Do not use +# file names with spaces, bibtex cannot handle them. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = /home/brad/Desktop/Craft/build/deps/glfw/docs/warnings.txt + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = \ + /home/brad/Desktop/Craft/deps/glfw/include/GLFW/glfw3.h \ + /home/brad/Desktop/Craft/deps/glfw/include/GLFW/glfw3native.h \ + /home/brad/Desktop/Craft/deps/glfw/docs/main.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/news.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/quick.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/moving.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/build.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/context.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/monitor.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/window.dox \ + /home/brad/Desktop/Craft/deps/glfw/docs/compat.dox + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.h *.dox + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = APIENTRY GLFWAPI + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = /home/brad/Desktop/Craft/deps/glfw/examples + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page (index.html). +# This can be useful if you have a project on for instance GitHub and want reuse +# the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C, C++ and Fortran comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = glfw GLFW_ + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If left blank doxygen will +# generate a default style sheet. Note that it is recommended to use +# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this +# tag will in the future become obsolete. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional +# user-defined cascading style sheet that is included after the standard +# style sheets created by doxygen. Using this option one can overrule +# certain style aspects. This is preferred over using HTML_STYLESHEET +# since it does not replace the standard style sheet and is therefor more +# robust against future updates. Doxygen will copy the style sheet file to +# the output directory. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the style sheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see http://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of +# entries shown in the various tree structured indices initially; the user +# can expand and collapse entries dynamically later on. Doxygen will expand +# the tree to such a level that at most the specified number of entries are +# visible (unless a fully collapsed tree already exceeds this amount). +# So setting the number of entries 1 will produce a full collapsed tree by +# default. 0 is a special value representing an infinite number of entries +# and will result in a full expanded tree by default. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely +# identify the documentation publisher. This should be a reverse domain-name +# style string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) +# at top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. Since the tabs have the same information as the +# navigation tree you can set this option to NO if you already set +# GENERATE_TREEVIEW to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. +# Since the tree basically has the same information as the tab index you +# could consider to set DISABLE_INDEX to NO when enabling this option. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 300 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you may also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# thA MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and +# SVG. The default value is HTML-CSS, which is slower, but has the best +# compatibility. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to +# the MathJax Content Delivery Network so you can quickly see the result without +# installing MathJax. +# However, it is strongly recommended to install a local +# copy of MathJax from http://www.mathjax.org before deployment. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension +# names that should be enabled during MathJax rendering. + +MATHJAX_EXTENSIONS = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. +# There are two flavours of web server based search depending on the +# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for +# searching and an index file used by the script. When EXTERNAL_SEARCH is +# enabled the indexing and searching needs to be provided by external tools. +# See the manual for details. + +SERVER_BASED_SEARCH = NO + +# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain +# the search results. Doxygen ships with an example indexer (doxyindexer) and +# search engine (doxysearch.cgi) which are based on the open source search engine +# library Xapian. See the manual for configuration details. + +EXTERNAL_SEARCH = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will returned the search results when EXTERNAL_SEARCH is enabled. +# Doxygen ships with an example search engine (doxysearch) which is based on +# the open source search engine library Xapian. See the manual for configuration +# details. + +SEARCHENGINE_URL = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. + +SEARCHDATA_FILE = searchdata.xml + +# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. + +EXTERNAL_SEARCH_ID = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id +# of to a relative location where the documentation can be found. +# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ... + +EXTRA_SEARCH_MAPPINGS = + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See +# http://en.wikipedia.org/wiki/BibTeX for more info. + +LATEX_BIB_STYLE = plain + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load style sheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = YES + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = GLFWAPI= \ + GLFW_EXPOSE_NATIVE_WIN32 \ + GLFW_EXPOSE_NATIVE_WGL \ + GLFW_EXPOSE_NATIVE_X11 \ + GLFW_EXPOSE_NATIVE_GLX \ + GLFW_EXPOSE_NATIVE_COCOA \ + GLFW_EXPOSE_NATIVE_NSGL \ + GLFW_EXPOSE_NATIVE_EGL + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. For each +# tag file the location of the external documentation should be added. The +# format of a tag file without this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths +# or URLs. Note that each tag file must have a unique name (where the name does +# NOT include the path). If a tag file is not located in the directory in which +# doxygen is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will use the Helvetica font for all dot files that +# doxygen generates. When you want a differently looking font you can specify +# the font name using DOT_FONTNAME. You need to make sure dot is able to find +# the font, which can be done by putting it in a standard location or by setting +# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the Helvetica font. +# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to +# set the path where dot can find it. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside +# the class node. If there are many fields or methods and many nodes the +# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS +# threshold limits the number of items for each type to make the size more +# managable. Set this to 0 for no limit. Note that the threshold may be +# exceeded by 50% before the limit is enforced. + +UML_LIMIT_NUM_FIELDS = 10 + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = NO + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = NO + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. If you choose svg you need to set +# HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible in IE 9+ (other browsers do not have this requirement). + +DOT_IMAGE_FORMAT = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# Note that this requires a modern browser other than Internet Explorer. +# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you +# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files +# visible. Older versions of IE do not have SVG support. + +INTERACTIVE_SVG = NO + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/build/deps/glfw/src/config.h b/build/deps/glfw/src/config.h new file mode 100644 index 000000000..336a37dff --- /dev/null +++ b/build/deps/glfw/src/config.h @@ -0,0 +1,84 @@ +//======================================================================== +// GLFW 3.0 - www.glfw.org +//------------------------------------------------------------------------ +// Copyright (c) 2010 Camilla Berglund +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would +// be appreciated but is not required. +// +// 2. Altered source versions must be plainly marked as such, and must not +// be misrepresented as being the original software. +// +// 3. This notice may not be removed or altered from any source +// distribution. +// +//======================================================================== +// As config.h.in, this file is used by CMake to produce the config.h shared +// configuration header file. If you are adding a feature requiring +// conditional compilation, this is the proper place to add the macros. +//======================================================================== +// As config.h, this file defines compile-time build options and macros for +// all platforms supported by GLFW. As this is a generated file, don't modify +// it. Instead, you should modify the config.h.in file. +//======================================================================== + +// Define this to 1 if building GLFW for X11 +#define _GLFW_X11 +// Define this to 1 if building GLFW for Win32 +/* #undef _GLFW_WIN32 */ +// Define this to 1 if building GLFW for Cocoa +/* #undef _GLFW_COCOA */ + +// Define this to 1 if building GLFW for EGL +/* #undef _GLFW_EGL */ +// Define this to 1 if building GLFW for GLX +#define _GLFW_GLX +// Define this to 1 if building GLFW for WGL +/* #undef _GLFW_WGL */ +// Define this to 1 if building GLFW for NSGL +/* #undef _GLFW_NSGL */ + +// Define this to 1 if building as a shared library / dynamic library / DLL +/* #undef _GLFW_BUILD_DLL */ + +// Define this to 1 to disable dynamic loading of winmm +/* #undef _GLFW_NO_DLOAD_WINMM */ +// Define this to 1 if glfwSwapInterval should ignore DWM compositing status +/* #undef _GLFW_USE_DWM_SWAP_INTERVAL */ +// Define this to 1 to force use of high-performance GPU on Optimus systems +/* #undef _GLFW_USE_OPTIMUS_HPG */ + +// Define this to 1 if glXGetProcAddress is available +#define _GLFW_HAS_GLXGETPROCADDRESS +// Define this to 1 if glXGetProcAddressARB is available +#define _GLFW_HAS_GLXGETPROCADDRESSARB +// Define this to 1 if glXGetProcAddressEXT is available +/* #undef _GLFW_HAS_GLXGETPROCADDRESSEXT */ +// Define this to 1 if dlopen is available +/* #undef _GLFW_HAS_DLOPEN */ + +// Define this to 1 if glfwInit should change the current directory +/* #undef _GLFW_USE_CHDIR */ +// Define this to 1 if glfwCreateWindow should populate the menu bar +/* #undef _GLFW_USE_MENUBAR */ + +// Define this to 1 if using OpenGL as the client library +#define _GLFW_USE_OPENGL +// Define this to 1 if using OpenGL ES 1.1 as the client library +/* #undef _GLFW_USE_GLESV1 */ +// Define this to 1 if using OpenGL ES 2.0 as the client library +/* #undef _GLFW_USE_GLESV2 */ + +// The GLFW version as used by glfwGetVersionString +#define _GLFW_VERSION_FULL "3.0.3" + diff --git a/build/deps/glfw/src/glfw3.pc b/build/deps/glfw/src/glfw3.pc new file mode 100644 index 000000000..8abe4947b --- /dev/null +++ b/build/deps/glfw/src/glfw3.pc @@ -0,0 +1,13 @@ +prefix=/usr/local +exec_prefix=${prefix} +includedir=${prefix}/include +libdir=${exec_prefix}/lib + +Name: GLFW +Description: A portable library for OpenGL, window and input +Version: 3.0.3 +URL: http://www.glfw.org/ +Requires.private: x11 xrandr xi xxf86vm gl +Libs: -L${libdir} -lglfw3 +Libs.private: -lrt -lm +Cflags: -I${includedir} diff --git a/build/deps/glfw/src/glfwConfig.cmake b/build/deps/glfw/src/glfwConfig.cmake new file mode 100644 index 000000000..bf0d7d2e4 --- /dev/null +++ b/build/deps/glfw/src/glfwConfig.cmake @@ -0,0 +1,10 @@ +# - Config file for the glfw package +# It defines the following variables +# GLFW_INCLUDE_DIR, the path where GLFW headers are located +# GLFW_LIBRARY_DIR, folder in which the GLFW library is located +# GLFW_LIBRARY, library to link against to use GLFW + +set(GLFW_INCLUDE_DIR "/usr/local/include") +set(GLFW_LIBRARY_DIR "/usr/local/lib") + +find_library(GLFW_LIBRARY "glfw3" HINTS ${GLFW_LIBRARY_DIR}) diff --git a/build/deps/glfw/src/glfwConfigVersion.cmake b/build/deps/glfw/src/glfwConfigVersion.cmake new file mode 100644 index 000000000..48f695c69 --- /dev/null +++ b/build/deps/glfw/src/glfwConfigVersion.cmake @@ -0,0 +1,12 @@ + +set(PACKAGE_VERSION "3.0.3") + +if ("${PACKAGE_FIND_VERSION_MAJOR}" EQUAL "3") + set(PACKAGE_VERSION_COMPATIBLE TRUE) + if ("${PACKAGE_FIND_VERSION_MINOR}" EQUAL 0) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) +endif() + diff --git a/src/main.c b/src/main.c index 7282b2715..6c80500d9 100644 --- a/src/main.c +++ b/src/main.c @@ -2039,6 +2039,7 @@ void handle_player_health() { g->players->state.z = 0; } + heal_damage(0.001); handle_lava_damage(g->players); } @@ -2080,6 +2081,11 @@ void inflict_damage(float damage) { g->players->health -= damage; } +//Heals the player for a set amount, not exceeding 10 +void heal_damage(float healing) { + if(g->players->health < 10.0) g->players->health += healing; +} + // Calculates the current movement speed of the player. // Returns the movement speed of the player. float handle_player_speed() { From a95ecfd8bdb627e8d7851dea13ca560535bdc8c7 Mon Sep 17 00:00:00 2001 From: Bradley-Jackson <32555818+Bradley-Jackson@users.noreply.github.com> Date: Thu, 8 Apr 2021 18:23:47 -0400 Subject: [PATCH 30/38] Update Backlog updated backlog --- Backlog | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Backlog b/Backlog index 82b04c63d..393552a3a 100644 --- a/Backlog +++ b/Backlog @@ -12,10 +12,10 @@ US006 Task011 - Rain drop blocks should have no collision and be effected by gra --COMPLETE-- US007 Task012 - Water blocks should not be transparent. Points 2 --ASSIGNED-- US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 --COMPLETE-- US007 Task014 - Lava blocks should have no collision. Points 1 ---ASSIGNED-- US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 ---ASSIGNED-- US009 Task016 - Add the ability to double jump while not flying. Points 3 +--COMPLETE-- US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 +--COMPLETE-- US009 Task016 - Add the ability to double jump while not flying. Points 3 --ASSIGNED-- US010 Task017 - Add bodies of water to terrain generation. Points 5 --COMPLETE-- US011 Task018 - Give players a health value. points 2 --COMPLETE-- US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 -US011 Task020 - Add to the player's health periodically if it is not full. points 4 ---ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 \ No newline at end of file +--COMPLETE-- US011 Task020 - Add to the player's health periodically if it is not full. points 4 +--ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 From 571cc702f5603716eb32e47617cde85e2cd21eb7 Mon Sep 17 00:00:00 2001 From: Brad Date: Thu, 8 Apr 2021 18:38:18 -0400 Subject: [PATCH 31/38] used macro instead of hard coding --- src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 6c80500d9..1c9abb153 100644 --- a/src/main.c +++ b/src/main.c @@ -2083,7 +2083,7 @@ void inflict_damage(float damage) { //Heals the player for a set amount, not exceeding 10 void heal_damage(float healing) { - if(g->players->health < 10.0) g->players->health += healing; + if(g->players->health < MAX_PLAYER_HEALTH) g->players->health += healing; } // Calculates the current movement speed of the player. From 11ff8f4a1646ce367113673a7019bcba49d4b901 Mon Sep 17 00:00:00 2001 From: Bradley-Jackson <32555818+Bradley-Jackson@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:10:06 -0400 Subject: [PATCH 32/38] Update UserStories Added user story 13 --- UserStories | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UserStories b/UserStories index 5e6305e82..83ffd283d 100644 --- a/UserStories +++ b/UserStories @@ -10,4 +10,4 @@ US009 - As a player of Craft, I want to be able to double jump US010 - As a player of Craft, I want bodies of water to be generated in the map. US011 - As a player of Craft, I want the player to have limited, regenerating health, to make a more realistic environment. US012 - As a player of Craft, I want to be able to swim wherever there are water blocks, to make the game more realistic. - +US013 - As a developer of Craft, I want to have better documented and understandable code to increase readability. From 84a27efc7172f61c26830eaacf531a2cae5ac534 Mon Sep 17 00:00:00 2001 From: Bradley-Jackson <32555818+Bradley-Jackson@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:20:09 -0400 Subject: [PATCH 33/38] Update UserStories --- UserStories | 1 + 1 file changed, 1 insertion(+) diff --git a/UserStories b/UserStories index 83ffd283d..3fa04b673 100644 --- a/UserStories +++ b/UserStories @@ -11,3 +11,4 @@ US010 - As a player of Craft, I want bodies of water to be generated in the map. US011 - As a player of Craft, I want the player to have limited, regenerating health, to make a more realistic environment. US012 - As a player of Craft, I want to be able to swim wherever there are water blocks, to make the game more realistic. US013 - As a developer of Craft, I want to have better documented and understandable code to increase readability. +US014 - As a player of Craft, I want to be able to view the controls of the game when I pause. From a866145f74a0059d9cb534e1ee4332c51988cab3 Mon Sep 17 00:00:00 2001 From: Bradley-Jackson <32555818+Bradley-Jackson@users.noreply.github.com> Date: Thu, 8 Apr 2021 20:24:39 -0400 Subject: [PATCH 34/38] Update Backlog --- Backlog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Backlog b/Backlog index 393552a3a..58b8bec38 100644 --- a/Backlog +++ b/Backlog @@ -19,3 +19,6 @@ US006 Task011 - Rain drop blocks should have no collision and be effected by gra --COMPLETE-- US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 --COMPLETE-- US011 Task020 - Add to the player's health periodically if it is not full. points 4 --ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 +--ASSIGNED-- US013 Task022 - Document the main.c functions handle_movement, tree, on_mouse_button, heal_damage, and create_window +--ASSIGNED-- US014 Task023 - Create overlay when paused that displays the controls. +--ASSIGNED-- US001 Task024 - Make mouse more responsive to input, and reduce spinning when looking straight up or down. From 15cbdaac3606d9ba4d16658dc4ed2e755f7e216a Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 8 Apr 2021 20:51:59 -0400 Subject: [PATCH 35/38] Update backlog tasks --- Backlog | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Backlog b/Backlog index 58b8bec38..5cd76b1b7 100644 --- a/Backlog +++ b/Backlog @@ -10,15 +10,16 @@ US004 Task006 - Create generation function and spawn conditions for buildings. P --COMPLETE-- US006 Task010 - Create spawn conditions for rain drop blocks. Points 3 US006 Task011 - Rain drop blocks should have no collision and be effected by gravity. Points 3 --COMPLETE-- US007 Task012 - Water blocks should not be transparent. Points 2 ---ASSIGNED-- US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 +--COMPLETE-- US007 Task013 - Water and lava blocks should slow player movement when the player is inside them. Points 3 --COMPLETE-- US007 Task014 - Lava blocks should have no collision. Points 1 --COMPLETE-- US008 Task015 - Add button handling for sprint, doubling movement speed. Points 3 --COMPLETE-- US009 Task016 - Add the ability to double jump while not flying. Points 3 ---ASSIGNED-- US010 Task017 - Add bodies of water to terrain generation. Points 5 +--COMPLETE-- US010 Task017 - Add bodies of water to terrain generation. Points 5 --COMPLETE-- US011 Task018 - Give players a health value. points 2 --COMPLETE-- US011 Task019 - Subtract from the player's health value while in lava or if the player falls from 5 blocks or higher. points 5 --COMPLETE-- US011 Task020 - Add to the player's health periodically if it is not full. points 4 --ASSIGNED-- US012 Task021 - Hold the space key to float to the top of a water body. points 3 ---ASSIGNED-- US013 Task022 - Document the main.c functions handle_movement, tree, on_mouse_button, heal_damage, and create_window ---ASSIGNED-- US014 Task023 - Create overlay when paused that displays the controls. ---ASSIGNED-- US001 Task024 - Make mouse more responsive to input, and reduce spinning when looking straight up or down. +--ASSIGNED-- US013 Task022 - Document the main.c functions handle_movement, tree, on_mouse_button, heal_damage, and create_window. points 2 +--ASSIGNED-- US014 Task023 - Create overlay when paused that displays the controls. points 3 +--ASSIGNED-- US001 Task024 - Make mouse more responsive to input, and reduce spinning when looking straight up or down. points 4 +--ASSIGNED-- US013 Task025 - Document the main.c functions: handle_player_health, handle_lava_damage, handle_fall_damage, is_movement_slowed, and reset_model. points 2 \ No newline at end of file From 2834252798d94ee907e3f0937318f1700564d2f2 Mon Sep 17 00:00:00 2001 From: David Landes Date: Thu, 8 Apr 2021 21:02:00 -0400 Subject: [PATCH 36/38] Add new task --- Backlog | 3 ++- UserStories | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Backlog b/Backlog index 5cd76b1b7..72b8bab93 100644 --- a/Backlog +++ b/Backlog @@ -22,4 +22,5 @@ US006 Task011 - Rain drop blocks should have no collision and be effected by gra --ASSIGNED-- US013 Task022 - Document the main.c functions handle_movement, tree, on_mouse_button, heal_damage, and create_window. points 2 --ASSIGNED-- US014 Task023 - Create overlay when paused that displays the controls. points 3 --ASSIGNED-- US001 Task024 - Make mouse more responsive to input, and reduce spinning when looking straight up or down. points 4 ---ASSIGNED-- US013 Task025 - Document the main.c functions: handle_player_health, handle_lava_damage, handle_fall_damage, is_movement_slowed, and reset_model. points 2 \ No newline at end of file +--ASSIGNED-- US013 Task025 - Document the main.c functions: handle_player_health, handle_lava_damage, handle_fall_damage, is_movement_slowed, and reset_model. points 2 +--ASSIGNED-- US014 Task026 - Re-map the zoom key from left-shift to 'z'. points 2 \ No newline at end of file diff --git a/UserStories b/UserStories index 3fa04b673..4bd04e6ab 100644 --- a/UserStories +++ b/UserStories @@ -12,3 +12,4 @@ US011 - As a player of Craft, I want the player to have limited, regenerating he US012 - As a player of Craft, I want to be able to swim wherever there are water blocks, to make the game more realistic. US013 - As a developer of Craft, I want to have better documented and understandable code to increase readability. US014 - As a player of Craft, I want to be able to view the controls of the game when I pause. +US015 - As a player of Craft, I want the game controls to be more intuitive to create a smoother transition from another game to Craft. From 338a3dfc1385e239cf079b6474e30f91746b02b6 Mon Sep 17 00:00:00 2001 From: David Landes Date: Wed, 14 Apr 2021 22:45:03 -0400 Subject: [PATCH 37/38] Re-organize documentation. Include source code. --- CMakeDoxyfile.in | 280 - CMakeDoxygenDefaults.cmake | 672 -- Doxyfile => documentation/Doxyfile | 339 +- .../html/LICENSE_8md.html | 28 +- documentation/html/README_8md.html | 74 + documentation/html/annotated.html | 100 + documentation/html/auth_8c.html | 261 + documentation/html/auth_8c_source.html | 132 + documentation/html/auth_8h.html | 161 + documentation/html/auth_8h_source.html | 86 + documentation/html/bc_s.png | Bin 0 -> 676 bytes documentation/html/bdwn.png | Bin 0 -> 147 bytes documentation/html/builder_8py.html | 176 + documentation/html/builder_8py_source.html | 341 + .../html/classbuilder_1_1Client-members.html | 87 + .../html/classbuilder_1_1Client.html | 378 + documentation/html/classbuilder_1_1Client.png | Bin 0 -> 404 bytes documentation/html/classes.html | 107 + .../html/classserver_1_1Handler-members.html | 97 + .../html/classserver_1_1Handler.html | 516 ++ documentation/html/classserver_1_1Handler.png | Bin 0 -> 731 bytes .../html/classserver_1_1Model-members.html | 122 + documentation/html/classserver_1_1Model.html | 1930 +++++ documentation/html/classserver_1_1Model.png | Bin 0 -> 408 bytes .../classserver_1_1RateLimiter-members.html | 87 + .../html/classserver_1_1RateLimiter.html | 256 + .../html/classserver_1_1RateLimiter.png | Bin 0 -> 477 bytes .../html/classserver_1_1Server-members.html | 83 + documentation/html/classserver_1_1Server.html | 150 + documentation/html/classserver_1_1Server.png | Bin 0 -> 938 bytes .../html/classworld_1_1World-members.html | 87 + documentation/html/classworld_1_1World.html | 292 + documentation/html/classworld_1_1World.png | Bin 0 -> 385 bytes documentation/html/client_8c.html | 1097 +++ documentation/html/client_8c_source.html | 363 + documentation/html/client_8h.html | 723 ++ documentation/html/client_8h_source.html | 115 + documentation/html/closed.png | Bin 0 -> 132 bytes documentation/html/config_8h.html | 843 +++ documentation/html/config_8h_source.html | 132 + documentation/html/cube_8c.html | 1064 +++ documentation/html/cube_8c_source.html | 475 ++ documentation/html/cube_8h.html | 942 +++ documentation/html/cube_8h_source.html | 121 + documentation/html/db_8c.html | 1852 +++++ documentation/html/db_8c_source.html | 621 ++ documentation/html/db_8h.html | 1331 ++++ documentation/html/db_8h_source.html | 145 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 130 + documentation/html/doc.png | Bin 0 -> 746 bytes documentation/html/doxygen.css | 1799 +++++ documentation/html/doxygen.svg | 26 + documentation/html/dynsections.js | 128 + documentation/html/files.html | 106 + documentation/html/folderclosed.png | Bin 0 -> 616 bytes documentation/html/folderopen.png | Bin 0 -> 597 bytes documentation/html/functions.html | 667 ++ documentation/html/functions_func.html | 272 + documentation/html/functions_vars.html | 515 ++ documentation/html/globals.html | 101 + documentation/html/globals_a.html | 89 + documentation/html/globals_b.html | 96 + documentation/html/globals_c.html | 342 + documentation/html/globals_d.html | 261 + documentation/html/globals_defs.html | 539 ++ documentation/html/globals_e.html | 89 + documentation/html/globals_enum.html | 75 + documentation/html/globals_eval.html | 84 + documentation/html/globals_f.html | 93 + documentation/html/globals_func.html | 101 + documentation/html/globals_func_a.html | 77 + documentation/html/globals_func_b.html | 77 + documentation/html/globals_func_c.html | 168 + documentation/html/globals_func_d.html | 225 + documentation/html/globals_func_e.html | 77 + documentation/html/globals_func_f.html | 90 + documentation/html/globals_func_g.html | 136 + documentation/html/globals_func_h.html | 110 + documentation/html/globals_func_i.html | 107 + documentation/html/globals_func_l.html | 92 + documentation/html/globals_func_m.html | 180 + documentation/html/globals_func_n.html | 78 + documentation/html/globals_func_o.html | 98 + documentation/html/globals_func_p.html | 95 + documentation/html/globals_func_r.html | 166 + documentation/html/globals_func_s.html | 123 + documentation/html/globals_func_t.html | 84 + documentation/html/globals_func_u.html | 87 + documentation/html/globals_func_w.html | 81 + documentation/html/globals_g.html | 148 + documentation/html/globals_h.html | 110 + documentation/html/globals_i.html | 124 + documentation/html/globals_k.html | 77 + documentation/html/globals_l.html | 110 + documentation/html/globals_m.html | 240 + documentation/html/globals_n.html | 78 + documentation/html/globals_o.html | 98 + documentation/html/globals_p.html | 108 + documentation/html/globals_q.html | 83 + documentation/html/globals_r.html | 196 + documentation/html/globals_s.html | 174 + documentation/html/globals_t.html | 90 + documentation/html/globals_type.html | 75 + documentation/html/globals_u.html | 90 + documentation/html/globals_v.html | 77 + documentation/html/globals_vars.html | 209 + documentation/html/globals_w.html | 99 + documentation/html/globals_y.html | 77 + documentation/html/hierarchy.html | 102 + documentation/html/index.html | 74 + documentation/html/item_8c.html | 399 + documentation/html/item_8c_source.html | 375 + documentation/html/item_8h.html | 1485 ++++ documentation/html/item_8h_source.html | 164 + documentation/html/jquery.js | 35 + documentation/html/main_8c.html | 6609 +++++++++++++++++ documentation/html/main_8c_source.html | 3057 ++++++++ documentation/html/map_8c.html | 404 + documentation/html/map_8c_source.html | 186 + documentation/html/map_8h.html | 416 ++ documentation/html/map_8h_source.html | 126 + documentation/html/matrix_8c.html | 989 +++ documentation/html/matrix_8c_source.html | 355 + documentation/html/matrix_8h.html | 985 +++ documentation/html/matrix_8h_source.html | 120 + ...op_Software_Eng_Group_9_Craft_LICENSE.html | 79 + ...top_Software_Eng_Group_9_Craft_README.html | 206 + documentation/html/menu.js | 51 + documentation/html/menudata.js | 227 + documentation/html/namespacebuilder.html | 1327 ++++ documentation/html/namespacemembers.html | 362 + documentation/html/namespacemembers_func.html | 133 + documentation/html/namespacemembers_vars.html | 297 + documentation/html/namespaces.html | 87 + documentation/html/namespaceserver.html | 707 ++ documentation/html/namespaceworld.html | 314 + documentation/html/nav_f.png | Bin 0 -> 153 bytes documentation/html/nav_g.png | Bin 0 -> 95 bytes documentation/html/nav_h.png | Bin 0 -> 98 bytes documentation/html/open.png | Bin 0 -> 123 bytes documentation/html/pages.html | 80 + documentation/html/ring_8c.html | 553 ++ documentation/html/ring_8c_source.html | 207 + documentation/html/ring_8h.html | 598 ++ documentation/html/ring_8h_source.html | 152 + documentation/html/search/all_0.html | 37 + documentation/html/search/all_0.js | 13 + documentation/html/search/all_1.html | 37 + documentation/html/search/all_1.js | 18 + documentation/html/search/all_10.html | 37 + documentation/html/search/all_10.js | 7 + documentation/html/search/all_11.html | 37 + documentation/html/search/all_11.js | 53 + documentation/html/search/all_12.html | 37 + documentation/html/search/all_12.js | 73 + documentation/html/search/all_13.html | 37 + documentation/html/search/all_13.js | 16 + documentation/html/search/all_14.html | 37 + documentation/html/search/all_14.js | 12 + documentation/html/search/all_15.html | 37 + documentation/html/search/all_15.js | 6 + documentation/html/search/all_16.html | 37 + documentation/html/search/all_16.js | 20 + documentation/html/search/all_17.html | 37 + documentation/html/search/all_17.js | 4 + documentation/html/search/all_18.html | 37 + documentation/html/search/all_18.js | 6 + documentation/html/search/all_19.html | 37 + documentation/html/search/all_19.js | 4 + documentation/html/search/all_2.html | 37 + documentation/html/search/all_2.js | 18 + documentation/html/search/all_3.html | 37 + documentation/html/search/all_3.js | 120 + documentation/html/search/all_4.html | 37 + documentation/html/search/all_4.js | 72 + documentation/html/search/all_5.html | 37 + documentation/html/search/all_5.js | 15 + documentation/html/search/all_6.html | 37 + documentation/html/search/all_6.js | 17 + documentation/html/search/all_7.html | 37 + documentation/html/search/all_7.js | 30 + documentation/html/search/all_8.html | 37 + documentation/html/search/all_8.js | 19 + documentation/html/search/all_9.html | 37 + documentation/html/search/all_9.js | 22 + documentation/html/search/all_a.html | 37 + documentation/html/search/all_a.js | 5 + documentation/html/search/all_b.html | 37 + documentation/html/search/all_b.js | 21 + documentation/html/search/all_c.html | 37 + documentation/html/search/all_c.js | 68 + documentation/html/search/all_d.html | 37 + documentation/html/search/all_d.js | 9 + documentation/html/search/all_e.html | 37 + documentation/html/search/all_e.js | 30 + documentation/html/search/all_f.html | 37 + documentation/html/search/all_f.js | 26 + documentation/html/search/classes_0.html | 37 + documentation/html/search/classes_0.js | 4 + documentation/html/search/classes_1.html | 37 + documentation/html/search/classes_1.js | 4 + documentation/html/search/classes_2.html | 37 + documentation/html/search/classes_2.js | 5 + documentation/html/search/classes_3.html | 37 + documentation/html/search/classes_3.js | 4 + documentation/html/search/classes_4.html | 37 + documentation/html/search/classes_4.js | 4 + documentation/html/search/classes_5.html | 37 + documentation/html/search/classes_5.js | 6 + documentation/html/search/classes_6.html | 37 + documentation/html/search/classes_6.js | 4 + documentation/html/search/classes_7.html | 37 + documentation/html/search/classes_7.js | 6 + documentation/html/search/classes_8.html | 37 + documentation/html/search/classes_8.js | 7 + documentation/html/search/classes_9.html | 37 + documentation/html/search/classes_9.js | 4 + documentation/html/search/close.svg | 31 + documentation/html/search/defines_0.html | 37 + documentation/html/search/defines_0.js | 7 + documentation/html/search/defines_1.html | 37 + documentation/html/search/defines_1.js | 5 + documentation/html/search/defines_10.html | 37 + documentation/html/search/defines_10.js | 4 + documentation/html/search/defines_11.html | 37 + documentation/html/search/defines_11.js | 8 + documentation/html/search/defines_12.html | 37 + documentation/html/search/defines_12.js | 4 + documentation/html/search/defines_2.html | 37 + documentation/html/search/defines_2.js | 58 + documentation/html/search/defines_3.html | 37 + documentation/html/search/defines_3.js | 11 + documentation/html/search/defines_4.html | 37 + documentation/html/search/defines_4.js | 6 + documentation/html/search/defines_5.html | 37 + documentation/html/search/defines_5.js | 4 + documentation/html/search/defines_6.html | 37 + documentation/html/search/defines_6.js | 5 + documentation/html/search/defines_7.html | 37 + documentation/html/search/defines_7.js | 4 + documentation/html/search/defines_8.html | 37 + documentation/html/search/defines_8.js | 7 + documentation/html/search/defines_9.html | 37 + documentation/html/search/defines_9.js | 20 + documentation/html/search/defines_a.html | 37 + documentation/html/search/defines_a.js | 6 + documentation/html/search/defines_b.html | 37 + documentation/html/search/defines_b.js | 4 + documentation/html/search/defines_c.html | 37 + documentation/html/search/defines_c.js | 9 + documentation/html/search/defines_d.html | 37 + documentation/html/search/defines_d.js | 18 + documentation/html/search/defines_e.html | 37 + documentation/html/search/defines_e.js | 4 + documentation/html/search/defines_f.html | 37 + documentation/html/search/defines_f.js | 4 + documentation/html/search/enums_0.html | 37 + documentation/html/search/enums_0.js | 4 + documentation/html/search/enumvalues_0.html | 37 + documentation/html/search/enumvalues_0.js | 4 + documentation/html/search/enumvalues_1.html | 37 + documentation/html/search/enumvalues_1.js | 4 + documentation/html/search/enumvalues_2.html | 37 + documentation/html/search/enumvalues_2.js | 4 + documentation/html/search/enumvalues_3.html | 37 + documentation/html/search/enumvalues_3.js | 4 + documentation/html/search/files_0.html | 37 + documentation/html/search/files_0.js | 5 + documentation/html/search/files_1.html | 37 + documentation/html/search/files_1.js | 4 + documentation/html/search/files_2.html | 37 + documentation/html/search/files_2.js | 8 + documentation/html/search/files_3.html | 37 + documentation/html/search/files_3.js | 5 + documentation/html/search/files_4.html | 37 + documentation/html/search/files_4.js | 5 + documentation/html/search/files_5.html | 37 + documentation/html/search/files_5.js | 4 + documentation/html/search/files_6.html | 37 + documentation/html/search/files_6.js | 8 + documentation/html/search/files_7.html | 37 + documentation/html/search/files_7.js | 6 + documentation/html/search/files_8.html | 37 + documentation/html/search/files_8.js | 6 + documentation/html/search/files_9.html | 37 + documentation/html/search/files_9.js | 5 + documentation/html/search/files_a.html | 37 + documentation/html/search/files_a.js | 6 + documentation/html/search/functions_0.html | 37 + documentation/html/search/functions_0.js | 13 + documentation/html/search/functions_1.html | 37 + documentation/html/search/functions_1.js | 5 + documentation/html/search/functions_10.html | 37 + documentation/html/search/functions_10.js | 30 + documentation/html/search/functions_11.html | 37 + documentation/html/search/functions_11.js | 7 + documentation/html/search/functions_12.html | 37 + documentation/html/search/functions_12.js | 7 + documentation/html/search/functions_13.html | 37 + documentation/html/search/functions_13.js | 5 + documentation/html/search/functions_2.html | 37 + documentation/html/search/functions_2.js | 5 + documentation/html/search/functions_3.html | 37 + documentation/html/search/functions_3.js | 39 + documentation/html/search/functions_4.html | 37 + documentation/html/search/functions_4.js | 50 + documentation/html/search/functions_5.html | 37 + documentation/html/search/functions_5.js | 6 + documentation/html/search/functions_6.html | 37 + documentation/html/search/functions_6.js | 9 + documentation/html/search/functions_7.html | 37 + documentation/html/search/functions_7.js | 26 + documentation/html/search/functions_8.html | 37 + documentation/html/search/functions_8.js | 16 + documentation/html/search/functions_9.html | 37 + documentation/html/search/functions_9.js | 12 + documentation/html/search/functions_a.html | 37 + documentation/html/search/functions_a.js | 9 + documentation/html/search/functions_b.html | 37 + documentation/html/search/functions_b.js | 30 + documentation/html/search/functions_c.html | 37 + documentation/html/search/functions_c.js | 5 + documentation/html/search/functions_d.html | 37 + documentation/html/search/functions_d.js | 26 + documentation/html/search/functions_e.html | 37 + documentation/html/search/functions_e.js | 12 + documentation/html/search/functions_f.html | 37 + documentation/html/search/functions_f.js | 30 + documentation/html/search/mag_sel.svg | 74 + documentation/html/search/namespaces_0.html | 37 + documentation/html/search/namespaces_0.js | 4 + documentation/html/search/namespaces_1.html | 37 + documentation/html/search/namespaces_1.js | 4 + documentation/html/search/namespaces_2.html | 37 + documentation/html/search/namespaces_2.js | 4 + documentation/html/search/nomatches.html | 13 + documentation/html/search/pages_0.html | 37 + documentation/html/search/pages_0.js | 4 + documentation/html/search/pages_1.html | 37 + documentation/html/search/pages_1.js | 4 + documentation/html/search/search.css | 257 + documentation/html/search/search.js | 816 ++ documentation/html/search/search_l.png | Bin 0 -> 567 bytes documentation/html/search/search_m.png | Bin 0 -> 158 bytes documentation/html/search/search_r.png | Bin 0 -> 553 bytes documentation/html/search/searchdata.js | 45 + documentation/html/search/typedefs_0.html | 37 + documentation/html/search/typedefs_0.js | 4 + documentation/html/search/variables_0.html | 37 + documentation/html/search/variables_0.js | 9 + documentation/html/search/variables_1.html | 37 + documentation/html/search/variables_1.js | 13 + documentation/html/search/variables_10.html | 37 + documentation/html/search/variables_10.js | 14 + documentation/html/search/variables_11.html | 37 + documentation/html/search/variables_11.js | 29 + documentation/html/search/variables_12.html | 37 + documentation/html/search/variables_12.js | 12 + documentation/html/search/variables_13.html | 37 + documentation/html/search/variables_13.js | 5 + documentation/html/search/variables_14.html | 37 + documentation/html/search/variables_14.js | 5 + documentation/html/search/variables_15.html | 37 + documentation/html/search/variables_15.js | 10 + documentation/html/search/variables_16.html | 37 + documentation/html/search/variables_16.js | 4 + documentation/html/search/variables_17.html | 37 + documentation/html/search/variables_17.js | 6 + documentation/html/search/variables_18.html | 37 + documentation/html/search/variables_18.js | 4 + documentation/html/search/variables_2.html | 37 + documentation/html/search/variables_2.js | 26 + documentation/html/search/variables_3.html | 37 + documentation/html/search/variables_3.js | 19 + documentation/html/search/variables_4.html | 37 + documentation/html/search/variables_4.js | 9 + documentation/html/search/variables_5.html | 37 + documentation/html/search/variables_5.js | 9 + documentation/html/search/variables_6.html | 37 + documentation/html/search/variables_6.js | 7 + documentation/html/search/variables_7.html | 37 + documentation/html/search/variables_7.js | 5 + documentation/html/search/variables_8.html | 37 + documentation/html/search/variables_8.js | 10 + documentation/html/search/variables_9.html | 37 + documentation/html/search/variables_9.js | 5 + documentation/html/search/variables_a.html | 37 + documentation/html/search/variables_a.js | 11 + documentation/html/search/variables_b.html | 37 + documentation/html/search/variables_b.js | 15 + documentation/html/search/variables_c.html | 37 + documentation/html/search/variables_c.js | 7 + documentation/html/search/variables_d.html | 37 + documentation/html/search/variables_d.js | 7 + documentation/html/search/variables_e.html | 37 + documentation/html/search/variables_e.js | 15 + documentation/html/search/variables_f.html | 37 + documentation/html/search/variables_f.js | 6 + documentation/html/server_8py.html | 162 + documentation/html/server_8py_source.html | 749 ++ documentation/html/sign_8c.html | 423 ++ documentation/html/sign_8c_source.html | 169 + documentation/html/sign_8h.html | 411 + documentation/html/sign_8h_source.html | 122 + documentation/html/splitbar.png | Bin 0 -> 314 bytes documentation/html/structAttrib-members.html | 89 + documentation/html/structAttrib.html | 304 + documentation/html/structBlock-members.html | 81 + documentation/html/structBlock.html | 160 + documentation/html/structChunk-members.html | 90 + documentation/html/structChunk.html | 322 + documentation/html/structFPS-members.html | 80 + documentation/html/structFPS.html | 144 + documentation/html/structMap-members.html | 80 + documentation/html/structMap.html | 144 + .../html/structMapEntry-members.html | 81 + documentation/html/structMapEntry.html | 162 + documentation/html/structModel-members.html | 111 + documentation/html/structModel.html | 700 ++ documentation/html/structPlayer-members.html | 84 + documentation/html/structPlayer.html | 214 + documentation/html/structRing-members.html | 81 + documentation/html/structRing.html | 162 + .../html/structRingEntry-members.html | 85 + documentation/html/structRingEntry.html | 234 + documentation/html/structSign-members.html | 82 + documentation/html/structSign.html | 180 + .../html/structSignList-members.html | 80 + documentation/html/structSignList.html | 144 + documentation/html/structState-members.html | 83 + documentation/html/structState.html | 196 + documentation/html/sync_off.png | Bin 0 -> 853 bytes documentation/html/sync_on.png | Bin 0 -> 845 bytes documentation/html/tab_a.png | Bin 0 -> 142 bytes documentation/html/tab_b.png | Bin 0 -> 169 bytes documentation/html/tab_h.png | Bin 0 -> 177 bytes documentation/html/tab_s.png | Bin 0 -> 184 bytes documentation/html/tabs.css | 1 + documentation/html/util_8c.html | 823 ++ documentation/html/util_8c_source.html | 321 + documentation/html/util_8h.html | 942 +++ documentation/html/util_8h_source.html | 145 + documentation/html/world_8c.html | 219 + documentation/html/world_8c_source.html | 171 + documentation/html/world_8h.html | 239 + documentation/html/world_8h_source.html | 88 + documentation/html/world_8py.html | 110 + documentation/html/world_8py_source.html | 135 + html/annotated.html | 22 +- html/builder_8py_source.html | 326 + html/classbuilder_1_1Client-members.html | 14 +- html/classbuilder_1_1Client.html | 31 +- html/classbuilder_1_1Client.png | Bin 0 -> 404 bytes html/classbuilder_1_1Client__coll__graph.dot | 9 - ...classbuilder_1_1Client__inherit__graph.dot | 9 - html/classes.html | 64 +- html/classserver_1_1Handler-members.html | 14 +- html/classserver_1_1Handler.html | 31 +- html/classserver_1_1Handler.png | Bin 0 -> 731 bytes html/classserver_1_1Handler__coll__graph.dot | 9 - ...classserver_1_1Handler__inherit__graph.dot | 9 - html/classserver_1_1Model-members.html | 14 +- html/classserver_1_1Model.html | 31 +- html/classserver_1_1Model.png | Bin 0 -> 408 bytes html/classserver_1_1Model__coll__graph.dot | 9 - html/classserver_1_1Model__inherit__graph.dot | 9 - html/classserver_1_1RateLimiter-members.html | 14 +- html/classserver_1_1RateLimiter.html | 31 +- html/classserver_1_1RateLimiter.png | Bin 0 -> 477 bytes ...lassserver_1_1RateLimiter__coll__graph.dot | 9 - ...sserver_1_1RateLimiter__inherit__graph.dot | 9 - html/classserver_1_1Server-members.html | 14 +- html/classserver_1_1Server.html | 31 +- html/classserver_1_1Server.png | Bin 0 -> 938 bytes html/classserver_1_1Server__coll__graph.dot | 11 - .../classserver_1_1Server__inherit__graph.dot | 11 - html/classworld_1_1World-members.html | 14 +- html/classworld_1_1World.html | 31 +- html/classworld_1_1World.png | Bin 0 -> 385 bytes html/classworld_1_1World__coll__graph.dot | 9 - html/classworld_1_1World__inherit__graph.dot | 9 - html/doxygen.css | 160 +- html/doxygen.png | Bin 3779 -> 0 bytes html/doxygen.svg | 26 + html/dynsections.js | 40 +- html/files.html | 81 + html/graph_legend.dot | 23 - html/graph_legend.html | 136 - html/hierarchy.html | 24 +- html/index.html | 16 +- html/inherit_graph_0.dot | 16 - html/inherit_graph_1.dot | 10 - html/inherit_graph_2.dot | 12 - html/md_LICENSE.html | 24 +- html/md_README.html | 118 +- html/menu.js | 37 +- html/menudata.js | 36 +- html/pages.html | 18 +- html/search/all_0.html | 19 +- html/search/all_1.html | 19 +- html/search/all_2.html | 19 +- html/search/all_3.html | 19 +- html/search/all_4.html | 19 +- html/search/all_5.html | 19 +- html/search/all_6.html | 19 +- html/search/classes_0.html | 19 +- html/search/classes_1.html | 19 +- html/search/classes_2.html | 19 +- html/search/classes_3.html | 19 +- html/search/classes_4.html | 19 +- html/search/classes_5.html | 19 +- html/search/close.png | Bin 273 -> 0 bytes html/search/close.svg | 31 + html/search/mag_sel.png | Bin 465 -> 0 bytes html/search/mag_sel.svg | 74 + html/search/nomatches.html | 3 +- html/search/pages_0.html | 19 +- html/search/pages_1.html | 19 +- html/search/search.css | 104 +- html/search/search.js | 52 +- html/server_8py_source.html | 732 ++ html/tabs.css | 2 +- html/world_8py_source.html | 127 + 523 files changed, 65614 insertions(+), 2024 deletions(-) delete mode 100644 CMakeDoxyfile.in delete mode 100644 CMakeDoxygenDefaults.cmake rename Doxyfile => documentation/Doxyfile (91%) rename html/inherits.html => documentation/html/LICENSE_8md.html (75%) create mode 100644 documentation/html/README_8md.html create mode 100644 documentation/html/annotated.html create mode 100644 documentation/html/auth_8c.html create mode 100644 documentation/html/auth_8c_source.html create mode 100644 documentation/html/auth_8h.html create mode 100644 documentation/html/auth_8h_source.html create mode 100644 documentation/html/bc_s.png create mode 100644 documentation/html/bdwn.png create mode 100644 documentation/html/builder_8py.html create mode 100644 documentation/html/builder_8py_source.html create mode 100644 documentation/html/classbuilder_1_1Client-members.html create mode 100644 documentation/html/classbuilder_1_1Client.html create mode 100644 documentation/html/classbuilder_1_1Client.png create mode 100644 documentation/html/classes.html create mode 100644 documentation/html/classserver_1_1Handler-members.html create mode 100644 documentation/html/classserver_1_1Handler.html create mode 100644 documentation/html/classserver_1_1Handler.png create mode 100644 documentation/html/classserver_1_1Model-members.html create mode 100644 documentation/html/classserver_1_1Model.html create mode 100644 documentation/html/classserver_1_1Model.png create mode 100644 documentation/html/classserver_1_1RateLimiter-members.html create mode 100644 documentation/html/classserver_1_1RateLimiter.html create mode 100644 documentation/html/classserver_1_1RateLimiter.png create mode 100644 documentation/html/classserver_1_1Server-members.html create mode 100644 documentation/html/classserver_1_1Server.html create mode 100644 documentation/html/classserver_1_1Server.png create mode 100644 documentation/html/classworld_1_1World-members.html create mode 100644 documentation/html/classworld_1_1World.html create mode 100644 documentation/html/classworld_1_1World.png create mode 100644 documentation/html/client_8c.html create mode 100644 documentation/html/client_8c_source.html create mode 100644 documentation/html/client_8h.html create mode 100644 documentation/html/client_8h_source.html create mode 100644 documentation/html/closed.png create mode 100644 documentation/html/config_8h.html create mode 100644 documentation/html/config_8h_source.html create mode 100644 documentation/html/cube_8c.html create mode 100644 documentation/html/cube_8c_source.html create mode 100644 documentation/html/cube_8h.html create mode 100644 documentation/html/cube_8h_source.html create mode 100644 documentation/html/db_8c.html create mode 100644 documentation/html/db_8c_source.html create mode 100644 documentation/html/db_8h.html create mode 100644 documentation/html/db_8h_source.html create mode 100644 documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 documentation/html/doc.png create mode 100644 documentation/html/doxygen.css create mode 100644 documentation/html/doxygen.svg create mode 100644 documentation/html/dynsections.js create mode 100644 documentation/html/files.html create mode 100644 documentation/html/folderclosed.png create mode 100644 documentation/html/folderopen.png create mode 100644 documentation/html/functions.html create mode 100644 documentation/html/functions_func.html create mode 100644 documentation/html/functions_vars.html create mode 100644 documentation/html/globals.html create mode 100644 documentation/html/globals_a.html create mode 100644 documentation/html/globals_b.html create mode 100644 documentation/html/globals_c.html create mode 100644 documentation/html/globals_d.html create mode 100644 documentation/html/globals_defs.html create mode 100644 documentation/html/globals_e.html create mode 100644 documentation/html/globals_enum.html create mode 100644 documentation/html/globals_eval.html create mode 100644 documentation/html/globals_f.html create mode 100644 documentation/html/globals_func.html create mode 100644 documentation/html/globals_func_a.html create mode 100644 documentation/html/globals_func_b.html create mode 100644 documentation/html/globals_func_c.html create mode 100644 documentation/html/globals_func_d.html create mode 100644 documentation/html/globals_func_e.html create mode 100644 documentation/html/globals_func_f.html create mode 100644 documentation/html/globals_func_g.html create mode 100644 documentation/html/globals_func_h.html create mode 100644 documentation/html/globals_func_i.html create mode 100644 documentation/html/globals_func_l.html create mode 100644 documentation/html/globals_func_m.html create mode 100644 documentation/html/globals_func_n.html create mode 100644 documentation/html/globals_func_o.html create mode 100644 documentation/html/globals_func_p.html create mode 100644 documentation/html/globals_func_r.html create mode 100644 documentation/html/globals_func_s.html create mode 100644 documentation/html/globals_func_t.html create mode 100644 documentation/html/globals_func_u.html create mode 100644 documentation/html/globals_func_w.html create mode 100644 documentation/html/globals_g.html create mode 100644 documentation/html/globals_h.html create mode 100644 documentation/html/globals_i.html create mode 100644 documentation/html/globals_k.html create mode 100644 documentation/html/globals_l.html create mode 100644 documentation/html/globals_m.html create mode 100644 documentation/html/globals_n.html create mode 100644 documentation/html/globals_o.html create mode 100644 documentation/html/globals_p.html create mode 100644 documentation/html/globals_q.html create mode 100644 documentation/html/globals_r.html create mode 100644 documentation/html/globals_s.html create mode 100644 documentation/html/globals_t.html create mode 100644 documentation/html/globals_type.html create mode 100644 documentation/html/globals_u.html create mode 100644 documentation/html/globals_v.html create mode 100644 documentation/html/globals_vars.html create mode 100644 documentation/html/globals_w.html create mode 100644 documentation/html/globals_y.html create mode 100644 documentation/html/hierarchy.html create mode 100644 documentation/html/index.html create mode 100644 documentation/html/item_8c.html create mode 100644 documentation/html/item_8c_source.html create mode 100644 documentation/html/item_8h.html create mode 100644 documentation/html/item_8h_source.html create mode 100644 documentation/html/jquery.js create mode 100644 documentation/html/main_8c.html create mode 100644 documentation/html/main_8c_source.html create mode 100644 documentation/html/map_8c.html create mode 100644 documentation/html/map_8c_source.html create mode 100644 documentation/html/map_8h.html create mode 100644 documentation/html/map_8h_source.html create mode 100644 documentation/html/matrix_8c.html create mode 100644 documentation/html/matrix_8c_source.html create mode 100644 documentation/html/matrix_8h.html create mode 100644 documentation/html/matrix_8h_source.html create mode 100644 documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html create mode 100644 documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html create mode 100644 documentation/html/menu.js create mode 100644 documentation/html/menudata.js create mode 100644 documentation/html/namespacebuilder.html create mode 100644 documentation/html/namespacemembers.html create mode 100644 documentation/html/namespacemembers_func.html create mode 100644 documentation/html/namespacemembers_vars.html create mode 100644 documentation/html/namespaces.html create mode 100644 documentation/html/namespaceserver.html create mode 100644 documentation/html/namespaceworld.html create mode 100644 documentation/html/nav_f.png create mode 100644 documentation/html/nav_g.png create mode 100644 documentation/html/nav_h.png create mode 100644 documentation/html/open.png create mode 100644 documentation/html/pages.html create mode 100644 documentation/html/ring_8c.html create mode 100644 documentation/html/ring_8c_source.html create mode 100644 documentation/html/ring_8h.html create mode 100644 documentation/html/ring_8h_source.html create mode 100644 documentation/html/search/all_0.html create mode 100644 documentation/html/search/all_0.js create mode 100644 documentation/html/search/all_1.html create mode 100644 documentation/html/search/all_1.js create mode 100644 documentation/html/search/all_10.html create mode 100644 documentation/html/search/all_10.js create mode 100644 documentation/html/search/all_11.html create mode 100644 documentation/html/search/all_11.js create mode 100644 documentation/html/search/all_12.html create mode 100644 documentation/html/search/all_12.js create mode 100644 documentation/html/search/all_13.html create mode 100644 documentation/html/search/all_13.js create mode 100644 documentation/html/search/all_14.html create mode 100644 documentation/html/search/all_14.js create mode 100644 documentation/html/search/all_15.html create mode 100644 documentation/html/search/all_15.js create mode 100644 documentation/html/search/all_16.html create mode 100644 documentation/html/search/all_16.js create mode 100644 documentation/html/search/all_17.html create mode 100644 documentation/html/search/all_17.js create mode 100644 documentation/html/search/all_18.html create mode 100644 documentation/html/search/all_18.js create mode 100644 documentation/html/search/all_19.html create mode 100644 documentation/html/search/all_19.js create mode 100644 documentation/html/search/all_2.html create mode 100644 documentation/html/search/all_2.js create mode 100644 documentation/html/search/all_3.html create mode 100644 documentation/html/search/all_3.js create mode 100644 documentation/html/search/all_4.html create mode 100644 documentation/html/search/all_4.js create mode 100644 documentation/html/search/all_5.html create mode 100644 documentation/html/search/all_5.js create mode 100644 documentation/html/search/all_6.html create mode 100644 documentation/html/search/all_6.js create mode 100644 documentation/html/search/all_7.html create mode 100644 documentation/html/search/all_7.js create mode 100644 documentation/html/search/all_8.html create mode 100644 documentation/html/search/all_8.js create mode 100644 documentation/html/search/all_9.html create mode 100644 documentation/html/search/all_9.js create mode 100644 documentation/html/search/all_a.html create mode 100644 documentation/html/search/all_a.js create mode 100644 documentation/html/search/all_b.html create mode 100644 documentation/html/search/all_b.js create mode 100644 documentation/html/search/all_c.html create mode 100644 documentation/html/search/all_c.js create mode 100644 documentation/html/search/all_d.html create mode 100644 documentation/html/search/all_d.js create mode 100644 documentation/html/search/all_e.html create mode 100644 documentation/html/search/all_e.js create mode 100644 documentation/html/search/all_f.html create mode 100644 documentation/html/search/all_f.js create mode 100644 documentation/html/search/classes_0.html create mode 100644 documentation/html/search/classes_0.js create mode 100644 documentation/html/search/classes_1.html create mode 100644 documentation/html/search/classes_1.js create mode 100644 documentation/html/search/classes_2.html create mode 100644 documentation/html/search/classes_2.js create mode 100644 documentation/html/search/classes_3.html create mode 100644 documentation/html/search/classes_3.js create mode 100644 documentation/html/search/classes_4.html create mode 100644 documentation/html/search/classes_4.js create mode 100644 documentation/html/search/classes_5.html create mode 100644 documentation/html/search/classes_5.js create mode 100644 documentation/html/search/classes_6.html create mode 100644 documentation/html/search/classes_6.js create mode 100644 documentation/html/search/classes_7.html create mode 100644 documentation/html/search/classes_7.js create mode 100644 documentation/html/search/classes_8.html create mode 100644 documentation/html/search/classes_8.js create mode 100644 documentation/html/search/classes_9.html create mode 100644 documentation/html/search/classes_9.js create mode 100644 documentation/html/search/close.svg create mode 100644 documentation/html/search/defines_0.html create mode 100644 documentation/html/search/defines_0.js create mode 100644 documentation/html/search/defines_1.html create mode 100644 documentation/html/search/defines_1.js create mode 100644 documentation/html/search/defines_10.html create mode 100644 documentation/html/search/defines_10.js create mode 100644 documentation/html/search/defines_11.html create mode 100644 documentation/html/search/defines_11.js create mode 100644 documentation/html/search/defines_12.html create mode 100644 documentation/html/search/defines_12.js create mode 100644 documentation/html/search/defines_2.html create mode 100644 documentation/html/search/defines_2.js create mode 100644 documentation/html/search/defines_3.html create mode 100644 documentation/html/search/defines_3.js create mode 100644 documentation/html/search/defines_4.html create mode 100644 documentation/html/search/defines_4.js create mode 100644 documentation/html/search/defines_5.html create mode 100644 documentation/html/search/defines_5.js create mode 100644 documentation/html/search/defines_6.html create mode 100644 documentation/html/search/defines_6.js create mode 100644 documentation/html/search/defines_7.html create mode 100644 documentation/html/search/defines_7.js create mode 100644 documentation/html/search/defines_8.html create mode 100644 documentation/html/search/defines_8.js create mode 100644 documentation/html/search/defines_9.html create mode 100644 documentation/html/search/defines_9.js create mode 100644 documentation/html/search/defines_a.html create mode 100644 documentation/html/search/defines_a.js create mode 100644 documentation/html/search/defines_b.html create mode 100644 documentation/html/search/defines_b.js create mode 100644 documentation/html/search/defines_c.html create mode 100644 documentation/html/search/defines_c.js create mode 100644 documentation/html/search/defines_d.html create mode 100644 documentation/html/search/defines_d.js create mode 100644 documentation/html/search/defines_e.html create mode 100644 documentation/html/search/defines_e.js create mode 100644 documentation/html/search/defines_f.html create mode 100644 documentation/html/search/defines_f.js create mode 100644 documentation/html/search/enums_0.html create mode 100644 documentation/html/search/enums_0.js create mode 100644 documentation/html/search/enumvalues_0.html create mode 100644 documentation/html/search/enumvalues_0.js create mode 100644 documentation/html/search/enumvalues_1.html create mode 100644 documentation/html/search/enumvalues_1.js create mode 100644 documentation/html/search/enumvalues_2.html create mode 100644 documentation/html/search/enumvalues_2.js create mode 100644 documentation/html/search/enumvalues_3.html create mode 100644 documentation/html/search/enumvalues_3.js create mode 100644 documentation/html/search/files_0.html create mode 100644 documentation/html/search/files_0.js create mode 100644 documentation/html/search/files_1.html create mode 100644 documentation/html/search/files_1.js create mode 100644 documentation/html/search/files_2.html create mode 100644 documentation/html/search/files_2.js create mode 100644 documentation/html/search/files_3.html create mode 100644 documentation/html/search/files_3.js create mode 100644 documentation/html/search/files_4.html create mode 100644 documentation/html/search/files_4.js create mode 100644 documentation/html/search/files_5.html create mode 100644 documentation/html/search/files_5.js create mode 100644 documentation/html/search/files_6.html create mode 100644 documentation/html/search/files_6.js create mode 100644 documentation/html/search/files_7.html create mode 100644 documentation/html/search/files_7.js create mode 100644 documentation/html/search/files_8.html create mode 100644 documentation/html/search/files_8.js create mode 100644 documentation/html/search/files_9.html create mode 100644 documentation/html/search/files_9.js create mode 100644 documentation/html/search/files_a.html create mode 100644 documentation/html/search/files_a.js create mode 100644 documentation/html/search/functions_0.html create mode 100644 documentation/html/search/functions_0.js create mode 100644 documentation/html/search/functions_1.html create mode 100644 documentation/html/search/functions_1.js create mode 100644 documentation/html/search/functions_10.html create mode 100644 documentation/html/search/functions_10.js create mode 100644 documentation/html/search/functions_11.html create mode 100644 documentation/html/search/functions_11.js create mode 100644 documentation/html/search/functions_12.html create mode 100644 documentation/html/search/functions_12.js create mode 100644 documentation/html/search/functions_13.html create mode 100644 documentation/html/search/functions_13.js create mode 100644 documentation/html/search/functions_2.html create mode 100644 documentation/html/search/functions_2.js create mode 100644 documentation/html/search/functions_3.html create mode 100644 documentation/html/search/functions_3.js create mode 100644 documentation/html/search/functions_4.html create mode 100644 documentation/html/search/functions_4.js create mode 100644 documentation/html/search/functions_5.html create mode 100644 documentation/html/search/functions_5.js create mode 100644 documentation/html/search/functions_6.html create mode 100644 documentation/html/search/functions_6.js create mode 100644 documentation/html/search/functions_7.html create mode 100644 documentation/html/search/functions_7.js create mode 100644 documentation/html/search/functions_8.html create mode 100644 documentation/html/search/functions_8.js create mode 100644 documentation/html/search/functions_9.html create mode 100644 documentation/html/search/functions_9.js create mode 100644 documentation/html/search/functions_a.html create mode 100644 documentation/html/search/functions_a.js create mode 100644 documentation/html/search/functions_b.html create mode 100644 documentation/html/search/functions_b.js create mode 100644 documentation/html/search/functions_c.html create mode 100644 documentation/html/search/functions_c.js create mode 100644 documentation/html/search/functions_d.html create mode 100644 documentation/html/search/functions_d.js create mode 100644 documentation/html/search/functions_e.html create mode 100644 documentation/html/search/functions_e.js create mode 100644 documentation/html/search/functions_f.html create mode 100644 documentation/html/search/functions_f.js create mode 100644 documentation/html/search/mag_sel.svg create mode 100644 documentation/html/search/namespaces_0.html create mode 100644 documentation/html/search/namespaces_0.js create mode 100644 documentation/html/search/namespaces_1.html create mode 100644 documentation/html/search/namespaces_1.js create mode 100644 documentation/html/search/namespaces_2.html create mode 100644 documentation/html/search/namespaces_2.js create mode 100644 documentation/html/search/nomatches.html create mode 100644 documentation/html/search/pages_0.html create mode 100644 documentation/html/search/pages_0.js create mode 100644 documentation/html/search/pages_1.html create mode 100644 documentation/html/search/pages_1.js create mode 100644 documentation/html/search/search.css create mode 100644 documentation/html/search/search.js create mode 100644 documentation/html/search/search_l.png create mode 100644 documentation/html/search/search_m.png create mode 100644 documentation/html/search/search_r.png create mode 100644 documentation/html/search/searchdata.js create mode 100644 documentation/html/search/typedefs_0.html create mode 100644 documentation/html/search/typedefs_0.js create mode 100644 documentation/html/search/variables_0.html create mode 100644 documentation/html/search/variables_0.js create mode 100644 documentation/html/search/variables_1.html create mode 100644 documentation/html/search/variables_1.js create mode 100644 documentation/html/search/variables_10.html create mode 100644 documentation/html/search/variables_10.js create mode 100644 documentation/html/search/variables_11.html create mode 100644 documentation/html/search/variables_11.js create mode 100644 documentation/html/search/variables_12.html create mode 100644 documentation/html/search/variables_12.js create mode 100644 documentation/html/search/variables_13.html create mode 100644 documentation/html/search/variables_13.js create mode 100644 documentation/html/search/variables_14.html create mode 100644 documentation/html/search/variables_14.js create mode 100644 documentation/html/search/variables_15.html create mode 100644 documentation/html/search/variables_15.js create mode 100644 documentation/html/search/variables_16.html create mode 100644 documentation/html/search/variables_16.js create mode 100644 documentation/html/search/variables_17.html create mode 100644 documentation/html/search/variables_17.js create mode 100644 documentation/html/search/variables_18.html create mode 100644 documentation/html/search/variables_18.js create mode 100644 documentation/html/search/variables_2.html create mode 100644 documentation/html/search/variables_2.js create mode 100644 documentation/html/search/variables_3.html create mode 100644 documentation/html/search/variables_3.js create mode 100644 documentation/html/search/variables_4.html create mode 100644 documentation/html/search/variables_4.js create mode 100644 documentation/html/search/variables_5.html create mode 100644 documentation/html/search/variables_5.js create mode 100644 documentation/html/search/variables_6.html create mode 100644 documentation/html/search/variables_6.js create mode 100644 documentation/html/search/variables_7.html create mode 100644 documentation/html/search/variables_7.js create mode 100644 documentation/html/search/variables_8.html create mode 100644 documentation/html/search/variables_8.js create mode 100644 documentation/html/search/variables_9.html create mode 100644 documentation/html/search/variables_9.js create mode 100644 documentation/html/search/variables_a.html create mode 100644 documentation/html/search/variables_a.js create mode 100644 documentation/html/search/variables_b.html create mode 100644 documentation/html/search/variables_b.js create mode 100644 documentation/html/search/variables_c.html create mode 100644 documentation/html/search/variables_c.js create mode 100644 documentation/html/search/variables_d.html create mode 100644 documentation/html/search/variables_d.js create mode 100644 documentation/html/search/variables_e.html create mode 100644 documentation/html/search/variables_e.js create mode 100644 documentation/html/search/variables_f.html create mode 100644 documentation/html/search/variables_f.js create mode 100644 documentation/html/server_8py.html create mode 100644 documentation/html/server_8py_source.html create mode 100644 documentation/html/sign_8c.html create mode 100644 documentation/html/sign_8c_source.html create mode 100644 documentation/html/sign_8h.html create mode 100644 documentation/html/sign_8h_source.html create mode 100644 documentation/html/splitbar.png create mode 100644 documentation/html/structAttrib-members.html create mode 100644 documentation/html/structAttrib.html create mode 100644 documentation/html/structBlock-members.html create mode 100644 documentation/html/structBlock.html create mode 100644 documentation/html/structChunk-members.html create mode 100644 documentation/html/structChunk.html create mode 100644 documentation/html/structFPS-members.html create mode 100644 documentation/html/structFPS.html create mode 100644 documentation/html/structMap-members.html create mode 100644 documentation/html/structMap.html create mode 100644 documentation/html/structMapEntry-members.html create mode 100644 documentation/html/structMapEntry.html create mode 100644 documentation/html/structModel-members.html create mode 100644 documentation/html/structModel.html create mode 100644 documentation/html/structPlayer-members.html create mode 100644 documentation/html/structPlayer.html create mode 100644 documentation/html/structRing-members.html create mode 100644 documentation/html/structRing.html create mode 100644 documentation/html/structRingEntry-members.html create mode 100644 documentation/html/structRingEntry.html create mode 100644 documentation/html/structSign-members.html create mode 100644 documentation/html/structSign.html create mode 100644 documentation/html/structSignList-members.html create mode 100644 documentation/html/structSignList.html create mode 100644 documentation/html/structState-members.html create mode 100644 documentation/html/structState.html create mode 100644 documentation/html/sync_off.png create mode 100644 documentation/html/sync_on.png create mode 100644 documentation/html/tab_a.png create mode 100644 documentation/html/tab_b.png create mode 100644 documentation/html/tab_h.png create mode 100644 documentation/html/tab_s.png create mode 100644 documentation/html/tabs.css create mode 100644 documentation/html/util_8c.html create mode 100644 documentation/html/util_8c_source.html create mode 100644 documentation/html/util_8h.html create mode 100644 documentation/html/util_8h_source.html create mode 100644 documentation/html/world_8c.html create mode 100644 documentation/html/world_8c_source.html create mode 100644 documentation/html/world_8h.html create mode 100644 documentation/html/world_8h_source.html create mode 100644 documentation/html/world_8py.html create mode 100644 documentation/html/world_8py_source.html create mode 100644 html/builder_8py_source.html create mode 100644 html/classbuilder_1_1Client.png delete mode 100644 html/classbuilder_1_1Client__coll__graph.dot delete mode 100644 html/classbuilder_1_1Client__inherit__graph.dot create mode 100644 html/classserver_1_1Handler.png delete mode 100644 html/classserver_1_1Handler__coll__graph.dot delete mode 100644 html/classserver_1_1Handler__inherit__graph.dot create mode 100644 html/classserver_1_1Model.png delete mode 100644 html/classserver_1_1Model__coll__graph.dot delete mode 100644 html/classserver_1_1Model__inherit__graph.dot create mode 100644 html/classserver_1_1RateLimiter.png delete mode 100644 html/classserver_1_1RateLimiter__coll__graph.dot delete mode 100644 html/classserver_1_1RateLimiter__inherit__graph.dot create mode 100644 html/classserver_1_1Server.png delete mode 100644 html/classserver_1_1Server__coll__graph.dot delete mode 100644 html/classserver_1_1Server__inherit__graph.dot create mode 100644 html/classworld_1_1World.png delete mode 100644 html/classworld_1_1World__coll__graph.dot delete mode 100644 html/classworld_1_1World__inherit__graph.dot delete mode 100644 html/doxygen.png create mode 100644 html/doxygen.svg create mode 100644 html/files.html delete mode 100644 html/graph_legend.dot delete mode 100644 html/graph_legend.html delete mode 100644 html/inherit_graph_0.dot delete mode 100644 html/inherit_graph_1.dot delete mode 100644 html/inherit_graph_2.dot delete mode 100644 html/search/close.png create mode 100644 html/search/close.svg delete mode 100644 html/search/mag_sel.png create mode 100644 html/search/mag_sel.svg create mode 100644 html/server_8py_source.html create mode 100644 html/world_8py_source.html diff --git a/CMakeDoxyfile.in b/CMakeDoxyfile.in deleted file mode 100644 index 848a3c819..000000000 --- a/CMakeDoxyfile.in +++ /dev/null @@ -1,280 +0,0 @@ -# -# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! -# - -DOXYFILE_ENCODING = @DOXYGEN_DOXYFILE_ENCODING@ -PROJECT_NAME = @DOXYGEN_PROJECT_NAME@ -PROJECT_NUMBER = @DOXYGEN_PROJECT_NUMBER@ -PROJECT_BRIEF = @DOXYGEN_PROJECT_BRIEF@ -PROJECT_LOGO = @DOXYGEN_PROJECT_LOGO@ -OUTPUT_DIRECTORY = @DOXYGEN_OUTPUT_DIRECTORY@ -CREATE_SUBDIRS = @DOXYGEN_CREATE_SUBDIRS@ -ALLOW_UNICODE_NAMES = @DOXYGEN_ALLOW_UNICODE_NAMES@ -OUTPUT_LANGUAGE = @DOXYGEN_OUTPUT_LANGUAGE@ -OUTPUT_TEXT_DIRECTION = @DOXYGEN_OUTPUT_TEXT_DIRECTION@ -BRIEF_MEMBER_DESC = @DOXYGEN_BRIEF_MEMBER_DESC@ -REPEAT_BRIEF = @DOXYGEN_REPEAT_BRIEF@ -ABBREVIATE_BRIEF = @DOXYGEN_ABBREVIATE_BRIEF@ -ALWAYS_DETAILED_SEC = @DOXYGEN_ALWAYS_DETAILED_SEC@ -INLINE_INHERITED_MEMB = @DOXYGEN_INLINE_INHERITED_MEMB@ -FULL_PATH_NAMES = @DOXYGEN_FULL_PATH_NAMES@ -STRIP_FROM_PATH = @DOXYGEN_STRIP_FROM_PATH@ -STRIP_FROM_INC_PATH = @DOXYGEN_STRIP_FROM_INC_PATH@ -SHORT_NAMES = @DOXYGEN_SHORT_NAMES@ -JAVADOC_AUTOBRIEF = @DOXYGEN_JAVADOC_AUTOBRIEF@ -JAVADOC_BANNER = @DOXYGEN_JAVADOC_BANNER@ -QT_AUTOBRIEF = @DOXYGEN_QT_AUTOBRIEF@ -MULTILINE_CPP_IS_BRIEF = @DOXYGEN_MULTILINE_CPP_IS_BRIEF@ -INHERIT_DOCS = @DOXYGEN_INHERIT_DOCS@ -SEPARATE_MEMBER_PAGES = @DOXYGEN_SEPARATE_MEMBER_PAGES@ -TAB_SIZE = @DOXYGEN_TAB_SIZE@ -ALIASES = @DOXYGEN_ALIASES@ -TCL_SUBST = @DOXYGEN_TCL_SUBST@ -OPTIMIZE_OUTPUT_FOR_C = @DOXYGEN_OPTIMIZE_OUTPUT_FOR_C@ -OPTIMIZE_OUTPUT_JAVA = @DOXYGEN_OPTIMIZE_OUTPUT_JAVA@ -OPTIMIZE_FOR_FORTRAN = @DOXYGEN_OPTIMIZE_FOR_FORTRAN@ -OPTIMIZE_OUTPUT_VHDL = @DOXYGEN_OPTIMIZE_OUTPUT_VHDL@ -OPTIMIZE_OUTPUT_SLICE = @DOXYGEN_OPTIMIZE_OUTPUT_SLICE@ -EXTENSION_MAPPING = @DOXYGEN_EXTENSION_MAPPING@ -MARKDOWN_SUPPORT = @DOXYGEN_MARKDOWN_SUPPORT@ -TOC_INCLUDE_HEADINGS = @DOXYGEN_TOC_INCLUDE_HEADINGS@ -AUTOLINK_SUPPORT = @DOXYGEN_AUTOLINK_SUPPORT@ -BUILTIN_STL_SUPPORT = @DOXYGEN_BUILTIN_STL_SUPPORT@ -CPP_CLI_SUPPORT = @DOXYGEN_CPP_CLI_SUPPORT@ -SIP_SUPPORT = @DOXYGEN_SIP_SUPPORT@ -IDL_PROPERTY_SUPPORT = @DOXYGEN_IDL_PROPERTY_SUPPORT@ -DISTRIBUTE_GROUP_DOC = @DOXYGEN_DISTRIBUTE_GROUP_DOC@ -GROUP_NESTED_COMPOUNDS = @DOXYGEN_GROUP_NESTED_COMPOUNDS@ -SUBGROUPING = @DOXYGEN_SUBGROUPING@ -INLINE_GROUPED_CLASSES = @DOXYGEN_INLINE_GROUPED_CLASSES@ -INLINE_SIMPLE_STRUCTS = @DOXYGEN_INLINE_SIMPLE_STRUCTS@ -TYPEDEF_HIDES_STRUCT = @DOXYGEN_TYPEDEF_HIDES_STRUCT@ -LOOKUP_CACHE_SIZE = @DOXYGEN_LOOKUP_CACHE_SIZE@ -EXTRACT_ALL = @DOXYGEN_EXTRACT_ALL@ -EXTRACT_PRIVATE = @DOXYGEN_EXTRACT_PRIVATE@ -EXTRACT_PRIV_VIRTUAL = @DOXYGEN_EXTRACT_PRIV_VIRTUAL@ -EXTRACT_PACKAGE = @DOXYGEN_EXTRACT_PACKAGE@ -EXTRACT_STATIC = @DOXYGEN_EXTRACT_STATIC@ -EXTRACT_LOCAL_CLASSES = @DOXYGEN_EXTRACT_LOCAL_CLASSES@ -EXTRACT_LOCAL_METHODS = @DOXYGEN_EXTRACT_LOCAL_METHODS@ -EXTRACT_ANON_NSPACES = @DOXYGEN_EXTRACT_ANON_NSPACES@ -HIDE_UNDOC_MEMBERS = @DOXYGEN_HIDE_UNDOC_MEMBERS@ -HIDE_UNDOC_CLASSES = @DOXYGEN_HIDE_UNDOC_CLASSES@ -HIDE_FRIEND_COMPOUNDS = @DOXYGEN_HIDE_FRIEND_COMPOUNDS@ -HIDE_IN_BODY_DOCS = @DOXYGEN_HIDE_IN_BODY_DOCS@ -INTERNAL_DOCS = @DOXYGEN_INTERNAL_DOCS@ -CASE_SENSE_NAMES = @DOXYGEN_CASE_SENSE_NAMES@ -HIDE_SCOPE_NAMES = @DOXYGEN_HIDE_SCOPE_NAMES@ -HIDE_COMPOUND_REFERENCE= @DOXYGEN_HIDE_COMPOUND_REFERENCE@ -SHOW_INCLUDE_FILES = @DOXYGEN_SHOW_INCLUDE_FILES@ -SHOW_GROUPED_MEMB_INC = @DOXYGEN_SHOW_GROUPED_MEMB_INC@ -FORCE_LOCAL_INCLUDES = @DOXYGEN_FORCE_LOCAL_INCLUDES@ -INLINE_INFO = @DOXYGEN_INLINE_INFO@ -SORT_MEMBER_DOCS = @DOXYGEN_SORT_MEMBER_DOCS@ -SORT_BRIEF_DOCS = @DOXYGEN_SORT_BRIEF_DOCS@ -SORT_MEMBERS_CTORS_1ST = @DOXYGEN_SORT_MEMBERS_CTORS_1ST@ -SORT_GROUP_NAMES = @DOXYGEN_SORT_GROUP_NAMES@ -SORT_BY_SCOPE_NAME = @DOXYGEN_SORT_BY_SCOPE_NAME@ -STRICT_PROTO_MATCHING = @DOXYGEN_STRICT_PROTO_MATCHING@ -GENERATE_TODOLIST = @DOXYGEN_GENERATE_TODOLIST@ -GENERATE_TESTLIST = @DOXYGEN_GENERATE_TESTLIST@ -GENERATE_BUGLIST = @DOXYGEN_GENERATE_BUGLIST@ -GENERATE_DEPRECATEDLIST= @DOXYGEN_GENERATE_DEPRECATEDLIST@ -ENABLED_SECTIONS = @DOXYGEN_ENABLED_SECTIONS@ -MAX_INITIALIZER_LINES = @DOXYGEN_MAX_INITIALIZER_LINES@ -SHOW_USED_FILES = @DOXYGEN_SHOW_USED_FILES@ -SHOW_FILES = @DOXYGEN_SHOW_FILES@ -SHOW_NAMESPACES = @DOXYGEN_SHOW_NAMESPACES@ -FILE_VERSION_FILTER = @DOXYGEN_FILE_VERSION_FILTER@ -LAYOUT_FILE = @DOXYGEN_LAYOUT_FILE@ -CITE_BIB_FILES = @DOXYGEN_CITE_BIB_FILES@ -QUIET = @DOXYGEN_QUIET@ -WARNINGS = @DOXYGEN_WARNINGS@ -WARN_IF_UNDOCUMENTED = @DOXYGEN_WARN_IF_UNDOCUMENTED@ -WARN_IF_DOC_ERROR = @DOXYGEN_WARN_IF_DOC_ERROR@ -WARN_NO_PARAMDOC = @DOXYGEN_WARN_NO_PARAMDOC@ -WARN_AS_ERROR = @DOXYGEN_WARN_AS_ERROR@ -WARN_FORMAT = @DOXYGEN_WARN_FORMAT@ -WARN_LOGFILE = @DOXYGEN_WARN_LOGFILE@ -INPUT = @DOXYGEN_INPUT@ -INPUT_ENCODING = @DOXYGEN_INPUT_ENCODING@ -FILE_PATTERNS = @DOXYGEN_FILE_PATTERNS@ -RECURSIVE = @DOXYGEN_RECURSIVE@ -EXCLUDE = @DOXYGEN_EXCLUDE@ -EXCLUDE_SYMLINKS = @DOXYGEN_EXCLUDE_SYMLINKS@ -EXCLUDE_PATTERNS = @DOXYGEN_EXCLUDE_PATTERNS@ -EXCLUDE_SYMBOLS = @DOXYGEN_EXCLUDE_SYMBOLS@ -EXAMPLE_PATH = @DOXYGEN_EXAMPLE_PATH@ -EXAMPLE_PATTERNS = @DOXYGEN_EXAMPLE_PATTERNS@ -EXAMPLE_RECURSIVE = @DOXYGEN_EXAMPLE_RECURSIVE@ -IMAGE_PATH = @DOXYGEN_IMAGE_PATH@ -INPUT_FILTER = @DOXYGEN_INPUT_FILTER@ -FILTER_PATTERNS = @DOXYGEN_FILTER_PATTERNS@ -FILTER_SOURCE_FILES = @DOXYGEN_FILTER_SOURCE_FILES@ -FILTER_SOURCE_PATTERNS = @DOXYGEN_FILTER_SOURCE_PATTERNS@ -USE_MDFILE_AS_MAINPAGE = @DOXYGEN_USE_MDFILE_AS_MAINPAGE@ -SOURCE_BROWSER = @DOXYGEN_SOURCE_BROWSER@ -INLINE_SOURCES = @DOXYGEN_INLINE_SOURCES@ -STRIP_CODE_COMMENTS = @DOXYGEN_STRIP_CODE_COMMENTS@ -REFERENCED_BY_RELATION = @DOXYGEN_REFERENCED_BY_RELATION@ -REFERENCES_RELATION = @DOXYGEN_REFERENCES_RELATION@ -REFERENCES_LINK_SOURCE = @DOXYGEN_REFERENCES_LINK_SOURCE@ -SOURCE_TOOLTIPS = @DOXYGEN_SOURCE_TOOLTIPS@ -USE_HTAGS = @DOXYGEN_USE_HTAGS@ -VERBATIM_HEADERS = @DOXYGEN_VERBATIM_HEADERS@ -CLANG_ASSISTED_PARSING = @DOXYGEN_CLANG_ASSISTED_PARSING@ -CLANG_OPTIONS = @DOXYGEN_CLANG_OPTIONS@ -CLANG_DATABASE_PATH = @DOXYGEN_CLANG_DATABASE_PATH@ -ALPHABETICAL_INDEX = @DOXYGEN_ALPHABETICAL_INDEX@ -COLS_IN_ALPHA_INDEX = @DOXYGEN_COLS_IN_ALPHA_INDEX@ -IGNORE_PREFIX = @DOXYGEN_IGNORE_PREFIX@ -GENERATE_HTML = @DOXYGEN_GENERATE_HTML@ -HTML_OUTPUT = @DOXYGEN_HTML_OUTPUT@ -HTML_FILE_EXTENSION = @DOXYGEN_HTML_FILE_EXTENSION@ -HTML_HEADER = @DOXYGEN_HTML_HEADER@ -HTML_FOOTER = @DOXYGEN_HTML_FOOTER@ -HTML_STYLESHEET = @DOXYGEN_HTML_STYLESHEET@ -HTML_EXTRA_STYLESHEET = @DOXYGEN_HTML_EXTRA_STYLESHEET@ -HTML_EXTRA_FILES = @DOXYGEN_HTML_EXTRA_FILES@ -HTML_COLORSTYLE_HUE = @DOXYGEN_HTML_COLORSTYLE_HUE@ -HTML_COLORSTYLE_SAT = @DOXYGEN_HTML_COLORSTYLE_SAT@ -HTML_COLORSTYLE_GAMMA = @DOXYGEN_HTML_COLORSTYLE_GAMMA@ -HTML_TIMESTAMP = @DOXYGEN_HTML_TIMESTAMP@ -HTML_DYNAMIC_MENUS = @DOXYGEN_HTML_DYNAMIC_MENUS@ -HTML_DYNAMIC_SECTIONS = @DOXYGEN_HTML_DYNAMIC_SECTIONS@ -HTML_INDEX_NUM_ENTRIES = @DOXYGEN_HTML_INDEX_NUM_ENTRIES@ -GENERATE_DOCSET = @DOXYGEN_GENERATE_DOCSET@ -DOCSET_FEEDNAME = @DOXYGEN_DOCSET_FEEDNAME@ -DOCSET_BUNDLE_ID = @DOXYGEN_DOCSET_BUNDLE_ID@ -DOCSET_PUBLISHER_ID = @DOXYGEN_DOCSET_PUBLISHER_ID@ -DOCSET_PUBLISHER_NAME = @DOXYGEN_DOCSET_PUBLISHER_NAME@ -GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ -CHM_FILE = @DOXYGEN_CHM_FILE@ -HHC_LOCATION = @DOXYGEN_HHC_LOCATION@ -GENERATE_CHI = @DOXYGEN_GENERATE_CHI@ -CHM_INDEX_ENCODING = @DOXYGEN_CHM_INDEX_ENCODING@ -BINARY_TOC = @DOXYGEN_BINARY_TOC@ -TOC_EXPAND = @DOXYGEN_TOC_EXPAND@ -GENERATE_QHP = @DOXYGEN_GENERATE_QHP@ -QCH_FILE = @DOXYGEN_QCH_FILE@ -QHP_NAMESPACE = @DOXYGEN_QHP_NAMESPACE@ -QHP_VIRTUAL_FOLDER = @DOXYGEN_QHP_VIRTUAL_FOLDER@ -QHP_CUST_FILTER_NAME = @DOXYGEN_QHP_CUST_FILTER_NAME@ -QHP_CUST_FILTER_ATTRS = @DOXYGEN_QHP_CUST_FILTER_ATTRS@ -QHP_SECT_FILTER_ATTRS = @DOXYGEN_QHP_SECT_FILTER_ATTRS@ -QHG_LOCATION = @DOXYGEN_QHG_LOCATION@ -GENERATE_ECLIPSEHELP = @DOXYGEN_GENERATE_ECLIPSEHELP@ -ECLIPSE_DOC_ID = @DOXYGEN_ECLIPSE_DOC_ID@ -DISABLE_INDEX = @DOXYGEN_DISABLE_INDEX@ -GENERATE_TREEVIEW = @DOXYGEN_GENERATE_TREEVIEW@ -ENUM_VALUES_PER_LINE = @DOXYGEN_ENUM_VALUES_PER_LINE@ -TREEVIEW_WIDTH = @DOXYGEN_TREEVIEW_WIDTH@ -EXT_LINKS_IN_WINDOW = @DOXYGEN_EXT_LINKS_IN_WINDOW@ -FORMULA_FONTSIZE = @DOXYGEN_FORMULA_FONTSIZE@ -FORMULA_TRANSPARENT = @DOXYGEN_FORMULA_TRANSPARENT@ -FORMULA_MACROFILE = @DOXYGEN_FORMULA_MACROFILE@ -USE_MATHJAX = @DOXYGEN_USE_MATHJAX@ -MATHJAX_FORMAT = @DOXYGEN_MATHJAX_FORMAT@ -MATHJAX_RELPATH = @DOXYGEN_MATHJAX_RELPATH@ -MATHJAX_EXTENSIONS = @DOXYGEN_MATHJAX_EXTENSIONS@ -MATHJAX_CODEFILE = @DOXYGEN_MATHJAX_CODEFILE@ -SEARCHENGINE = @DOXYGEN_SEARCHENGINE@ -SERVER_BASED_SEARCH = @DOXYGEN_SERVER_BASED_SEARCH@ -EXTERNAL_SEARCH = @DOXYGEN_EXTERNAL_SEARCH@ -SEARCHENGINE_URL = @DOXYGEN_SEARCHENGINE_URL@ -SEARCHDATA_FILE = @DOXYGEN_SEARCHDATA_FILE@ -EXTERNAL_SEARCH_ID = @DOXYGEN_EXTERNAL_SEARCH_ID@ -EXTRA_SEARCH_MAPPINGS = @DOXYGEN_EXTRA_SEARCH_MAPPINGS@ -GENERATE_LATEX = @DOXYGEN_GENERATE_LATEX@ -LATEX_OUTPUT = @DOXYGEN_LATEX_OUTPUT@ -LATEX_CMD_NAME = @DOXYGEN_LATEX_CMD_NAME@ -MAKEINDEX_CMD_NAME = @DOXYGEN_MAKEINDEX_CMD_NAME@ -LATEX_MAKEINDEX_CMD = @DOXYGEN_LATEX_MAKEINDEX_CMD@ -COMPACT_LATEX = @DOXYGEN_COMPACT_LATEX@ -PAPER_TYPE = @DOXYGEN_PAPER_TYPE@ -EXTRA_PACKAGES = @DOXYGEN_EXTRA_PACKAGES@ -LATEX_HEADER = @DOXYGEN_LATEX_HEADER@ -LATEX_FOOTER = @DOXYGEN_LATEX_FOOTER@ -LATEX_EXTRA_STYLESHEET = @DOXYGEN_LATEX_EXTRA_STYLESHEET@ -LATEX_EXTRA_FILES = @DOXYGEN_LATEX_EXTRA_FILES@ -PDF_HYPERLINKS = @DOXYGEN_PDF_HYPERLINKS@ -USE_PDFLATEX = @DOXYGEN_USE_PDFLATEX@ -LATEX_BATCHMODE = @DOXYGEN_LATEX_BATCHMODE@ -LATEX_HIDE_INDICES = @DOXYGEN_LATEX_HIDE_INDICES@ -LATEX_SOURCE_CODE = @DOXYGEN_LATEX_SOURCE_CODE@ -LATEX_BIB_STYLE = @DOXYGEN_LATEX_BIB_STYLE@ -LATEX_TIMESTAMP = @DOXYGEN_LATEX_TIMESTAMP@ -LATEX_EMOJI_DIRECTORY = @DOXYGEN_LATEX_EMOJI_DIRECTORY@ -GENERATE_RTF = @DOXYGEN_GENERATE_RTF@ -RTF_OUTPUT = @DOXYGEN_RTF_OUTPUT@ -COMPACT_RTF = @DOXYGEN_COMPACT_RTF@ -RTF_HYPERLINKS = @DOXYGEN_RTF_HYPERLINKS@ -RTF_STYLESHEET_FILE = @DOXYGEN_RTF_STYLESHEET_FILE@ -RTF_EXTENSIONS_FILE = @DOXYGEN_RTF_EXTENSIONS_FILE@ -RTF_SOURCE_CODE = @DOXYGEN_RTF_SOURCE_CODE@ -GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ -MAN_OUTPUT = @DOXYGEN_MAN_OUTPUT@ -MAN_EXTENSION = @DOXYGEN_MAN_EXTENSION@ -MAN_SUBDIR = @DOXYGEN_MAN_SUBDIR@ -MAN_LINKS = @DOXYGEN_MAN_LINKS@ -GENERATE_XML = @DOXYGEN_GENERATE_XML@ -XML_OUTPUT = @DOXYGEN_XML_OUTPUT@ -XML_PROGRAMLISTING = @DOXYGEN_XML_PROGRAMLISTING@ -XML_NS_MEMB_FILE_SCOPE = @DOXYGEN_XML_NS_MEMB_FILE_SCOPE@ -GENERATE_DOCBOOK = @DOXYGEN_GENERATE_DOCBOOK@ -DOCBOOK_OUTPUT = @DOXYGEN_DOCBOOK_OUTPUT@ -DOCBOOK_PROGRAMLISTING = @DOXYGEN_DOCBOOK_PROGRAMLISTING@ -GENERATE_AUTOGEN_DEF = @DOXYGEN_GENERATE_AUTOGEN_DEF@ -GENERATE_PERLMOD = @DOXYGEN_GENERATE_PERLMOD@ -PERLMOD_LATEX = @DOXYGEN_PERLMOD_LATEX@ -PERLMOD_PRETTY = @DOXYGEN_PERLMOD_PRETTY@ -PERLMOD_MAKEVAR_PREFIX = @DOXYGEN_PERLMOD_MAKEVAR_PREFIX@ -ENABLE_PREPROCESSING = @DOXYGEN_ENABLE_PREPROCESSING@ -MACRO_EXPANSION = @DOXYGEN_MACRO_EXPANSION@ -EXPAND_ONLY_PREDEF = @DOXYGEN_EXPAND_ONLY_PREDEF@ -SEARCH_INCLUDES = @DOXYGEN_SEARCH_INCLUDES@ -INCLUDE_PATH = @DOXYGEN_INCLUDE_PATH@ -INCLUDE_FILE_PATTERNS = @DOXYGEN_INCLUDE_FILE_PATTERNS@ -PREDEFINED = @DOXYGEN_PREDEFINED@ -EXPAND_AS_DEFINED = @DOXYGEN_EXPAND_AS_DEFINED@ -SKIP_FUNCTION_MACROS = @DOXYGEN_SKIP_FUNCTION_MACROS@ -TAGFILES = @DOXYGEN_TAGFILES@ -GENERATE_TAGFILE = @DOXYGEN_GENERATE_TAGFILE@ -ALLEXTERNALS = @DOXYGEN_ALLEXTERNALS@ -EXTERNAL_GROUPS = @DOXYGEN_EXTERNAL_GROUPS@ -EXTERNAL_PAGES = @DOXYGEN_EXTERNAL_PAGES@ -CLASS_DIAGRAMS = @DOXYGEN_CLASS_DIAGRAMS@ -DIA_PATH = @DOXYGEN_DIA_PATH@ -HIDE_UNDOC_RELATIONS = @DOXYGEN_HIDE_UNDOC_RELATIONS@ -HAVE_DOT = @DOXYGEN_HAVE_DOT@ -DOT_NUM_THREADS = @DOXYGEN_DOT_NUM_THREADS@ -DOT_FONTNAME = @DOXYGEN_DOT_FONTNAME@ -DOT_FONTSIZE = @DOXYGEN_DOT_FONTSIZE@ -DOT_FONTPATH = @DOXYGEN_DOT_FONTPATH@ -CLASS_GRAPH = @DOXYGEN_CLASS_GRAPH@ -COLLABORATION_GRAPH = @DOXYGEN_COLLABORATION_GRAPH@ -GROUP_GRAPHS = @DOXYGEN_GROUP_GRAPHS@ -UML_LOOK = @DOXYGEN_UML_LOOK@ -UML_LIMIT_NUM_FIELDS = @DOXYGEN_UML_LIMIT_NUM_FIELDS@ -TEMPLATE_RELATIONS = @DOXYGEN_TEMPLATE_RELATIONS@ -INCLUDE_GRAPH = @DOXYGEN_INCLUDE_GRAPH@ -INCLUDED_BY_GRAPH = @DOXYGEN_INCLUDED_BY_GRAPH@ -CALL_GRAPH = @DOXYGEN_CALL_GRAPH@ -CALLER_GRAPH = @DOXYGEN_CALLER_GRAPH@ -GRAPHICAL_HIERARCHY = @DOXYGEN_GRAPHICAL_HIERARCHY@ -DIRECTORY_GRAPH = @DOXYGEN_DIRECTORY_GRAPH@ -DOT_IMAGE_FORMAT = @DOXYGEN_DOT_IMAGE_FORMAT@ -INTERACTIVE_SVG = @DOXYGEN_INTERACTIVE_SVG@ -DOT_PATH = @DOXYGEN_DOT_PATH@ -DOTFILE_DIRS = @DOXYGEN_DOTFILE_DIRS@ -MSCFILE_DIRS = @DOXYGEN_MSCFILE_DIRS@ -DIAFILE_DIRS = @DOXYGEN_DIAFILE_DIRS@ -PLANTUML_JAR_PATH = @DOXYGEN_PLANTUML_JAR_PATH@ -PLANTUML_CFG_FILE = @DOXYGEN_PLANTUML_CFG_FILE@ -PLANTUML_INCLUDE_PATH = @DOXYGEN_PLANTUML_INCLUDE_PATH@ -DOT_GRAPH_MAX_NODES = @DOXYGEN_DOT_GRAPH_MAX_NODES@ -MAX_DOT_GRAPH_DEPTH = @DOXYGEN_MAX_DOT_GRAPH_DEPTH@ -DOT_TRANSPARENT = @DOXYGEN_DOT_TRANSPARENT@ -DOT_MULTI_TARGETS = @DOXYGEN_DOT_MULTI_TARGETS@ -GENERATE_LEGEND = @DOXYGEN_GENERATE_LEGEND@ -DOT_CLEANUP = @DOXYGEN_DOT_CLEANUP@ diff --git a/CMakeDoxygenDefaults.cmake b/CMakeDoxygenDefaults.cmake deleted file mode 100644 index db28798f1..000000000 --- a/CMakeDoxygenDefaults.cmake +++ /dev/null @@ -1,672 +0,0 @@ -# -# DO NOT EDIT! THIS FILE WAS GENERATED BY CMAKE! -# - -if(NOT DEFINED DOXYGEN_DOXYFILE_ENCODING) - set(DOXYGEN_DOXYFILE_ENCODING UTF-8) -endif() -if(NOT DEFINED DOXYGEN_PROJECT_NAME) - set(DOXYGEN_PROJECT_NAME "My Project") -endif() -if(NOT DEFINED DOXYGEN_CREATE_SUBDIRS) - set(DOXYGEN_CREATE_SUBDIRS NO) -endif() -if(NOT DEFINED DOXYGEN_ALLOW_UNICODE_NAMES) - set(DOXYGEN_ALLOW_UNICODE_NAMES NO) -endif() -if(NOT DEFINED DOXYGEN_OUTPUT_LANGUAGE) - set(DOXYGEN_OUTPUT_LANGUAGE English) -endif() -if(NOT DEFINED DOXYGEN_OUTPUT_TEXT_DIRECTION) - set(DOXYGEN_OUTPUT_TEXT_DIRECTION None) -endif() -if(NOT DEFINED DOXYGEN_BRIEF_MEMBER_DESC) - set(DOXYGEN_BRIEF_MEMBER_DESC YES) -endif() -if(NOT DEFINED DOXYGEN_REPEAT_BRIEF) - set(DOXYGEN_REPEAT_BRIEF YES) -endif() -if(NOT DEFINED DOXYGEN_ABBREVIATE_BRIEF) - set(DOXYGEN_ABBREVIATE_BRIEF "The $name class" - "The $name widget" - "The $name file" - is - provides - specifies - contains - represents - a - an - the) -endif() -if(NOT DEFINED DOXYGEN_ALWAYS_DETAILED_SEC) - set(DOXYGEN_ALWAYS_DETAILED_SEC NO) -endif() -if(NOT DEFINED DOXYGEN_INLINE_INHERITED_MEMB) - set(DOXYGEN_INLINE_INHERITED_MEMB NO) -endif() -if(NOT DEFINED DOXYGEN_FULL_PATH_NAMES) - set(DOXYGEN_FULL_PATH_NAMES YES) -endif() -if(NOT DEFINED DOXYGEN_SHORT_NAMES) - set(DOXYGEN_SHORT_NAMES NO) -endif() -if(NOT DEFINED DOXYGEN_JAVADOC_AUTOBRIEF) - set(DOXYGEN_JAVADOC_AUTOBRIEF NO) -endif() -if(NOT DEFINED DOXYGEN_JAVADOC_BANNER) - set(DOXYGEN_JAVADOC_BANNER NO) -endif() -if(NOT DEFINED DOXYGEN_QT_AUTOBRIEF) - set(DOXYGEN_QT_AUTOBRIEF NO) -endif() -if(NOT DEFINED DOXYGEN_MULTILINE_CPP_IS_BRIEF) - set(DOXYGEN_MULTILINE_CPP_IS_BRIEF NO) -endif() -if(NOT DEFINED DOXYGEN_INHERIT_DOCS) - set(DOXYGEN_INHERIT_DOCS YES) -endif() -if(NOT DEFINED DOXYGEN_SEPARATE_MEMBER_PAGES) - set(DOXYGEN_SEPARATE_MEMBER_PAGES NO) -endif() -if(NOT DEFINED DOXYGEN_TAB_SIZE) - set(DOXYGEN_TAB_SIZE 4) -endif() -if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_FOR_C) - set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C NO) -endif() -if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_JAVA) - set(DOXYGEN_OPTIMIZE_OUTPUT_JAVA NO) -endif() -if(NOT DEFINED DOXYGEN_OPTIMIZE_FOR_FORTRAN) - set(DOXYGEN_OPTIMIZE_FOR_FORTRAN NO) -endif() -if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_VHDL) - set(DOXYGEN_OPTIMIZE_OUTPUT_VHDL NO) -endif() -if(NOT DEFINED DOXYGEN_OPTIMIZE_OUTPUT_SLICE) - set(DOXYGEN_OPTIMIZE_OUTPUT_SLICE NO) -endif() -if(NOT DEFINED DOXYGEN_MARKDOWN_SUPPORT) - set(DOXYGEN_MARKDOWN_SUPPORT YES) -endif() -if(NOT DEFINED DOXYGEN_TOC_INCLUDE_HEADINGS) - set(DOXYGEN_TOC_INCLUDE_HEADINGS 5) -endif() -if(NOT DEFINED DOXYGEN_AUTOLINK_SUPPORT) - set(DOXYGEN_AUTOLINK_SUPPORT YES) -endif() -if(NOT DEFINED DOXYGEN_BUILTIN_STL_SUPPORT) - set(DOXYGEN_BUILTIN_STL_SUPPORT NO) -endif() -if(NOT DEFINED DOXYGEN_CPP_CLI_SUPPORT) - set(DOXYGEN_CPP_CLI_SUPPORT NO) -endif() -if(NOT DEFINED DOXYGEN_SIP_SUPPORT) - set(DOXYGEN_SIP_SUPPORT NO) -endif() -if(NOT DEFINED DOXYGEN_IDL_PROPERTY_SUPPORT) - set(DOXYGEN_IDL_PROPERTY_SUPPORT YES) -endif() -if(NOT DEFINED DOXYGEN_DISTRIBUTE_GROUP_DOC) - set(DOXYGEN_DISTRIBUTE_GROUP_DOC NO) -endif() -if(NOT DEFINED DOXYGEN_GROUP_NESTED_COMPOUNDS) - set(DOXYGEN_GROUP_NESTED_COMPOUNDS NO) -endif() -if(NOT DEFINED DOXYGEN_SUBGROUPING) - set(DOXYGEN_SUBGROUPING YES) -endif() -if(NOT DEFINED DOXYGEN_INLINE_GROUPED_CLASSES) - set(DOXYGEN_INLINE_GROUPED_CLASSES NO) -endif() -if(NOT DEFINED DOXYGEN_INLINE_SIMPLE_STRUCTS) - set(DOXYGEN_INLINE_SIMPLE_STRUCTS NO) -endif() -if(NOT DEFINED DOXYGEN_TYPEDEF_HIDES_STRUCT) - set(DOXYGEN_TYPEDEF_HIDES_STRUCT NO) -endif() -if(NOT DEFINED DOXYGEN_LOOKUP_CACHE_SIZE) - set(DOXYGEN_LOOKUP_CACHE_SIZE 0) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_ALL) - set(DOXYGEN_EXTRACT_ALL NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_PRIVATE) - set(DOXYGEN_EXTRACT_PRIVATE NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_PRIV_VIRTUAL) - set(DOXYGEN_EXTRACT_PRIV_VIRTUAL NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_PACKAGE) - set(DOXYGEN_EXTRACT_PACKAGE NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_STATIC) - set(DOXYGEN_EXTRACT_STATIC NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_CLASSES) - set(DOXYGEN_EXTRACT_LOCAL_CLASSES YES) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_LOCAL_METHODS) - set(DOXYGEN_EXTRACT_LOCAL_METHODS NO) -endif() -if(NOT DEFINED DOXYGEN_EXTRACT_ANON_NSPACES) - set(DOXYGEN_EXTRACT_ANON_NSPACES NO) -endif() -if(NOT DEFINED DOXYGEN_HIDE_UNDOC_MEMBERS) - set(DOXYGEN_HIDE_UNDOC_MEMBERS NO) -endif() -if(NOT DEFINED DOXYGEN_HIDE_UNDOC_CLASSES) - set(DOXYGEN_HIDE_UNDOC_CLASSES NO) -endif() -if(NOT DEFINED DOXYGEN_HIDE_FRIEND_COMPOUNDS) - set(DOXYGEN_HIDE_FRIEND_COMPOUNDS NO) -endif() -if(NOT DEFINED DOXYGEN_HIDE_IN_BODY_DOCS) - set(DOXYGEN_HIDE_IN_BODY_DOCS NO) -endif() -if(NOT DEFINED DOXYGEN_INTERNAL_DOCS) - set(DOXYGEN_INTERNAL_DOCS NO) -endif() -if(NOT DEFINED DOXYGEN_CASE_SENSE_NAMES) - set(DOXYGEN_CASE_SENSE_NAMES YES) -endif() -if(NOT DEFINED DOXYGEN_HIDE_SCOPE_NAMES) - set(DOXYGEN_HIDE_SCOPE_NAMES NO) -endif() -if(NOT DEFINED DOXYGEN_HIDE_COMPOUND_REFERENCE) - set(DOXYGEN_HIDE_COMPOUND_REFERENCE NO) -endif() -if(NOT DEFINED DOXYGEN_SHOW_INCLUDE_FILES) - set(DOXYGEN_SHOW_INCLUDE_FILES YES) -endif() -if(NOT DEFINED DOXYGEN_SHOW_GROUPED_MEMB_INC) - set(DOXYGEN_SHOW_GROUPED_MEMB_INC NO) -endif() -if(NOT DEFINED DOXYGEN_FORCE_LOCAL_INCLUDES) - set(DOXYGEN_FORCE_LOCAL_INCLUDES NO) -endif() -if(NOT DEFINED DOXYGEN_INLINE_INFO) - set(DOXYGEN_INLINE_INFO YES) -endif() -if(NOT DEFINED DOXYGEN_SORT_MEMBER_DOCS) - set(DOXYGEN_SORT_MEMBER_DOCS YES) -endif() -if(NOT DEFINED DOXYGEN_SORT_BRIEF_DOCS) - set(DOXYGEN_SORT_BRIEF_DOCS NO) -endif() -if(NOT DEFINED DOXYGEN_SORT_MEMBERS_CTORS_1ST) - set(DOXYGEN_SORT_MEMBERS_CTORS_1ST NO) -endif() -if(NOT DEFINED DOXYGEN_SORT_GROUP_NAMES) - set(DOXYGEN_SORT_GROUP_NAMES NO) -endif() -if(NOT DEFINED DOXYGEN_SORT_BY_SCOPE_NAME) - set(DOXYGEN_SORT_BY_SCOPE_NAME NO) -endif() -if(NOT DEFINED DOXYGEN_STRICT_PROTO_MATCHING) - set(DOXYGEN_STRICT_PROTO_MATCHING NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_TODOLIST) - set(DOXYGEN_GENERATE_TODOLIST YES) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_TESTLIST) - set(DOXYGEN_GENERATE_TESTLIST YES) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_BUGLIST) - set(DOXYGEN_GENERATE_BUGLIST YES) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_DEPRECATEDLIST) - set(DOXYGEN_GENERATE_DEPRECATEDLIST YES) -endif() -if(NOT DEFINED DOXYGEN_MAX_INITIALIZER_LINES) - set(DOXYGEN_MAX_INITIALIZER_LINES 30) -endif() -if(NOT DEFINED DOXYGEN_SHOW_USED_FILES) - set(DOXYGEN_SHOW_USED_FILES YES) -endif() -if(NOT DEFINED DOXYGEN_SHOW_FILES) - set(DOXYGEN_SHOW_FILES YES) -endif() -if(NOT DEFINED DOXYGEN_SHOW_NAMESPACES) - set(DOXYGEN_SHOW_NAMESPACES YES) -endif() -if(NOT DEFINED DOXYGEN_QUIET) - set(DOXYGEN_QUIET NO) -endif() -if(NOT DEFINED DOXYGEN_WARNINGS) - set(DOXYGEN_WARNINGS YES) -endif() -if(NOT DEFINED DOXYGEN_WARN_IF_UNDOCUMENTED) - set(DOXYGEN_WARN_IF_UNDOCUMENTED YES) -endif() -if(NOT DEFINED DOXYGEN_WARN_IF_DOC_ERROR) - set(DOXYGEN_WARN_IF_DOC_ERROR YES) -endif() -if(NOT DEFINED DOXYGEN_WARN_NO_PARAMDOC) - set(DOXYGEN_WARN_NO_PARAMDOC NO) -endif() -if(NOT DEFINED DOXYGEN_WARN_AS_ERROR) - set(DOXYGEN_WARN_AS_ERROR NO) -endif() -if(NOT DEFINED DOXYGEN_WARN_FORMAT) - set(DOXYGEN_WARN_FORMAT "$file:$line: $text") -endif() -if(NOT DEFINED DOXYGEN_INPUT_ENCODING) - set(DOXYGEN_INPUT_ENCODING UTF-8) -endif() -if(NOT DEFINED DOXYGEN_FILE_PATTERNS) - set(DOXYGEN_FILE_PATTERNS *.c - *.cc - *.cxx - *.cpp - *.c++ - *.java - *.ii - *.ixx - *.ipp - *.i++ - *.inl - *.idl - *.ddl - *.odl - *.h - *.hh - *.hxx - *.hpp - *.h++ - *.cs - *.d - *.php - *.php4 - *.php5 - *.phtml - *.inc - *.m - *.markdown - *.md - *.mm - *.dox - *.doc - *.txt - *.py - *.pyw - *.f90 - *.f95 - *.f03 - *.f08 - *.f - *.for - *.tcl - *.vhd - *.vhdl - *.ucf - *.qsf - *.ice) -endif() -if(NOT DEFINED DOXYGEN_RECURSIVE) - set(DOXYGEN_RECURSIVE NO) -endif() -if(NOT DEFINED DOXYGEN_EXCLUDE_SYMLINKS) - set(DOXYGEN_EXCLUDE_SYMLINKS NO) -endif() -if(NOT DEFINED DOXYGEN_EXAMPLE_PATTERNS) - set(DOXYGEN_EXAMPLE_PATTERNS *) -endif() -if(NOT DEFINED DOXYGEN_EXAMPLE_RECURSIVE) - set(DOXYGEN_EXAMPLE_RECURSIVE NO) -endif() -if(NOT DEFINED DOXYGEN_FILTER_SOURCE_FILES) - set(DOXYGEN_FILTER_SOURCE_FILES NO) -endif() -if(NOT DEFINED DOXYGEN_SOURCE_BROWSER) - set(DOXYGEN_SOURCE_BROWSER NO) -endif() -if(NOT DEFINED DOXYGEN_INLINE_SOURCES) - set(DOXYGEN_INLINE_SOURCES NO) -endif() -if(NOT DEFINED DOXYGEN_STRIP_CODE_COMMENTS) - set(DOXYGEN_STRIP_CODE_COMMENTS YES) -endif() -if(NOT DEFINED DOXYGEN_REFERENCED_BY_RELATION) - set(DOXYGEN_REFERENCED_BY_RELATION NO) -endif() -if(NOT DEFINED DOXYGEN_REFERENCES_RELATION) - set(DOXYGEN_REFERENCES_RELATION NO) -endif() -if(NOT DEFINED DOXYGEN_REFERENCES_LINK_SOURCE) - set(DOXYGEN_REFERENCES_LINK_SOURCE YES) -endif() -if(NOT DEFINED DOXYGEN_SOURCE_TOOLTIPS) - set(DOXYGEN_SOURCE_TOOLTIPS YES) -endif() -if(NOT DEFINED DOXYGEN_USE_HTAGS) - set(DOXYGEN_USE_HTAGS NO) -endif() -if(NOT DEFINED DOXYGEN_VERBATIM_HEADERS) - set(DOXYGEN_VERBATIM_HEADERS YES) -endif() -if(NOT DEFINED DOXYGEN_CLANG_ASSISTED_PARSING) - set(DOXYGEN_CLANG_ASSISTED_PARSING NO) -endif() -if(NOT DEFINED DOXYGEN_ALPHABETICAL_INDEX) - set(DOXYGEN_ALPHABETICAL_INDEX YES) -endif() -if(NOT DEFINED DOXYGEN_COLS_IN_ALPHA_INDEX) - set(DOXYGEN_COLS_IN_ALPHA_INDEX 5) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_HTML) - set(DOXYGEN_GENERATE_HTML YES) -endif() -if(NOT DEFINED DOXYGEN_HTML_OUTPUT) - set(DOXYGEN_HTML_OUTPUT html) -endif() -if(NOT DEFINED DOXYGEN_HTML_FILE_EXTENSION) - set(DOXYGEN_HTML_FILE_EXTENSION .html) -endif() -if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_HUE) - set(DOXYGEN_HTML_COLORSTYLE_HUE 220) -endif() -if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_SAT) - set(DOXYGEN_HTML_COLORSTYLE_SAT 100) -endif() -if(NOT DEFINED DOXYGEN_HTML_COLORSTYLE_GAMMA) - set(DOXYGEN_HTML_COLORSTYLE_GAMMA 80) -endif() -if(NOT DEFINED DOXYGEN_HTML_TIMESTAMP) - set(DOXYGEN_HTML_TIMESTAMP NO) -endif() -if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_MENUS) - set(DOXYGEN_HTML_DYNAMIC_MENUS YES) -endif() -if(NOT DEFINED DOXYGEN_HTML_DYNAMIC_SECTIONS) - set(DOXYGEN_HTML_DYNAMIC_SECTIONS NO) -endif() -if(NOT DEFINED DOXYGEN_HTML_INDEX_NUM_ENTRIES) - set(DOXYGEN_HTML_INDEX_NUM_ENTRIES 100) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_DOCSET) - set(DOXYGEN_GENERATE_DOCSET NO) -endif() -if(NOT DEFINED DOXYGEN_DOCSET_FEEDNAME) - set(DOXYGEN_DOCSET_FEEDNAME "Doxygen generated docs") -endif() -if(NOT DEFINED DOXYGEN_DOCSET_BUNDLE_ID) - set(DOXYGEN_DOCSET_BUNDLE_ID org.doxygen.Project) -endif() -if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_ID) - set(DOXYGEN_DOCSET_PUBLISHER_ID org.doxygen.Publisher) -endif() -if(NOT DEFINED DOXYGEN_DOCSET_PUBLISHER_NAME) - set(DOXYGEN_DOCSET_PUBLISHER_NAME Publisher) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_HTMLHELP) - set(DOXYGEN_GENERATE_HTMLHELP NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_CHI) - set(DOXYGEN_GENERATE_CHI NO) -endif() -if(NOT DEFINED DOXYGEN_BINARY_TOC) - set(DOXYGEN_BINARY_TOC NO) -endif() -if(NOT DEFINED DOXYGEN_TOC_EXPAND) - set(DOXYGEN_TOC_EXPAND NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_QHP) - set(DOXYGEN_GENERATE_QHP NO) -endif() -if(NOT DEFINED DOXYGEN_QHP_NAMESPACE) - set(DOXYGEN_QHP_NAMESPACE org.doxygen.Project) -endif() -if(NOT DEFINED DOXYGEN_QHP_VIRTUAL_FOLDER) - set(DOXYGEN_QHP_VIRTUAL_FOLDER doc) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_ECLIPSEHELP) - set(DOXYGEN_GENERATE_ECLIPSEHELP NO) -endif() -if(NOT DEFINED DOXYGEN_ECLIPSE_DOC_ID) - set(DOXYGEN_ECLIPSE_DOC_ID org.doxygen.Project) -endif() -if(NOT DEFINED DOXYGEN_DISABLE_INDEX) - set(DOXYGEN_DISABLE_INDEX NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_TREEVIEW) - set(DOXYGEN_GENERATE_TREEVIEW NO) -endif() -if(NOT DEFINED DOXYGEN_ENUM_VALUES_PER_LINE) - set(DOXYGEN_ENUM_VALUES_PER_LINE 4) -endif() -if(NOT DEFINED DOXYGEN_TREEVIEW_WIDTH) - set(DOXYGEN_TREEVIEW_WIDTH 250) -endif() -if(NOT DEFINED DOXYGEN_EXT_LINKS_IN_WINDOW) - set(DOXYGEN_EXT_LINKS_IN_WINDOW NO) -endif() -if(NOT DEFINED DOXYGEN_FORMULA_FONTSIZE) - set(DOXYGEN_FORMULA_FONTSIZE 10) -endif() -if(NOT DEFINED DOXYGEN_FORMULA_TRANSPARENT) - set(DOXYGEN_FORMULA_TRANSPARENT YES) -endif() -if(NOT DEFINED DOXYGEN_USE_MATHJAX) - set(DOXYGEN_USE_MATHJAX NO) -endif() -if(NOT DEFINED DOXYGEN_MATHJAX_FORMAT) - set(DOXYGEN_MATHJAX_FORMAT HTML-CSS) -endif() -if(NOT DEFINED DOXYGEN_MATHJAX_RELPATH) - set(DOXYGEN_MATHJAX_RELPATH https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/) -endif() -if(NOT DEFINED DOXYGEN_SEARCHENGINE) - set(DOXYGEN_SEARCHENGINE YES) -endif() -if(NOT DEFINED DOXYGEN_SERVER_BASED_SEARCH) - set(DOXYGEN_SERVER_BASED_SEARCH NO) -endif() -if(NOT DEFINED DOXYGEN_EXTERNAL_SEARCH) - set(DOXYGEN_EXTERNAL_SEARCH NO) -endif() -if(NOT DEFINED DOXYGEN_SEARCHDATA_FILE) - set(DOXYGEN_SEARCHDATA_FILE searchdata.xml) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_LATEX) - set(DOXYGEN_GENERATE_LATEX YES) -endif() -if(NOT DEFINED DOXYGEN_LATEX_OUTPUT) - set(DOXYGEN_LATEX_OUTPUT latex) -endif() -if(NOT DEFINED DOXYGEN_MAKEINDEX_CMD_NAME) - set(DOXYGEN_MAKEINDEX_CMD_NAME makeindex) -endif() -if(NOT DEFINED DOXYGEN_LATEX_MAKEINDEX_CMD) - set(DOXYGEN_LATEX_MAKEINDEX_CMD makeindex) -endif() -if(NOT DEFINED DOXYGEN_COMPACT_LATEX) - set(DOXYGEN_COMPACT_LATEX NO) -endif() -if(NOT DEFINED DOXYGEN_PAPER_TYPE) - set(DOXYGEN_PAPER_TYPE a4) -endif() -if(NOT DEFINED DOXYGEN_PDF_HYPERLINKS) - set(DOXYGEN_PDF_HYPERLINKS YES) -endif() -if(NOT DEFINED DOXYGEN_USE_PDFLATEX) - set(DOXYGEN_USE_PDFLATEX YES) -endif() -if(NOT DEFINED DOXYGEN_LATEX_BATCHMODE) - set(DOXYGEN_LATEX_BATCHMODE NO) -endif() -if(NOT DEFINED DOXYGEN_LATEX_HIDE_INDICES) - set(DOXYGEN_LATEX_HIDE_INDICES NO) -endif() -if(NOT DEFINED DOXYGEN_LATEX_SOURCE_CODE) - set(DOXYGEN_LATEX_SOURCE_CODE NO) -endif() -if(NOT DEFINED DOXYGEN_LATEX_BIB_STYLE) - set(DOXYGEN_LATEX_BIB_STYLE plain) -endif() -if(NOT DEFINED DOXYGEN_LATEX_TIMESTAMP) - set(DOXYGEN_LATEX_TIMESTAMP NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_RTF) - set(DOXYGEN_GENERATE_RTF NO) -endif() -if(NOT DEFINED DOXYGEN_RTF_OUTPUT) - set(DOXYGEN_RTF_OUTPUT rtf) -endif() -if(NOT DEFINED DOXYGEN_COMPACT_RTF) - set(DOXYGEN_COMPACT_RTF NO) -endif() -if(NOT DEFINED DOXYGEN_RTF_HYPERLINKS) - set(DOXYGEN_RTF_HYPERLINKS NO) -endif() -if(NOT DEFINED DOXYGEN_RTF_SOURCE_CODE) - set(DOXYGEN_RTF_SOURCE_CODE NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_MAN) - set(DOXYGEN_GENERATE_MAN NO) -endif() -if(NOT DEFINED DOXYGEN_MAN_OUTPUT) - set(DOXYGEN_MAN_OUTPUT man) -endif() -if(NOT DEFINED DOXYGEN_MAN_EXTENSION) - set(DOXYGEN_MAN_EXTENSION .3) -endif() -if(NOT DEFINED DOXYGEN_MAN_LINKS) - set(DOXYGEN_MAN_LINKS NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_XML) - set(DOXYGEN_GENERATE_XML NO) -endif() -if(NOT DEFINED DOXYGEN_XML_OUTPUT) - set(DOXYGEN_XML_OUTPUT xml) -endif() -if(NOT DEFINED DOXYGEN_XML_PROGRAMLISTING) - set(DOXYGEN_XML_PROGRAMLISTING YES) -endif() -if(NOT DEFINED DOXYGEN_XML_NS_MEMB_FILE_SCOPE) - set(DOXYGEN_XML_NS_MEMB_FILE_SCOPE NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_DOCBOOK) - set(DOXYGEN_GENERATE_DOCBOOK NO) -endif() -if(NOT DEFINED DOXYGEN_DOCBOOK_OUTPUT) - set(DOXYGEN_DOCBOOK_OUTPUT docbook) -endif() -if(NOT DEFINED DOXYGEN_DOCBOOK_PROGRAMLISTING) - set(DOXYGEN_DOCBOOK_PROGRAMLISTING NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_AUTOGEN_DEF) - set(DOXYGEN_GENERATE_AUTOGEN_DEF NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_PERLMOD) - set(DOXYGEN_GENERATE_PERLMOD NO) -endif() -if(NOT DEFINED DOXYGEN_PERLMOD_LATEX) - set(DOXYGEN_PERLMOD_LATEX NO) -endif() -if(NOT DEFINED DOXYGEN_PERLMOD_PRETTY) - set(DOXYGEN_PERLMOD_PRETTY YES) -endif() -if(NOT DEFINED DOXYGEN_ENABLE_PREPROCESSING) - set(DOXYGEN_ENABLE_PREPROCESSING YES) -endif() -if(NOT DEFINED DOXYGEN_MACRO_EXPANSION) - set(DOXYGEN_MACRO_EXPANSION NO) -endif() -if(NOT DEFINED DOXYGEN_EXPAND_ONLY_PREDEF) - set(DOXYGEN_EXPAND_ONLY_PREDEF NO) -endif() -if(NOT DEFINED DOXYGEN_SEARCH_INCLUDES) - set(DOXYGEN_SEARCH_INCLUDES YES) -endif() -if(NOT DEFINED DOXYGEN_SKIP_FUNCTION_MACROS) - set(DOXYGEN_SKIP_FUNCTION_MACROS YES) -endif() -if(NOT DEFINED DOXYGEN_ALLEXTERNALS) - set(DOXYGEN_ALLEXTERNALS NO) -endif() -if(NOT DEFINED DOXYGEN_EXTERNAL_GROUPS) - set(DOXYGEN_EXTERNAL_GROUPS YES) -endif() -if(NOT DEFINED DOXYGEN_EXTERNAL_PAGES) - set(DOXYGEN_EXTERNAL_PAGES YES) -endif() -if(NOT DEFINED DOXYGEN_CLASS_DIAGRAMS) - set(DOXYGEN_CLASS_DIAGRAMS YES) -endif() -if(NOT DEFINED DOXYGEN_HIDE_UNDOC_RELATIONS) - set(DOXYGEN_HIDE_UNDOC_RELATIONS YES) -endif() -if(NOT DEFINED DOXYGEN_HAVE_DOT) - set(DOXYGEN_HAVE_DOT YES) -endif() -if(NOT DEFINED DOXYGEN_DOT_NUM_THREADS) - set(DOXYGEN_DOT_NUM_THREADS 0) -endif() -if(NOT DEFINED DOXYGEN_DOT_FONTNAME) - set(DOXYGEN_DOT_FONTNAME Helvetica) -endif() -if(NOT DEFINED DOXYGEN_DOT_FONTSIZE) - set(DOXYGEN_DOT_FONTSIZE 10) -endif() -if(NOT DEFINED DOXYGEN_CLASS_GRAPH) - set(DOXYGEN_CLASS_GRAPH YES) -endif() -if(NOT DEFINED DOXYGEN_COLLABORATION_GRAPH) - set(DOXYGEN_COLLABORATION_GRAPH YES) -endif() -if(NOT DEFINED DOXYGEN_GROUP_GRAPHS) - set(DOXYGEN_GROUP_GRAPHS YES) -endif() -if(NOT DEFINED DOXYGEN_UML_LOOK) - set(DOXYGEN_UML_LOOK NO) -endif() -if(NOT DEFINED DOXYGEN_UML_LIMIT_NUM_FIELDS) - set(DOXYGEN_UML_LIMIT_NUM_FIELDS 10) -endif() -if(NOT DEFINED DOXYGEN_TEMPLATE_RELATIONS) - set(DOXYGEN_TEMPLATE_RELATIONS NO) -endif() -if(NOT DEFINED DOXYGEN_INCLUDE_GRAPH) - set(DOXYGEN_INCLUDE_GRAPH YES) -endif() -if(NOT DEFINED DOXYGEN_INCLUDED_BY_GRAPH) - set(DOXYGEN_INCLUDED_BY_GRAPH YES) -endif() -if(NOT DEFINED DOXYGEN_CALL_GRAPH) - set(DOXYGEN_CALL_GRAPH NO) -endif() -if(NOT DEFINED DOXYGEN_CALLER_GRAPH) - set(DOXYGEN_CALLER_GRAPH NO) -endif() -if(NOT DEFINED DOXYGEN_GRAPHICAL_HIERARCHY) - set(DOXYGEN_GRAPHICAL_HIERARCHY YES) -endif() -if(NOT DEFINED DOXYGEN_DIRECTORY_GRAPH) - set(DOXYGEN_DIRECTORY_GRAPH YES) -endif() -if(NOT DEFINED DOXYGEN_DOT_IMAGE_FORMAT) - set(DOXYGEN_DOT_IMAGE_FORMAT png) -endif() -if(NOT DEFINED DOXYGEN_INTERACTIVE_SVG) - set(DOXYGEN_INTERACTIVE_SVG NO) -endif() -if(NOT DEFINED DOXYGEN_DOT_GRAPH_MAX_NODES) - set(DOXYGEN_DOT_GRAPH_MAX_NODES 50) -endif() -if(NOT DEFINED DOXYGEN_MAX_DOT_GRAPH_DEPTH) - set(DOXYGEN_MAX_DOT_GRAPH_DEPTH 0) -endif() -if(NOT DEFINED DOXYGEN_DOT_TRANSPARENT) - set(DOXYGEN_DOT_TRANSPARENT NO) -endif() -if(NOT DEFINED DOXYGEN_DOT_MULTI_TARGETS) - set(DOXYGEN_DOT_MULTI_TARGETS NO) -endif() -if(NOT DEFINED DOXYGEN_GENERATE_LEGEND) - set(DOXYGEN_GENERATE_LEGEND YES) -endif() -if(NOT DEFINED DOXYGEN_DOT_CLEANUP) - set(DOXYGEN_DOT_CLEANUP YES) -endif() diff --git a/Doxyfile b/documentation/Doxyfile similarity index 91% rename from Doxyfile rename to documentation/Doxyfile index 95929b43f..46959a452 100644 --- a/Doxyfile +++ b/documentation/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.17 +# Doxyfile 1.9.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "My Project" +PROJECT_NAME = "Craft" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -93,14 +93,6 @@ ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English -# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all generated output in the proper direction. -# Possible values are: None, LTR, RTL and Context. -# The default value is: None. - -OUTPUT_TEXT_DIRECTION = None - # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. @@ -227,6 +219,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -250,25 +250,19 @@ TAB_SIZE = 4 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines (in the resulting output). You can put ^^ in the value part of an -# alias to insert a newline as if a physical newline was in the original file. -# When you need a literal { or } or , in the value part of an alias you have to -# escape them by means of a backslash (\), this can lead to conflicts with the -# commands \{ and \} for these it is advised to use the version @{ and @} or use -# a double escape (\\{ and \\}) +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) ALIASES = -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = - # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all @@ -310,18 +304,21 @@ OPTIMIZE_OUTPUT_SLICE = NO # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, -# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, -# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the -# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat -# .inc files as Fortran files (default is PHP), and .f files as C (default is -# Fortran), use: inc=Fortran f=C. +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. EXTENSION_MAPPING = @@ -455,6 +452,19 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which efficively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -467,13 +477,13 @@ LOOKUP_CACHE_SIZE = 0 # normally produced when WARNINGS is set to YES. # The default value is: NO. -EXTRACT_ALL = NO +EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. -EXTRACT_PRIVATE = NO +EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. @@ -491,7 +501,7 @@ EXTRACT_PACKAGE = NO # included in the documentation. # The default value is: NO. -EXTRACT_STATIC = NO +EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, @@ -518,6 +528,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -555,11 +572,18 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# (including Cygwin) ands Mac users are advised to set this option to NO. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. # The default value is: system dependent. CASE_SENSE_NAMES = YES @@ -781,24 +805,35 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. If -# EXTRACT_ALL is set to YES then this flag will automatically be disabled. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -829,13 +864,14 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = +INPUT = ../ \ + ../src # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 @@ -848,12 +884,14 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), -# *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen -# C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ @@ -875,6 +913,7 @@ FILE_PATTERNS = *.c \ *.hxx \ *.hpp \ *.h++ \ + *.l \ *.cs \ *.d \ *.php \ @@ -887,17 +926,15 @@ FILE_PATTERNS = *.c \ *.md \ *.mm \ *.dox \ - *.doc \ - *.txt \ *.py \ *.pyw \ *.f90 \ *.f95 \ *.f03 \ *.f08 \ + *.f18 \ *.f \ *.for \ - *.tcl \ *.vhd \ *.vhdl \ *.ucf \ @@ -950,7 +987,7 @@ EXCLUDE_SYMBOLS = # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -1039,13 +1076,13 @@ USE_MDFILE_AS_MAINPAGE = # also VERBATIM_HEADERS is set to NO. # The default value is: NO. -SOURCE_BROWSER = NO +SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. -INLINE_SOURCES = NO +INLINE_SOURCES = YES # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and @@ -1114,35 +1151,6 @@ USE_HTAGS = NO VERBATIM_HEADERS = YES -# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. -# The default value is: NO. - -CLANG_ASSISTED_PARSING = NO - -# If clang assisted parsing is enabled you can provide the compiler with command -# line options that you would normally use when invoking the compiler. Note that -# the include paths will already be set by doxygen for the files and directories -# specified with INPUT and INCLUDE_PATH. -# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. - -CLANG_OPTIONS = - -# If clang assisted parsing is enabled you can provide the clang parser with the -# path to the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files -# were built. This is equivalent to specifying the "-p" option to a clang tool, -# such as clang-check. These options will then be passed to the parser. -# Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse_libclang=ON option for CMake. - -CLANG_DATABASE_PATH = - #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- @@ -1154,13 +1162,6 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = YES -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -COLS_IN_ALPHA_INDEX = 5 - # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored @@ -1331,10 +1332,11 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/xcode/), introduced with OSX -# 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. @@ -1376,8 +1378,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1407,7 +1413,7 @@ CHM_FILE = HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1452,7 +1458,8 @@ QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1460,8 +1467,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- -# folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1469,16 +1476,16 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- -# filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = @@ -1490,9 +1497,9 @@ QHP_CUST_FILTER_ATTRS = QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = @@ -1569,6 +1576,17 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1608,7 +1626,7 @@ USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. @@ -1624,10 +1642,10 @@ MATHJAX_FORMAT = HTML-CSS # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. -# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. +# The default value is: https://cdn.jsdelivr.net/npm/mathjax@2. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/ +MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example @@ -1638,7 +1656,8 @@ MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1685,7 +1704,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1698,8 +1718,9 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. SEARCHENGINE_URL = @@ -1808,29 +1829,31 @@ PAPER_TYPE = a4 EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_FOOTER = @@ -1863,9 +1886,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -2297,9 +2322,9 @@ HIDE_UNDOC_RELATIONS = YES # http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent # Bell Labs. The other options in this section have no effect if this option is # set to NO -# The default value is: YES. +# The default value is: NO. -HAVE_DOT = YES +HAVE_DOT = NO # The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed # to run in parallel. When set to 0 doxygen will base this on the number of @@ -2376,10 +2401,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2453,9 +2500,7 @@ DIRECTORY_GRAPH = YES # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). -# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd, -# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo, -# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo, +# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, # png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # png:gdiplus:gdiplus. # The default value is: png. @@ -2571,9 +2616,11 @@ DOT_MULTI_TARGETS = NO GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc and +# plantuml temporary files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES diff --git a/html/inherits.html b/documentation/html/LICENSE_8md.html similarity index 75% rename from html/inherits.html rename to documentation/html/LICENSE_8md.html index 4c56d263f..dc2151ec0 100644 --- a/html/inherits.html +++ b/documentation/html/LICENSE_8md.html @@ -3,9 +3,9 @@ - + -My Project: Class Hierarchy +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/LICENSE.md File Reference @@ -21,7 +21,7 @@ -
    My Project +
    Craft
    @@ -29,10 +29,10 @@
    - + @@ -45,7 +45,6 @@ }); /* @license-end */ -
    +
    -
    Class Hierarchy
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/LICENSE.md File Reference
    diff --git a/documentation/html/README_8md.html b/documentation/html/README_8md.html new file mode 100644 index 000000000..6088785fd --- /dev/null +++ b/documentation/html/README_8md.html @@ -0,0 +1,74 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/README.md File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/README.md File Reference
    +
    +
    +
    + + + + diff --git a/documentation/html/annotated.html b/documentation/html/annotated.html new file mode 100644 index 000000000..2e4290017 --- /dev/null +++ b/documentation/html/annotated.html @@ -0,0 +1,100 @@ + + + + + + + +Craft: Class List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class List
    +
    +
    +
    Here are the classes, structs, unions and interfaces with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + +
     Nbuilder
     CClient
     Nserver
     CRateLimiter
     CServer
     CHandler
     CModel
     Nworld
     CWorld
     CAttrib
     CBlock
     CChunk
     CFPS
     CMap
     CMapEntry
     CModel
     CPlayer
     CRing
     CRingEntry
     CSign
     CSignList
     CState
    +
    +
    + + + + diff --git a/documentation/html/auth_8c.html b/documentation/html/auth_8c.html new file mode 100644 index 000000000..cc99716c9 --- /dev/null +++ b/documentation/html/auth_8c.html @@ -0,0 +1,261 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/auth.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    auth.c File Reference
    +
    +
    +
    #include <curl/curl.h>
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include "auth.h"
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Macros

    #define MAX_POST_LENGTH   1024
     
    #define MAX_RESPONSE_LENGTH   1024
     
    + + + + + +

    +Functions

    size_t write_function (char *data, size_t size, size_t count, void *arg)
     
    int get_access_token (char *result, int length, char *username, char *identity_token)
     
    +

    Macro Definition Documentation

    + +

    ◆ MAX_POST_LENGTH

    + +
    +
    + + + + +
    #define MAX_POST_LENGTH   1024
    +
    + +

    Definition at line 7 of file auth.c.

    + +
    +
    + +

    ◆ MAX_RESPONSE_LENGTH

    + +
    +
    + + + + +
    #define MAX_RESPONSE_LENGTH   1024
    +
    + +

    Definition at line 8 of file auth.c.

    + +
    +
    +

    Function Documentation

    + +

    ◆ get_access_token()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int get_access_token (char * result,
    int length,
    char * username,
    char * identity_token 
    )
    +
    + +

    Definition at line 21 of file auth.c.

    +
    23 {
    +
    24  static char url[] = "https://craft.michaelfogleman.com/api/1/identity";
    +
    25  strncpy(result, "", length);
    +
    26  CURL *curl = curl_easy_init();
    +
    27  if (curl) {
    +
    28  char post[MAX_POST_LENGTH] = {0};
    +
    29  char response[MAX_RESPONSE_LENGTH] = {0};
    +
    30  long http_code = 0;
    +
    31  snprintf(post, MAX_POST_LENGTH, "username=%s&identity_token=%s",
    +
    32  username, identity_token);
    +
    33  #ifdef _WIN32
    +
    34  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    +
    35  #endif
    +
    36  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function);
    +
    37  curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
    +
    38  curl_easy_setopt(curl, CURLOPT_URL, url);
    +
    39  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
    +
    40  CURLcode code = curl_easy_perform(curl);
    +
    41  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
    +
    42  curl_easy_cleanup(curl);
    +
    43  if (code == CURLE_OK && http_code == 200) {
    +
    44  strncpy(result, response, length);
    +
    45  return 1;
    +
    46  }
    +
    47  }
    +
    48  return 0;
    +
    49 }
    +
    size_t write_function(char *data, size_t size, size_t count, void *arg)
    Definition: auth.c:10
    +
    #define MAX_POST_LENGTH
    Definition: auth.c:7
    +
    #define MAX_RESPONSE_LENGTH
    Definition: auth.c:8
    +
    +
    +
    + +

    ◆ write_function()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    size_t write_function (char * data,
    size_t size,
    size_t count,
    void * arg 
    )
    +
    + +

    Definition at line 10 of file auth.c.

    +
    10  {
    +
    11  size_t length = size * count;
    +
    12  char *dst = (char *)arg;
    +
    13  char *src = malloc(length + 1);
    +
    14  memcpy(src, data, length);
    +
    15  src[length] = '\0';
    +
    16  strncat(dst, src, MAX_RESPONSE_LENGTH - strlen(dst) - 1);
    +
    17  free(src);
    +
    18  return length;
    +
    19 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/auth_8c_source.html b/documentation/html/auth_8c_source.html new file mode 100644 index 000000000..83999edae --- /dev/null +++ b/documentation/html/auth_8c_source.html @@ -0,0 +1,132 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/auth.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    auth.c
    +
    +
    +Go to the documentation of this file.
    1 #include <curl/curl.h>
    +
    2 #include <stdio.h>
    +
    3 #include <stdlib.h>
    +
    4 #include <string.h>
    +
    5 #include "auth.h"
    +
    6 
    +
    7 #define MAX_POST_LENGTH 1024
    +
    8 #define MAX_RESPONSE_LENGTH 1024
    +
    9 
    +
    10 size_t write_function(char *data, size_t size, size_t count, void *arg) {
    +
    11  size_t length = size * count;
    +
    12  char *dst = (char *)arg;
    +
    13  char *src = malloc(length + 1);
    +
    14  memcpy(src, data, length);
    +
    15  src[length] = '\0';
    +
    16  strncat(dst, src, MAX_RESPONSE_LENGTH - strlen(dst) - 1);
    +
    17  free(src);
    +
    18  return length;
    +
    19 }
    +
    20 
    + +
    22  char *result, int length, char *username, char *identity_token)
    +
    23 {
    +
    24  static char url[] = "https://craft.michaelfogleman.com/api/1/identity";
    +
    25  strncpy(result, "", length);
    +
    26  CURL *curl = curl_easy_init();
    +
    27  if (curl) {
    +
    28  char post[MAX_POST_LENGTH] = {0};
    +
    29  char response[MAX_RESPONSE_LENGTH] = {0};
    +
    30  long http_code = 0;
    +
    31  snprintf(post, MAX_POST_LENGTH, "username=%s&identity_token=%s",
    +
    32  username, identity_token);
    +
    33  #ifdef _WIN32
    +
    34  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    +
    35  #endif
    +
    36  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function);
    +
    37  curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
    +
    38  curl_easy_setopt(curl, CURLOPT_URL, url);
    +
    39  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
    +
    40  CURLcode code = curl_easy_perform(curl);
    +
    41  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
    +
    42  curl_easy_cleanup(curl);
    +
    43  if (code == CURLE_OK && http_code == 200) {
    +
    44  strncpy(result, response, length);
    +
    45  return 1;
    +
    46  }
    +
    47  }
    +
    48  return 0;
    +
    49 }
    +
    size_t write_function(char *data, size_t size, size_t count, void *arg)
    Definition: auth.c:10
    +
    int get_access_token(char *result, int length, char *username, char *identity_token)
    Definition: auth.c:21
    +
    #define MAX_POST_LENGTH
    Definition: auth.c:7
    +
    #define MAX_RESPONSE_LENGTH
    Definition: auth.c:8
    + +
    + + + + diff --git a/documentation/html/auth_8h.html b/documentation/html/auth_8h.html new file mode 100644 index 000000000..0d08a3553 --- /dev/null +++ b/documentation/html/auth_8h.html @@ -0,0 +1,161 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/auth.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    auth.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Functions

    int get_access_token (char *result, int length, char *username, char *identity_token)
     
    +

    Function Documentation

    + +

    ◆ get_access_token()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int get_access_token (char * result,
    int length,
    char * username,
    char * identity_token 
    )
    +
    + +

    Definition at line 21 of file auth.c.

    +
    23 {
    +
    24  static char url[] = "https://craft.michaelfogleman.com/api/1/identity";
    +
    25  strncpy(result, "", length);
    +
    26  CURL *curl = curl_easy_init();
    +
    27  if (curl) {
    +
    28  char post[MAX_POST_LENGTH] = {0};
    +
    29  char response[MAX_RESPONSE_LENGTH] = {0};
    +
    30  long http_code = 0;
    +
    31  snprintf(post, MAX_POST_LENGTH, "username=%s&identity_token=%s",
    +
    32  username, identity_token);
    +
    33  #ifdef _WIN32
    +
    34  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
    +
    35  #endif
    +
    36  curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function);
    +
    37  curl_easy_setopt(curl, CURLOPT_WRITEDATA, response);
    +
    38  curl_easy_setopt(curl, CURLOPT_URL, url);
    +
    39  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post);
    +
    40  CURLcode code = curl_easy_perform(curl);
    +
    41  curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
    +
    42  curl_easy_cleanup(curl);
    +
    43  if (code == CURLE_OK && http_code == 200) {
    +
    44  strncpy(result, response, length);
    +
    45  return 1;
    +
    46  }
    +
    47  }
    +
    48  return 0;
    +
    49 }
    +
    size_t write_function(char *data, size_t size, size_t count, void *arg)
    Definition: auth.c:10
    +
    #define MAX_POST_LENGTH
    Definition: auth.c:7
    +
    #define MAX_RESPONSE_LENGTH
    Definition: auth.c:8
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/auth_8h_source.html b/documentation/html/auth_8h_source.html new file mode 100644 index 000000000..e93fd4850 --- /dev/null +++ b/documentation/html/auth_8h_source.html @@ -0,0 +1,86 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/auth.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    auth.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _auth_h_
    +
    2 #define _auth_h_
    +
    3 
    + +
    5  char *result, int length, char *username, char *identity_token);
    +
    6 
    +
    7 #endif
    +
    int get_access_token(char *result, int length, char *username, char *identity_token)
    Definition: auth.c:21
    +
    + + + + diff --git a/documentation/html/bc_s.png b/documentation/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/documentation/html/bdwn.png b/documentation/html/bdwn.png new file mode 100644 index 0000000000000000000000000000000000000000..940a0b950443a0bb1b216ac03c45b8a16c955452 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/builder.py File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/builder.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  builder.Client
     
    + + + +

    +Namespaces

    namespace  builder
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def builder.sphere (cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False)
     
    def builder.circle_x (x, y, z, r, fill=False)
     
    def builder.circle_y (x, y, z, r, fill=False)
     
    def builder.circle_z (x, y, z, r, fill=False)
     
    def builder.cylinder_x (x1, x2, y, z, r, fill=False)
     
    def builder.cylinder_y (x, y1, y2, z, r, fill=False)
     
    def builder.cylinder_z (x, y, z1, z2, r, fill=False)
     
    def builder.cuboid (x1, x2, y1, y2, z1, z2, fill=True)
     
    def builder.pyramid (x1, x2, y, z1, z2, fill=False)
     
    def builder.get_identity ()
     
    def builder.get_client ()
     
    def builder.main ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    string builder.DEFAULT_HOST = '127.0.0.1'
     
    int builder.DEFAULT_PORT = 4080
     
    int builder.EMPTY = 0
     
    int builder.GRASS = 1
     
    int builder.SAND = 2
     
    int builder.STONE = 3
     
    int builder.BRICK = 4
     
    int builder.WOOD = 5
     
    int builder.CEMENT = 6
     
    int builder.DIRT = 7
     
    int builder.PLANK = 8
     
    int builder.SNOW = 9
     
    int builder.GLASS = 10
     
    int builder.COBBLE = 11
     
    int builder.LIGHT_STONE = 12
     
    int builder.DARK_STONE = 13
     
    int builder.CHEST = 14
     
    int builder.LEAVES = 15
     
    int builder.CLOUD = 16
     
    int builder.TALL_GRASS = 17
     
    int builder.YELLOW_FLOWER = 18
     
    int builder.RED_FLOWER = 19
     
    int builder.PURPLE_FLOWER = 20
     
    int builder.SUN_FLOWER = 21
     
    int builder.WHITE_FLOWER = 22
     
    int builder.BLUE_FLOWER = 23
     
    list builder.OFFSETS
     
    +
    + + + + diff --git a/documentation/html/builder_8py_source.html b/documentation/html/builder_8py_source.html new file mode 100644 index 000000000..6dbd401e9 --- /dev/null +++ b/documentation/html/builder_8py_source.html @@ -0,0 +1,341 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/builder.py Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/builder.py
    +
    +
    +Go to the documentation of this file.
    1 # This file allows you to programmatically create blocks in Craft.
    +
    2 # Please use this wisely. Test on your own server first. Do not abuse it.
    +
    3 
    +
    4 import requests
    +
    5 import socket
    +
    6 import sqlite3
    +
    7 import sys
    +
    8 
    +
    9 DEFAULT_HOST = '127.0.0.1'
    +
    10 DEFAULT_PORT = 4080
    +
    11 
    +
    12 EMPTY = 0
    +
    13 GRASS = 1
    +
    14 SAND = 2
    +
    15 STONE = 3
    +
    16 BRICK = 4
    +
    17 WOOD = 5
    +
    18 CEMENT = 6
    +
    19 DIRT = 7
    +
    20 PLANK = 8
    +
    21 SNOW = 9
    +
    22 GLASS = 10
    +
    23 COBBLE = 11
    +
    24 LIGHT_STONE = 12
    +
    25 DARK_STONE = 13
    +
    26 CHEST = 14
    +
    27 LEAVES = 15
    +
    28 CLOUD = 16
    +
    29 TALL_GRASS = 17
    +
    30 YELLOW_FLOWER = 18
    +
    31 RED_FLOWER = 19
    +
    32 PURPLE_FLOWER = 20
    +
    33 SUN_FLOWER = 21
    +
    34 WHITE_FLOWER = 22
    +
    35 BLUE_FLOWER = 23
    +
    36 
    +
    37 OFFSETS = [
    +
    38  (-0.5, -0.5, -0.5),
    +
    39  (-0.5, -0.5, 0.5),
    +
    40  (-0.5, 0.5, -0.5),
    +
    41  (-0.5, 0.5, 0.5),
    +
    42  (0.5, -0.5, -0.5),
    +
    43  (0.5, -0.5, 0.5),
    +
    44  (0.5, 0.5, -0.5),
    +
    45  (0.5, 0.5, 0.5),
    +
    46 ]
    +
    47 
    +
    48 def sphere(cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False):
    +
    49  result = set()
    +
    50  for x in range(cx - r, cx + r + 1):
    +
    51  if fx and x != cx:
    +
    52  continue
    +
    53  for y in range(cy - r, cy + r + 1):
    +
    54  # if y < cy:
    +
    55  # continue # top hemisphere only
    +
    56  if fy and y != cy:
    +
    57  continue
    +
    58  for z in range(cz - r, cz + r + 1):
    +
    59  if fz and z != cz:
    +
    60  continue
    +
    61  inside = False
    +
    62  outside = fill
    +
    63  for dx, dy, dz in OFFSETS:
    +
    64  ox, oy, oz = x + dx, y + dy, z + dz
    +
    65  d2 = (ox - cx) ** 2 + (oy - cy) ** 2 + (oz - cz) ** 2
    +
    66  d = d2 ** 0.5
    +
    67  if d < r:
    +
    68  inside = True
    +
    69  else:
    +
    70  outside = True
    +
    71  if inside and outside:
    +
    72  result.add((x, y, z))
    +
    73  return result
    +
    74 
    +
    75 def circle_x(x, y, z, r, fill=False):
    +
    76  return sphere(x, y, z, r, fill, fx=True)
    +
    77 
    +
    78 def circle_y(x, y, z, r, fill=False):
    +
    79  return sphere(x, y, z, r, fill, fy=True)
    +
    80 
    +
    81 def circle_z(x, y, z, r, fill=False):
    +
    82  return sphere(x, y, z, r, fill, fz=True)
    +
    83 
    +
    84 def cylinder_x(x1, x2, y, z, r, fill=False):
    +
    85  x1, x2 = sorted((x1, x2))
    +
    86  result = set()
    +
    87  for x in range(x1, x2 + 1):
    +
    88  result |= circle_x(x, y, z, r, fill)
    +
    89  return result
    +
    90 
    +
    91 def cylinder_y(x, y1, y2, z, r, fill=False):
    +
    92  y1, y2 = sorted((y1, y2))
    +
    93  result = set()
    +
    94  for y in range(y1, y2 + 1):
    +
    95  result |= circle_y(x, y, z, r, fill)
    +
    96  return result
    +
    97 
    +
    98 def cylinder_z(x, y, z1, z2, r, fill=False):
    +
    99  z1, z2 = sorted((z1, z2))
    +
    100  result = set()
    +
    101  for z in range(z1, z2 + 1):
    +
    102  result |= circle_z(x, y, z, r, fill)
    +
    103  return result
    +
    104 
    +
    105 def cuboid(x1, x2, y1, y2, z1, z2, fill=True):
    +
    106  x1, x2 = sorted((x1, x2))
    +
    107  y1, y2 = sorted((y1, y2))
    +
    108  z1, z2 = sorted((z1, z2))
    +
    109  result = set()
    +
    110  a = (x1 == x2) + (y1 == y2) + (z1 == z2)
    +
    111  for x in range(x1, x2 + 1):
    +
    112  for y in range(y1, y2 + 1):
    +
    113  for z in range(z1, z2 + 1):
    +
    114  n = 0
    +
    115  n += x in (x1, x2)
    +
    116  n += y in (y1, y2)
    +
    117  n += z in (z1, z2)
    +
    118  if not fill and n <= a:
    +
    119  continue
    +
    120  result.add((x, y, z))
    +
    121  return result
    +
    122 
    +
    123 def pyramid(x1, x2, y, z1, z2, fill=False):
    +
    124  x1, x2 = sorted((x1, x2))
    +
    125  z1, z2 = sorted((z1, z2))
    +
    126  result = set()
    +
    127  while x2 >= x1 and z2 >= z2:
    +
    128  result |= cuboid(x1, x2, y, y, z1, z2, fill)
    +
    129  y, x1, x2, z1, z2 = y + 1, x1 + 1, x2 - 1, z1 + 1, z2 - 1
    +
    130  return result
    +
    131 
    + +
    133  query = (
    +
    134  'select username, token from identity_token where selected = 1;'
    +
    135  )
    +
    136  conn = sqlite3.connect('auth.db')
    +
    137  rows = conn.execute(query)
    +
    138  for row in rows:
    +
    139  return row
    +
    140  raise Exception('No identities found.')
    +
    141 
    +
    142 class Client(object):
    +
    143  def __init__(self, host, port):
    +
    144  self.connconn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    +
    145  self.connconn.connect((host, port))
    +
    146  self.authenticateauthenticate()
    +
    147  def authenticate(self):
    +
    148  username, identity_token = get_identity()
    +
    149  url = 'https://craft.michaelfogleman.com/api/1/identity'
    +
    150  payload = {
    +
    151  'username': username,
    +
    152  'identity_token': identity_token,
    +
    153  }
    +
    154  response = requests.post(url, data=payload)
    +
    155  if response.status_code == 200 and response.text.isalnum():
    +
    156  access_token = response.text
    +
    157  self.connconn.sendall('A,%s,%s\n' % (username, access_token))
    +
    158  else:
    +
    159  raise Exception('Failed to authenticate.')
    +
    160  def set_block(self, x, y, z, w):
    +
    161  self.connconn.sendall('B,%d,%d,%d,%d\n' % (x, y, z, w))
    +
    162  def set_blocks(self, blocks, w):
    +
    163  key = lambda block: (block[1], block[0], block[2])
    +
    164  for x, y, z in sorted(blocks, key=key):
    +
    165  self.set_blockset_block(x, y, z, w)
    +
    166  def bitmap(self, sx, sy, sz, d1, d2, data, lookup):
    +
    167  x, y, z = sx, sy, sz
    +
    168  dx1, dy1, dz1 = d1
    +
    169  dx2, dy2, dz2 = d2
    +
    170  for row in data:
    +
    171  x = sx if dx1 else x
    +
    172  y = sy if dy1 else y
    +
    173  z = sz if dz1 else z
    +
    174  for c in row:
    +
    175  w = lookup.get(c)
    +
    176  if w is not None:
    +
    177  self.set_blockset_block(x, y, z, w)
    +
    178  x, y, z = x + dx1, y + dy1, z + dz1
    +
    179  x, y, z = x + dx2, y + dy2, z + dz2
    +
    180 
    + +
    182  default_args = [DEFAULT_HOST, DEFAULT_PORT]
    +
    183  args = sys.argv[1:] + [None] * len(default_args)
    +
    184  host, port = [a or b for a, b in zip(args, default_args)]
    +
    185  client = Client(host, int(port))
    +
    186  return client
    +
    187 
    +
    188 def main():
    +
    189  client = get_client()
    +
    190  set_block = client.set_block
    +
    191  set_blocks = client.set_blocks
    +
    192  # set_blocks(circle_y(0, 32, 0, 16, True), STONE)
    +
    193  # set_blocks(circle_y(0, 33, 0, 16), BRICK)
    +
    194  # set_blocks(cuboid(-1, 1, 1, 31, -1, 1), CEMENT)
    +
    195  # set_blocks(cuboid(-1024, 1024, 32, 32, -3, 3), STONE)
    +
    196  # set_blocks(cuboid(-3, 3, 32, 32, -1024, 1024), STONE)
    +
    197  # set_blocks(cuboid(-1024, 1024, 33, 33, -3, -3), BRICK)
    +
    198  # set_blocks(cuboid(-1024, 1024, 33, 33, 3, 3), BRICK)
    +
    199  # set_blocks(cuboid(-3, -3, 33, 33, -1024, 1024), BRICK)
    +
    200  # set_blocks(cuboid(3, 3, 33, 33, -1024, 1024), BRICK)
    +
    201  # set_blocks(sphere(0, 32, 0, 16), GLASS)
    +
    202  # for y in range(1, 32):
    +
    203  # set_blocks(circle_y(0, y, 0, 4, True), CEMENT)
    +
    204  # set_blocks(circle_x(16, 33, 0, 3), BRICK)
    +
    205  # set_blocks(circle_x(-16, 33, 0, 3), BRICK)
    +
    206  # set_blocks(circle_z(0, 33, 16, 3), BRICK)
    +
    207  # set_blocks(circle_z(0, 33, -16, 3), BRICK)
    +
    208  # for x in range(0, 1024, 32):
    +
    209  # set_blocks(cuboid(x - 1, x + 1, 31, 32, -1, 1), CEMENT)
    +
    210  # set_blocks(cuboid(-x - 1, -x + 1, 31, 32, -1, 1), CEMENT)
    +
    211  # set_blocks(cuboid(x, x, 1, 32, -1, 1), CEMENT)
    +
    212  # set_blocks(cuboid(-x, -x, 1, 32, -1, 1), CEMENT)
    +
    213  # for z in range(0, 1024, 32):
    +
    214  # set_blocks(cuboid(-1, 1, 31, 32, z - 1, z + 1), CEMENT)
    +
    215  # set_blocks(cuboid(-1, 1, 31, 32, -z - 1, -z + 1), CEMENT)
    +
    216  # set_blocks(cuboid(-1, 1, 1, 32, z, z), CEMENT)
    +
    217  # set_blocks(cuboid(-1, 1, 1, 32, -z, -z), CEMENT)
    +
    218  # for x in range(0, 1024, 8):
    +
    219  # set_block(x, 32, 0, CEMENT)
    +
    220  # set_block(-x, 32, 0, CEMENT)
    +
    221  # for z in range(0, 1024, 8):
    +
    222  # set_block(0, 32, z, CEMENT)
    +
    223  # set_block(0, 32, -z, CEMENT)
    +
    224  # set_blocks(pyramid(32, 32+64-1, 12, 32, 32+64-1), COBBLE)
    +
    225  # outer = circle_y(0, 11, 0, 176 + 3, True)
    +
    226  # inner = circle_y(0, 11, 0, 176 - 3, True)
    +
    227  # set_blocks(outer - inner, STONE)
    +
    228  # a = sphere(-32, 48, -32, 24, True)
    +
    229  # b = sphere(-24, 40, -24, 24, True)
    +
    230  # set_blocks(a - b, PLANK)
    +
    231  # set_blocks(cylinder_x(-64, 64, 32, 0, 8), STONE)
    +
    232  # data = [
    +
    233  # '...............................',
    +
    234  # '..xxx..xxxx...xxx..xxxxx.xxxxx.',
    +
    235  # '.x...x.x...x.x...x.x.......x...',
    +
    236  # '.x.....xxxx..xxxxx.xxx.....x...',
    +
    237  # '.x...x.x..x..x...x.x.......x...',
    +
    238  # '..xxx..x...x.x...x.x.......x...',
    +
    239  # '...............................',
    +
    240  # ]
    +
    241  # lookup = {
    +
    242  # 'x': STONE,
    +
    243  # '.': PLANK,
    +
    244  # }
    +
    245  # client.bitmap(0, 32, 32, (1, 0, 0), (0, -1, 0), data, lookup)
    +
    246 
    +
    247 if __name__ == '__main__':
    +
    248  main()
    + +
    def __init__(self, host, port)
    Definition: builder.py:143
    +
    def set_blocks(self, blocks, w)
    Definition: builder.py:162
    + +
    def bitmap(self, sx, sy, sz, d1, d2, data, lookup)
    Definition: builder.py:166
    +
    def set_block(self, x, y, z, w)
    Definition: builder.py:160
    +
    def authenticate(self)
    Definition: builder.py:147
    +
    def pyramid(x1, x2, y, z1, z2, fill=False)
    Definition: builder.py:123
    +
    def circle_x(x, y, z, r, fill=False)
    Definition: builder.py:75
    +
    def get_client()
    Definition: builder.py:181
    +
    def cylinder_y(x, y1, y2, z, r, fill=False)
    Definition: builder.py:91
    +
    def circle_z(x, y, z, r, fill=False)
    Definition: builder.py:81
    +
    def circle_y(x, y, z, r, fill=False)
    Definition: builder.py:78
    +
    def sphere(cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False)
    Definition: builder.py:48
    +
    def cylinder_z(x, y, z1, z2, r, fill=False)
    Definition: builder.py:98
    +
    def cuboid(x1, x2, y1, y2, z1, z2, fill=True)
    Definition: builder.py:105
    +
    def main()
    Definition: builder.py:188
    +
    def get_identity()
    Definition: builder.py:132
    +
    def cylinder_x(x1, x2, y, z, r, fill=False)
    Definition: builder.py:84
    +
    + + + + diff --git a/documentation/html/classbuilder_1_1Client-members.html b/documentation/html/classbuilder_1_1Client-members.html new file mode 100644 index 000000000..b6b5ad7e6 --- /dev/null +++ b/documentation/html/classbuilder_1_1Client-members.html @@ -0,0 +1,87 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    builder.Client Member List
    +
    +
    + +

    This is the complete list of members for builder.Client, including all inherited members.

    + + + + + + + +
    __init__(self, host, port)builder.Client
    authenticate(self)builder.Client
    bitmap(self, sx, sy, sz, d1, d2, data, lookup)builder.Client
    connbuilder.Client
    set_block(self, x, y, z, w)builder.Client
    set_blocks(self, blocks, w)builder.Client
    + + + + diff --git a/documentation/html/classbuilder_1_1Client.html b/documentation/html/classbuilder_1_1Client.html new file mode 100644 index 000000000..d0b781893 --- /dev/null +++ b/documentation/html/classbuilder_1_1Client.html @@ -0,0 +1,378 @@ + + + + + + + +Craft: builder.Client Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    builder.Client Class Reference
    +
    +
    +
    +Inheritance diagram for builder.Client:
    +
    +
    + +
    + + + + + + + + + + + + +

    +Public Member Functions

    def __init__ (self, host, port)
     
    def authenticate (self)
     
    def set_block (self, x, y, z, w)
     
    def set_blocks (self, blocks, w)
     
    def bitmap (self, sx, sy, sz, d1, d2, data, lookup)
     
    + + + +

    +Public Attributes

     conn
     
    +

    Detailed Description

    +
    +

    Definition at line 142 of file builder.py.

    +

    Constructor & Destructor Documentation

    + +

    ◆ __init__()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.Client.__init__ ( self,
     host,
     port 
    )
    +
    + +

    Definition at line 143 of file builder.py.

    +
    143  def __init__(self, host, port):
    +
    144  self.conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    +
    145  self.conn.connect((host, port))
    +
    146  self.authenticate()
    +
    +
    +
    +

    Member Function Documentation

    + +

    ◆ authenticate()

    + +
    +
    + + + + + + + + +
    def builder.Client.authenticate ( self)
    +
    + +

    Definition at line 147 of file builder.py.

    +
    147  def authenticate(self):
    +
    148  username, identity_token = get_identity()
    +
    149  url = 'https://craft.michaelfogleman.com/api/1/identity'
    +
    150  payload = {
    +
    151  'username': username,
    +
    152  'identity_token': identity_token,
    +
    153  }
    +
    154  response = requests.post(url, data=payload)
    +
    155  if response.status_code == 200 and response.text.isalnum():
    +
    156  access_token = response.text
    +
    157  self.conn.sendall('A,%s,%s\n' % (username, access_token))
    +
    158  else:
    +
    159  raise Exception('Failed to authenticate.')
    +
    def get_identity()
    Definition: builder.py:132
    +
    +
    +
    + +

    ◆ bitmap()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.Client.bitmap ( self,
     sx,
     sy,
     sz,
     d1,
     d2,
     data,
     lookup 
    )
    +
    + +

    Definition at line 166 of file builder.py.

    +
    166  def bitmap(self, sx, sy, sz, d1, d2, data, lookup):
    +
    167  x, y, z = sx, sy, sz
    +
    168  dx1, dy1, dz1 = d1
    +
    169  dx2, dy2, dz2 = d2
    +
    170  for row in data:
    +
    171  x = sx if dx1 else x
    +
    172  y = sy if dy1 else y
    +
    173  z = sz if dz1 else z
    +
    174  for c in row:
    +
    175  w = lookup.get(c)
    +
    176  if w is not None:
    +
    177  self.set_block(x, y, z, w)
    +
    178  x, y, z = x + dx1, y + dy1, z + dz1
    +
    179  x, y, z = x + dx2, y + dy2, z + dz2
    +
    180 
    +
    +
    +
    + +

    ◆ set_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.Client.set_block ( self,
     x,
     y,
     z,
     w 
    )
    +
    + +

    Definition at line 160 of file builder.py.

    +
    160  def set_block(self, x, y, z, w):
    +
    161  self.conn.sendall('B,%d,%d,%d,%d\n' % (x, y, z, w))
    +
    void set_block(int x, int y, int z, int w)
    Definition: main.c:1182
    +
    +
    +
    + +

    ◆ set_blocks()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.Client.set_blocks ( self,
     blocks,
     w 
    )
    +
    + +

    Definition at line 162 of file builder.py.

    +
    162  def set_blocks(self, blocks, w):
    +
    163  key = lambda block: (block[1], block[0], block[2])
    +
    164  for x, y, z in sorted(blocks, key=key):
    +
    165  self.set_block(x, y, z, w)
    +
    +
    +
    +

    Member Data Documentation

    + +

    ◆ conn

    + +
    +
    + + + + +
    builder.Client.conn
    +
    + +

    Definition at line 144 of file builder.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/builder.py
    • +
    +
    + + + + diff --git a/documentation/html/classbuilder_1_1Client.png b/documentation/html/classbuilder_1_1Client.png new file mode 100644 index 0000000000000000000000000000000000000000..67992aaae8f702f2c575f60d5ae3cb6c3ea60039 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^;XoX~!3-p$g(aT>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^l`Nuvv^%9u>4+`*JHu*%}BpMb>*encemQ3>r8el&#;)j zWbv*$9=8>KXY{BV%guHJaZU$)9!`~KE(#CaN(JgnaRCDHEu-m?B5wm+lv zJp05M=3HfB5H{)Dty6qp@(%4Xt_rd5rGFp9JZCy_c;~rNJ%%eq>x%#LPFGRqU}<<* z^iIAo`_C?;zpnhDfuU*b(QFJ3YtN=T`o7!OI%DJ6LytG?7MWe3sg+Xe%cHx4b*;=z z@wl2N?=&l~UOV_eOzmS`!R%zqgJ+MY6disneWxw`&33jMUv<-bYkTV~0^2KI%zo}} vzhwWa`r@gN-2T)R=rt7WnczL?@mI#Jn@lQN-!;7k1|fr|tDnm{r-UW|*SfZ# literal 0 HcmV?d00001 diff --git a/documentation/html/classes.html b/documentation/html/classes.html new file mode 100644 index 000000000..77cbfb33f --- /dev/null +++ b/documentation/html/classes.html @@ -0,0 +1,107 @@ + + + + + + + +Craft: Class Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Index
    +
    +
    +
    A | B | C | F | H | M | P | R | S | W
    + +
    + + + + diff --git a/documentation/html/classserver_1_1Handler-members.html b/documentation/html/classserver_1_1Handler-members.html new file mode 100644 index 000000000..f320f61dd --- /dev/null +++ b/documentation/html/classserver_1_1Handler-members.html @@ -0,0 +1,97 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    server.Handler Member List
    +
    + + + + + diff --git a/documentation/html/classserver_1_1Handler.html b/documentation/html/classserver_1_1Handler.html new file mode 100644 index 000000000..3b2a24cfe --- /dev/null +++ b/documentation/html/classserver_1_1Handler.html @@ -0,0 +1,516 @@ + + + + + + + +Craft: server.Handler Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    server.Handler Class Reference
    +
    +
    +
    +Inheritance diagram for server.Handler:
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    def setup (self)
     
    def handle (self)
     
    def finish (self)
     
    def stop (self)
     
    def start (self)
     
    def run (self)
     
    def send_raw (self, data)
     
    def send (self, *args)
     
    + + + + + + + + + + + + + + + + + +

    +Public Attributes

     position_limiter
     
     limiter
     
     version
     
     client_id
     
     user_id
     
     nick
     
     queue
     
     running
     
    +

    Detailed Description

    +
    +

    Definition at line 91 of file server.py.

    +

    Member Function Documentation

    + +

    ◆ finish()

    + +
    +
    + + + + + + + + +
    def server.Handler.finish ( self)
    +
    + +

    Definition at line 131 of file server.py.

    +
    131  def finish(self):
    +
    132  self.running = False
    +
    +
    +
    + +

    ◆ handle()

    + +
    +
    + + + + + + + + +
    def server.Handler.handle ( self)
    +
    + +

    Definition at line 102 of file server.py.

    +
    102  def handle(self):
    +
    103  model = self.server.model
    +
    104  model.enqueue(model.on_connect, self)
    +
    105  try:
    +
    106  buf = []
    +
    107  while True:
    +
    108  data = self.request.recv(BUFFER_SIZE)
    +
    109  if not data:
    +
    110  break
    +
    111  buf.extend(data.replace('\r\n', '\n'))
    +
    112  while '\n' in buf:
    +
    113  index = buf.index('\n')
    +
    114  line = ''.join(buf[:index])
    +
    115  buf = buf[index + 1:]
    +
    116  if not line:
    +
    117  continue
    +
    118  if line[0] == POSITION:
    +
    119  if self.position_limiter.tick():
    +
    120  log('RATE', self.client_id)
    +
    121  self.stop()
    +
    122  return
    +
    123  else:
    +
    124  if self.limiter.tick():
    +
    125  log('RATE', self.client_id)
    +
    126  self.stop()
    +
    127  return
    +
    128  model.enqueue(model.on_data, self, line)
    +
    129  finally:
    +
    130  model.enqueue(model.on_disconnect, self)
    +
    def log(*args)
    Definition: server.py:53
    +
    +
    +
    + +

    ◆ run()

    + +
    +
    + + + + + + + + +
    def server.Handler.run ( self)
    +
    + +

    Definition at line 139 of file server.py.

    +
    139  def run(self):
    +
    140  while self.running:
    +
    141  try:
    +
    142  buf = []
    +
    143  try:
    +
    144  buf.append(self.queue.get(timeout=5))
    +
    145  try:
    +
    146  while True:
    +
    147  buf.append(self.queue.get(False))
    +
    148  except Queue.Empty:
    +
    149  pass
    +
    150  except Queue.Empty:
    +
    151  continue
    +
    152  data = ''.join(buf)
    +
    153  self.request.sendall(data)
    +
    154  except Exception:
    +
    155  self.request.close()
    +
    156  raise
    +
    +
    +
    + +

    ◆ send()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Handler.send ( self,
    args 
    )
    +
    + +

    Definition at line 160 of file server.py.

    +
    160  def send(self, *args):
    +
    161  self.send_raw(packet(*args))
    +
    162 
    +
    def packet(*args)
    Definition: server.py:63
    +
    +
    +
    + +

    ◆ send_raw()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Handler.send_raw ( self,
     data 
    )
    +
    + +

    Definition at line 157 of file server.py.

    +
    157  def send_raw(self, data):
    +
    158  if data:
    +
    159  self.queue.put(data)
    +
    +
    +
    + +

    ◆ setup()

    + +
    +
    + + + + + + + + +
    def server.Handler.setup ( self)
    +
    + +

    Definition at line 92 of file server.py.

    +
    92  def setup(self):
    +
    93  self.position_limiter = RateLimiter(100, 5)
    +
    94  self.limiter = RateLimiter(1000, 10)
    +
    95  self.version = None
    +
    96  self.client_id = None
    +
    97  self.user_id = None
    +
    98  self.nick = None
    +
    99  self.queue = Queue.Queue()
    +
    100  self.running = True
    +
    101  self.start()
    +
    +
    +
    + +

    ◆ start()

    + +
    +
    + + + + + + + + +
    def server.Handler.start ( self)
    +
    + +

    Definition at line 135 of file server.py.

    +
    135  def start(self):
    +
    136  thread = threading.Thread(target=self.run)
    +
    137  thread.setDaemon(True)
    +
    138  thread.start()
    +
    +
    +
    + +

    ◆ stop()

    + +
    +
    + + + + + + + + +
    def server.Handler.stop ( self)
    +
    + +

    Definition at line 133 of file server.py.

    +
    133  def stop(self):
    +
    134  self.request.close()
    +
    +
    +
    +

    Member Data Documentation

    + +

    ◆ client_id

    + +
    +
    + + + + +
    server.Handler.client_id
    +
    + +

    Definition at line 96 of file server.py.

    + +
    +
    + +

    ◆ limiter

    + +
    +
    + + + + +
    server.Handler.limiter
    +
    + +

    Definition at line 94 of file server.py.

    + +
    +
    + +

    ◆ nick

    + +
    +
    + + + + +
    server.Handler.nick
    +
    + +

    Definition at line 98 of file server.py.

    + +
    +
    + +

    ◆ position_limiter

    + +
    +
    + + + + +
    server.Handler.position_limiter
    +
    + +

    Definition at line 93 of file server.py.

    + +
    +
    + +

    ◆ queue

    + +
    +
    + + + + +
    server.Handler.queue
    +
    + +

    Definition at line 99 of file server.py.

    + +
    +
    + +

    ◆ running

    + +
    +
    + + + + +
    server.Handler.running
    +
    + +

    Definition at line 100 of file server.py.

    + +
    +
    + +

    ◆ user_id

    + +
    +
    + + + + +
    server.Handler.user_id
    +
    + +

    Definition at line 97 of file server.py.

    + +
    +
    + +

    ◆ version

    + +
    +
    + + + + +
    server.Handler.version
    +
    + +

    Definition at line 95 of file server.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/server.py
    • +
    +
    + + + + diff --git a/documentation/html/classserver_1_1Handler.png b/documentation/html/classserver_1_1Handler.png new file mode 100644 index 0000000000000000000000000000000000000000..8b325bfec81f35b19ba22f61ff3cdb3442220815 GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0vp^mw-5cgBeIh+uvRcq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0vOHZJLn;{G&b@f)lNOJwxcR&9^^f;& zV|8+{U;eE^LT&MGu9g;7#l5Oar(6^AoD>$M;Cbl{mx|}CSkae}+A1ppFMrPAS*x=0 za$Jo{=7RF%Nw3O{t=_a?O&TqKp4*kL3-L(>H#-KaJ^t=-oz^C2`v-=RN+H^*!b9HinvovxW56UrX`3 z{8Tu<y7hH9a(+#l#Oq=WlPM> xoWwU;atBKPzT3<4K^WQX*}hAFF82D*u&unDoy{S+444ubJYD@<);T3K0RW&+M}YtU literal 0 HcmV?d00001 diff --git a/documentation/html/classserver_1_1Model-members.html b/documentation/html/classserver_1_1Model-members.html new file mode 100644 index 000000000..4da02c3d2 --- /dev/null +++ b/documentation/html/classserver_1_1Model-members.html @@ -0,0 +1,122 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    server.Model Member List
    +
    +
    + +

    This is the complete list of members for server.Model, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    __init__(self, seed)server.Model
    clientsserver.Model
    commandsserver.Model
    commit(self)server.Model
    connectionserver.Model
    create_tables(self)server.Model
    dequeue(self)server.Model
    enqueue(self, func, *args, **kwargs)server.Model
    execute(self, *args, **kwargs)server.Model
    get_block(self, x, y, z)server.Model
    get_default_block(self, x, y, z)server.Model
    last_commitserver.Model
    next_client_id(self)server.Model
    on_authenticate(self, client, username, access_token)server.Model
    on_block(self, client, x, y, z, w)server.Model
    on_chunk(self, client, p, q, key=0)server.Model
    on_connect(self, client)server.Model
    on_data(self, client, data)server.Model
    on_disconnect(self, client)server.Model
    on_goto(self, client, nick=None)server.Model
    on_help(self, client, topic=None)server.Model
    on_list(self, client)server.Model
    on_position(self, client, x, y, z, rx, ry)server.Model
    on_pq(self, client, p, q)server.Model
    on_sign(self, client, x, y, z, face, *args)server.Model
    on_spawn(self, client)server.Model
    on_talk(self, client, *args)server.Model
    on_version(self, client, version)server.Model
    patternsserver.Model
    queueserver.Model
    run(self)server.Model
    send_block(self, client, p, q, x, y, z, w)server.Model
    send_disconnect(self, client)server.Model
    send_nick(self, client)server.Model
    send_nicks(self, client)server.Model
    send_position(self, client)server.Model
    send_positions(self, client)server.Model
    send_sign(self, client, p, q, x, y, z, face, text)server.Model
    send_talk(self, text)server.Model
    start(self)server.Model
    worldserver.Model
    + + + + diff --git a/documentation/html/classserver_1_1Model.html b/documentation/html/classserver_1_1Model.html new file mode 100644 index 000000000..8ee2d579d --- /dev/null +++ b/documentation/html/classserver_1_1Model.html @@ -0,0 +1,1930 @@ + + + + + + + +Craft: server.Model Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    server.Model Class Reference
    +
    +
    +
    +Inheritance diagram for server.Model:
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

    def __init__ (self, seed)
     
    def start (self)
     
    def run (self)
     
    def enqueue (self, func, *args, **kwargs)
     
    def dequeue (self)
     
    def execute (self, *args, **kwargs)
     
    def commit (self)
     
    def create_tables (self)
     
    def get_default_block (self, x, y, z)
     
    def get_block (self, x, y, z)
     
    def next_client_id (self)
     
    def on_connect (self, client)
     
    def on_data (self, client, data)
     
    def on_disconnect (self, client)
     
    def on_version (self, client, version)
     
    def on_authenticate (self, client, username, access_token)
     
    def on_chunk (self, client, p, q, key=0)
     
    def on_block (self, client, x, y, z, w)
     
    def on_sign (self, client, x, y, z, face, *args)
     
    def on_position (self, client, x, y, z, rx, ry)
     
    def on_talk (self, client, *args)
     
    def on_spawn (self, client)
     
    def on_goto (self, client, nick=None)
     
    def on_pq (self, client, p, q)
     
    def on_help (self, client, topic=None)
     
    def on_list (self, client)
     
    def send_positions (self, client)
     
    def send_position (self, client)
     
    def send_nicks (self, client)
     
    def send_nick (self, client)
     
    def send_disconnect (self, client)
     
    def send_block (self, client, p, q, x, y, z, w)
     
    def send_sign (self, client, p, q, x, y, z, face, text)
     
    def send_talk (self, text)
     
    + + + + + + + + + + + + + + + +

    +Public Attributes

     world
     
     clients
     
     queue
     
     commands
     
     patterns
     
     connection
     
     last_commit
     
    +

    Detailed Description

    +
    +

    Definition at line 163 of file server.py.

    +

    Constructor & Destructor Documentation

    + +

    ◆ __init__()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.__init__ ( self,
     seed 
    )
    +
    + +

    Definition at line 164 of file server.py.

    +
    164  def __init__(self, seed):
    +
    165  self.world = World(seed)
    +
    166  self.clients = []
    +
    167  self.queue = Queue.Queue()
    +
    168  self.commands = {
    +
    169  AUTHENTICATE: self.on_authenticate,
    +
    170  CHUNK: self.on_chunk,
    +
    171  BLOCK: self.on_block,
    +
    172  POSITION: self.on_position,
    +
    173  TALK: self.on_talk,
    +
    174  SIGN: self.on_sign,
    +
    175  VERSION: self.on_version,
    +
    176  }
    +
    177  self.patterns = [
    +
    178  (re.compile(r'^/spawn$'), self.on_spawn),
    +
    179  (re.compile(r'^/goto(?:\s+(\S+))?$'), self.on_goto),
    +
    180  (re.compile(r'^/pq\s+(-?[0-9]+)\s*,?\s*(-?[0-9]+)$'), self.on_pq),
    +
    181  (re.compile(r'^/help(?:\s+(\S+))?$'), self.on_help),
    +
    182  (re.compile(r'^/list$'), self.on_list),
    +
    183  ]
    +
    +
    +
    +

    Member Function Documentation

    + +

    ◆ commit()

    + +
    +
    + + + + + + + + +
    def server.Model.commit ( self)
    +
    + +

    Definition at line 209 of file server.py.

    +
    209  def commit(self):
    +
    210  self.last_commit = time.time()
    +
    211  self.connection.commit()
    +
    +
    +
    + +

    ◆ create_tables()

    + +
    +
    + + + + + + + + +
    def server.Model.create_tables ( self)
    +
    + +

    Definition at line 212 of file server.py.

    +
    212  def create_tables(self):
    +
    213  queries = [
    +
    214  'create table if not exists block ('
    +
    215  ' p int not null,'
    +
    216  ' q int not null,'
    +
    217  ' x int not null,'
    +
    218  ' y int not null,'
    +
    219  ' z int not null,'
    +
    220  ' w int not null'
    +
    221  ');',
    +
    222  'create unique index if not exists block_pqxyz_idx on '
    +
    223  ' block (p, q, x, y, z);',
    +
    224  'create table if not exists sign ('
    +
    225  ' p int not null,'
    +
    226  ' q int not null,'
    +
    227  ' x int not null,'
    +
    228  ' y int not null,'
    +
    229  ' z int not null,'
    +
    230  ' face int not null,'
    +
    231  ' text text not null'
    +
    232  ');',
    +
    233  'create index if not exists sign_pq_idx on sign (p, q);',
    +
    234  'create unique index if not exists sign_xyzface_idx on '
    +
    235  ' sign (x, y, z, face);',
    +
    236  'create table if not exists block_history ('
    +
    237  ' timestamp real not null,'
    +
    238  ' user_id int not null,'
    +
    239  ' x int not null,'
    +
    240  ' y int not null,'
    +
    241  ' z int not null,'
    +
    242  ' w int not null'
    +
    243  ');',
    +
    244  ]
    +
    245  for query in queries:
    +
    246  self.execute(query)
    +
    +
    +
    + +

    ◆ dequeue()

    + +
    +
    + + + + + + + + +
    def server.Model.dequeue ( self)
    +
    + +

    Definition at line 201 of file server.py.

    +
    201  def dequeue(self):
    +
    202  try:
    +
    203  func, args, kwargs = self.queue.get(timeout=5)
    +
    204  func(*args, **kwargs)
    +
    205  except Queue.Empty:
    +
    206  pass
    +
    +
    +
    + +

    ◆ enqueue()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.enqueue ( self,
     func,
    args,
    ** kwargs 
    )
    +
    + +

    Definition at line 199 of file server.py.

    +
    199  def enqueue(self, func, *args, **kwargs):
    +
    200  self.queue.put((func, args, kwargs))
    +
    +
    +
    + +

    ◆ execute()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.execute ( self,
    args,
    ** kwargs 
    )
    +
    + +

    Definition at line 207 of file server.py.

    +
    207  def execute(self, *args, **kwargs):
    +
    208  return self.connection.execute(*args, **kwargs)
    +
    +
    +
    + +

    ◆ get_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.get_block ( self,
     x,
     y,
     z 
    )
    +
    + +

    Definition at line 251 of file server.py.

    +
    251  def get_block(self, x, y, z):
    +
    252  query = (
    +
    253  'select w from block where '
    +
    254  'p = :p and q = :q and x = :x and y = :y and z = :z;'
    +
    255  )
    +
    256  p, q = chunked(x), chunked(z)
    +
    257  rows = list(self.execute(query, dict(p=p, q=q, x=x, y=y, z=z)))
    +
    258  if rows:
    +
    259  return rows[0][0]
    +
    260  return self.get_default_block(x, y, z)
    +
    int get_block(int x, int y, int z)
    Definition: main.c:1211
    +
    int chunked(float x)
    Definition: main.c:137
    +
    +
    +
    + +

    ◆ get_default_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.get_default_block ( self,
     x,
     y,
     z 
    )
    +
    + +

    Definition at line 247 of file server.py.

    +
    247  def get_default_block(self, x, y, z):
    +
    248  p, q = chunked(x), chunked(z)
    +
    249  chunk = self.world.get_chunk(p, q)
    +
    250  return chunk.get((x, y, z), 0)
    +
    +
    +
    + +

    ◆ next_client_id()

    + +
    +
    + + + + + + + + +
    def server.Model.next_client_id ( self)
    +
    + +

    Definition at line 261 of file server.py.

    +
    261  def next_client_id(self):
    +
    262  result = 1
    +
    263  client_ids = set(x.client_id for x in self.clients)
    +
    264  while result in client_ids:
    +
    265  result += 1
    +
    266  return result
    +
    +
    +
    + +

    ◆ on_authenticate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_authenticate ( self,
     client,
     username,
     access_token 
    )
    +
    + +

    Definition at line 301 of file server.py.

    +
    301  def on_authenticate(self, client, username, access_token):
    +
    302  user_id = None
    +
    303  if username and access_token:
    +
    304  url = 'https://craft.michaelfogleman.com/api/1/access'
    +
    305  payload = {
    +
    306  'username': username,
    +
    307  'access_token': access_token,
    +
    308  }
    +
    309  response = requests.post(url, data=payload)
    +
    310  if response.status_code == 200 and response.text.isdigit():
    +
    311  user_id = int(response.text)
    +
    312  client.user_id = user_id
    +
    313  if user_id is None:
    +
    314  client.nick = 'guest%d' % client.client_id
    +
    315  client.send(TALK, 'Visit craft.michaelfogleman.com to register!')
    +
    316  else:
    +
    317  client.nick = username
    +
    318  self.send_nick(client)
    +
    319  # TODO: has left message if was already authenticated
    +
    320  self.send_talk('%s has joined the game.' % client.nick)
    +
    +
    +
    + +

    ◆ on_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_block ( self,
     client,
     x,
     y,
     z,
     w 
    )
    +
    + +

    Definition at line 350 of file server.py.

    +
    350  def on_block(self, client, x, y, z, w):
    +
    351  x, y, z, w = map(int, (x, y, z, w))
    +
    352  p, q = chunked(x), chunked(z)
    +
    353  previous = self.get_block(x, y, z)
    +
    354  message = None
    +
    355  if client.user_id is None:
    +
    356  message = 'Only logged in users are allowed to build.'
    +
    357  elif y <= 0 or y > 255:
    +
    358  message = 'Invalid block coordinates.'
    +
    359  elif w not in ALLOWED_ITEMS:
    +
    360  message = 'That item is not allowed.'
    +
    361  elif w and previous:
    +
    362  message = 'Cannot create blocks in a non-empty space.'
    +
    363  elif not w and not previous:
    +
    364  message = 'That space is already empty.'
    +
    365  elif previous in INDESTRUCTIBLE_ITEMS:
    +
    366  message = 'Cannot destroy that type of block.'
    +
    367  if message is not None:
    +
    368  client.send(BLOCK, p, q, x, y, z, previous)
    +
    369  client.send(REDRAW, p, q)
    +
    370  client.send(TALK, message)
    +
    371  return
    +
    372  query = (
    +
    373  'insert into block_history (timestamp, user_id, x, y, z, w) '
    +
    374  'values (:timestamp, :user_id, :x, :y, :z, :w);'
    +
    375  )
    +
    376  if RECORD_HISTORY:
    +
    377  self.execute(query, dict(timestamp=time.time(),
    +
    378  user_id=client.user_id, x=x, y=y, z=z, w=w))
    +
    379  query = (
    +
    380  'insert or replace into block (p, q, x, y, z, w) '
    +
    381  'values (:p, :q, :x, :y, :z, :w);'
    +
    382  )
    +
    383  self.execute(query, dict(p=p, q=q, x=x, y=y, z=z, w=w))
    +
    384  self.send_block(client, p, q, x, y, z, w)
    +
    385  for dx in range(-1, 2):
    +
    386  for dz in range(-1, 2):
    +
    387  if dx == 0 and dz == 0:
    +
    388  continue
    +
    389  if dx and chunked(x + dx) == p:
    +
    390  continue
    +
    391  if dz and chunked(z + dz) == q:
    +
    392  continue
    +
    393  np, nq = p + dx, q + dz
    +
    394  self.execute(query, dict(p=np, q=nq, x=x, y=y, z=z, w=-w))
    +
    395  self.send_block(client, np, nq, x, y, z, -w)
    +
    396  if w == 0:
    +
    397  query = (
    +
    398  'delete from sign where '
    +
    399  'x = :x and y = :y and z = :z;'
    +
    400  )
    +
    401  self.execute(query, dict(x=x, y=y, z=z))
    +
    +
    +
    + +

    ◆ on_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_chunk ( self,
     client,
     p,
     q,
     key = 0 
    )
    +
    + +

    Definition at line 321 of file server.py.

    +
    321  def on_chunk(self, client, p, q, key=0):
    +
    322  packets = []
    +
    323  p, q, key = map(int, (p, q, key))
    +
    324  query = (
    +
    325  'select rowid, x, y, z, w from block where '
    +
    326  'p = :p and q = :q and rowid > :key;'
    +
    327  )
    +
    328  rows = self.execute(query, dict(p=p, q=q, key=key))
    +
    329  max_rowid = 0
    +
    330  blocks = 0
    +
    331  for rowid, x, y, z, w in rows:
    +
    332  blocks += 1
    +
    333  packets.append(packet(BLOCK, p, q, x, y, z, w))
    +
    334  max_rowid = max(max_rowid, rowid)
    +
    335  query = (
    +
    336  'select x, y, z, face, text from sign where '
    +
    337  'p = :p and q = :q;'
    +
    338  )
    +
    339  rows = self.execute(query, dict(p=p, q=q))
    +
    340  signs = 0
    +
    341  for x, y, z, face, text in rows:
    +
    342  signs += 1
    +
    343  packets.append(packet(SIGN, p, q, x, y, z, face, text))
    +
    344  if blocks:
    +
    345  packets.append(packet(KEY, p, q, max_rowid))
    +
    346  if blocks or signs:
    +
    347  packets.append(packet(REDRAW, p, q))
    +
    348  packets.append(packet(CHUNK, p, q))
    +
    349  client.send_raw(''.join(packets))
    +
    def packet(*args)
    Definition: server.py:63
    +
    +
    +
    + +

    ◆ on_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.on_connect ( self,
     client 
    )
    +
    + +

    Definition at line 267 of file server.py.

    +
    267  def on_connect(self, client):
    +
    268  client.client_id = self.next_client_id()
    +
    269  client.nick = 'guest%d' % client.client_id
    +
    270  log('CONN', client.client_id, *client.client_address)
    +
    271  client.position = SPAWN_POINT
    +
    272  self.clients.append(client)
    +
    273  client.send(YOU, client.client_id, *client.position)
    +
    274  client.send(TALK, 'Welcome to Craft!')
    +
    275  client.send(TALK, 'Type "/help" for a list of commands.')
    +
    276  self.send_position(client)
    +
    277  self.send_positions(client)
    +
    278  self.send_nick(client)
    +
    279  self.send_nicks(client)
    +
    def log(*args)
    Definition: server.py:53
    +
    +
    +
    + +

    ◆ on_data()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_data ( self,
     client,
     data 
    )
    +
    + +

    Definition at line 280 of file server.py.

    +
    280  def on_data(self, client, data):
    +
    281  #log('RECV', client.client_id, data)
    +
    282  args = data.split(',')
    +
    283  command, args = args[0], args[1:]
    +
    284  if command in self.commands:
    +
    285  func = self.commands[command]
    +
    286  func(client, *args)
    +
    +
    +
    + +

    ◆ on_disconnect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.on_disconnect ( self,
     client 
    )
    +
    + +

    Definition at line 287 of file server.py.

    +
    287  def on_disconnect(self, client):
    +
    288  log('DISC', client.client_id, *client.client_address)
    +
    289  self.clients.remove(client)
    +
    290  self.send_disconnect(client)
    +
    291  self.send_talk('%s has disconnected from the server.' % client.nick)
    +
    +
    +
    + +

    ◆ on_goto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_goto ( self,
     client,
     nick = None 
    )
    +
    + +

    Definition at line 458 of file server.py.

    +
    458  def on_goto(self, client, nick=None):
    +
    459  if nick is None:
    +
    460  clients = [x for x in self.clients if x != client]
    +
    461  other = random.choice(clients) if clients else None
    +
    462  else:
    +
    463  nicks = dict((client.nick, client) for client in self.clients)
    +
    464  other = nicks.get(nick)
    +
    465  if other:
    +
    466  client.position = other.position
    +
    467  client.send(YOU, client.client_id, *client.position)
    +
    468  self.send_position(client)
    +
    +
    +
    + +

    ◆ on_help()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_help ( self,
     client,
     topic = None 
    )
    +
    + +

    Definition at line 476 of file server.py.

    +
    476  def on_help(self, client, topic=None):
    +
    477  if topic is None:
    +
    478  client.send(TALK, 'Type "t" to chat. Type "/" to type commands:')
    +
    479  client.send(TALK, '/goto [NAME], /help [TOPIC], /list, /login NAME, /logout')
    +
    480  client.send(TALK, '/offline [FILE], /online HOST [PORT], /pq P Q, /spawn, /view N')
    +
    481  return
    +
    482  topic = topic.lower().strip()
    +
    483  if topic == 'goto':
    +
    484  client.send(TALK, 'Help: /goto [NAME]')
    +
    485  client.send(TALK, 'Teleport to another user.')
    +
    486  client.send(TALK, 'If NAME is unspecified, a random user is chosen.')
    +
    487  elif topic == 'list':
    +
    488  client.send(TALK, 'Help: /list')
    +
    489  client.send(TALK, 'Display a list of connected users.')
    +
    490  elif topic == 'login':
    +
    491  client.send(TALK, 'Help: /login NAME')
    +
    492  client.send(TALK, 'Switch to another registered username.')
    +
    493  client.send(TALK, 'The login server will be re-contacted. The username is case-sensitive.')
    +
    494  elif topic == 'logout':
    +
    495  client.send(TALK, 'Help: /logout')
    +
    496  client.send(TALK, 'Unauthenticate and become a guest user.')
    +
    497  client.send(TALK, 'Automatic logins will not occur again until the /login command is re-issued.')
    +
    498  elif topic == 'offline':
    +
    499  client.send(TALK, 'Help: /offline [FILE]')
    +
    500  client.send(TALK, 'Switch to offline mode.')
    +
    501  client.send(TALK, 'FILE specifies the save file to use and defaults to "craft".')
    +
    502  elif topic == 'online':
    +
    503  client.send(TALK, 'Help: /online HOST [PORT]')
    +
    504  client.send(TALK, 'Connect to the specified server.')
    +
    505  elif topic == 'pq':
    +
    506  client.send(TALK, 'Help: /pq P Q')
    +
    507  client.send(TALK, 'Teleport to the specified chunk.')
    +
    508  elif topic == 'spawn':
    +
    509  client.send(TALK, 'Help: /spawn')
    +
    510  client.send(TALK, 'Teleport back to the spawn point.')
    +
    511  elif topic == 'view':
    +
    512  client.send(TALK, 'Help: /view N')
    +
    513  client.send(TALK, 'Set viewing distance, 1 - 24.')
    +
    +
    +
    + +

    ◆ on_list()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.on_list ( self,
     client 
    )
    +
    + +

    Definition at line 514 of file server.py.

    +
    514  def on_list(self, client):
    +
    515  client.send(TALK,
    +
    516  'Players: %s' % ', '.join(x.nick for x in self.clients))
    +
    +
    +
    + +

    ◆ on_position()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_position ( self,
     client,
     x,
     y,
     z,
     rx,
     ry 
    )
    +
    + +

    Definition at line 429 of file server.py.

    +
    429  def on_position(self, client, x, y, z, rx, ry):
    +
    430  x, y, z, rx, ry = map(float, (x, y, z, rx, ry))
    +
    431  client.position = (x, y, z, rx, ry)
    +
    432  self.send_position(client)
    +
    +
    +
    + +

    ◆ on_pq()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_pq ( self,
     client,
     p,
     q 
    )
    +
    + +

    Definition at line 469 of file server.py.

    +
    469  def on_pq(self, client, p, q):
    +
    470  p, q = map(int, (p, q))
    +
    471  if abs(p) > 1000 or abs(q) > 1000:
    +
    472  return
    +
    473  client.position = (p * CHUNK_SIZE, 0, q * CHUNK_SIZE, 0, 0)
    +
    474  client.send(YOU, client.client_id, *client.position)
    +
    475  self.send_position(client)
    +
    +
    +
    + +

    ◆ on_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_sign ( self,
     client,
     x,
     y,
     z,
     face,
    args 
    )
    +
    + +

    Definition at line 402 of file server.py.

    +
    402  def on_sign(self, client, x, y, z, face, *args):
    +
    403  if client.user_id is None:
    +
    404  client.send(TALK, 'Only logged in users are allowed to build.')
    +
    405  return
    +
    406  text = ','.join(args)
    +
    407  x, y, z, face = map(int, (x, y, z, face))
    +
    408  if y <= 0 or y > 255:
    +
    409  return
    +
    410  if face < 0 or face > 7:
    +
    411  return
    +
    412  if len(text) > 48:
    +
    413  return
    +
    414  p, q = chunked(x), chunked(z)
    +
    415  if text:
    +
    416  query = (
    +
    417  'insert or replace into sign (p, q, x, y, z, face, text) '
    +
    418  'values (:p, :q, :x, :y, :z, :face, :text);'
    +
    419  )
    +
    420  self.execute(query,
    +
    421  dict(p=p, q=q, x=x, y=y, z=z, face=face, text=text))
    +
    422  else:
    +
    423  query = (
    +
    424  'delete from sign where '
    +
    425  'x = :x and y = :y and z = :z and face = :face;'
    +
    426  )
    +
    427  self.execute(query, dict(x=x, y=y, z=z, face=face))
    +
    428  self.send_sign(client, p, q, x, y, z, face, text)
    +
    +
    +
    + +

    ◆ on_spawn()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.on_spawn ( self,
     client 
    )
    +
    + +

    Definition at line 454 of file server.py.

    +
    454  def on_spawn(self, client):
    +
    455  client.position = SPAWN_POINT
    +
    456  client.send(YOU, client.client_id, *client.position)
    +
    457  self.send_position(client)
    +
    +
    +
    + +

    ◆ on_talk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_talk ( self,
     client,
    args 
    )
    +
    + +

    Definition at line 433 of file server.py.

    +
    433  def on_talk(self, client, *args):
    +
    434  text = ','.join(args)
    +
    435  if text.startswith('/'):
    +
    436  for pattern, func in self.patterns:
    +
    437  match = pattern.match(text)
    +
    438  if match:
    +
    439  func(client, *match.groups())
    +
    440  break
    +
    441  else:
    +
    442  client.send(TALK, 'Unrecognized command: "%s"' % text)
    +
    443  elif text.startswith('@'):
    +
    444  nick = text[1:].split(' ', 1)[0]
    +
    445  for other in self.clients:
    +
    446  if other.nick == nick:
    +
    447  client.send(TALK, '%s> %s' % (client.nick, text))
    +
    448  other.send(TALK, '%s> %s' % (client.nick, text))
    +
    449  break
    +
    450  else:
    +
    451  client.send(TALK, 'Unrecognized nick: "%s"' % nick)
    +
    452  else:
    +
    453  self.send_talk('%s> %s' % (client.nick, text))
    +
    +
    +
    + +

    ◆ on_version()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.on_version ( self,
     client,
     version 
    )
    +
    + +

    Definition at line 292 of file server.py.

    +
    292  def on_version(self, client, version):
    +
    293  if client.version is not None:
    +
    294  return
    +
    295  version = int(version)
    +
    296  if version != 1:
    +
    297  client.stop()
    +
    298  return
    +
    299  client.version = version
    +
    300  # TODO: client.start() here
    +
    +
    +
    + +

    ◆ run()

    + +
    +
    + + + + + + + + +
    def server.Model.run ( self)
    +
    + +

    Definition at line 188 of file server.py.

    +
    188  def run(self):
    +
    189  self.connection = sqlite3.connect(DB_PATH)
    +
    190  self.create_tables()
    +
    191  self.commit()
    +
    192  while True:
    +
    193  try:
    +
    194  if time.time() - self.last_commit > COMMIT_INTERVAL:
    +
    195  self.commit()
    +
    196  self.dequeue()
    +
    197  except Exception:
    +
    198  traceback.print_exc()
    +
    +
    +
    + +

    ◆ send_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.send_block ( self,
     client,
     p,
     q,
     x,
     y,
     z,
     w 
    )
    +
    + +

    Definition at line 540 of file server.py.

    +
    540  def send_block(self, client, p, q, x, y, z, w):
    +
    541  for other in self.clients:
    +
    542  if other == client:
    +
    543  continue
    +
    544  other.send(BLOCK, p, q, x, y, z, w)
    +
    545  other.send(REDRAW, p, q)
    +
    +
    +
    + +

    ◆ send_disconnect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_disconnect ( self,
     client 
    )
    +
    + +

    Definition at line 535 of file server.py.

    +
    535  def send_disconnect(self, client):
    +
    536  for other in self.clients:
    +
    537  if other == client:
    +
    538  continue
    +
    539  other.send(DISCONNECT, client.client_id)
    +
    +
    +
    + +

    ◆ send_nick()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_nick ( self,
     client 
    )
    +
    + +

    Definition at line 532 of file server.py.

    +
    532  def send_nick(self, client):
    +
    533  for other in self.clients:
    +
    534  other.send(NICK, client.client_id, client.nick)
    +
    +
    +
    + +

    ◆ send_nicks()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_nicks ( self,
     client 
    )
    +
    + +

    Definition at line 527 of file server.py.

    +
    527  def send_nicks(self, client):
    +
    528  for other in self.clients:
    +
    529  if other == client:
    +
    530  continue
    +
    531  client.send(NICK, other.client_id, other.nick)
    +
    +
    +
    + +

    ◆ send_position()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_position ( self,
     client 
    )
    +
    + +

    Definition at line 522 of file server.py.

    +
    522  def send_position(self, client):
    +
    523  for other in self.clients:
    +
    524  if other == client:
    +
    525  continue
    +
    526  other.send(POSITION, client.client_id, *client.position)
    +
    +
    +
    + +

    ◆ send_positions()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_positions ( self,
     client 
    )
    +
    + +

    Definition at line 517 of file server.py.

    +
    517  def send_positions(self, client):
    +
    518  for other in self.clients:
    +
    519  if other == client:
    +
    520  continue
    +
    521  client.send(POSITION, other.client_id, *other.position)
    +
    +
    +
    + +

    ◆ send_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.Model.send_sign ( self,
     client,
     p,
     q,
     x,
     y,
     z,
     face,
     text 
    )
    +
    + +

    Definition at line 546 of file server.py.

    +
    546  def send_sign(self, client, p, q, x, y, z, face, text):
    +
    547  for other in self.clients:
    +
    548  if other == client:
    +
    549  continue
    +
    550  other.send(SIGN, p, q, x, y, z, face, text)
    +
    +
    +
    + +

    ◆ send_talk()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def server.Model.send_talk ( self,
     text 
    )
    +
    + +

    Definition at line 551 of file server.py.

    +
    551  def send_talk(self, text):
    +
    552  log(text)
    +
    553  for client in self.clients:
    +
    554  client.send(TALK, text)
    +
    555 
    +
    +
    +
    + +

    ◆ start()

    + +
    +
    + + + + + + + + +
    def server.Model.start ( self)
    +
    + +

    Definition at line 184 of file server.py.

    +
    184  def start(self):
    +
    185  thread = threading.Thread(target=self.run)
    +
    186  thread.setDaemon(True)
    +
    187  thread.start()
    +
    +
    +
    +

    Member Data Documentation

    + +

    ◆ clients

    + +
    +
    + + + + +
    server.Model.clients
    +
    + +

    Definition at line 166 of file server.py.

    + +
    +
    + +

    ◆ commands

    + +
    +
    + + + + +
    server.Model.commands
    +
    + +

    Definition at line 168 of file server.py.

    + +
    +
    + +

    ◆ connection

    + +
    +
    + + + + +
    server.Model.connection
    +
    + +

    Definition at line 189 of file server.py.

    + +
    +
    + +

    ◆ last_commit

    + +
    +
    + + + + +
    server.Model.last_commit
    +
    + +

    Definition at line 210 of file server.py.

    + +
    +
    + +

    ◆ patterns

    + +
    +
    + + + + +
    server.Model.patterns
    +
    + +

    Definition at line 177 of file server.py.

    + +
    +
    + +

    ◆ queue

    + +
    +
    + + + + +
    server.Model.queue
    +
    + +

    Definition at line 167 of file server.py.

    + +
    +
    + +

    ◆ world

    + +
    +
    + + + + +
    server.Model.world
    +
    + +

    Definition at line 165 of file server.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/server.py
    • +
    +
    + + + + diff --git a/documentation/html/classserver_1_1Model.png b/documentation/html/classserver_1_1Model.png new file mode 100644 index 0000000000000000000000000000000000000000..106b68b9954b5df10b2265735fd5f319aca03230 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^5kMTk!3-owHr!%<83e zlpZNCSgd7buzA87C#JqhyyEGv33m_J-wc~e>PQp?q9|^LRaQ6EI+Z9@#qW)UfTDWn%Jd#`SfRHs1Gc z=`>GZxU{;ihTCkJzU!@?U*94U_8ysXdyW2V5sM#{M{hU$&Z}US`)?EcSSsJ!P{A)N uXZNCA;d-Cn8pkp+ltXNv2eg}gFGHiKDgUZdYKwuv$l&Sf=d#Wzp$PzV=cs7_ literal 0 HcmV?d00001 diff --git a/documentation/html/classserver_1_1RateLimiter-members.html b/documentation/html/classserver_1_1RateLimiter-members.html new file mode 100644 index 000000000..5fc5c5d6e --- /dev/null +++ b/documentation/html/classserver_1_1RateLimiter-members.html @@ -0,0 +1,87 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    server.RateLimiter Member List
    +
    +
    + +

    This is the complete list of members for server.RateLimiter, including all inherited members.

    + + + + + + + +
    __init__(self, rate, per)server.RateLimiter
    allowanceserver.RateLimiter
    last_checkserver.RateLimiter
    perserver.RateLimiter
    rateserver.RateLimiter
    tick(self)server.RateLimiter
    + + + + diff --git a/documentation/html/classserver_1_1RateLimiter.html b/documentation/html/classserver_1_1RateLimiter.html new file mode 100644 index 000000000..02adfa7a5 --- /dev/null +++ b/documentation/html/classserver_1_1RateLimiter.html @@ -0,0 +1,256 @@ + + + + + + + +Craft: server.RateLimiter Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    server.RateLimiter Class Reference
    +
    +
    +
    +Inheritance diagram for server.RateLimiter:
    +
    +
    + +
    + + + + + + +

    +Public Member Functions

    def __init__ (self, rate, per)
     
    def tick (self)
     
    + + + + + + + + + +

    +Public Attributes

     rate
     
     per
     
     allowance
     
     last_check
     
    +

    Detailed Description

    +
    +

    Definition at line 66 of file server.py.

    +

    Constructor & Destructor Documentation

    + +

    ◆ __init__()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def server.RateLimiter.__init__ ( self,
     rate,
     per 
    )
    +
    + +

    Definition at line 67 of file server.py.

    +
    67  def __init__(self, rate, per):
    +
    68  self.rate = float(rate)
    +
    69  self.per = float(per)
    +
    70  self.allowance = self.rate
    +
    71  self.last_check = time.time()
    +
    +
    +
    +

    Member Function Documentation

    + +

    ◆ tick()

    + +
    +
    + + + + + + + + +
    def server.RateLimiter.tick ( self)
    +
    + +

    Definition at line 72 of file server.py.

    +
    72  def tick(self):
    +
    73  if not RATE_LIMIT:
    +
    74  return False
    +
    75  now = time.time()
    +
    76  elapsed = now - self.last_check
    +
    77  self.last_check = now
    +
    78  self.allowance += elapsed * (self.rate / self.per)
    +
    79  if self.allowance > self.rate:
    +
    80  self.allowance = self.rate
    +
    81  if self.allowance < 1:
    +
    82  return True # too fast
    +
    83  else:
    +
    84  self.allowance -= 1
    +
    85  return False # okay
    +
    86 
    +
    +
    +
    +

    Member Data Documentation

    + +

    ◆ allowance

    + +
    +
    + + + + +
    server.RateLimiter.allowance
    +
    + +

    Definition at line 70 of file server.py.

    + +
    +
    + +

    ◆ last_check

    + +
    +
    + + + + +
    server.RateLimiter.last_check
    +
    + +

    Definition at line 71 of file server.py.

    + +
    +
    + +

    ◆ per

    + +
    +
    + + + + +
    server.RateLimiter.per
    +
    + +

    Definition at line 69 of file server.py.

    + +
    +
    + +

    ◆ rate

    + +
    +
    + + + + +
    server.RateLimiter.rate
    +
    + +

    Definition at line 68 of file server.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/server.py
    • +
    +
    + + + + diff --git a/documentation/html/classserver_1_1RateLimiter.png b/documentation/html/classserver_1_1RateLimiter.png new file mode 100644 index 0000000000000000000000000000000000000000..a141a437e8c52c31d293ad60950c95b0bcab664b GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^#Xuau!3-p2m+tZbQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;$`*Z_6t*$;T ze$o2)_2e1r=Un=^U&+((m(sGCH)9xMF7qaAx_4mD-Dl4C55!EkyzqTOo$q}$VFizq zEFFPHj7d{`8YEPO72FWqJ;X99x&;C8{_BElR>vNm$zq0tgmA~>?;mzDT;o97fCFVK@voTx! z?60-`f0QNL{q==s+oX2Im?+klcTT@@bx+Ssem-B}isbO1`#g{Dlzlyt;r85MUHWys zjcIHgQu&X J%Q~loCIGKV-{k-R literal 0 HcmV?d00001 diff --git a/documentation/html/classserver_1_1Server-members.html b/documentation/html/classserver_1_1Server-members.html new file mode 100644 index 000000000..336189387 --- /dev/null +++ b/documentation/html/classserver_1_1Server-members.html @@ -0,0 +1,83 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    server.Server Member List
    +
    +
    + +

    This is the complete list of members for server.Server, including all inherited members.

    + + + +
    allow_reuse_addressserver.Serverstatic
    daemon_threadsserver.Serverstatic
    + + + + diff --git a/documentation/html/classserver_1_1Server.html b/documentation/html/classserver_1_1Server.html new file mode 100644 index 000000000..ee4152d3a --- /dev/null +++ b/documentation/html/classserver_1_1Server.html @@ -0,0 +1,150 @@ + + + + + + + +Craft: server.Server Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    server.Server Class Reference
    +
    +
    +
    +Inheritance diagram for server.Server:
    +
    +
    + +
    + + + + + + +

    +Static Public Attributes

    bool allow_reuse_address = True
     
    bool daemon_threads = True
     
    +

    Detailed Description

    +
    +

    Definition at line 87 of file server.py.

    +

    Member Data Documentation

    + +

    ◆ allow_reuse_address

    + +
    +
    + + + + + +
    + + + + +
    bool server.Server.allow_reuse_address = True
    +
    +static
    +
    + +

    Definition at line 88 of file server.py.

    + +
    +
    + +

    ◆ daemon_threads

    + +
    +
    + + + + + +
    + + + + +
    bool server.Server.daemon_threads = True
    +
    +static
    +
    + +

    Definition at line 89 of file server.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/server.py
    • +
    +
    + + + + diff --git a/documentation/html/classserver_1_1Server.png b/documentation/html/classserver_1_1Server.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ece5ab14187d5538aed58477895b6140418870 GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0y~yU@QW%12~w0r149>O+ZQ_z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opTl`nU^Ob?X9rI`Y^R?}>f%0!7C)q6si;KHkr`0)M{OX+8#q;9Dx0r+` zm!A!Ncf42izgTdS*;Cc<&f9T^8a@TPU5crlvM4^{o9T1E=swe_{aSH}6_I9;X-%prct^XFf-G0xHwdx5we ziGlHK-iFSZ8~$S&AD8f*|3EoVZ|%ID`~NeChwSsYYt;PqXROf9Wm@0wJ2SfNT=40) z^69`kx&MEwea~xiVr1L7tmr`B4{!au4Q+lJ2Lz_;>h!NIoE*m0mj5X`$v`BbAvbzaHmwspG^|mneOxn6@k}+F#M6ibQU~N jmWAh~nMpFJe`24q`@)iGR)^z&8H>Tw)z4*}Q$iB}y|Jz4 literal 0 HcmV?d00001 diff --git a/documentation/html/classworld_1_1World-members.html b/documentation/html/classworld_1_1World-members.html new file mode 100644 index 000000000..d96a5e705 --- /dev/null +++ b/documentation/html/classworld_1_1World-members.html @@ -0,0 +1,87 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    world.World Member List
    +
    +
    + +

    This is the complete list of members for world.World, including all inherited members.

    + + + + + + + +
    __init__(self, seed=None, cache_size=64)world.World
    cacheworld.World
    cache_sizeworld.World
    create_chunk(self, p, q)world.World
    get_chunk(self, p, q)world.World
    seedworld.World
    + + + + diff --git a/documentation/html/classworld_1_1World.html b/documentation/html/classworld_1_1World.html new file mode 100644 index 000000000..cd2bae0e4 --- /dev/null +++ b/documentation/html/classworld_1_1World.html @@ -0,0 +1,292 @@ + + + + + + + +Craft: world.World Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    world.World Class Reference
    +
    +
    +
    +Inheritance diagram for world.World:
    +
    +
    + +
    + + + + + + + + +

    +Public Member Functions

    def __init__ (self, seed=None, cache_size=64)
     
    def create_chunk (self, p, q)
     
    def get_chunk (self, p, q)
     
    + + + + + + + +

    +Public Attributes

     seed
     
     cache
     
     cache_size
     
    +

    Detailed Description

    +
    +

    Definition at line 31 of file world.py.

    +

    Constructor & Destructor Documentation

    + +

    ◆ __init__()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def world.World.__init__ ( self,
     seed = None,
     cache_size = 64 
    )
    +
    + +

    Definition at line 32 of file world.py.

    +
    32  def __init__(self, seed=None, cache_size=64):
    +
    33  self.seed = seed
    +
    34  self.cache = OrderedDict()
    +
    35  self.cache_size = cache_size
    +
    +
    +
    +

    Member Function Documentation

    + +

    ◆ create_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def world.World.create_chunk ( self,
     p,
     q 
    )
    +
    + +

    Definition at line 36 of file world.py.

    +
    36  def create_chunk(self, p, q):
    +
    37  if self.seed is not None:
    +
    38  dll_seed(self.seed)
    +
    39  return dll_create_world(p, q)
    +
    void create_chunk(Chunk *chunk, int p, int q)
    Definition: main.c:970
    +
    def dll_create_world(p, q)
    Definition: world.py:14
    +
    def dll_seed(x)
    Definition: world.py:11
    +
    +
    +
    + +

    ◆ get_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    def world.World.get_chunk ( self,
     p,
     q 
    )
    +
    + +

    Definition at line 40 of file world.py.

    +
    40  def get_chunk(self, p, q):
    +
    41  try:
    +
    42  chunk = self.cache.pop((p, q))
    +
    43  except KeyError:
    +
    44  chunk = self.create_chunk(p, q)
    +
    45  self.cache[(p, q)] = chunk
    +
    46  if len(self.cache) > self.cache_size:
    +
    47  self.cache.popitem(False)
    +
    48  return chunk
    +
    +
    +
    +

    Member Data Documentation

    + +

    ◆ cache

    + +
    +
    + + + + +
    world.World.cache
    +
    + +

    Definition at line 34 of file world.py.

    + +
    +
    + +

    ◆ cache_size

    + +
    +
    + + + + +
    world.World.cache_size
    +
    + +

    Definition at line 35 of file world.py.

    + +
    +
    + +

    ◆ seed

    + +
    +
    + + + + +
    world.World.seed
    +
    + +

    Definition at line 33 of file world.py.

    + +
    +
    +
    The documentation for this class was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/world.py
    • +
    +
    + + + + diff --git a/documentation/html/classworld_1_1World.png b/documentation/html/classworld_1_1World.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf0563babc94720c27538fc1dd45c83e07ae9b7 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J7@JY5_^Dj46+z1??Mfrs_DzUBY_$7i!m znk4PIb@S?}GKNK5?Vj8V&(E0Y+TO&9tU0k&WkgUY<2G;`FUR zuf5Zk*nU5>Dl%>T+W?i9C(<8=eOt!y@HLm{x9xwwU*E9*^wRK2d_D7~JpBA6{Ln|{ z`StOWo;>DUI5Sd#!P$plq6_zO%^MQBb80spD|l#sW+uO#`iRvXH`<9E;?u>R`TI%%nvHqvu_apZ8 zGqTURF!_+wJC6JEY%LNo7uO~FS416F+mrWT+dK91u^Q)%8fF8nnbDe-*7%3va+(1T UPt)Rq!0=-5boFyt=akR{01ir~r2qf` literal 0 HcmV?d00001 diff --git a/documentation/html/client_8c.html b/documentation/html/client_8c.html new file mode 100644 index 000000000..58e41ddaa --- /dev/null +++ b/documentation/html/client_8c.html @@ -0,0 +1,1097 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/client.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    client.c File Reference
    +
    +
    +
    #include <netdb.h>
    +#include <unistd.h>
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include "client.h"
    +#include "tinycthread.h"
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Macros

    #define QUEUE_SIZE   1048576
     
    #define RECV_SIZE   4096
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void client_enable ()
     
    void client_disable ()
     
    int get_client_enabled ()
     
    int client_sendall (int sd, char *data, int length)
     
    void client_send (char *data)
     
    void client_version (int version)
     
    void client_login (const char *username, const char *identity_token)
     
    void client_position (float x, float y, float z, float rx, float ry)
     
    void client_chunk (int p, int q, int key)
     
    void client_block (int x, int y, int z, int w)
     
    void client_sign (int x, int y, int z, int face, const char *text)
     
    void client_talk (const char *text)
     
    char * client_recv ()
     
    int recv_worker (void *arg)
     
    void client_connect (char *hostname, int port)
     
    void client_start ()
     
    void client_stop ()
     
    + + + + + + + + + + + + + + + + + + + +

    +Variables

    static int client_enabled = 0
     
    static int running = 0
     
    static int sd = 0
     
    static int bytes_sent = 0
     
    static int bytes_received = 0
     
    static char * queue = 0
     
    static int qsize = 0
     
    static thrd_t recv_thread
     
    static mtx_t mutex
     
    +

    Macro Definition Documentation

    + +

    ◆ QUEUE_SIZE

    + +
    +
    + + + + +
    #define QUEUE_SIZE   1048576
    +
    + +

    Definition at line 17 of file client.c.

    + +
    +
    + +

    ◆ RECV_SIZE

    + +
    +
    + + + + +
    #define RECV_SIZE   4096
    +
    + +

    Definition at line 18 of file client.c.

    + +
    +
    +

    Function Documentation

    + +

    ◆ client_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_block (int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 116 of file client.c.

    +
    116  {
    +
    117  if (!client_enabled) {
    +
    118  return;
    +
    119  }
    +
    120  char buffer[1024];
    +
    121  snprintf(buffer, 1024, "B,%d,%d,%d,%d\n", x, y, z, w);
    +
    122  client_send(buffer);
    +
    123 }
    +
    void client_send(char *data)
    Definition: client.c:59
    +
    static int client_enabled
    Definition: client.c:20
    +
    +
    +
    + +

    ◆ client_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_chunk (int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 107 of file client.c.

    +
    107  {
    +
    108  if (!client_enabled) {
    +
    109  return;
    +
    110  }
    +
    111  char buffer[1024];
    +
    112  snprintf(buffer, 1024, "C,%d,%d,%d\n", p, q, key);
    +
    113  client_send(buffer);
    +
    114 }
    +
    +
    +
    + +

    ◆ client_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void client_connect (char * hostname,
    int port 
    )
    +
    + +

    Definition at line 203 of file client.c.

    +
    203  {
    +
    204  if (!client_enabled) {
    +
    205  return;
    +
    206  }
    +
    207  struct hostent *host;
    +
    208  struct sockaddr_in address;
    +
    209  if ((host = gethostbyname(hostname)) == 0) {
    +
    210  perror("gethostbyname");
    +
    211  exit(1);
    +
    212  }
    +
    213  memset(&address, 0, sizeof(address));
    +
    214  address.sin_family = AF_INET;
    +
    215  address.sin_addr.s_addr = ((struct in_addr *)(host->h_addr_list[0]))->s_addr;
    +
    216  address.sin_port = htons(port);
    +
    217  if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    +
    218  perror("socket");
    +
    219  exit(1);
    +
    220  }
    +
    221  if (connect(sd, (struct sockaddr *)&address, sizeof(address)) == -1) {
    +
    222  perror("connect");
    +
    223  exit(1);
    +
    224  }
    +
    225 }
    +
    static int sd
    Definition: client.c:22
    +
    +
    +
    + +

    ◆ client_disable()

    + +
    +
    + + + + + + + +
    void client_disable ()
    +
    + +

    Definition at line 34 of file client.c.

    +
    34  {
    +
    35  client_enabled = 0;
    +
    36 }
    +
    +
    +
    + +

    ◆ client_enable()

    + +
    +
    + + + + + + + +
    void client_enable ()
    +
    + +

    Definition at line 30 of file client.c.

    +
    30  {
    +
    31  client_enabled = 1;
    +
    32 }
    +
    +
    +
    + +

    ◆ client_login()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void client_login (const char * username,
    const char * identity_token 
    )
    +
    + +

    Definition at line 78 of file client.c.

    +
    78  {
    +
    79  if (!client_enabled) {
    +
    80  return;
    +
    81  }
    +
    82  char buffer[1024];
    +
    83  snprintf(buffer, 1024, "A,%s,%s\n", username, identity_token);
    +
    84  client_send(buffer);
    +
    85 }
    +
    +
    +
    + +

    ◆ client_position()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_position (float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 87 of file client.c.

    +
    87  {
    +
    88  if (!client_enabled) {
    +
    89  return;
    +
    90  }
    +
    91  static float px, py, pz, prx, pry = 0;
    +
    92  float distance =
    +
    93  (px - x) * (px - x) +
    +
    94  (py - y) * (py - y) +
    +
    95  (pz - z) * (pz - z) +
    +
    96  (prx - rx) * (prx - rx) +
    +
    97  (pry - ry) * (pry - ry);
    +
    98  if (distance < 0.0001) {
    +
    99  return;
    +
    100  }
    +
    101  px = x; py = y; pz = z; prx = rx; pry = ry;
    +
    102  char buffer[1024];
    +
    103  snprintf(buffer, 1024, "P,%.2f,%.2f,%.2f,%.2f,%.2f\n", x, y, z, rx, ry);
    +
    104  client_send(buffer);
    +
    105 }
    +
    +
    +
    + +

    ◆ client_recv()

    + +
    +
    + + + + + + + +
    char* client_recv ()
    +
    + +

    Definition at line 146 of file client.c.

    +
    146  {
    +
    147  if (!client_enabled) {
    +
    148  return 0;
    +
    149  }
    +
    150  char *result = 0;
    +
    151  mtx_lock(&mutex);
    +
    152  char *p = queue + qsize - 1;
    +
    153  while (p >= queue && *p != '\n') {
    +
    154  p--;
    +
    155  }
    +
    156  if (p >= queue) {
    +
    157  int length = p - queue + 1;
    +
    158  result = malloc(sizeof(char) * (length + 1));
    +
    159  memcpy(result, queue, sizeof(char) * length);
    +
    160  result[length] = '\0';
    +
    161  int remaining = qsize - length;
    +
    162  memmove(queue, p + 1, remaining);
    +
    163  qsize -= length;
    +
    164  bytes_received += length;
    +
    165  }
    +
    166  mtx_unlock(&mutex);
    +
    167  return result;
    +
    168 }
    +
    static int bytes_received
    Definition: client.c:24
    +
    static mtx_t mutex
    Definition: client.c:28
    +
    static int qsize
    Definition: client.c:26
    +
    static char * queue
    Definition: client.c:25
    +
    +
    +
    + +

    ◆ client_send()

    + +
    +
    + + + + + + + + +
    void client_send (char * data)
    +
    + +

    Definition at line 59 of file client.c.

    +
    59  {
    +
    60  if (!client_enabled) {
    +
    61  return;
    +
    62  }
    +
    63  if (client_sendall(sd, data, strlen(data)) == -1) {
    +
    64  perror("client_sendall");
    +
    65  exit(1);
    +
    66  }
    +
    67 }
    +
    int client_sendall(int sd, char *data, int length)
    Definition: client.c:42
    +
    +
    +
    + +

    ◆ client_sendall()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int client_sendall (int sd,
    char * data,
    int length 
    )
    +
    + +

    Definition at line 42 of file client.c.

    +
    42  {
    +
    43  if (!client_enabled) {
    +
    44  return 0;
    +
    45  }
    +
    46  int count = 0;
    +
    47  while (count < length) {
    +
    48  int n = send(sd, data + count, length, 0);
    +
    49  if (n == -1) {
    +
    50  return -1;
    +
    51  }
    +
    52  count += n;
    +
    53  length -= n;
    +
    54  bytes_sent += n;
    +
    55  }
    +
    56  return 0;
    +
    57 }
    +
    static int bytes_sent
    Definition: client.c:23
    +
    +
    +
    + +

    ◆ client_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_sign (int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 125 of file client.c.

    +
    125  {
    +
    126  if (!client_enabled) {
    +
    127  return;
    +
    128  }
    +
    129  char buffer[1024];
    +
    130  snprintf(buffer, 1024, "S,%d,%d,%d,%d,%s\n", x, y, z, face, text);
    +
    131  client_send(buffer);
    +
    132 }
    +
    +
    +
    + +

    ◆ client_start()

    + +
    +
    + + + + + + + +
    void client_start ()
    +
    + +

    Definition at line 227 of file client.c.

    +
    227  {
    +
    228  if (!client_enabled) {
    +
    229  return;
    +
    230  }
    +
    231  running = 1;
    +
    232  queue = (char *)calloc(QUEUE_SIZE, sizeof(char));
    +
    233  qsize = 0;
    +
    234  mtx_init(&mutex, mtx_plain);
    +
    235  if (thrd_create(&recv_thread, recv_worker, NULL) != thrd_success) {
    +
    236  perror("thrd_create");
    +
    237  exit(1);
    +
    238  }
    +
    239 }
    +
    #define QUEUE_SIZE
    Definition: client.c:17
    +
    static int running
    Definition: client.c:21
    +
    int recv_worker(void *arg)
    Definition: client.c:170
    +
    static thrd_t recv_thread
    Definition: client.c:27
    +
    +
    +
    + +

    ◆ client_stop()

    + +
    +
    + + + + + + + +
    void client_stop ()
    +
    + +

    Definition at line 241 of file client.c.

    +
    241  {
    +
    242  if (!client_enabled) {
    +
    243  return;
    +
    244  }
    +
    245  running = 0;
    +
    246  close(sd);
    +
    247  // if (thrd_join(recv_thread, NULL) != thrd_success) {
    +
    248  // perror("thrd_join");
    +
    249  // exit(1);
    +
    250  // }
    +
    251  // mtx_destroy(&mutex);
    +
    252  qsize = 0;
    +
    253  free(queue);
    +
    254  // printf("Bytes Sent: %d, Bytes Received: %d\n",
    +
    255  // bytes_sent, bytes_received);
    +
    256 }
    +
    +
    +
    + +

    ◆ client_talk()

    + +
    +
    + + + + + + + + +
    void client_talk (const char * text)
    +
    + +

    Definition at line 134 of file client.c.

    +
    134  {
    +
    135  if (!client_enabled) {
    +
    136  return;
    +
    137  }
    +
    138  if (strlen(text) == 0) {
    +
    139  return;
    +
    140  }
    +
    141  char buffer[1024];
    +
    142  snprintf(buffer, 1024, "T,%s\n", text);
    +
    143  client_send(buffer);
    +
    144 }
    +
    +
    +
    + +

    ◆ client_version()

    + +
    +
    + + + + + + + + +
    void client_version (int version)
    +
    + +

    Definition at line 69 of file client.c.

    +
    69  {
    +
    70  if (!client_enabled) {
    +
    71  return;
    +
    72  }
    +
    73  char buffer[1024];
    +
    74  snprintf(buffer, 1024, "V,%d\n", version);
    +
    75  client_send(buffer);
    +
    76 }
    +
    +
    +
    + +

    ◆ get_client_enabled()

    + +
    +
    + + + + + + + +
    int get_client_enabled ()
    +
    + +

    Definition at line 38 of file client.c.

    +
    38  {
    +
    39  return client_enabled;
    +
    40 }
    +
    +
    +
    + +

    ◆ recv_worker()

    + +
    +
    + + + + + + + + +
    int recv_worker (void * arg)
    +
    + +

    Definition at line 170 of file client.c.

    +
    170  {
    +
    171  char *data = malloc(sizeof(char) * RECV_SIZE);
    +
    172  while (1) {
    +
    173  int length;
    +
    174  if ((length = recv(sd, data, RECV_SIZE - 1, 0)) <= 0) {
    +
    175  if (running) {
    +
    176  perror("recv");
    +
    177  exit(1);
    +
    178  }
    +
    179  else {
    +
    180  break;
    +
    181  }
    +
    182  }
    +
    183  data[length] = '\0';
    +
    184  while (1) {
    +
    185  int done = 0;
    +
    186  mtx_lock(&mutex);
    +
    187  if (qsize + length < QUEUE_SIZE) {
    +
    188  memcpy(queue + qsize, data, sizeof(char) * (length + 1));
    +
    189  qsize += length;
    +
    190  done = 1;
    +
    191  }
    +
    192  mtx_unlock(&mutex);
    +
    193  if (done) {
    +
    194  break;
    +
    195  }
    +
    196  sleep(0);
    +
    197  }
    +
    198  }
    +
    199  free(data);
    +
    200  return 0;
    +
    201 }
    +
    #define RECV_SIZE
    Definition: client.c:18
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ bytes_received

    + +
    +
    + + + + + +
    + + + + +
    int bytes_received = 0
    +
    +static
    +
    + +

    Definition at line 24 of file client.c.

    + +
    +
    + +

    ◆ bytes_sent

    + +
    +
    + + + + + +
    + + + + +
    int bytes_sent = 0
    +
    +static
    +
    + +

    Definition at line 23 of file client.c.

    + +
    +
    + +

    ◆ client_enabled

    + +
    +
    + + + + + +
    + + + + +
    int client_enabled = 0
    +
    +static
    +
    + +

    Definition at line 20 of file client.c.

    + +
    +
    + +

    ◆ mutex

    + +
    +
    + + + + + +
    + + + + +
    mtx_t mutex
    +
    +static
    +
    + +

    Definition at line 28 of file client.c.

    + +
    +
    + +

    ◆ qsize

    + +
    +
    + + + + + +
    + + + + +
    int qsize = 0
    +
    +static
    +
    + +

    Definition at line 26 of file client.c.

    + +
    +
    + +

    ◆ queue

    + +
    +
    + + + + + +
    + + + + +
    char* queue = 0
    +
    +static
    +
    + +

    Definition at line 25 of file client.c.

    + +
    +
    + +

    ◆ recv_thread

    + +
    +
    + + + + + +
    + + + + +
    thrd_t recv_thread
    +
    +static
    +
    + +

    Definition at line 27 of file client.c.

    + +
    +
    + +

    ◆ running

    + +
    +
    + + + + + +
    + + + + +
    int running = 0
    +
    +static
    +
    + +

    Definition at line 21 of file client.c.

    + +
    +
    + +

    ◆ sd

    + +
    +
    + + + + + +
    + + + + +
    int sd = 0
    +
    +static
    +
    + +

    Definition at line 22 of file client.c.

    + +
    +
    +
    + + + + diff --git a/documentation/html/client_8c_source.html b/documentation/html/client_8c_source.html new file mode 100644 index 000000000..31d6d6997 --- /dev/null +++ b/documentation/html/client_8c_source.html @@ -0,0 +1,363 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/client.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    client.c
    +
    +
    +Go to the documentation of this file.
    1 #ifdef _WIN32
    +
    2  #include <winsock2.h>
    +
    3  #include <windows.h>
    +
    4  #define close closesocket
    +
    5  #define sleep Sleep
    +
    6 #else
    +
    7  #include <netdb.h>
    +
    8  #include <unistd.h>
    +
    9 #endif
    +
    10 
    +
    11 #include <stdio.h>
    +
    12 #include <stdlib.h>
    +
    13 #include <string.h>
    +
    14 #include "client.h"
    +
    15 #include "tinycthread.h"
    +
    16 
    +
    17 #define QUEUE_SIZE 1048576
    +
    18 #define RECV_SIZE 4096
    +
    19 
    +
    20 static int client_enabled = 0;
    +
    21 static int running = 0;
    +
    22 static int sd = 0;
    +
    23 static int bytes_sent = 0;
    +
    24 static int bytes_received = 0;
    +
    25 static char *queue = 0;
    +
    26 static int qsize = 0;
    +
    27 static thrd_t recv_thread;
    +
    28 static mtx_t mutex;
    +
    29 
    +
    30 void client_enable() {
    +
    31  client_enabled = 1;
    +
    32 }
    +
    33 
    + +
    35  client_enabled = 0;
    +
    36 }
    +
    37 
    + +
    39  return client_enabled;
    +
    40 }
    +
    41 
    +
    42 int client_sendall(int sd, char *data, int length) {
    +
    43  if (!client_enabled) {
    +
    44  return 0;
    +
    45  }
    +
    46  int count = 0;
    +
    47  while (count < length) {
    +
    48  int n = send(sd, data + count, length, 0);
    +
    49  if (n == -1) {
    +
    50  return -1;
    +
    51  }
    +
    52  count += n;
    +
    53  length -= n;
    +
    54  bytes_sent += n;
    +
    55  }
    +
    56  return 0;
    +
    57 }
    +
    58 
    +
    59 void client_send(char *data) {
    +
    60  if (!client_enabled) {
    +
    61  return;
    +
    62  }
    +
    63  if (client_sendall(sd, data, strlen(data)) == -1) {
    +
    64  perror("client_sendall");
    +
    65  exit(1);
    +
    66  }
    +
    67 }
    +
    68 
    +
    69 void client_version(int version) {
    +
    70  if (!client_enabled) {
    +
    71  return;
    +
    72  }
    +
    73  char buffer[1024];
    +
    74  snprintf(buffer, 1024, "V,%d\n", version);
    +
    75  client_send(buffer);
    +
    76 }
    +
    77 
    +
    78 void client_login(const char *username, const char *identity_token) {
    +
    79  if (!client_enabled) {
    +
    80  return;
    +
    81  }
    +
    82  char buffer[1024];
    +
    83  snprintf(buffer, 1024, "A,%s,%s\n", username, identity_token);
    +
    84  client_send(buffer);
    +
    85 }
    +
    86 
    +
    87 void client_position(float x, float y, float z, float rx, float ry) {
    +
    88  if (!client_enabled) {
    +
    89  return;
    +
    90  }
    +
    91  static float px, py, pz, prx, pry = 0;
    +
    92  float distance =
    +
    93  (px - x) * (px - x) +
    +
    94  (py - y) * (py - y) +
    +
    95  (pz - z) * (pz - z) +
    +
    96  (prx - rx) * (prx - rx) +
    +
    97  (pry - ry) * (pry - ry);
    +
    98  if (distance < 0.0001) {
    +
    99  return;
    +
    100  }
    +
    101  px = x; py = y; pz = z; prx = rx; pry = ry;
    +
    102  char buffer[1024];
    +
    103  snprintf(buffer, 1024, "P,%.2f,%.2f,%.2f,%.2f,%.2f\n", x, y, z, rx, ry);
    +
    104  client_send(buffer);
    +
    105 }
    +
    106 
    +
    107 void client_chunk(int p, int q, int key) {
    +
    108  if (!client_enabled) {
    +
    109  return;
    +
    110  }
    +
    111  char buffer[1024];
    +
    112  snprintf(buffer, 1024, "C,%d,%d,%d\n", p, q, key);
    +
    113  client_send(buffer);
    +
    114 }
    +
    115 
    +
    116 void client_block(int x, int y, int z, int w) {
    +
    117  if (!client_enabled) {
    +
    118  return;
    +
    119  }
    +
    120  char buffer[1024];
    +
    121  snprintf(buffer, 1024, "B,%d,%d,%d,%d\n", x, y, z, w);
    +
    122  client_send(buffer);
    +
    123 }
    +
    124 
    +
    125 void client_sign(int x, int y, int z, int face, const char *text) {
    +
    126  if (!client_enabled) {
    +
    127  return;
    +
    128  }
    +
    129  char buffer[1024];
    +
    130  snprintf(buffer, 1024, "S,%d,%d,%d,%d,%s\n", x, y, z, face, text);
    +
    131  client_send(buffer);
    +
    132 }
    +
    133 
    +
    134 void client_talk(const char *text) {
    +
    135  if (!client_enabled) {
    +
    136  return;
    +
    137  }
    +
    138  if (strlen(text) == 0) {
    +
    139  return;
    +
    140  }
    +
    141  char buffer[1024];
    +
    142  snprintf(buffer, 1024, "T,%s\n", text);
    +
    143  client_send(buffer);
    +
    144 }
    +
    145 
    +
    146 char *client_recv() {
    +
    147  if (!client_enabled) {
    +
    148  return 0;
    +
    149  }
    +
    150  char *result = 0;
    +
    151  mtx_lock(&mutex);
    +
    152  char *p = queue + qsize - 1;
    +
    153  while (p >= queue && *p != '\n') {
    +
    154  p--;
    +
    155  }
    +
    156  if (p >= queue) {
    +
    157  int length = p - queue + 1;
    +
    158  result = malloc(sizeof(char) * (length + 1));
    +
    159  memcpy(result, queue, sizeof(char) * length);
    +
    160  result[length] = '\0';
    +
    161  int remaining = qsize - length;
    +
    162  memmove(queue, p + 1, remaining);
    +
    163  qsize -= length;
    +
    164  bytes_received += length;
    +
    165  }
    +
    166  mtx_unlock(&mutex);
    +
    167  return result;
    +
    168 }
    +
    169 
    +
    170 int recv_worker(void *arg) {
    +
    171  char *data = malloc(sizeof(char) * RECV_SIZE);
    +
    172  while (1) {
    +
    173  int length;
    +
    174  if ((length = recv(sd, data, RECV_SIZE - 1, 0)) <= 0) {
    +
    175  if (running) {
    +
    176  perror("recv");
    +
    177  exit(1);
    +
    178  }
    +
    179  else {
    +
    180  break;
    +
    181  }
    +
    182  }
    +
    183  data[length] = '\0';
    +
    184  while (1) {
    +
    185  int done = 0;
    +
    186  mtx_lock(&mutex);
    +
    187  if (qsize + length < QUEUE_SIZE) {
    +
    188  memcpy(queue + qsize, data, sizeof(char) * (length + 1));
    +
    189  qsize += length;
    +
    190  done = 1;
    +
    191  }
    +
    192  mtx_unlock(&mutex);
    +
    193  if (done) {
    +
    194  break;
    +
    195  }
    +
    196  sleep(0);
    +
    197  }
    +
    198  }
    +
    199  free(data);
    +
    200  return 0;
    +
    201 }
    +
    202 
    +
    203 void client_connect(char *hostname, int port) {
    +
    204  if (!client_enabled) {
    +
    205  return;
    +
    206  }
    +
    207  struct hostent *host;
    +
    208  struct sockaddr_in address;
    +
    209  if ((host = gethostbyname(hostname)) == 0) {
    +
    210  perror("gethostbyname");
    +
    211  exit(1);
    +
    212  }
    +
    213  memset(&address, 0, sizeof(address));
    +
    214  address.sin_family = AF_INET;
    +
    215  address.sin_addr.s_addr = ((struct in_addr *)(host->h_addr_list[0]))->s_addr;
    +
    216  address.sin_port = htons(port);
    +
    217  if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    +
    218  perror("socket");
    +
    219  exit(1);
    +
    220  }
    +
    221  if (connect(sd, (struct sockaddr *)&address, sizeof(address)) == -1) {
    +
    222  perror("connect");
    +
    223  exit(1);
    +
    224  }
    +
    225 }
    +
    226 
    +
    227 void client_start() {
    +
    228  if (!client_enabled) {
    +
    229  return;
    +
    230  }
    +
    231  running = 1;
    +
    232  queue = (char *)calloc(QUEUE_SIZE, sizeof(char));
    +
    233  qsize = 0;
    +
    234  mtx_init(&mutex, mtx_plain);
    +
    235  if (thrd_create(&recv_thread, recv_worker, NULL) != thrd_success) {
    +
    236  perror("thrd_create");
    +
    237  exit(1);
    +
    238  }
    +
    239 }
    +
    240 
    +
    241 void client_stop() {
    +
    242  if (!client_enabled) {
    +
    243  return;
    +
    244  }
    +
    245  running = 0;
    +
    246  close(sd);
    +
    247  // if (thrd_join(recv_thread, NULL) != thrd_success) {
    +
    248  // perror("thrd_join");
    +
    249  // exit(1);
    +
    250  // }
    +
    251  // mtx_destroy(&mutex);
    +
    252  qsize = 0;
    +
    253  free(queue);
    +
    254  // printf("Bytes Sent: %d, Bytes Received: %d\n",
    +
    255  // bytes_sent, bytes_received);
    +
    256 }
    +
    char * client_recv()
    Definition: client.c:146
    +
    static int sd
    Definition: client.c:22
    +
    static int bytes_received
    Definition: client.c:24
    +
    void client_block(int x, int y, int z, int w)
    Definition: client.c:116
    +
    #define QUEUE_SIZE
    Definition: client.c:17
    +
    static mtx_t mutex
    Definition: client.c:28
    +
    static int running
    Definition: client.c:21
    +
    static int qsize
    Definition: client.c:26
    +
    void client_login(const char *username, const char *identity_token)
    Definition: client.c:78
    +
    void client_chunk(int p, int q, int key)
    Definition: client.c:107
    +
    void client_version(int version)
    Definition: client.c:69
    +
    void client_send(char *data)
    Definition: client.c:59
    +
    void client_sign(int x, int y, int z, int face, const char *text)
    Definition: client.c:125
    +
    void client_connect(char *hostname, int port)
    Definition: client.c:203
    +
    void client_disable()
    Definition: client.c:34
    +
    void client_position(float x, float y, float z, float rx, float ry)
    Definition: client.c:87
    +
    int recv_worker(void *arg)
    Definition: client.c:170
    +
    void client_start()
    Definition: client.c:227
    +
    void client_enable()
    Definition: client.c:30
    +
    static thrd_t recv_thread
    Definition: client.c:27
    +
    #define RECV_SIZE
    Definition: client.c:18
    +
    void client_stop()
    Definition: client.c:241
    +
    static int bytes_sent
    Definition: client.c:23
    +
    int get_client_enabled()
    Definition: client.c:38
    +
    static char * queue
    Definition: client.c:25
    +
    static int client_enabled
    Definition: client.c:20
    +
    void client_talk(const char *text)
    Definition: client.c:134
    +
    int client_sendall(int sd, char *data, int length)
    Definition: client.c:42
    + +
    + + + + diff --git a/documentation/html/client_8h.html b/documentation/html/client_8h.html new file mode 100644 index 000000000..d228e8619 --- /dev/null +++ b/documentation/html/client_8h.html @@ -0,0 +1,723 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/client.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    client.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Macros

    #define DEFAULT_PORT   4080
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void client_enable ()
     
    void client_disable ()
     
    int get_client_enabled ()
     
    void client_connect (char *hostname, int port)
     
    void client_start ()
     
    void client_stop ()
     
    void client_send (char *data)
     
    char * client_recv ()
     
    void client_version (int version)
     
    void client_login (const char *username, const char *identity_token)
     
    void client_position (float x, float y, float z, float rx, float ry)
     
    void client_chunk (int p, int q, int key)
     
    void client_block (int x, int y, int z, int w)
     
    void client_sign (int x, int y, int z, int face, const char *text)
     
    void client_talk (const char *text)
     
    +

    Macro Definition Documentation

    + +

    ◆ DEFAULT_PORT

    + +
    +
    + + + + +
    #define DEFAULT_PORT   4080
    +
    + +

    Definition at line 4 of file client.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ client_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_block (int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 116 of file client.c.

    +
    116  {
    +
    117  if (!client_enabled) {
    +
    118  return;
    +
    119  }
    +
    120  char buffer[1024];
    +
    121  snprintf(buffer, 1024, "B,%d,%d,%d,%d\n", x, y, z, w);
    +
    122  client_send(buffer);
    +
    123 }
    +
    void client_send(char *data)
    Definition: client.c:59
    +
    static int client_enabled
    Definition: client.c:20
    +
    +
    +
    + +

    ◆ client_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_chunk (int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 107 of file client.c.

    +
    107  {
    +
    108  if (!client_enabled) {
    +
    109  return;
    +
    110  }
    +
    111  char buffer[1024];
    +
    112  snprintf(buffer, 1024, "C,%d,%d,%d\n", p, q, key);
    +
    113  client_send(buffer);
    +
    114 }
    +
    +
    +
    + +

    ◆ client_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void client_connect (char * hostname,
    int port 
    )
    +
    + +

    Definition at line 203 of file client.c.

    +
    203  {
    +
    204  if (!client_enabled) {
    +
    205  return;
    +
    206  }
    +
    207  struct hostent *host;
    +
    208  struct sockaddr_in address;
    +
    209  if ((host = gethostbyname(hostname)) == 0) {
    +
    210  perror("gethostbyname");
    +
    211  exit(1);
    +
    212  }
    +
    213  memset(&address, 0, sizeof(address));
    +
    214  address.sin_family = AF_INET;
    +
    215  address.sin_addr.s_addr = ((struct in_addr *)(host->h_addr_list[0]))->s_addr;
    +
    216  address.sin_port = htons(port);
    +
    217  if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    +
    218  perror("socket");
    +
    219  exit(1);
    +
    220  }
    +
    221  if (connect(sd, (struct sockaddr *)&address, sizeof(address)) == -1) {
    +
    222  perror("connect");
    +
    223  exit(1);
    +
    224  }
    +
    225 }
    +
    static int sd
    Definition: client.c:22
    +
    +
    +
    + +

    ◆ client_disable()

    + +
    +
    + + + + + + + +
    void client_disable ()
    +
    + +

    Definition at line 34 of file client.c.

    +
    34  {
    +
    35  client_enabled = 0;
    +
    36 }
    +
    +
    +
    + +

    ◆ client_enable()

    + +
    +
    + + + + + + + +
    void client_enable ()
    +
    + +

    Definition at line 30 of file client.c.

    +
    30  {
    +
    31  client_enabled = 1;
    +
    32 }
    +
    +
    +
    + +

    ◆ client_login()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void client_login (const char * username,
    const char * identity_token 
    )
    +
    + +

    Definition at line 78 of file client.c.

    +
    78  {
    +
    79  if (!client_enabled) {
    +
    80  return;
    +
    81  }
    +
    82  char buffer[1024];
    +
    83  snprintf(buffer, 1024, "A,%s,%s\n", username, identity_token);
    +
    84  client_send(buffer);
    +
    85 }
    +
    +
    +
    + +

    ◆ client_position()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_position (float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 87 of file client.c.

    +
    87  {
    +
    88  if (!client_enabled) {
    +
    89  return;
    +
    90  }
    +
    91  static float px, py, pz, prx, pry = 0;
    +
    92  float distance =
    +
    93  (px - x) * (px - x) +
    +
    94  (py - y) * (py - y) +
    +
    95  (pz - z) * (pz - z) +
    +
    96  (prx - rx) * (prx - rx) +
    +
    97  (pry - ry) * (pry - ry);
    +
    98  if (distance < 0.0001) {
    +
    99  return;
    +
    100  }
    +
    101  px = x; py = y; pz = z; prx = rx; pry = ry;
    +
    102  char buffer[1024];
    +
    103  snprintf(buffer, 1024, "P,%.2f,%.2f,%.2f,%.2f,%.2f\n", x, y, z, rx, ry);
    +
    104  client_send(buffer);
    +
    105 }
    +
    +
    +
    + +

    ◆ client_recv()

    + +
    +
    + + + + + + + +
    char* client_recv ()
    +
    + +

    Definition at line 146 of file client.c.

    +
    146  {
    +
    147  if (!client_enabled) {
    +
    148  return 0;
    +
    149  }
    +
    150  char *result = 0;
    +
    151  mtx_lock(&mutex);
    +
    152  char *p = queue + qsize - 1;
    +
    153  while (p >= queue && *p != '\n') {
    +
    154  p--;
    +
    155  }
    +
    156  if (p >= queue) {
    +
    157  int length = p - queue + 1;
    +
    158  result = malloc(sizeof(char) * (length + 1));
    +
    159  memcpy(result, queue, sizeof(char) * length);
    +
    160  result[length] = '\0';
    +
    161  int remaining = qsize - length;
    +
    162  memmove(queue, p + 1, remaining);
    +
    163  qsize -= length;
    +
    164  bytes_received += length;
    +
    165  }
    +
    166  mtx_unlock(&mutex);
    +
    167  return result;
    +
    168 }
    +
    static int bytes_received
    Definition: client.c:24
    +
    static mtx_t mutex
    Definition: client.c:28
    +
    static int qsize
    Definition: client.c:26
    +
    static char * queue
    Definition: client.c:25
    +
    +
    +
    + +

    ◆ client_send()

    + +
    +
    + + + + + + + + +
    void client_send (char * data)
    +
    + +

    Definition at line 59 of file client.c.

    +
    59  {
    +
    60  if (!client_enabled) {
    +
    61  return;
    +
    62  }
    +
    63  if (client_sendall(sd, data, strlen(data)) == -1) {
    +
    64  perror("client_sendall");
    +
    65  exit(1);
    +
    66  }
    +
    67 }
    +
    int client_sendall(int sd, char *data, int length)
    Definition: client.c:42
    +
    +
    +
    + +

    ◆ client_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void client_sign (int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 125 of file client.c.

    +
    125  {
    +
    126  if (!client_enabled) {
    +
    127  return;
    +
    128  }
    +
    129  char buffer[1024];
    +
    130  snprintf(buffer, 1024, "S,%d,%d,%d,%d,%s\n", x, y, z, face, text);
    +
    131  client_send(buffer);
    +
    132 }
    +
    +
    +
    + +

    ◆ client_start()

    + +
    +
    + + + + + + + +
    void client_start ()
    +
    + +

    Definition at line 227 of file client.c.

    +
    227  {
    +
    228  if (!client_enabled) {
    +
    229  return;
    +
    230  }
    +
    231  running = 1;
    +
    232  queue = (char *)calloc(QUEUE_SIZE, sizeof(char));
    +
    233  qsize = 0;
    +
    234  mtx_init(&mutex, mtx_plain);
    +
    235  if (thrd_create(&recv_thread, recv_worker, NULL) != thrd_success) {
    +
    236  perror("thrd_create");
    +
    237  exit(1);
    +
    238  }
    +
    239 }
    +
    #define QUEUE_SIZE
    Definition: client.c:17
    +
    static int running
    Definition: client.c:21
    +
    int recv_worker(void *arg)
    Definition: client.c:170
    +
    static thrd_t recv_thread
    Definition: client.c:27
    +
    +
    +
    + +

    ◆ client_stop()

    + +
    +
    + + + + + + + +
    void client_stop ()
    +
    + +

    Definition at line 241 of file client.c.

    +
    241  {
    +
    242  if (!client_enabled) {
    +
    243  return;
    +
    244  }
    +
    245  running = 0;
    +
    246  close(sd);
    +
    247  // if (thrd_join(recv_thread, NULL) != thrd_success) {
    +
    248  // perror("thrd_join");
    +
    249  // exit(1);
    +
    250  // }
    +
    251  // mtx_destroy(&mutex);
    +
    252  qsize = 0;
    +
    253  free(queue);
    +
    254  // printf("Bytes Sent: %d, Bytes Received: %d\n",
    +
    255  // bytes_sent, bytes_received);
    +
    256 }
    +
    +
    +
    + +

    ◆ client_talk()

    + +
    +
    + + + + + + + + +
    void client_talk (const char * text)
    +
    + +

    Definition at line 134 of file client.c.

    +
    134  {
    +
    135  if (!client_enabled) {
    +
    136  return;
    +
    137  }
    +
    138  if (strlen(text) == 0) {
    +
    139  return;
    +
    140  }
    +
    141  char buffer[1024];
    +
    142  snprintf(buffer, 1024, "T,%s\n", text);
    +
    143  client_send(buffer);
    +
    144 }
    +
    +
    +
    + +

    ◆ client_version()

    + +
    +
    + + + + + + + + +
    void client_version (int version)
    +
    + +

    Definition at line 69 of file client.c.

    +
    69  {
    +
    70  if (!client_enabled) {
    +
    71  return;
    +
    72  }
    +
    73  char buffer[1024];
    +
    74  snprintf(buffer, 1024, "V,%d\n", version);
    +
    75  client_send(buffer);
    +
    76 }
    +
    +
    +
    + +

    ◆ get_client_enabled()

    + +
    +
    + + + + + + + +
    int get_client_enabled ()
    +
    + +

    Definition at line 38 of file client.c.

    +
    38  {
    +
    39  return client_enabled;
    +
    40 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/client_8h_source.html b/documentation/html/client_8h_source.html new file mode 100644 index 000000000..439e44c2c --- /dev/null +++ b/documentation/html/client_8h_source.html @@ -0,0 +1,115 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/client.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    client.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _client_h_
    +
    2 #define _client_h_
    +
    3 
    +
    4 #define DEFAULT_PORT 4080
    +
    5 
    +
    6 void client_enable();
    +
    7 void client_disable();
    + +
    9 void client_connect(char *hostname, int port);
    +
    10 void client_start();
    +
    11 void client_stop();
    +
    12 void client_send(char *data);
    +
    13 char *client_recv();
    +
    14 void client_version(int version);
    +
    15 void client_login(const char *username, const char *identity_token);
    +
    16 void client_position(float x, float y, float z, float rx, float ry);
    +
    17 void client_chunk(int p, int q, int key);
    +
    18 void client_block(int x, int y, int z, int w);
    +
    19 void client_sign(int x, int y, int z, int face, const char *text);
    +
    20 void client_talk(const char *text);
    +
    21 
    +
    22 #endif
    +
    char * client_recv()
    Definition: client.c:146
    +
    void client_block(int x, int y, int z, int w)
    Definition: client.c:116
    +
    void client_login(const char *username, const char *identity_token)
    Definition: client.c:78
    +
    void client_chunk(int p, int q, int key)
    Definition: client.c:107
    +
    void client_version(int version)
    Definition: client.c:69
    +
    void client_send(char *data)
    Definition: client.c:59
    +
    void client_sign(int x, int y, int z, int face, const char *text)
    Definition: client.c:125
    +
    void client_connect(char *hostname, int port)
    Definition: client.c:203
    +
    void client_disable()
    Definition: client.c:34
    +
    void client_position(float x, float y, float z, float rx, float ry)
    Definition: client.c:87
    +
    void client_start()
    Definition: client.c:227
    +
    void client_enable()
    Definition: client.c:30
    +
    void client_stop()
    Definition: client.c:241
    +
    int get_client_enabled()
    Definition: client.c:38
    +
    void client_talk(const char *text)
    Definition: client.c:134
    +
    + + + + diff --git a/documentation/html/closed.png b/documentation/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/documentation/html/config_8h.html b/documentation/html/config_8h.html new file mode 100644 index 000000000..c69e50348 --- /dev/null +++ b/documentation/html/config_8h.html @@ -0,0 +1,843 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/config.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    config.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define DEBUG   0
     
    #define FULLSCREEN   0
     
    #define WINDOW_WIDTH   1024
     
    #define WINDOW_HEIGHT   768
     
    #define VSYNC   1
     
    #define SCROLL_THRESHOLD   0.1
     
    #define MAX_MESSAGES   4
     
    #define DB_PATH   "craft.db"
     
    #define USE_CACHE   1
     
    #define DAY_LENGTH   300
     
    #define INVERT_MOUSE   0
     
    #define SHOW_PLANTS   1
     
    #define SHOW_CLOUDS   1
     
    #define SHOW_TREES   1
     
    #define SHOW_ITEM   1
     
    #define SHOW_CROSSHAIRS   1
     
    #define SHOW_WIREFRAME   1
     
    #define SHOW_INFO_TEXT   1
     
    #define SHOW_CHAT_TEXT   1
     
    #define SHOW_PLAYER_NAMES   1
     
    #define CRAFT_KEY_QUIT   'Q'
     
    #define CRAFT_KEY_FORWARD   'W'
     
    #define CRAFT_KEY_BACKWARD   'S'
     
    #define CRAFT_KEY_LEFT   'A'
     
    #define CRAFT_KEY_RIGHT   'D'
     
    #define CRAFT_KEY_JUMP   GLFW_KEY_SPACE
     
    #define CRAFT_KEY_FLY   GLFW_KEY_TAB
     
    #define CRAFT_KEY_OBSERVE   'O'
     
    #define CRAFT_KEY_OBSERVE_INSET   'P'
     
    #define CRAFT_KEY_ITEM_NEXT   'E'
     
    #define CRAFT_KEY_ITEM_PREV   'R'
     
    #define CRAFT_KEY_ZOOM   GLFW_KEY_LEFT_SHIFT
     
    #define CRAFT_KEY_ORTHO   'F'
     
    #define CRAFT_KEY_CHAT   't'
     
    #define CRAFT_KEY_COMMAND   '/'
     
    #define CRAFT_KEY_SIGN   '`'
     
    #define CREATE_CHUNK_RADIUS   10
     
    #define RENDER_CHUNK_RADIUS   10
     
    #define RENDER_SIGN_RADIUS   4
     
    #define DELETE_CHUNK_RADIUS   14
     
    #define CHUNK_SIZE   32
     
    #define COMMIT_INTERVAL   5
     
    +

    Macro Definition Documentation

    + +

    ◆ CHUNK_SIZE

    + +
    +
    + + + + +
    #define CHUNK_SIZE   32
    +
    + +

    Definition at line 51 of file config.h.

    + +
    +
    + +

    ◆ COMMIT_INTERVAL

    + +
    +
    + + + + +
    #define COMMIT_INTERVAL   5
    +
    + +

    Definition at line 52 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_BACKWARD

    + +
    +
    + + + + +
    #define CRAFT_KEY_BACKWARD   'S'
    +
    + +

    Definition at line 31 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_CHAT

    + +
    +
    + + + + +
    #define CRAFT_KEY_CHAT   't'
    +
    + +

    Definition at line 42 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_COMMAND

    + +
    +
    + + + + +
    #define CRAFT_KEY_COMMAND   '/'
    +
    + +

    Definition at line 43 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_FLY

    + +
    +
    + + + + +
    #define CRAFT_KEY_FLY   GLFW_KEY_TAB
    +
    + +

    Definition at line 35 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_FORWARD

    + +
    +
    + + + + +
    #define CRAFT_KEY_FORWARD   'W'
    +
    + +

    Definition at line 30 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_ITEM_NEXT

    + +
    +
    + + + + +
    #define CRAFT_KEY_ITEM_NEXT   'E'
    +
    + +

    Definition at line 38 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_ITEM_PREV

    + +
    +
    + + + + +
    #define CRAFT_KEY_ITEM_PREV   'R'
    +
    + +

    Definition at line 39 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_JUMP

    + +
    +
    + + + + +
    #define CRAFT_KEY_JUMP   GLFW_KEY_SPACE
    +
    + +

    Definition at line 34 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_LEFT

    + +
    +
    + + + + +
    #define CRAFT_KEY_LEFT   'A'
    +
    + +

    Definition at line 32 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_OBSERVE

    + +
    +
    + + + + +
    #define CRAFT_KEY_OBSERVE   'O'
    +
    + +

    Definition at line 36 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_OBSERVE_INSET

    + +
    +
    + + + + +
    #define CRAFT_KEY_OBSERVE_INSET   'P'
    +
    + +

    Definition at line 37 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_ORTHO

    + +
    +
    + + + + +
    #define CRAFT_KEY_ORTHO   'F'
    +
    + +

    Definition at line 41 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_QUIT

    + +
    +
    + + + + +
    #define CRAFT_KEY_QUIT   'Q'
    +
    + +

    Definition at line 29 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_RIGHT

    + +
    +
    + + + + +
    #define CRAFT_KEY_RIGHT   'D'
    +
    + +

    Definition at line 33 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_SIGN

    + +
    +
    + + + + +
    #define CRAFT_KEY_SIGN   '`'
    +
    + +

    Definition at line 44 of file config.h.

    + +
    +
    + +

    ◆ CRAFT_KEY_ZOOM

    + +
    +
    + + + + +
    #define CRAFT_KEY_ZOOM   GLFW_KEY_LEFT_SHIFT
    +
    + +

    Definition at line 40 of file config.h.

    + +
    +
    + +

    ◆ CREATE_CHUNK_RADIUS

    + +
    +
    + + + + +
    #define CREATE_CHUNK_RADIUS   10
    +
    + +

    Definition at line 47 of file config.h.

    + +
    +
    + +

    ◆ DAY_LENGTH

    + +
    +
    + + + + +
    #define DAY_LENGTH   300
    +
    + +

    Definition at line 14 of file config.h.

    + +
    +
    + +

    ◆ DB_PATH

    + +
    +
    + + + + +
    #define DB_PATH   "craft.db"
    +
    + +

    Definition at line 12 of file config.h.

    + +
    +
    + +

    ◆ DEBUG

    + +
    +
    + + + + +
    #define DEBUG   0
    +
    + +

    Definition at line 5 of file config.h.

    + +
    +
    + +

    ◆ DELETE_CHUNK_RADIUS

    + +
    +
    + + + + +
    #define DELETE_CHUNK_RADIUS   14
    +
    + +

    Definition at line 50 of file config.h.

    + +
    +
    + +

    ◆ FULLSCREEN

    + +
    +
    + + + + +
    #define FULLSCREEN   0
    +
    + +

    Definition at line 6 of file config.h.

    + +
    +
    + +

    ◆ INVERT_MOUSE

    + +
    +
    + + + + +
    #define INVERT_MOUSE   0
    +
    + +

    Definition at line 15 of file config.h.

    + +
    +
    + +

    ◆ MAX_MESSAGES

    + +
    +
    + + + + +
    #define MAX_MESSAGES   4
    +
    + +

    Definition at line 11 of file config.h.

    + +
    +
    + +

    ◆ RENDER_CHUNK_RADIUS

    + +
    +
    + + + + +
    #define RENDER_CHUNK_RADIUS   10
    +
    + +

    Definition at line 48 of file config.h.

    + +
    +
    + +

    ◆ RENDER_SIGN_RADIUS

    + +
    +
    + + + + +
    #define RENDER_SIGN_RADIUS   4
    +
    + +

    Definition at line 49 of file config.h.

    + +
    +
    + +

    ◆ SCROLL_THRESHOLD

    + +
    +
    + + + + +
    #define SCROLL_THRESHOLD   0.1
    +
    + +

    Definition at line 10 of file config.h.

    + +
    +
    + +

    ◆ SHOW_CHAT_TEXT

    + +
    +
    + + + + +
    #define SHOW_CHAT_TEXT   1
    +
    + +

    Definition at line 25 of file config.h.

    + +
    +
    + +

    ◆ SHOW_CLOUDS

    + +
    +
    + + + + +
    #define SHOW_CLOUDS   1
    +
    + +

    Definition at line 19 of file config.h.

    + +
    +
    + +

    ◆ SHOW_CROSSHAIRS

    + +
    +
    + + + + +
    #define SHOW_CROSSHAIRS   1
    +
    + +

    Definition at line 22 of file config.h.

    + +
    +
    + +

    ◆ SHOW_INFO_TEXT

    + +
    +
    + + + + +
    #define SHOW_INFO_TEXT   1
    +
    + +

    Definition at line 24 of file config.h.

    + +
    +
    + +

    ◆ SHOW_ITEM

    + +
    +
    + + + + +
    #define SHOW_ITEM   1
    +
    + +

    Definition at line 21 of file config.h.

    + +
    +
    + +

    ◆ SHOW_PLANTS

    + +
    +
    + + + + +
    #define SHOW_PLANTS   1
    +
    + +

    Definition at line 18 of file config.h.

    + +
    +
    + +

    ◆ SHOW_PLAYER_NAMES

    + +
    +
    + + + + +
    #define SHOW_PLAYER_NAMES   1
    +
    + +

    Definition at line 26 of file config.h.

    + +
    +
    + +

    ◆ SHOW_TREES

    + +
    +
    + + + + +
    #define SHOW_TREES   1
    +
    + +

    Definition at line 20 of file config.h.

    + +
    +
    + +

    ◆ SHOW_WIREFRAME

    + +
    +
    + + + + +
    #define SHOW_WIREFRAME   1
    +
    + +

    Definition at line 23 of file config.h.

    + +
    +
    + +

    ◆ USE_CACHE

    + +
    +
    + + + + +
    #define USE_CACHE   1
    +
    + +

    Definition at line 13 of file config.h.

    + +
    +
    + +

    ◆ VSYNC

    + +
    +
    + + + + +
    #define VSYNC   1
    +
    + +

    Definition at line 9 of file config.h.

    + +
    +
    + +

    ◆ WINDOW_HEIGHT

    + +
    +
    + + + + +
    #define WINDOW_HEIGHT   768
    +
    + +

    Definition at line 8 of file config.h.

    + +
    +
    + +

    ◆ WINDOW_WIDTH

    + +
    +
    + + + + +
    #define WINDOW_WIDTH   1024
    +
    + +

    Definition at line 7 of file config.h.

    + +
    +
    +
    + + + + diff --git a/documentation/html/config_8h_source.html b/documentation/html/config_8h_source.html new file mode 100644 index 000000000..f7b8d5999 --- /dev/null +++ b/documentation/html/config_8h_source.html @@ -0,0 +1,132 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/config.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    config.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _config_h_
    +
    2 #define _config_h_
    +
    3 
    +
    4 // app parameters
    +
    5 #define DEBUG 0
    +
    6 #define FULLSCREEN 0
    +
    7 #define WINDOW_WIDTH 1024
    +
    8 #define WINDOW_HEIGHT 768
    +
    9 #define VSYNC 1
    +
    10 #define SCROLL_THRESHOLD 0.1
    +
    11 #define MAX_MESSAGES 4
    +
    12 #define DB_PATH "craft.db"
    +
    13 #define USE_CACHE 1
    +
    14 #define DAY_LENGTH 300
    +
    15 #define INVERT_MOUSE 0
    +
    16 
    +
    17 // rendering options
    +
    18 #define SHOW_PLANTS 1
    +
    19 #define SHOW_CLOUDS 1
    +
    20 #define SHOW_TREES 1
    +
    21 #define SHOW_ITEM 1
    +
    22 #define SHOW_CROSSHAIRS 1
    +
    23 #define SHOW_WIREFRAME 1
    +
    24 #define SHOW_INFO_TEXT 1
    +
    25 #define SHOW_CHAT_TEXT 1
    +
    26 #define SHOW_PLAYER_NAMES 1
    +
    27 
    +
    28 // key bindings
    +
    29 #define CRAFT_KEY_QUIT 'Q'
    +
    30 #define CRAFT_KEY_FORWARD 'W'
    +
    31 #define CRAFT_KEY_BACKWARD 'S'
    +
    32 #define CRAFT_KEY_LEFT 'A'
    +
    33 #define CRAFT_KEY_RIGHT 'D'
    +
    34 #define CRAFT_KEY_JUMP GLFW_KEY_SPACE
    +
    35 #define CRAFT_KEY_FLY GLFW_KEY_TAB
    +
    36 #define CRAFT_KEY_OBSERVE 'O'
    +
    37 #define CRAFT_KEY_OBSERVE_INSET 'P'
    +
    38 #define CRAFT_KEY_ITEM_NEXT 'E'
    +
    39 #define CRAFT_KEY_ITEM_PREV 'R'
    +
    40 #define CRAFT_KEY_ZOOM GLFW_KEY_LEFT_SHIFT
    +
    41 #define CRAFT_KEY_ORTHO 'F'
    +
    42 #define CRAFT_KEY_CHAT 't'
    +
    43 #define CRAFT_KEY_COMMAND '/'
    +
    44 #define CRAFT_KEY_SIGN '`'
    +
    45 
    +
    46 // advanced parameters
    +
    47 #define CREATE_CHUNK_RADIUS 10
    +
    48 #define RENDER_CHUNK_RADIUS 10
    +
    49 #define RENDER_SIGN_RADIUS 4
    +
    50 #define DELETE_CHUNK_RADIUS 14
    +
    51 #define CHUNK_SIZE 32
    +
    52 #define COMMIT_INTERVAL 5
    +
    53 
    +
    54 #endif
    +
    + + + + diff --git a/documentation/html/cube_8c.html b/documentation/html/cube_8c.html new file mode 100644 index 000000000..e4cf00c8a --- /dev/null +++ b/documentation/html/cube_8c.html @@ -0,0 +1,1064 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/cube.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    cube.c File Reference
    +
    +
    +
    #include <math.h>
    +#include "cube.h"
    +#include "item.h"
    +#include "matrix.h"
    +#include "util.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void make_cube_faces (float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
     
    void make_cube (float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
     
    void make_plant (float *data, float px, float py, float pz, float n, int w, float rotation)
     
    void make_player (float *data, float x, float y, float z, float rx, float ry)
     
    void make_cube_wireframe (float *data, float x, float y, float z, float n)
     
    void make_character (float *data, float x, float y, float n, float m, char c)
     
    void make_character_3d (float *data, float x, float y, float z, float n, int face, char c)
     
    int _make_sphere (float *data, float r, int detail, float *a, float *b, float *c, float *ta, float *tb, float *tc)
     
    void make_sphere (float *data, float r, int detail)
     
    +

    Function Documentation

    + +

    ◆ _make_sphere()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int _make_sphere (float * data,
    float r,
    int detail,
    float * a,
    float * b,
    float * c,
    float * ta,
    float * tb,
    float * tc 
    )
    +
    + +

    Definition at line 290 of file cube.c.

    +
    294 {
    +
    295  if (detail == 0) {
    +
    296  float *d = data;
    +
    297  *(d++) = a[0] * r; *(d++) = a[1] * r; *(d++) = a[2] * r;
    +
    298  *(d++) = a[0]; *(d++) = a[1]; *(d++) = a[2];
    +
    299  *(d++) = ta[0]; *(d++) = ta[1];
    +
    300  *(d++) = b[0] * r; *(d++) = b[1] * r; *(d++) = b[2] * r;
    +
    301  *(d++) = b[0]; *(d++) = b[1]; *(d++) = b[2];
    +
    302  *(d++) = tb[0]; *(d++) = tb[1];
    +
    303  *(d++) = c[0] * r; *(d++) = c[1] * r; *(d++) = c[2] * r;
    +
    304  *(d++) = c[0]; *(d++) = c[1]; *(d++) = c[2];
    +
    305  *(d++) = tc[0]; *(d++) = tc[1];
    +
    306  return 1;
    +
    307  }
    +
    308  else {
    +
    309  float ab[3], ac[3], bc[3];
    +
    310  for (int i = 0; i < 3; i++) {
    +
    311  ab[i] = (a[i] + b[i]) / 2;
    +
    312  ac[i] = (a[i] + c[i]) / 2;
    +
    313  bc[i] = (b[i] + c[i]) / 2;
    +
    314  }
    +
    315  normalize(ab + 0, ab + 1, ab + 2);
    +
    316  normalize(ac + 0, ac + 1, ac + 2);
    +
    317  normalize(bc + 0, bc + 1, bc + 2);
    +
    318  float tab[2], tac[2], tbc[2];
    +
    319  tab[0] = 0; tab[1] = 1 - acosf(ab[1]) / PI;
    +
    320  tac[0] = 0; tac[1] = 1 - acosf(ac[1]) / PI;
    +
    321  tbc[0] = 0; tbc[1] = 1 - acosf(bc[1]) / PI;
    +
    322  int total = 0;
    +
    323  int n;
    +
    324  n = _make_sphere(data, r, detail - 1, a, ab, ac, ta, tab, tac);
    +
    325  total += n; data += n * 24;
    +
    326  n = _make_sphere(data, r, detail - 1, b, bc, ab, tb, tbc, tab);
    +
    327  total += n; data += n * 24;
    +
    328  n = _make_sphere(data, r, detail - 1, c, ac, bc, tc, tac, tbc);
    +
    329  total += n; data += n * 24;
    +
    330  n = _make_sphere(data, r, detail - 1, ab, bc, ac, tab, tbc, tac);
    +
    331  total += n; data += n * 24;
    +
    332  return total;
    +
    333  }
    +
    334 }
    +
    int _make_sphere(float *data, float r, int detail, float *a, float *b, float *c, float *ta, float *tb, float *tc)
    Definition: cube.c:290
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    #define PI
    Definition: util.h:8
    +
    +
    +
    + +

    ◆ make_character()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_character (float * data,
    float x,
    float y,
    float n,
    float m,
    char c 
    )
    +
    + +

    Definition at line 206 of file cube.c.

    +
    209 {
    +
    210  float *d = data;
    +
    211  float s = 0.0625;
    +
    212  float a = s;
    +
    213  float b = s * 2;
    +
    214  int w = c - 32;
    +
    215  float du = (w % 16) * a;
    +
    216  float dv = 1 - (w / 16) * b - b;
    +
    217  *(d++) = x - n; *(d++) = y - m;
    +
    218  *(d++) = du + 0; *(d++) = dv;
    +
    219  *(d++) = x + n; *(d++) = y - m;
    +
    220  *(d++) = du + a; *(d++) = dv;
    +
    221  *(d++) = x + n; *(d++) = y + m;
    +
    222  *(d++) = du + a; *(d++) = dv + b;
    +
    223  *(d++) = x - n; *(d++) = y - m;
    +
    224  *(d++) = du + 0; *(d++) = dv;
    +
    225  *(d++) = x + n; *(d++) = y + m;
    +
    226  *(d++) = du + a; *(d++) = dv + b;
    +
    227  *(d++) = x - n; *(d++) = y + m;
    +
    228  *(d++) = du + 0; *(d++) = dv + b;
    +
    229 }
    +
    +
    +
    + +

    ◆ make_character_3d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_character_3d (float * data,
    float x,
    float y,
    float z,
    float n,
    int face,
    char c 
    )
    +
    + +

    Definition at line 231 of file cube.c.

    +
    233 {
    +
    234  static const float positions[8][6][3] = {
    +
    235  {{0, -2, -1}, {0, +2, +1}, {0, +2, -1},
    +
    236  {0, -2, -1}, {0, -2, +1}, {0, +2, +1}},
    +
    237  {{0, -2, -1}, {0, +2, +1}, {0, -2, +1},
    +
    238  {0, -2, -1}, {0, +2, -1}, {0, +2, +1}},
    +
    239  {{-1, -2, 0}, {+1, +2, 0}, {+1, -2, 0},
    +
    240  {-1, -2, 0}, {-1, +2, 0}, {+1, +2, 0}},
    +
    241  {{-1, -2, 0}, {+1, -2, 0}, {+1, +2, 0},
    +
    242  {-1, -2, 0}, {+1, +2, 0}, {-1, +2, 0}},
    +
    243  {{-1, 0, +2}, {+1, 0, +2}, {+1, 0, -2},
    +
    244  {-1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    245  {{-2, 0, +1}, {+2, 0, -1}, {-2, 0, -1},
    +
    246  {-2, 0, +1}, {+2, 0, +1}, {+2, 0, -1}},
    +
    247  {{+1, 0, +2}, {-1, 0, -2}, {-1, 0, +2},
    +
    248  {+1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    249  {{+2, 0, -1}, {-2, 0, +1}, {+2, 0, +1},
    +
    250  {+2, 0, -1}, {-2, 0, -1}, {-2, 0, +1}}
    +
    251  };
    +
    252  static const float uvs[8][6][2] = {
    +
    253  {{0, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}, {1, 1}},
    +
    254  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    255  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    256  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    257  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    258  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    259  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    260  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}
    +
    261  };
    +
    262  static const float offsets[8][3] = {
    +
    263  {-1, 0, 0}, {+1, 0, 0}, {0, 0, -1}, {0, 0, +1},
    +
    264  {0, +1, 0}, {0, +1, 0}, {0, +1, 0}, {0, +1, 0},
    +
    265  };
    +
    266  float *d = data;
    +
    267  float s = 0.0625;
    +
    268  float pu = s / 5;
    +
    269  float pv = s / 2.5;
    +
    270  float u1 = pu;
    +
    271  float v1 = pv;
    +
    272  float u2 = s - pu;
    +
    273  float v2 = s * 2 - pv;
    +
    274  float p = 0.5;
    +
    275  int w = c - 32;
    +
    276  float du = (w % 16) * s;
    +
    277  float dv = 1 - (w / 16 + 1) * s * 2;
    +
    278  x += p * offsets[face][0];
    +
    279  y += p * offsets[face][1];
    +
    280  z += p * offsets[face][2];
    +
    281  for (int i = 0; i < 6; i++) {
    +
    282  *(d++) = x + n * positions[face][i][0];
    +
    283  *(d++) = y + n * positions[face][i][1];
    +
    284  *(d++) = z + n * positions[face][i][2];
    +
    285  *(d++) = du + (uvs[face][i][0] ? u2 : u1);
    +
    286  *(d++) = dv + (uvs[face][i][1] ? v2 : v1);
    +
    287  }
    +
    288 }
    +
    +
    +
    + +

    ◆ make_cube()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube (float * data,
    float ao[6][4],
    int left,
    int right,
    int top,
    int bottom,
    int front,
    int back,
    float x,
    float y,
    float z,
    float n,
    int w 
    )
    +
    + +

    Definition at line 81 of file cube.c.

    +
    85 {
    +
    86  int wleft = blocks[w][0];
    +
    87  int wright = blocks[w][1];
    +
    88  int wtop = blocks[w][2];
    +
    89  int wbottom = blocks[w][3];
    +
    90  int wfront = blocks[w][4];
    +
    91  int wback = blocks[w][5];
    + +
    93  data, ao,
    +
    94  left, right, top, bottom, front, back,
    +
    95  wleft, wright, wtop, wbottom, wfront, wback,
    +
    96  x, y, z, n);
    +
    97 }
    +
    void make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
    Definition: cube.c:7
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    +
    +
    + +

    ◆ make_cube_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube_faces (float * data,
    float ao[6][4],
    int left,
    int right,
    int top,
    int bottom,
    int front,
    int back,
    int wleft,
    int wright,
    int wtop,
    int wbottom,
    int wfront,
    int wback,
    float x,
    float y,
    float z,
    float n 
    )
    +
    + +

    Definition at line 7 of file cube.c.

    +
    12 {
    +
    13  static const float positions[6][4][3] = {
    +
    14  {{-1, -1, -1}, {-1, -1, +1}, {-1, +1, -1}, {-1, +1, +1}},
    +
    15  {{+1, -1, -1}, {+1, -1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    16  {{-1, +1, -1}, {-1, +1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    17  {{-1, -1, -1}, {-1, -1, +1}, {+1, -1, -1}, {+1, -1, +1}},
    +
    18  {{-1, -1, -1}, {-1, +1, -1}, {+1, -1, -1}, {+1, +1, -1}},
    +
    19  {{-1, -1, +1}, {-1, +1, +1}, {+1, -1, +1}, {+1, +1, +1}}
    +
    20  };
    +
    21  static const float normals[6][3] = {
    +
    22  {-1, 0, 0},
    +
    23  {+1, 0, 0},
    +
    24  {0, +1, 0},
    +
    25  {0, -1, 0},
    +
    26  {0, 0, -1},
    +
    27  {0, 0, +1}
    +
    28  };
    +
    29  static const float uvs[6][4][2] = {
    +
    30  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    31  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    32  {{0, 1}, {0, 0}, {1, 1}, {1, 0}},
    +
    33  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    34  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    35  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    36  };
    +
    37  static const float indices[6][6] = {
    +
    38  {0, 3, 2, 0, 1, 3},
    +
    39  {0, 3, 1, 0, 2, 3},
    +
    40  {0, 3, 2, 0, 1, 3},
    +
    41  {0, 3, 1, 0, 2, 3},
    +
    42  {0, 3, 2, 0, 1, 3},
    +
    43  {0, 3, 1, 0, 2, 3}
    +
    44  };
    +
    45  static const float flipped[6][6] = {
    +
    46  {0, 1, 2, 1, 3, 2},
    +
    47  {0, 2, 1, 2, 3, 1},
    +
    48  {0, 1, 2, 1, 3, 2},
    +
    49  {0, 2, 1, 2, 3, 1},
    +
    50  {0, 1, 2, 1, 3, 2},
    +
    51  {0, 2, 1, 2, 3, 1}
    +
    52  };
    +
    53  float *d = data;
    +
    54  float s = 0.0625;
    +
    55  float a = 0 + 1 / 2048.0;
    +
    56  float b = s - 1 / 2048.0;
    +
    57  int faces[6] = {left, right, top, bottom, front, back};
    +
    58  int tiles[6] = {wleft, wright, wtop, wbottom, wfront, wback};
    +
    59  for (int i = 0; i < 6; i++) {
    +
    60  if (faces[i] == 0) {
    +
    61  continue;
    +
    62  }
    +
    63  float du = (tiles[i] % 16) * s;
    +
    64  float dv = (tiles[i] / 16) * s;
    +
    65  int flip = ao[i][0] + ao[i][3] > ao[i][1] + ao[i][2];
    +
    66  for (int v = 0; v < 6; v++) {
    +
    67  int j = flip ? flipped[i][v] : indices[i][v];
    +
    68  *(d++) = x + n * positions[i][j][0];
    +
    69  *(d++) = y + n * positions[i][j][1];
    +
    70  *(d++) = z + n * positions[i][j][2];
    +
    71  *(d++) = normals[i][0];
    +
    72  *(d++) = normals[i][1];
    +
    73  *(d++) = normals[i][2];
    +
    74  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    75  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    76  *(d++) = ao[i][j];
    +
    77  }
    +
    78  }
    +
    79 }
    +
    +
    +
    + +

    ◆ make_cube_wireframe()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube_wireframe (float * data,
    float x,
    float y,
    float z,
    float n 
    )
    +
    + +

    Definition at line 181 of file cube.c.

    +
    181  {
    +
    182  static const float positions[8][3] = {
    +
    183  {-1, -1, -1},
    +
    184  {-1, -1, +1},
    +
    185  {-1, +1, -1},
    +
    186  {-1, +1, +1},
    +
    187  {+1, -1, -1},
    +
    188  {+1, -1, +1},
    +
    189  {+1, +1, -1},
    +
    190  {+1, +1, +1}
    +
    191  };
    +
    192  static const int indices[24] = {
    +
    193  0, 1, 0, 2, 0, 4, 1, 3,
    +
    194  1, 5, 2, 3, 2, 6, 3, 7,
    +
    195  4, 5, 4, 6, 5, 7, 6, 7
    +
    196  };
    +
    197  float *d = data;
    +
    198  for (int i = 0; i < 24; i++) {
    +
    199  int j = indices[i];
    +
    200  *(d++) = x + n * positions[j][0];
    +
    201  *(d++) = y + n * positions[j][1];
    +
    202  *(d++) = z + n * positions[j][2];
    +
    203  }
    +
    204 }
    +
    +
    +
    + +

    ◆ make_plant()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_plant (float * data,
    float px,
    float py,
    float pz,
    float n,
    int w,
    float rotation 
    )
    +
    + +

    Definition at line 99 of file cube.c.

    +
    102 {
    +
    103  static const float positions[4][4][3] = {
    +
    104  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    105  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    106  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}},
    +
    107  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}}
    +
    108  };
    +
    109  static const float normals[4][3] = {
    +
    110  {-1, 0, 0},
    +
    111  {+1, 0, 0},
    +
    112  {0, 0, -1},
    +
    113  {0, 0, +1}
    +
    114  };
    +
    115  static const float uvs[4][4][2] = {
    +
    116  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    117  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    118  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    119  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    120  };
    +
    121  static const float indices[4][6] = {
    +
    122  {0, 3, 2, 0, 1, 3},
    +
    123  {0, 3, 1, 0, 2, 3},
    +
    124  {0, 3, 2, 0, 1, 3},
    +
    125  {0, 3, 1, 0, 2, 3}
    +
    126  };
    +
    127  float *d = data;
    +
    128  float s = 0.0625;
    +
    129  float a = 0;
    +
    130  float b = s;
    +
    131  float du = (plants[w] % 16) * s;
    +
    132  float dv = (plants[w] / 16) * s;
    +
    133  for (int i = 0; i < 4; i++) {
    +
    134  for (int v = 0; v < 6; v++) {
    +
    135  int j = indices[i][v];
    +
    136  *(d++) = n * positions[i][j][0];
    +
    137  *(d++) = n * positions[i][j][1];
    +
    138  *(d++) = n * positions[i][j][2];
    +
    139  *(d++) = normals[i][0];
    +
    140  *(d++) = normals[i][1];
    +
    141  *(d++) = normals[i][2];
    +
    142  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    143  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    144  *(d++) = 0;
    +
    145  }
    +
    146  }
    +
    147  float ma[16];
    +
    148  float mb[16];
    +
    149  mat_identity(ma);
    +
    150  mat_rotate(mb, 0, 1, 0, RADIANS(rotation));
    +
    151  mat_multiply(ma, mb, ma);
    +
    152  mat_apply(data, ma, 24, 3, 9);
    +
    153  mat_translate(mb, px, py, pz);
    +
    154  mat_multiply(ma, mb, ma);
    +
    155  mat_apply(data, ma, 24, 0, 9);
    +
    156 }
    +
    const int plants[256]
    Definition: item.c:136
    +
    void mat_apply(float *data, float *matrix, int count, int offset, int stride)
    Definition: matrix.c:107
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    #define RADIANS(degrees)
    Definition: util.h:10
    +
    +
    +
    + +

    ◆ make_player()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_player (float * data,
    float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 158 of file cube.c.

    +
    161 {
    +
    162  float ao[6][4] = {0};
    + +
    164  data, ao,
    +
    165  1, 1, 1, 1, 1, 1,
    +
    166  226, 224, 241, 209, 225, 227,
    +
    167  0, 0, 0, 0.4);
    +
    168  float ma[16];
    +
    169  float mb[16];
    +
    170  mat_identity(ma);
    +
    171  mat_rotate(mb, 0, 1, 0, rx);
    +
    172  mat_multiply(ma, mb, ma);
    +
    173  mat_rotate(mb, cosf(rx), 0, sinf(rx), -ry);
    +
    174  mat_multiply(ma, mb, ma);
    +
    175  mat_apply(data, ma, 36, 3, 9);
    +
    176  mat_translate(mb, x, y, z);
    +
    177  mat_multiply(ma, mb, ma);
    +
    178  mat_apply(data, ma, 36, 0, 9);
    +
    179 }
    +
    +
    +
    + +

    ◆ make_sphere()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_sphere (float * data,
    float r,
    int detail 
    )
    +
    + +

    Definition at line 336 of file cube.c.

    +
    336  {
    +
    337  // detail, triangles, floats
    +
    338  // 0, 8, 192
    +
    339  // 1, 32, 768
    +
    340  // 2, 128, 3072
    +
    341  // 3, 512, 12288
    +
    342  // 4, 2048, 49152
    +
    343  // 5, 8192, 196608
    +
    344  // 6, 32768, 786432
    +
    345  // 7, 131072, 3145728
    +
    346  static int indices[8][3] = {
    +
    347  {4, 3, 0}, {1, 4, 0},
    +
    348  {3, 4, 5}, {4, 1, 5},
    +
    349  {0, 3, 2}, {0, 2, 1},
    +
    350  {5, 2, 3}, {5, 1, 2}
    +
    351  };
    +
    352  static float positions[6][3] = {
    +
    353  { 0, 0,-1}, { 1, 0, 0},
    +
    354  { 0,-1, 0}, {-1, 0, 0},
    +
    355  { 0, 1, 0}, { 0, 0, 1}
    +
    356  };
    +
    357  static float uvs[6][3] = {
    +
    358  {0, 0.5}, {0, 0.5},
    +
    359  {0, 0}, {0, 0.5},
    +
    360  {0, 1}, {0, 0.5}
    +
    361  };
    +
    362  int total = 0;
    +
    363  for (int i = 0; i < 8; i++) {
    +
    364  int n = _make_sphere(
    +
    365  data, r, detail,
    +
    366  positions[indices[i][0]],
    +
    367  positions[indices[i][1]],
    +
    368  positions[indices[i][2]],
    +
    369  uvs[indices[i][0]],
    +
    370  uvs[indices[i][1]],
    +
    371  uvs[indices[i][2]]);
    +
    372  total += n; data += n * 24;
    +
    373  }
    +
    374 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/cube_8c_source.html b/documentation/html/cube_8c_source.html new file mode 100644 index 000000000..c0554b77b --- /dev/null +++ b/documentation/html/cube_8c_source.html @@ -0,0 +1,475 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/cube.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cube.c
    +
    +
    +Go to the documentation of this file.
    1 #include <math.h>
    +
    2 #include "cube.h"
    +
    3 #include "item.h"
    +
    4 #include "matrix.h"
    +
    5 #include "util.h"
    +
    6 
    + +
    8  float *data, float ao[6][4],
    +
    9  int left, int right, int top, int bottom, int front, int back,
    +
    10  int wleft, int wright, int wtop, int wbottom, int wfront, int wback,
    +
    11  float x, float y, float z, float n)
    +
    12 {
    +
    13  static const float positions[6][4][3] = {
    +
    14  {{-1, -1, -1}, {-1, -1, +1}, {-1, +1, -1}, {-1, +1, +1}},
    +
    15  {{+1, -1, -1}, {+1, -1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    16  {{-1, +1, -1}, {-1, +1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    17  {{-1, -1, -1}, {-1, -1, +1}, {+1, -1, -1}, {+1, -1, +1}},
    +
    18  {{-1, -1, -1}, {-1, +1, -1}, {+1, -1, -1}, {+1, +1, -1}},
    +
    19  {{-1, -1, +1}, {-1, +1, +1}, {+1, -1, +1}, {+1, +1, +1}}
    +
    20  };
    +
    21  static const float normals[6][3] = {
    +
    22  {-1, 0, 0},
    +
    23  {+1, 0, 0},
    +
    24  {0, +1, 0},
    +
    25  {0, -1, 0},
    +
    26  {0, 0, -1},
    +
    27  {0, 0, +1}
    +
    28  };
    +
    29  static const float uvs[6][4][2] = {
    +
    30  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    31  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    32  {{0, 1}, {0, 0}, {1, 1}, {1, 0}},
    +
    33  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    34  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    35  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    36  };
    +
    37  static const float indices[6][6] = {
    +
    38  {0, 3, 2, 0, 1, 3},
    +
    39  {0, 3, 1, 0, 2, 3},
    +
    40  {0, 3, 2, 0, 1, 3},
    +
    41  {0, 3, 1, 0, 2, 3},
    +
    42  {0, 3, 2, 0, 1, 3},
    +
    43  {0, 3, 1, 0, 2, 3}
    +
    44  };
    +
    45  static const float flipped[6][6] = {
    +
    46  {0, 1, 2, 1, 3, 2},
    +
    47  {0, 2, 1, 2, 3, 1},
    +
    48  {0, 1, 2, 1, 3, 2},
    +
    49  {0, 2, 1, 2, 3, 1},
    +
    50  {0, 1, 2, 1, 3, 2},
    +
    51  {0, 2, 1, 2, 3, 1}
    +
    52  };
    +
    53  float *d = data;
    +
    54  float s = 0.0625;
    +
    55  float a = 0 + 1 / 2048.0;
    +
    56  float b = s - 1 / 2048.0;
    +
    57  int faces[6] = {left, right, top, bottom, front, back};
    +
    58  int tiles[6] = {wleft, wright, wtop, wbottom, wfront, wback};
    +
    59  for (int i = 0; i < 6; i++) {
    +
    60  if (faces[i] == 0) {
    +
    61  continue;
    +
    62  }
    +
    63  float du = (tiles[i] % 16) * s;
    +
    64  float dv = (tiles[i] / 16) * s;
    +
    65  int flip = ao[i][0] + ao[i][3] > ao[i][1] + ao[i][2];
    +
    66  for (int v = 0; v < 6; v++) {
    +
    67  int j = flip ? flipped[i][v] : indices[i][v];
    +
    68  *(d++) = x + n * positions[i][j][0];
    +
    69  *(d++) = y + n * positions[i][j][1];
    +
    70  *(d++) = z + n * positions[i][j][2];
    +
    71  *(d++) = normals[i][0];
    +
    72  *(d++) = normals[i][1];
    +
    73  *(d++) = normals[i][2];
    +
    74  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    75  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    76  *(d++) = ao[i][j];
    +
    77  }
    +
    78  }
    +
    79 }
    +
    80 
    +
    81 void make_cube(
    +
    82  float *data, float ao[6][4],
    +
    83  int left, int right, int top, int bottom, int front, int back,
    +
    84  float x, float y, float z, float n, int w)
    +
    85 {
    +
    86  int wleft = blocks[w][0];
    +
    87  int wright = blocks[w][1];
    +
    88  int wtop = blocks[w][2];
    +
    89  int wbottom = blocks[w][3];
    +
    90  int wfront = blocks[w][4];
    +
    91  int wback = blocks[w][5];
    + +
    93  data, ao,
    +
    94  left, right, top, bottom, front, back,
    +
    95  wleft, wright, wtop, wbottom, wfront, wback,
    +
    96  x, y, z, n);
    +
    97 }
    +
    98 
    + +
    100  float *data,
    +
    101  float px, float py, float pz, float n, int w, float rotation)
    +
    102 {
    +
    103  static const float positions[4][4][3] = {
    +
    104  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    105  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    106  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}},
    +
    107  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}}
    +
    108  };
    +
    109  static const float normals[4][3] = {
    +
    110  {-1, 0, 0},
    +
    111  {+1, 0, 0},
    +
    112  {0, 0, -1},
    +
    113  {0, 0, +1}
    +
    114  };
    +
    115  static const float uvs[4][4][2] = {
    +
    116  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    117  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    118  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    119  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    120  };
    +
    121  static const float indices[4][6] = {
    +
    122  {0, 3, 2, 0, 1, 3},
    +
    123  {0, 3, 1, 0, 2, 3},
    +
    124  {0, 3, 2, 0, 1, 3},
    +
    125  {0, 3, 1, 0, 2, 3}
    +
    126  };
    +
    127  float *d = data;
    +
    128  float s = 0.0625;
    +
    129  float a = 0;
    +
    130  float b = s;
    +
    131  float du = (plants[w] % 16) * s;
    +
    132  float dv = (plants[w] / 16) * s;
    +
    133  for (int i = 0; i < 4; i++) {
    +
    134  for (int v = 0; v < 6; v++) {
    +
    135  int j = indices[i][v];
    +
    136  *(d++) = n * positions[i][j][0];
    +
    137  *(d++) = n * positions[i][j][1];
    +
    138  *(d++) = n * positions[i][j][2];
    +
    139  *(d++) = normals[i][0];
    +
    140  *(d++) = normals[i][1];
    +
    141  *(d++) = normals[i][2];
    +
    142  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    143  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    144  *(d++) = 0;
    +
    145  }
    +
    146  }
    +
    147  float ma[16];
    +
    148  float mb[16];
    +
    149  mat_identity(ma);
    +
    150  mat_rotate(mb, 0, 1, 0, RADIANS(rotation));
    +
    151  mat_multiply(ma, mb, ma);
    +
    152  mat_apply(data, ma, 24, 3, 9);
    +
    153  mat_translate(mb, px, py, pz);
    +
    154  mat_multiply(ma, mb, ma);
    +
    155  mat_apply(data, ma, 24, 0, 9);
    +
    156 }
    +
    157 
    + +
    159  float *data,
    +
    160  float x, float y, float z, float rx, float ry)
    +
    161 {
    +
    162  float ao[6][4] = {0};
    + +
    164  data, ao,
    +
    165  1, 1, 1, 1, 1, 1,
    +
    166  226, 224, 241, 209, 225, 227,
    +
    167  0, 0, 0, 0.4);
    +
    168  float ma[16];
    +
    169  float mb[16];
    +
    170  mat_identity(ma);
    +
    171  mat_rotate(mb, 0, 1, 0, rx);
    +
    172  mat_multiply(ma, mb, ma);
    +
    173  mat_rotate(mb, cosf(rx), 0, sinf(rx), -ry);
    +
    174  mat_multiply(ma, mb, ma);
    +
    175  mat_apply(data, ma, 36, 3, 9);
    +
    176  mat_translate(mb, x, y, z);
    +
    177  mat_multiply(ma, mb, ma);
    +
    178  mat_apply(data, ma, 36, 0, 9);
    +
    179 }
    +
    180 
    +
    181 void make_cube_wireframe(float *data, float x, float y, float z, float n) {
    +
    182  static const float positions[8][3] = {
    +
    183  {-1, -1, -1},
    +
    184  {-1, -1, +1},
    +
    185  {-1, +1, -1},
    +
    186  {-1, +1, +1},
    +
    187  {+1, -1, -1},
    +
    188  {+1, -1, +1},
    +
    189  {+1, +1, -1},
    +
    190  {+1, +1, +1}
    +
    191  };
    +
    192  static const int indices[24] = {
    +
    193  0, 1, 0, 2, 0, 4, 1, 3,
    +
    194  1, 5, 2, 3, 2, 6, 3, 7,
    +
    195  4, 5, 4, 6, 5, 7, 6, 7
    +
    196  };
    +
    197  float *d = data;
    +
    198  for (int i = 0; i < 24; i++) {
    +
    199  int j = indices[i];
    +
    200  *(d++) = x + n * positions[j][0];
    +
    201  *(d++) = y + n * positions[j][1];
    +
    202  *(d++) = z + n * positions[j][2];
    +
    203  }
    +
    204 }
    +
    205 
    + +
    207  float *data,
    +
    208  float x, float y, float n, float m, char c)
    +
    209 {
    +
    210  float *d = data;
    +
    211  float s = 0.0625;
    +
    212  float a = s;
    +
    213  float b = s * 2;
    +
    214  int w = c - 32;
    +
    215  float du = (w % 16) * a;
    +
    216  float dv = 1 - (w / 16) * b - b;
    +
    217  *(d++) = x - n; *(d++) = y - m;
    +
    218  *(d++) = du + 0; *(d++) = dv;
    +
    219  *(d++) = x + n; *(d++) = y - m;
    +
    220  *(d++) = du + a; *(d++) = dv;
    +
    221  *(d++) = x + n; *(d++) = y + m;
    +
    222  *(d++) = du + a; *(d++) = dv + b;
    +
    223  *(d++) = x - n; *(d++) = y - m;
    +
    224  *(d++) = du + 0; *(d++) = dv;
    +
    225  *(d++) = x + n; *(d++) = y + m;
    +
    226  *(d++) = du + a; *(d++) = dv + b;
    +
    227  *(d++) = x - n; *(d++) = y + m;
    +
    228  *(d++) = du + 0; *(d++) = dv + b;
    +
    229 }
    +
    230 
    + +
    232  float *data, float x, float y, float z, float n, int face, char c)
    +
    233 {
    +
    234  static const float positions[8][6][3] = {
    +
    235  {{0, -2, -1}, {0, +2, +1}, {0, +2, -1},
    +
    236  {0, -2, -1}, {0, -2, +1}, {0, +2, +1}},
    +
    237  {{0, -2, -1}, {0, +2, +1}, {0, -2, +1},
    +
    238  {0, -2, -1}, {0, +2, -1}, {0, +2, +1}},
    +
    239  {{-1, -2, 0}, {+1, +2, 0}, {+1, -2, 0},
    +
    240  {-1, -2, 0}, {-1, +2, 0}, {+1, +2, 0}},
    +
    241  {{-1, -2, 0}, {+1, -2, 0}, {+1, +2, 0},
    +
    242  {-1, -2, 0}, {+1, +2, 0}, {-1, +2, 0}},
    +
    243  {{-1, 0, +2}, {+1, 0, +2}, {+1, 0, -2},
    +
    244  {-1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    245  {{-2, 0, +1}, {+2, 0, -1}, {-2, 0, -1},
    +
    246  {-2, 0, +1}, {+2, 0, +1}, {+2, 0, -1}},
    +
    247  {{+1, 0, +2}, {-1, 0, -2}, {-1, 0, +2},
    +
    248  {+1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    249  {{+2, 0, -1}, {-2, 0, +1}, {+2, 0, +1},
    +
    250  {+2, 0, -1}, {-2, 0, -1}, {-2, 0, +1}}
    +
    251  };
    +
    252  static const float uvs[8][6][2] = {
    +
    253  {{0, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}, {1, 1}},
    +
    254  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    255  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    256  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    257  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    258  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    259  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    260  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}
    +
    261  };
    +
    262  static const float offsets[8][3] = {
    +
    263  {-1, 0, 0}, {+1, 0, 0}, {0, 0, -1}, {0, 0, +1},
    +
    264  {0, +1, 0}, {0, +1, 0}, {0, +1, 0}, {0, +1, 0},
    +
    265  };
    +
    266  float *d = data;
    +
    267  float s = 0.0625;
    +
    268  float pu = s / 5;
    +
    269  float pv = s / 2.5;
    +
    270  float u1 = pu;
    +
    271  float v1 = pv;
    +
    272  float u2 = s - pu;
    +
    273  float v2 = s * 2 - pv;
    +
    274  float p = 0.5;
    +
    275  int w = c - 32;
    +
    276  float du = (w % 16) * s;
    +
    277  float dv = 1 - (w / 16 + 1) * s * 2;
    +
    278  x += p * offsets[face][0];
    +
    279  y += p * offsets[face][1];
    +
    280  z += p * offsets[face][2];
    +
    281  for (int i = 0; i < 6; i++) {
    +
    282  *(d++) = x + n * positions[face][i][0];
    +
    283  *(d++) = y + n * positions[face][i][1];
    +
    284  *(d++) = z + n * positions[face][i][2];
    +
    285  *(d++) = du + (uvs[face][i][0] ? u2 : u1);
    +
    286  *(d++) = dv + (uvs[face][i][1] ? v2 : v1);
    +
    287  }
    +
    288 }
    +
    289 
    + +
    291  float *data, float r, int detail,
    +
    292  float *a, float *b, float *c,
    +
    293  float *ta, float *tb, float *tc)
    +
    294 {
    +
    295  if (detail == 0) {
    +
    296  float *d = data;
    +
    297  *(d++) = a[0] * r; *(d++) = a[1] * r; *(d++) = a[2] * r;
    +
    298  *(d++) = a[0]; *(d++) = a[1]; *(d++) = a[2];
    +
    299  *(d++) = ta[0]; *(d++) = ta[1];
    +
    300  *(d++) = b[0] * r; *(d++) = b[1] * r; *(d++) = b[2] * r;
    +
    301  *(d++) = b[0]; *(d++) = b[1]; *(d++) = b[2];
    +
    302  *(d++) = tb[0]; *(d++) = tb[1];
    +
    303  *(d++) = c[0] * r; *(d++) = c[1] * r; *(d++) = c[2] * r;
    +
    304  *(d++) = c[0]; *(d++) = c[1]; *(d++) = c[2];
    +
    305  *(d++) = tc[0]; *(d++) = tc[1];
    +
    306  return 1;
    +
    307  }
    +
    308  else {
    +
    309  float ab[3], ac[3], bc[3];
    +
    310  for (int i = 0; i < 3; i++) {
    +
    311  ab[i] = (a[i] + b[i]) / 2;
    +
    312  ac[i] = (a[i] + c[i]) / 2;
    +
    313  bc[i] = (b[i] + c[i]) / 2;
    +
    314  }
    +
    315  normalize(ab + 0, ab + 1, ab + 2);
    +
    316  normalize(ac + 0, ac + 1, ac + 2);
    +
    317  normalize(bc + 0, bc + 1, bc + 2);
    +
    318  float tab[2], tac[2], tbc[2];
    +
    319  tab[0] = 0; tab[1] = 1 - acosf(ab[1]) / PI;
    +
    320  tac[0] = 0; tac[1] = 1 - acosf(ac[1]) / PI;
    +
    321  tbc[0] = 0; tbc[1] = 1 - acosf(bc[1]) / PI;
    +
    322  int total = 0;
    +
    323  int n;
    +
    324  n = _make_sphere(data, r, detail - 1, a, ab, ac, ta, tab, tac);
    +
    325  total += n; data += n * 24;
    +
    326  n = _make_sphere(data, r, detail - 1, b, bc, ab, tb, tbc, tab);
    +
    327  total += n; data += n * 24;
    +
    328  n = _make_sphere(data, r, detail - 1, c, ac, bc, tc, tac, tbc);
    +
    329  total += n; data += n * 24;
    +
    330  n = _make_sphere(data, r, detail - 1, ab, bc, ac, tab, tbc, tac);
    +
    331  total += n; data += n * 24;
    +
    332  return total;
    +
    333  }
    +
    334 }
    +
    335 
    +
    336 void make_sphere(float *data, float r, int detail) {
    +
    337  // detail, triangles, floats
    +
    338  // 0, 8, 192
    +
    339  // 1, 32, 768
    +
    340  // 2, 128, 3072
    +
    341  // 3, 512, 12288
    +
    342  // 4, 2048, 49152
    +
    343  // 5, 8192, 196608
    +
    344  // 6, 32768, 786432
    +
    345  // 7, 131072, 3145728
    +
    346  static int indices[8][3] = {
    +
    347  {4, 3, 0}, {1, 4, 0},
    +
    348  {3, 4, 5}, {4, 1, 5},
    +
    349  {0, 3, 2}, {0, 2, 1},
    +
    350  {5, 2, 3}, {5, 1, 2}
    +
    351  };
    +
    352  static float positions[6][3] = {
    +
    353  { 0, 0,-1}, { 1, 0, 0},
    +
    354  { 0,-1, 0}, {-1, 0, 0},
    +
    355  { 0, 1, 0}, { 0, 0, 1}
    +
    356  };
    +
    357  static float uvs[6][3] = {
    +
    358  {0, 0.5}, {0, 0.5},
    +
    359  {0, 0}, {0, 0.5},
    +
    360  {0, 1}, {0, 0.5}
    +
    361  };
    +
    362  int total = 0;
    +
    363  for (int i = 0; i < 8; i++) {
    +
    364  int n = _make_sphere(
    +
    365  data, r, detail,
    +
    366  positions[indices[i][0]],
    +
    367  positions[indices[i][1]],
    +
    368  positions[indices[i][2]],
    +
    369  uvs[indices[i][0]],
    +
    370  uvs[indices[i][1]],
    +
    371  uvs[indices[i][2]]);
    +
    372  total += n; data += n * 24;
    +
    373  }
    +
    374 }
    +
    void make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
    Definition: cube.c:7
    +
    void make_character_3d(float *data, float x, float y, float z, float n, int face, char c)
    Definition: cube.c:231
    +
    void make_cube_wireframe(float *data, float x, float y, float z, float n)
    Definition: cube.c:181
    +
    void make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
    Definition: cube.c:81
    +
    void make_player(float *data, float x, float y, float z, float rx, float ry)
    Definition: cube.c:158
    +
    void make_character(float *data, float x, float y, float n, float m, char c)
    Definition: cube.c:206
    +
    void make_sphere(float *data, float r, int detail)
    Definition: cube.c:336
    +
    void make_plant(float *data, float px, float py, float pz, float n, int w, float rotation)
    Definition: cube.c:99
    +
    int _make_sphere(float *data, float r, int detail, float *a, float *b, float *c, float *ta, float *tb, float *tc)
    Definition: cube.c:290
    + +
    const int plants[256]
    Definition: item.c:136
    +
    const int blocks[256][6]
    Definition: item.c:67
    + + +
    void mat_apply(float *data, float *matrix, int count, int offset, int stride)
    Definition: matrix.c:107
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    + +
    #define RADIANS(degrees)
    Definition: util.h:10
    +
    #define PI
    Definition: util.h:8
    +
    + + + + diff --git a/documentation/html/cube_8h.html b/documentation/html/cube_8h.html new file mode 100644 index 000000000..ed9493de4 --- /dev/null +++ b/documentation/html/cube_8h.html @@ -0,0 +1,942 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/cube.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    cube.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + +

    +Functions

    void make_cube_faces (float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
     
    void make_cube (float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
     
    void make_plant (float *data, float px, float py, float pz, float n, int w, float rotation)
     
    void make_player (float *data, float x, float y, float z, float rx, float ry)
     
    void make_cube_wireframe (float *data, float x, float y, float z, float n)
     
    void make_character (float *data, float x, float y, float n, float m, char c)
     
    void make_character_3d (float *data, float x, float y, float z, float n, int face, char c)
     
    void make_sphere (float *data, float r, int detail)
     
    +

    Function Documentation

    + +

    ◆ make_character()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_character (float * data,
    float x,
    float y,
    float n,
    float m,
    char c 
    )
    +
    + +

    Definition at line 206 of file cube.c.

    +
    209 {
    +
    210  float *d = data;
    +
    211  float s = 0.0625;
    +
    212  float a = s;
    +
    213  float b = s * 2;
    +
    214  int w = c - 32;
    +
    215  float du = (w % 16) * a;
    +
    216  float dv = 1 - (w / 16) * b - b;
    +
    217  *(d++) = x - n; *(d++) = y - m;
    +
    218  *(d++) = du + 0; *(d++) = dv;
    +
    219  *(d++) = x + n; *(d++) = y - m;
    +
    220  *(d++) = du + a; *(d++) = dv;
    +
    221  *(d++) = x + n; *(d++) = y + m;
    +
    222  *(d++) = du + a; *(d++) = dv + b;
    +
    223  *(d++) = x - n; *(d++) = y - m;
    +
    224  *(d++) = du + 0; *(d++) = dv;
    +
    225  *(d++) = x + n; *(d++) = y + m;
    +
    226  *(d++) = du + a; *(d++) = dv + b;
    +
    227  *(d++) = x - n; *(d++) = y + m;
    +
    228  *(d++) = du + 0; *(d++) = dv + b;
    +
    229 }
    +
    +
    +
    + +

    ◆ make_character_3d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_character_3d (float * data,
    float x,
    float y,
    float z,
    float n,
    int face,
    char c 
    )
    +
    + +

    Definition at line 231 of file cube.c.

    +
    233 {
    +
    234  static const float positions[8][6][3] = {
    +
    235  {{0, -2, -1}, {0, +2, +1}, {0, +2, -1},
    +
    236  {0, -2, -1}, {0, -2, +1}, {0, +2, +1}},
    +
    237  {{0, -2, -1}, {0, +2, +1}, {0, -2, +1},
    +
    238  {0, -2, -1}, {0, +2, -1}, {0, +2, +1}},
    +
    239  {{-1, -2, 0}, {+1, +2, 0}, {+1, -2, 0},
    +
    240  {-1, -2, 0}, {-1, +2, 0}, {+1, +2, 0}},
    +
    241  {{-1, -2, 0}, {+1, -2, 0}, {+1, +2, 0},
    +
    242  {-1, -2, 0}, {+1, +2, 0}, {-1, +2, 0}},
    +
    243  {{-1, 0, +2}, {+1, 0, +2}, {+1, 0, -2},
    +
    244  {-1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    245  {{-2, 0, +1}, {+2, 0, -1}, {-2, 0, -1},
    +
    246  {-2, 0, +1}, {+2, 0, +1}, {+2, 0, -1}},
    +
    247  {{+1, 0, +2}, {-1, 0, -2}, {-1, 0, +2},
    +
    248  {+1, 0, +2}, {+1, 0, -2}, {-1, 0, -2}},
    +
    249  {{+2, 0, -1}, {-2, 0, +1}, {+2, 0, +1},
    +
    250  {+2, 0, -1}, {-2, 0, -1}, {-2, 0, +1}}
    +
    251  };
    +
    252  static const float uvs[8][6][2] = {
    +
    253  {{0, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}, {1, 1}},
    +
    254  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    255  {{1, 0}, {0, 1}, {0, 0}, {1, 0}, {1, 1}, {0, 1}},
    +
    256  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    257  {{0, 0}, {1, 0}, {1, 1}, {0, 0}, {1, 1}, {0, 1}},
    +
    258  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    259  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}},
    +
    260  {{0, 1}, {1, 0}, {1, 1}, {0, 1}, {0, 0}, {1, 0}}
    +
    261  };
    +
    262  static const float offsets[8][3] = {
    +
    263  {-1, 0, 0}, {+1, 0, 0}, {0, 0, -1}, {0, 0, +1},
    +
    264  {0, +1, 0}, {0, +1, 0}, {0, +1, 0}, {0, +1, 0},
    +
    265  };
    +
    266  float *d = data;
    +
    267  float s = 0.0625;
    +
    268  float pu = s / 5;
    +
    269  float pv = s / 2.5;
    +
    270  float u1 = pu;
    +
    271  float v1 = pv;
    +
    272  float u2 = s - pu;
    +
    273  float v2 = s * 2 - pv;
    +
    274  float p = 0.5;
    +
    275  int w = c - 32;
    +
    276  float du = (w % 16) * s;
    +
    277  float dv = 1 - (w / 16 + 1) * s * 2;
    +
    278  x += p * offsets[face][0];
    +
    279  y += p * offsets[face][1];
    +
    280  z += p * offsets[face][2];
    +
    281  for (int i = 0; i < 6; i++) {
    +
    282  *(d++) = x + n * positions[face][i][0];
    +
    283  *(d++) = y + n * positions[face][i][1];
    +
    284  *(d++) = z + n * positions[face][i][2];
    +
    285  *(d++) = du + (uvs[face][i][0] ? u2 : u1);
    +
    286  *(d++) = dv + (uvs[face][i][1] ? v2 : v1);
    +
    287  }
    +
    288 }
    +
    +
    +
    + +

    ◆ make_cube()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube (float * data,
    float ao[6][4],
    int left,
    int right,
    int top,
    int bottom,
    int front,
    int back,
    float x,
    float y,
    float z,
    float n,
    int w 
    )
    +
    + +

    Definition at line 81 of file cube.c.

    +
    85 {
    +
    86  int wleft = blocks[w][0];
    +
    87  int wright = blocks[w][1];
    +
    88  int wtop = blocks[w][2];
    +
    89  int wbottom = blocks[w][3];
    +
    90  int wfront = blocks[w][4];
    +
    91  int wback = blocks[w][5];
    + +
    93  data, ao,
    +
    94  left, right, top, bottom, front, back,
    +
    95  wleft, wright, wtop, wbottom, wfront, wback,
    +
    96  x, y, z, n);
    +
    97 }
    +
    void make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
    Definition: cube.c:7
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    +
    +
    + +

    ◆ make_cube_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube_faces (float * data,
    float ao[6][4],
    int left,
    int right,
    int top,
    int bottom,
    int front,
    int back,
    int wleft,
    int wright,
    int wtop,
    int wbottom,
    int wfront,
    int wback,
    float x,
    float y,
    float z,
    float n 
    )
    +
    + +

    Definition at line 7 of file cube.c.

    +
    12 {
    +
    13  static const float positions[6][4][3] = {
    +
    14  {{-1, -1, -1}, {-1, -1, +1}, {-1, +1, -1}, {-1, +1, +1}},
    +
    15  {{+1, -1, -1}, {+1, -1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    16  {{-1, +1, -1}, {-1, +1, +1}, {+1, +1, -1}, {+1, +1, +1}},
    +
    17  {{-1, -1, -1}, {-1, -1, +1}, {+1, -1, -1}, {+1, -1, +1}},
    +
    18  {{-1, -1, -1}, {-1, +1, -1}, {+1, -1, -1}, {+1, +1, -1}},
    +
    19  {{-1, -1, +1}, {-1, +1, +1}, {+1, -1, +1}, {+1, +1, +1}}
    +
    20  };
    +
    21  static const float normals[6][3] = {
    +
    22  {-1, 0, 0},
    +
    23  {+1, 0, 0},
    +
    24  {0, +1, 0},
    +
    25  {0, -1, 0},
    +
    26  {0, 0, -1},
    +
    27  {0, 0, +1}
    +
    28  };
    +
    29  static const float uvs[6][4][2] = {
    +
    30  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    31  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    32  {{0, 1}, {0, 0}, {1, 1}, {1, 0}},
    +
    33  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    34  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    35  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    36  };
    +
    37  static const float indices[6][6] = {
    +
    38  {0, 3, 2, 0, 1, 3},
    +
    39  {0, 3, 1, 0, 2, 3},
    +
    40  {0, 3, 2, 0, 1, 3},
    +
    41  {0, 3, 1, 0, 2, 3},
    +
    42  {0, 3, 2, 0, 1, 3},
    +
    43  {0, 3, 1, 0, 2, 3}
    +
    44  };
    +
    45  static const float flipped[6][6] = {
    +
    46  {0, 1, 2, 1, 3, 2},
    +
    47  {0, 2, 1, 2, 3, 1},
    +
    48  {0, 1, 2, 1, 3, 2},
    +
    49  {0, 2, 1, 2, 3, 1},
    +
    50  {0, 1, 2, 1, 3, 2},
    +
    51  {0, 2, 1, 2, 3, 1}
    +
    52  };
    +
    53  float *d = data;
    +
    54  float s = 0.0625;
    +
    55  float a = 0 + 1 / 2048.0;
    +
    56  float b = s - 1 / 2048.0;
    +
    57  int faces[6] = {left, right, top, bottom, front, back};
    +
    58  int tiles[6] = {wleft, wright, wtop, wbottom, wfront, wback};
    +
    59  for (int i = 0; i < 6; i++) {
    +
    60  if (faces[i] == 0) {
    +
    61  continue;
    +
    62  }
    +
    63  float du = (tiles[i] % 16) * s;
    +
    64  float dv = (tiles[i] / 16) * s;
    +
    65  int flip = ao[i][0] + ao[i][3] > ao[i][1] + ao[i][2];
    +
    66  for (int v = 0; v < 6; v++) {
    +
    67  int j = flip ? flipped[i][v] : indices[i][v];
    +
    68  *(d++) = x + n * positions[i][j][0];
    +
    69  *(d++) = y + n * positions[i][j][1];
    +
    70  *(d++) = z + n * positions[i][j][2];
    +
    71  *(d++) = normals[i][0];
    +
    72  *(d++) = normals[i][1];
    +
    73  *(d++) = normals[i][2];
    +
    74  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    75  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    76  *(d++) = ao[i][j];
    +
    77  }
    +
    78  }
    +
    79 }
    +
    +
    +
    + +

    ◆ make_cube_wireframe()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_cube_wireframe (float * data,
    float x,
    float y,
    float z,
    float n 
    )
    +
    + +

    Definition at line 181 of file cube.c.

    +
    181  {
    +
    182  static const float positions[8][3] = {
    +
    183  {-1, -1, -1},
    +
    184  {-1, -1, +1},
    +
    185  {-1, +1, -1},
    +
    186  {-1, +1, +1},
    +
    187  {+1, -1, -1},
    +
    188  {+1, -1, +1},
    +
    189  {+1, +1, -1},
    +
    190  {+1, +1, +1}
    +
    191  };
    +
    192  static const int indices[24] = {
    +
    193  0, 1, 0, 2, 0, 4, 1, 3,
    +
    194  1, 5, 2, 3, 2, 6, 3, 7,
    +
    195  4, 5, 4, 6, 5, 7, 6, 7
    +
    196  };
    +
    197  float *d = data;
    +
    198  for (int i = 0; i < 24; i++) {
    +
    199  int j = indices[i];
    +
    200  *(d++) = x + n * positions[j][0];
    +
    201  *(d++) = y + n * positions[j][1];
    +
    202  *(d++) = z + n * positions[j][2];
    +
    203  }
    +
    204 }
    +
    +
    +
    + +

    ◆ make_plant()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_plant (float * data,
    float px,
    float py,
    float pz,
    float n,
    int w,
    float rotation 
    )
    +
    + +

    Definition at line 99 of file cube.c.

    +
    102 {
    +
    103  static const float positions[4][4][3] = {
    +
    104  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    105  {{ 0, -1, -1}, { 0, -1, +1}, { 0, +1, -1}, { 0, +1, +1}},
    +
    106  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}},
    +
    107  {{-1, -1, 0}, {-1, +1, 0}, {+1, -1, 0}, {+1, +1, 0}}
    +
    108  };
    +
    109  static const float normals[4][3] = {
    +
    110  {-1, 0, 0},
    +
    111  {+1, 0, 0},
    +
    112  {0, 0, -1},
    +
    113  {0, 0, +1}
    +
    114  };
    +
    115  static const float uvs[4][4][2] = {
    +
    116  {{0, 0}, {1, 0}, {0, 1}, {1, 1}},
    +
    117  {{1, 0}, {0, 0}, {1, 1}, {0, 1}},
    +
    118  {{0, 0}, {0, 1}, {1, 0}, {1, 1}},
    +
    119  {{1, 0}, {1, 1}, {0, 0}, {0, 1}}
    +
    120  };
    +
    121  static const float indices[4][6] = {
    +
    122  {0, 3, 2, 0, 1, 3},
    +
    123  {0, 3, 1, 0, 2, 3},
    +
    124  {0, 3, 2, 0, 1, 3},
    +
    125  {0, 3, 1, 0, 2, 3}
    +
    126  };
    +
    127  float *d = data;
    +
    128  float s = 0.0625;
    +
    129  float a = 0;
    +
    130  float b = s;
    +
    131  float du = (plants[w] % 16) * s;
    +
    132  float dv = (plants[w] / 16) * s;
    +
    133  for (int i = 0; i < 4; i++) {
    +
    134  for (int v = 0; v < 6; v++) {
    +
    135  int j = indices[i][v];
    +
    136  *(d++) = n * positions[i][j][0];
    +
    137  *(d++) = n * positions[i][j][1];
    +
    138  *(d++) = n * positions[i][j][2];
    +
    139  *(d++) = normals[i][0];
    +
    140  *(d++) = normals[i][1];
    +
    141  *(d++) = normals[i][2];
    +
    142  *(d++) = du + (uvs[i][j][0] ? b : a);
    +
    143  *(d++) = dv + (uvs[i][j][1] ? b : a);
    +
    144  *(d++) = 0;
    +
    145  }
    +
    146  }
    +
    147  float ma[16];
    +
    148  float mb[16];
    +
    149  mat_identity(ma);
    +
    150  mat_rotate(mb, 0, 1, 0, RADIANS(rotation));
    +
    151  mat_multiply(ma, mb, ma);
    +
    152  mat_apply(data, ma, 24, 3, 9);
    +
    153  mat_translate(mb, px, py, pz);
    +
    154  mat_multiply(ma, mb, ma);
    +
    155  mat_apply(data, ma, 24, 0, 9);
    +
    156 }
    +
    const int plants[256]
    Definition: item.c:136
    +
    void mat_apply(float *data, float *matrix, int count, int offset, int stride)
    Definition: matrix.c:107
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    #define RADIANS(degrees)
    Definition: util.h:10
    +
    +
    +
    + +

    ◆ make_player()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_player (float * data,
    float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 158 of file cube.c.

    +
    161 {
    +
    162  float ao[6][4] = {0};
    + +
    164  data, ao,
    +
    165  1, 1, 1, 1, 1, 1,
    +
    166  226, 224, 241, 209, 225, 227,
    +
    167  0, 0, 0, 0.4);
    +
    168  float ma[16];
    +
    169  float mb[16];
    +
    170  mat_identity(ma);
    +
    171  mat_rotate(mb, 0, 1, 0, rx);
    +
    172  mat_multiply(ma, mb, ma);
    +
    173  mat_rotate(mb, cosf(rx), 0, sinf(rx), -ry);
    +
    174  mat_multiply(ma, mb, ma);
    +
    175  mat_apply(data, ma, 36, 3, 9);
    +
    176  mat_translate(mb, x, y, z);
    +
    177  mat_multiply(ma, mb, ma);
    +
    178  mat_apply(data, ma, 36, 0, 9);
    +
    179 }
    +
    +
    +
    + +

    ◆ make_sphere()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void make_sphere (float * data,
    float r,
    int detail 
    )
    +
    + +

    Definition at line 336 of file cube.c.

    +
    336  {
    +
    337  // detail, triangles, floats
    +
    338  // 0, 8, 192
    +
    339  // 1, 32, 768
    +
    340  // 2, 128, 3072
    +
    341  // 3, 512, 12288
    +
    342  // 4, 2048, 49152
    +
    343  // 5, 8192, 196608
    +
    344  // 6, 32768, 786432
    +
    345  // 7, 131072, 3145728
    +
    346  static int indices[8][3] = {
    +
    347  {4, 3, 0}, {1, 4, 0},
    +
    348  {3, 4, 5}, {4, 1, 5},
    +
    349  {0, 3, 2}, {0, 2, 1},
    +
    350  {5, 2, 3}, {5, 1, 2}
    +
    351  };
    +
    352  static float positions[6][3] = {
    +
    353  { 0, 0,-1}, { 1, 0, 0},
    +
    354  { 0,-1, 0}, {-1, 0, 0},
    +
    355  { 0, 1, 0}, { 0, 0, 1}
    +
    356  };
    +
    357  static float uvs[6][3] = {
    +
    358  {0, 0.5}, {0, 0.5},
    +
    359  {0, 0}, {0, 0.5},
    +
    360  {0, 1}, {0, 0.5}
    +
    361  };
    +
    362  int total = 0;
    +
    363  for (int i = 0; i < 8; i++) {
    +
    364  int n = _make_sphere(
    +
    365  data, r, detail,
    +
    366  positions[indices[i][0]],
    +
    367  positions[indices[i][1]],
    +
    368  positions[indices[i][2]],
    +
    369  uvs[indices[i][0]],
    +
    370  uvs[indices[i][1]],
    +
    371  uvs[indices[i][2]]);
    +
    372  total += n; data += n * 24;
    +
    373  }
    +
    374 }
    +
    int _make_sphere(float *data, float r, int detail, float *a, float *b, float *c, float *ta, float *tb, float *tc)
    Definition: cube.c:290
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/cube_8h_source.html b/documentation/html/cube_8h_source.html new file mode 100644 index 000000000..0c20ffe81 --- /dev/null +++ b/documentation/html/cube_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/cube.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    cube.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _cube_h_
    +
    2 #define _cube_h_
    +
    3 
    +
    4 void make_cube_faces(
    +
    5  float *data, float ao[6][4],
    +
    6  int left, int right, int top, int bottom, int front, int back,
    +
    7  int wleft, int wright, int wtop, int wbottom, int wfront, int wback,
    +
    8  float x, float y, float z, float n);
    +
    9 
    +
    10 void make_cube(
    +
    11  float *data, float ao[6][4],
    +
    12  int left, int right, int top, int bottom, int front, int back,
    +
    13  float x, float y, float z, float n, int w);
    +
    14 
    +
    15 void make_plant(
    +
    16  float *data,
    +
    17  float px, float py, float pz, float n, int w, float rotation);
    +
    18 
    +
    19 void make_player(
    +
    20  float *data,
    +
    21  float x, float y, float z, float rx, float ry);
    +
    22 
    + +
    24  float *data, float x, float y, float z, float n);
    +
    25 
    +
    26 void make_character(
    +
    27  float *data,
    +
    28  float x, float y, float n, float m, char c);
    +
    29 
    + +
    31  float *data, float x, float y, float z, float n, int face, char c);
    +
    32 
    +
    33 void make_sphere(float *data, float r, int detail);
    +
    34 
    +
    35 #endif
    +
    void make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n)
    Definition: cube.c:7
    +
    void make_character_3d(float *data, float x, float y, float z, float n, int face, char c)
    Definition: cube.c:231
    +
    void make_cube_wireframe(float *data, float x, float y, float z, float n)
    Definition: cube.c:181
    +
    void make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
    Definition: cube.c:81
    +
    void make_player(float *data, float x, float y, float z, float rx, float ry)
    Definition: cube.c:158
    +
    void make_character(float *data, float x, float y, float n, float m, char c)
    Definition: cube.c:206
    +
    void make_sphere(float *data, float r, int detail)
    Definition: cube.c:336
    +
    void make_plant(float *data, float px, float py, float pz, float n, int w, float rotation)
    Definition: cube.c:99
    +
    + + + + diff --git a/documentation/html/db_8c.html b/documentation/html/db_8c.html new file mode 100644 index 000000000..3462fc987 --- /dev/null +++ b/documentation/html/db_8c.html @@ -0,0 +1,1852 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/db.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    db.c File Reference
    +
    +
    +
    #include <string.h>
    +#include "db.h"
    +#include "ring.h"
    +#include "sqlite3.h"
    +#include "tinycthread.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void db_enable ()
     
    void db_disable ()
     
    int get_db_enabled ()
     
    int db_init (char *path)
     
    void db_close ()
     
    void db_commit ()
     
    void _db_commit ()
     
    void db_auth_set (char *username, char *identity_token)
     
    int db_auth_select (char *username)
     
    void db_auth_select_none ()
     
    int db_auth_get (char *username, char *identity_token, int identity_token_length)
     
    int db_auth_get_selected (char *username, int username_length, char *identity_token, int identity_token_length)
     
    void db_save_state (float x, float y, float z, float rx, float ry)
     
    int db_load_state (float *x, float *y, float *z, float *rx, float *ry)
     
    void db_insert_block (int p, int q, int x, int y, int z, int w)
     
    void _db_insert_block (int p, int q, int x, int y, int z, int w)
     
    void db_insert_sign (int p, int q, int x, int y, int z, int face, const char *text)
     
    void db_delete_sign (int x, int y, int z, int face)
     
    void db_delete_signs (int x, int y, int z)
     
    void db_delete_all_signs ()
     
    void db_load_map (Map *map, int p, int q)
     
    void db_load_signs (SignList *list, int p, int q)
     
    int db_get_key (int p, int q)
     
    void db_set_key (int p, int q, int key)
     
    void _db_set_key (int p, int q, int key)
     
    void db_worker_start (char *path)
     
    void db_worker_stop ()
     
    int db_worker_run (void *arg)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    static int db_enabled = 0
     
    static sqlite3 * db
     
    static sqlite3_stmt * insert_block_stmt
     
    static sqlite3_stmt * insert_sign_stmt
     
    static sqlite3_stmt * delete_sign_stmt
     
    static sqlite3_stmt * delete_signs_stmt
     
    static sqlite3_stmt * load_map_stmt
     
    static sqlite3_stmt * load_signs_stmt
     
    static sqlite3_stmt * get_key_stmt
     
    static sqlite3_stmt * set_key_stmt
     
    static Ring ring
     
    static thrd_t thrd
     
    static mtx_t mtx
     
    static cnd_t cnd
     
    +

    Function Documentation

    + +

    ◆ _db_commit()

    + +
    +
    + + + + + + + +
    void _db_commit ()
    +
    + +

    Definition at line 158 of file db.c.

    +
    158  {
    +
    159  sqlite3_exec(db, "commit; begin;", NULL, NULL, NULL);
    +
    160 }
    +
    static sqlite3 * db
    Definition: db.c:9
    +
    +
    +
    + +

    ◆ _db_insert_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void _db_insert_block (int p,
    int q,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 301 of file db.c.

    +
    301  {
    +
    302  sqlite3_reset(insert_block_stmt);
    +
    303  sqlite3_bind_int(insert_block_stmt, 1, p);
    +
    304  sqlite3_bind_int(insert_block_stmt, 2, q);
    +
    305  sqlite3_bind_int(insert_block_stmt, 3, x);
    +
    306  sqlite3_bind_int(insert_block_stmt, 4, y);
    +
    307  sqlite3_bind_int(insert_block_stmt, 5, z);
    +
    308  sqlite3_bind_int(insert_block_stmt, 6, w);
    +
    309  sqlite3_step(insert_block_stmt);
    +
    310 }
    +
    static sqlite3_stmt * insert_block_stmt
    Definition: db.c:10
    +
    +
    +
    + +

    ◆ _db_set_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void _db_set_key (int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 416 of file db.c.

    +
    416  {
    +
    417  sqlite3_reset(set_key_stmt);
    +
    418  sqlite3_bind_int(set_key_stmt, 1, p);
    +
    419  sqlite3_bind_int(set_key_stmt, 2, q);
    +
    420  sqlite3_bind_int(set_key_stmt, 3, key);
    +
    421  sqlite3_step(set_key_stmt);
    +
    422 }
    +
    static sqlite3_stmt * set_key_stmt
    Definition: db.c:17
    +
    +
    +
    + +

    ◆ db_auth_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_auth_get (char * username,
    char * identity_token,
    int identity_token_length 
    )
    +
    + +

    Definition at line 202 of file db.c.

    +
    205 {
    +
    206  if (!db_enabled) {
    +
    207  return 0;
    +
    208  }
    +
    209  static const char *query =
    +
    210  "select token from auth.identity_token "
    +
    211  "where username = ?;";
    +
    212  int result = 0;
    +
    213  sqlite3_stmt *stmt;
    +
    214  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    215  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    216  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    217  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    218  strncpy(identity_token, a, identity_token_length - 1);
    +
    219  identity_token[identity_token_length - 1] = '\0';
    +
    220  result = 1;
    +
    221  }
    +
    222  sqlite3_finalize(stmt);
    +
    223  return result;
    +
    224 }
    +
    static int db_enabled
    Definition: db.c:7
    +
    +
    +
    + +

    ◆ db_auth_get_selected()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_auth_get_selected (char * username,
    int username_length,
    char * identity_token,
    int identity_token_length 
    )
    +
    + +

    Definition at line 226 of file db.c.

    +
    229 {
    +
    230  if (!db_enabled) {
    +
    231  return 0;
    +
    232  }
    +
    233  static const char *query =
    +
    234  "select username, token from auth.identity_token "
    +
    235  "where selected = 1;";
    +
    236  int result = 0;
    +
    237  sqlite3_stmt *stmt;
    +
    238  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    239  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    240  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    241  const char *b = (const char *)sqlite3_column_text(stmt, 1);
    +
    242  strncpy(username, a, username_length - 1);
    +
    243  username[username_length - 1] = '\0';
    +
    244  strncpy(identity_token, b, identity_token_length - 1);
    +
    245  identity_token[identity_token_length - 1] = '\0';
    +
    246  result = 1;
    +
    247  }
    +
    248  sqlite3_finalize(stmt);
    +
    249  return result;
    +
    250 }
    +
    +
    +
    + +

    ◆ db_auth_select()

    + +
    +
    + + + + + + + + +
    int db_auth_select (char * username)
    +
    + +

    Definition at line 179 of file db.c.

    +
    179  {
    +
    180  if (!db_enabled) {
    +
    181  return 0;
    +
    182  }
    + +
    184  static const char *query =
    +
    185  "update auth.identity_token set selected = 1 where username = ?;";
    +
    186  sqlite3_stmt *stmt;
    +
    187  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    188  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    189  sqlite3_step(stmt);
    +
    190  sqlite3_finalize(stmt);
    +
    191  return sqlite3_changes(db);
    +
    192 }
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    +
    +
    + +

    ◆ db_auth_select_none()

    + +
    +
    + + + + + + + +
    void db_auth_select_none ()
    +
    + +

    Definition at line 194 of file db.c.

    +
    194  {
    +
    195  if (!db_enabled) {
    +
    196  return;
    +
    197  }
    +
    198  sqlite3_exec(db, "update auth.identity_token set selected = 0;",
    +
    199  NULL, NULL, NULL);
    +
    200 }
    +
    +
    +
    + +

    ◆ db_auth_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void db_auth_set (char * username,
    char * identity_token 
    )
    +
    + +

    Definition at line 162 of file db.c.

    +
    162  {
    +
    163  if (!db_enabled) {
    +
    164  return;
    +
    165  }
    +
    166  static const char *query =
    +
    167  "insert or replace into auth.identity_token "
    +
    168  "(username, token, selected) values (?, ?, ?);";
    +
    169  sqlite3_stmt *stmt;
    +
    170  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    171  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    172  sqlite3_bind_text(stmt, 2, identity_token, -1, NULL);
    +
    173  sqlite3_bind_int(stmt, 3, 1);
    +
    174  sqlite3_step(stmt);
    +
    175  sqlite3_finalize(stmt);
    +
    176  db_auth_select(username);
    +
    177 }
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    +
    +
    + +

    ◆ db_close()

    + +
    +
    + + + + + + + +
    void db_close ()
    +
    + +

    Definition at line 131 of file db.c.

    +
    131  {
    +
    132  if (!db_enabled) {
    +
    133  return;
    +
    134  }
    +
    135  db_worker_stop();
    +
    136  sqlite3_exec(db, "commit;", NULL, NULL, NULL);
    +
    137  sqlite3_finalize(insert_block_stmt);
    +
    138  sqlite3_finalize(insert_sign_stmt);
    +
    139  sqlite3_finalize(delete_sign_stmt);
    +
    140  sqlite3_finalize(delete_signs_stmt);
    +
    141  sqlite3_finalize(load_map_stmt);
    +
    142  sqlite3_finalize(load_signs_stmt);
    +
    143  sqlite3_finalize(get_key_stmt);
    +
    144  sqlite3_finalize(set_key_stmt);
    +
    145  sqlite3_close(db);
    +
    146 }
    +
    static sqlite3_stmt * load_map_stmt
    Definition: db.c:14
    +
    static sqlite3_stmt * delete_signs_stmt
    Definition: db.c:13
    +
    static sqlite3_stmt * insert_sign_stmt
    Definition: db.c:11
    +
    static sqlite3_stmt * get_key_stmt
    Definition: db.c:16
    +
    void db_worker_stop()
    Definition: db.c:434
    +
    static sqlite3_stmt * delete_sign_stmt
    Definition: db.c:12
    +
    static sqlite3_stmt * load_signs_stmt
    Definition: db.c:15
    +
    +
    +
    + +

    ◆ db_commit()

    + +
    +
    + + + + + + + +
    void db_commit ()
    +
    + +

    Definition at line 148 of file db.c.

    +
    148  {
    +
    149  if (!db_enabled) {
    +
    150  return;
    +
    151  }
    +
    152  mtx_lock(&mtx);
    + +
    154  cnd_signal(&cnd);
    +
    155  mtx_unlock(&mtx);
    +
    156 }
    +
    static cnd_t cnd
    Definition: db.c:22
    +
    static mtx_t mtx
    Definition: db.c:21
    +
    static Ring ring
    Definition: db.c:19
    +
    void ring_put_commit(Ring *ring)
    Definition: ring.c:77
    +
    +
    +
    + +

    ◆ db_delete_all_signs()

    + +
    +
    + + + + + + + +
    void db_delete_all_signs ()
    +
    + +

    Definition at line 352 of file db.c.

    +
    352  {
    +
    353  if (!db_enabled) {
    +
    354  return;
    +
    355  }
    +
    356  sqlite3_exec(db, "delete from sign;", NULL, NULL, NULL);
    +
    357 }
    +
    +
    +
    + +

    ◆ db_delete_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_delete_sign (int x,
    int y,
    int z,
    int face 
    )
    +
    + +

    Definition at line 329 of file db.c.

    +
    329  {
    +
    330  if (!db_enabled) {
    +
    331  return;
    +
    332  }
    +
    333  sqlite3_reset(delete_sign_stmt);
    +
    334  sqlite3_bind_int(delete_sign_stmt, 1, x);
    +
    335  sqlite3_bind_int(delete_sign_stmt, 2, y);
    +
    336  sqlite3_bind_int(delete_sign_stmt, 3, z);
    +
    337  sqlite3_bind_int(delete_sign_stmt, 4, face);
    +
    338  sqlite3_step(delete_sign_stmt);
    +
    339 }
    +
    +
    +
    + +

    ◆ db_delete_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_delete_signs (int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 341 of file db.c.

    +
    341  {
    +
    342  if (!db_enabled) {
    +
    343  return;
    +
    344  }
    +
    345  sqlite3_reset(delete_signs_stmt);
    +
    346  sqlite3_bind_int(delete_signs_stmt, 1, x);
    +
    347  sqlite3_bind_int(delete_signs_stmt, 2, y);
    +
    348  sqlite3_bind_int(delete_signs_stmt, 3, z);
    +
    349  sqlite3_step(delete_signs_stmt);
    +
    350 }
    +
    +
    +
    + +

    ◆ db_disable()

    + +
    +
    + + + + + + + +
    void db_disable ()
    +
    + +

    Definition at line 28 of file db.c.

    +
    28  {
    +
    29  db_enabled = 0;
    +
    30 }
    +
    +
    +
    + +

    ◆ db_enable()

    + +
    +
    + + + + + + + +
    void db_enable ()
    +
    + +

    Definition at line 24 of file db.c.

    +
    24  {
    +
    25  db_enabled = 1;
    +
    26 }
    +
    +
    +
    + +

    ◆ db_get_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int db_get_key (int p,
    int q 
    )
    +
    + +

    Definition at line 393 of file db.c.

    +
    393  {
    +
    394  if (!db_enabled) {
    +
    395  return 0;
    +
    396  }
    +
    397  sqlite3_reset(get_key_stmt);
    +
    398  sqlite3_bind_int(get_key_stmt, 1, p);
    +
    399  sqlite3_bind_int(get_key_stmt, 2, q);
    +
    400  if (sqlite3_step(get_key_stmt) == SQLITE_ROW) {
    +
    401  return sqlite3_column_int(get_key_stmt, 0);
    +
    402  }
    +
    403  return 0;
    +
    404 }
    +
    +
    +
    + +

    ◆ db_init()

    + +
    +
    + + + + + + + + +
    int db_init (char * path)
    +
    + +

    Definition at line 36 of file db.c.

    +
    36  {
    +
    37  if (!db_enabled) {
    +
    38  return 0;
    +
    39  }
    +
    40  static const char *create_query =
    +
    41  "attach database 'auth.db' as auth;"
    +
    42  "create table if not exists auth.identity_token ("
    +
    43  " username text not null,"
    +
    44  " token text not null,"
    +
    45  " selected int not null"
    +
    46  ");"
    +
    47  "create unique index if not exists auth.identity_token_username_idx"
    +
    48  " on identity_token (username);"
    +
    49  "create table if not exists state ("
    +
    50  " x float not null,"
    +
    51  " y float not null,"
    +
    52  " z float not null,"
    +
    53  " rx float not null,"
    +
    54  " ry float not null"
    +
    55  ");"
    +
    56  "create table if not exists block ("
    +
    57  " p int not null,"
    +
    58  " q int not null,"
    +
    59  " x int not null,"
    +
    60  " y int not null,"
    +
    61  " z int not null,"
    +
    62  " w int not null"
    +
    63  ");"
    +
    64  "create table if not exists key ("
    +
    65  " p int not null,"
    +
    66  " q int not null,"
    +
    67  " key int not null"
    +
    68  ");"
    +
    69  "create table if not exists sign ("
    +
    70  " p int not null,"
    +
    71  " q int not null,"
    +
    72  " x int not null,"
    +
    73  " y int not null,"
    +
    74  " z int not null,"
    +
    75  " face int not null,"
    +
    76  " text text not null"
    +
    77  ");"
    +
    78  "create unique index if not exists block_pqxyz_idx on block (p, q, x, y, z);"
    +
    79  "create unique index if not exists key_pq_idx on key (p, q);"
    +
    80  "create unique index if not exists sign_xyzface_idx on sign (x, y, z, face);"
    +
    81  "create index if not exists sign_pq_idx on sign (p, q);";
    +
    82  static const char *insert_block_query =
    +
    83  "insert or replace into block (p, q, x, y, z, w) "
    +
    84  "values (?, ?, ?, ?, ?, ?);";
    +
    85  static const char *insert_sign_query =
    +
    86  "insert or replace into sign (p, q, x, y, z, face, text) "
    +
    87  "values (?, ?, ?, ?, ?, ?, ?);";
    +
    88  static const char *delete_sign_query =
    +
    89  "delete from sign where x = ? and y = ? and z = ? and face = ?;";
    +
    90  static const char *delete_signs_query =
    +
    91  "delete from sign where x = ? and y = ? and z = ?;";
    +
    92  static const char *load_map_query =
    +
    93  "select x, y, z, w from block where p = ? and q = ?;";
    +
    94  static const char *load_signs_query =
    +
    95  "select x, y, z, face, text from sign where p = ? and q = ?;";
    +
    96  static const char *get_key_query =
    +
    97  "select key from key where p = ? and q = ?;";
    +
    98  static const char *set_key_query =
    +
    99  "insert or replace into key (p, q, key) "
    +
    100  "values (?, ?, ?);";
    +
    101  int rc;
    +
    102  rc = sqlite3_open(path, &db);
    +
    103  if (rc) return rc;
    +
    104  rc = sqlite3_exec(db, create_query, NULL, NULL, NULL);
    +
    105  if (rc) return rc;
    +
    106  rc = sqlite3_prepare_v2(
    +
    107  db, insert_block_query, -1, &insert_block_stmt, NULL);
    +
    108  if (rc) return rc;
    +
    109  rc = sqlite3_prepare_v2(
    +
    110  db, insert_sign_query, -1, &insert_sign_stmt, NULL);
    +
    111  if (rc) return rc;
    +
    112  rc = sqlite3_prepare_v2(
    +
    113  db, delete_sign_query, -1, &delete_sign_stmt, NULL);
    +
    114  if (rc) return rc;
    +
    115  rc = sqlite3_prepare_v2(
    +
    116  db, delete_signs_query, -1, &delete_signs_stmt, NULL);
    +
    117  if (rc) return rc;
    +
    118  rc = sqlite3_prepare_v2(db, load_map_query, -1, &load_map_stmt, NULL);
    +
    119  if (rc) return rc;
    +
    120  rc = sqlite3_prepare_v2(db, load_signs_query, -1, &load_signs_stmt, NULL);
    +
    121  if (rc) return rc;
    +
    122  rc = sqlite3_prepare_v2(db, get_key_query, -1, &get_key_stmt, NULL);
    +
    123  if (rc) return rc;
    +
    124  rc = sqlite3_prepare_v2(db, set_key_query, -1, &set_key_stmt, NULL);
    +
    125  if (rc) return rc;
    +
    126  sqlite3_exec(db, "begin;", NULL, NULL, NULL);
    +
    127  db_worker_start();
    +
    128  return 0;
    +
    129 }
    +
    void db_worker_start(char *path)
    Definition: db.c:424
    +
    +
    +
    + +

    ◆ db_insert_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_insert_block (int p,
    int q,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 291 of file db.c.

    +
    291  {
    +
    292  if (!db_enabled) {
    +
    293  return;
    +
    294  }
    +
    295  mtx_lock(&mtx);
    +
    296  ring_put_block(&ring, p, q, x, y, z, w);
    +
    297  cnd_signal(&cnd);
    +
    298  mtx_unlock(&mtx);
    +
    299 }
    +
    void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w)
    Definition: ring.c:56
    +
    +
    +
    + +

    ◆ db_insert_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_insert_sign (int p,
    int q,
    int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 312 of file db.c.

    +
    314 {
    +
    315  if (!db_enabled) {
    +
    316  return;
    +
    317  }
    +
    318  sqlite3_reset(insert_sign_stmt);
    +
    319  sqlite3_bind_int(insert_sign_stmt, 1, p);
    +
    320  sqlite3_bind_int(insert_sign_stmt, 2, q);
    +
    321  sqlite3_bind_int(insert_sign_stmt, 3, x);
    +
    322  sqlite3_bind_int(insert_sign_stmt, 4, y);
    +
    323  sqlite3_bind_int(insert_sign_stmt, 5, z);
    +
    324  sqlite3_bind_int(insert_sign_stmt, 6, face);
    +
    325  sqlite3_bind_text(insert_sign_stmt, 7, text, -1, NULL);
    +
    326  sqlite3_step(insert_sign_stmt);
    +
    327 }
    +
    +
    +
    + +

    ◆ db_load_map()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_load_map (Mapmap,
    int p,
    int q 
    )
    +
    + +

    Definition at line 359 of file db.c.

    +
    359  {
    +
    360  if (!db_enabled) {
    +
    361  return;
    +
    362  }
    +
    363  sqlite3_reset(load_map_stmt);
    +
    364  sqlite3_bind_int(load_map_stmt, 1, p);
    +
    365  sqlite3_bind_int(load_map_stmt, 2, q);
    +
    366  while (sqlite3_step(load_map_stmt) == SQLITE_ROW) {
    +
    367  int x = sqlite3_column_int(load_map_stmt, 0);
    +
    368  int y = sqlite3_column_int(load_map_stmt, 1);
    +
    369  int z = sqlite3_column_int(load_map_stmt, 2);
    +
    370  int w = sqlite3_column_int(load_map_stmt, 3);
    +
    371  map_set(map, x, y, z, w);
    +
    372  }
    +
    373 }
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    +
    +
    + +

    ◆ db_load_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_load_signs (SignListlist,
    int p,
    int q 
    )
    +
    + +

    Definition at line 375 of file db.c.

    +
    375  {
    +
    376  if (!db_enabled) {
    +
    377  return;
    +
    378  }
    +
    379  sqlite3_reset(load_signs_stmt);
    +
    380  sqlite3_bind_int(load_signs_stmt, 1, p);
    +
    381  sqlite3_bind_int(load_signs_stmt, 2, q);
    +
    382  while (sqlite3_step(load_signs_stmt) == SQLITE_ROW) {
    +
    383  int x = sqlite3_column_int(load_signs_stmt, 0);
    +
    384  int y = sqlite3_column_int(load_signs_stmt, 1);
    +
    385  int z = sqlite3_column_int(load_signs_stmt, 2);
    +
    386  int face = sqlite3_column_int(load_signs_stmt, 3);
    +
    387  const char *text = (const char *)sqlite3_column_text(
    +
    388  load_signs_stmt, 4);
    +
    389  sign_list_add(list, x, y, z, face, text);
    +
    390  }
    +
    391 }
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    +
    +
    +
    + +

    ◆ db_load_state()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_load_state (float * x,
    float * y,
    float * z,
    float * rx,
    float * ry 
    )
    +
    + +

    Definition at line 270 of file db.c.

    +
    270  {
    +
    271  if (!db_enabled) {
    +
    272  return 0;
    +
    273  }
    +
    274  static const char *query =
    +
    275  "select x, y, z, rx, ry from state;";
    +
    276  int result = 0;
    +
    277  sqlite3_stmt *stmt;
    +
    278  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    279  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    280  *x = sqlite3_column_double(stmt, 0);
    +
    281  *y = sqlite3_column_double(stmt, 1);
    +
    282  *z = sqlite3_column_double(stmt, 2);
    +
    283  *rx = sqlite3_column_double(stmt, 3);
    +
    284  *ry = sqlite3_column_double(stmt, 4);
    +
    285  result = 1;
    +
    286  }
    +
    287  sqlite3_finalize(stmt);
    +
    288  return result;
    +
    289 }
    +
    +
    +
    + +

    ◆ db_save_state()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_save_state (float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 252 of file db.c.

    +
    252  {
    +
    253  if (!db_enabled) {
    +
    254  return;
    +
    255  }
    +
    256  static const char *query =
    +
    257  "insert into state (x, y, z, rx, ry) values (?, ?, ?, ?, ?);";
    +
    258  sqlite3_stmt *stmt;
    +
    259  sqlite3_exec(db, "delete from state;", NULL, NULL, NULL);
    +
    260  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    261  sqlite3_bind_double(stmt, 1, x);
    +
    262  sqlite3_bind_double(stmt, 2, y);
    +
    263  sqlite3_bind_double(stmt, 3, z);
    +
    264  sqlite3_bind_double(stmt, 4, rx);
    +
    265  sqlite3_bind_double(stmt, 5, ry);
    +
    266  sqlite3_step(stmt);
    +
    267  sqlite3_finalize(stmt);
    +
    268 }
    +
    +
    +
    + +

    ◆ db_set_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_set_key (int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 406 of file db.c.

    +
    406  {
    +
    407  if (!db_enabled) {
    +
    408  return;
    +
    409  }
    +
    410  mtx_lock(&mtx);
    +
    411  ring_put_key(&ring, p, q, key);
    +
    412  cnd_signal(&cnd);
    +
    413  mtx_unlock(&mtx);
    +
    414 }
    +
    void ring_put_key(Ring *ring, int p, int q, int key)
    Definition: ring.c:68
    +
    +
    +
    + +

    ◆ db_worker_run()

    + +
    +
    + + + + + + + + +
    int db_worker_run (void * arg)
    +
    + +

    Definition at line 448 of file db.c.

    +
    448  {
    +
    449  int running = 1;
    +
    450  while (running) {
    +
    451  RingEntry e;
    +
    452  mtx_lock(&mtx);
    +
    453  while (!ring_get(&ring, &e)) {
    +
    454  cnd_wait(&cnd, &mtx);
    +
    455  }
    +
    456  mtx_unlock(&mtx);
    +
    457  switch (e.type) {
    +
    458  case BLOCK:
    +
    459  _db_insert_block(e.p, e.q, e.x, e.y, e.z, e.w);
    +
    460  break;
    +
    461  case KEY:
    +
    462  _db_set_key(e.p, e.q, e.key);
    +
    463  break;
    +
    464  case COMMIT:
    +
    465  _db_commit();
    +
    466  break;
    +
    467  case EXIT:
    +
    468  running = 0;
    +
    469  break;
    +
    470  }
    +
    471  }
    +
    472  return 0;
    +
    473 }
    +
    static int running
    Definition: client.c:21
    +
    void _db_commit()
    Definition: db.c:158
    +
    void _db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:301
    +
    void _db_set_key(int p, int q, int key)
    Definition: db.c:416
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    Definition: ring.h:11
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int key
    Definition: ring.h:19
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    +
    +
    + +

    ◆ db_worker_start()

    + +
    +
    + + + + + + + + +
    void db_worker_start (char * path)
    +
    + +

    Definition at line 424 of file db.c.

    +
    424  {
    +
    425  if (!db_enabled) {
    +
    426  return;
    +
    427  }
    +
    428  ring_alloc(&ring, 1024);
    +
    429  mtx_init(&mtx, mtx_plain);
    +
    430  cnd_init(&cnd);
    +
    431  thrd_create(&thrd, db_worker_run, path);
    +
    432 }
    +
    static thrd_t thrd
    Definition: db.c:20
    +
    int db_worker_run(void *arg)
    Definition: db.c:448
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    +
    +
    +
    + +

    ◆ db_worker_stop()

    + +
    +
    + + + + + + + +
    void db_worker_stop ()
    +
    + +

    Definition at line 434 of file db.c.

    +
    434  {
    +
    435  if (!db_enabled) {
    +
    436  return;
    +
    437  }
    +
    438  mtx_lock(&mtx);
    + +
    440  cnd_signal(&cnd);
    +
    441  mtx_unlock(&mtx);
    +
    442  thrd_join(thrd, NULL);
    +
    443  cnd_destroy(&cnd);
    +
    444  mtx_destroy(&mtx);
    +
    445  ring_free(&ring);
    +
    446 }
    +
    void ring_put_exit(Ring *ring)
    Definition: ring.c:83
    +
    void ring_free(Ring *ring)
    Definition: ring.c:12
    +
    +
    +
    + +

    ◆ get_db_enabled()

    + +
    +
    + + + + + + + +
    int get_db_enabled ()
    +
    + +

    Definition at line 32 of file db.c.

    +
    32  {
    +
    33  return db_enabled;
    +
    34 }
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ cnd

    + +
    +
    + + + + + +
    + + + + +
    cnd_t cnd
    +
    +static
    +
    + +

    Definition at line 22 of file db.c.

    + +
    +
    + +

    ◆ db

    + +
    +
    + + + + + +
    + + + + +
    sqlite3* db
    +
    +static
    +
    + +

    Definition at line 9 of file db.c.

    + +
    +
    + +

    ◆ db_enabled

    + +
    +
    + + + + + +
    + + + + +
    int db_enabled = 0
    +
    +static
    +
    + +

    Definition at line 7 of file db.c.

    + +
    +
    + +

    ◆ delete_sign_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* delete_sign_stmt
    +
    +static
    +
    + +

    Definition at line 12 of file db.c.

    + +
    +
    + +

    ◆ delete_signs_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* delete_signs_stmt
    +
    +static
    +
    + +

    Definition at line 13 of file db.c.

    + +
    +
    + +

    ◆ get_key_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* get_key_stmt
    +
    +static
    +
    + +

    Definition at line 16 of file db.c.

    + +
    +
    + +

    ◆ insert_block_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* insert_block_stmt
    +
    +static
    +
    + +

    Definition at line 10 of file db.c.

    + +
    +
    + +

    ◆ insert_sign_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* insert_sign_stmt
    +
    +static
    +
    + +

    Definition at line 11 of file db.c.

    + +
    +
    + +

    ◆ load_map_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* load_map_stmt
    +
    +static
    +
    + +

    Definition at line 14 of file db.c.

    + +
    +
    + +

    ◆ load_signs_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* load_signs_stmt
    +
    +static
    +
    + +

    Definition at line 15 of file db.c.

    + +
    +
    + +

    ◆ mtx

    + +
    +
    + + + + + +
    + + + + +
    mtx_t mtx
    +
    +static
    +
    + +

    Definition at line 21 of file db.c.

    + +
    +
    + +

    ◆ ring

    + +
    +
    + + + + + +
    + + + + +
    Ring ring
    +
    +static
    +
    + +

    Definition at line 19 of file db.c.

    + +
    +
    + +

    ◆ set_key_stmt

    + +
    +
    + + + + + +
    + + + + +
    sqlite3_stmt* set_key_stmt
    +
    +static
    +
    + +

    Definition at line 17 of file db.c.

    + +
    +
    + +

    ◆ thrd

    + +
    +
    + + + + + +
    + + + + +
    thrd_t thrd
    +
    +static
    +
    + +

    Definition at line 20 of file db.c.

    + +
    +
    +
    + + + + diff --git a/documentation/html/db_8c_source.html b/documentation/html/db_8c_source.html new file mode 100644 index 000000000..453f8a8de --- /dev/null +++ b/documentation/html/db_8c_source.html @@ -0,0 +1,621 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/db.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    db.c
    +
    +
    +Go to the documentation of this file.
    1 #include <string.h>
    +
    2 #include "db.h"
    +
    3 #include "ring.h"
    +
    4 #include "sqlite3.h"
    +
    5 #include "tinycthread.h"
    +
    6 
    +
    7 static int db_enabled = 0;
    +
    8 
    +
    9 static sqlite3 *db;
    +
    10 static sqlite3_stmt *insert_block_stmt;
    +
    11 static sqlite3_stmt *insert_sign_stmt;
    +
    12 static sqlite3_stmt *delete_sign_stmt;
    +
    13 static sqlite3_stmt *delete_signs_stmt;
    +
    14 static sqlite3_stmt *load_map_stmt;
    +
    15 static sqlite3_stmt *load_signs_stmt;
    +
    16 static sqlite3_stmt *get_key_stmt;
    +
    17 static sqlite3_stmt *set_key_stmt;
    +
    18 
    +
    19 static Ring ring;
    +
    20 static thrd_t thrd;
    +
    21 static mtx_t mtx;
    +
    22 static cnd_t cnd;
    +
    23 
    +
    24 void db_enable() {
    +
    25  db_enabled = 1;
    +
    26 }
    +
    27 
    +
    28 void db_disable() {
    +
    29  db_enabled = 0;
    +
    30 }
    +
    31 
    + +
    33  return db_enabled;
    +
    34 }
    +
    35 
    +
    36 int db_init(char *path) {
    +
    37  if (!db_enabled) {
    +
    38  return 0;
    +
    39  }
    +
    40  static const char *create_query =
    +
    41  "attach database 'auth.db' as auth;"
    +
    42  "create table if not exists auth.identity_token ("
    +
    43  " username text not null,"
    +
    44  " token text not null,"
    +
    45  " selected int not null"
    +
    46  ");"
    +
    47  "create unique index if not exists auth.identity_token_username_idx"
    +
    48  " on identity_token (username);"
    +
    49  "create table if not exists state ("
    +
    50  " x float not null,"
    +
    51  " y float not null,"
    +
    52  " z float not null,"
    +
    53  " rx float not null,"
    +
    54  " ry float not null"
    +
    55  ");"
    +
    56  "create table if not exists block ("
    +
    57  " p int not null,"
    +
    58  " q int not null,"
    +
    59  " x int not null,"
    +
    60  " y int not null,"
    +
    61  " z int not null,"
    +
    62  " w int not null"
    +
    63  ");"
    +
    64  "create table if not exists key ("
    +
    65  " p int not null,"
    +
    66  " q int not null,"
    +
    67  " key int not null"
    +
    68  ");"
    +
    69  "create table if not exists sign ("
    +
    70  " p int not null,"
    +
    71  " q int not null,"
    +
    72  " x int not null,"
    +
    73  " y int not null,"
    +
    74  " z int not null,"
    +
    75  " face int not null,"
    +
    76  " text text not null"
    +
    77  ");"
    +
    78  "create unique index if not exists block_pqxyz_idx on block (p, q, x, y, z);"
    +
    79  "create unique index if not exists key_pq_idx on key (p, q);"
    +
    80  "create unique index if not exists sign_xyzface_idx on sign (x, y, z, face);"
    +
    81  "create index if not exists sign_pq_idx on sign (p, q);";
    +
    82  static const char *insert_block_query =
    +
    83  "insert or replace into block (p, q, x, y, z, w) "
    +
    84  "values (?, ?, ?, ?, ?, ?);";
    +
    85  static const char *insert_sign_query =
    +
    86  "insert or replace into sign (p, q, x, y, z, face, text) "
    +
    87  "values (?, ?, ?, ?, ?, ?, ?);";
    +
    88  static const char *delete_sign_query =
    +
    89  "delete from sign where x = ? and y = ? and z = ? and face = ?;";
    +
    90  static const char *delete_signs_query =
    +
    91  "delete from sign where x = ? and y = ? and z = ?;";
    +
    92  static const char *load_map_query =
    +
    93  "select x, y, z, w from block where p = ? and q = ?;";
    +
    94  static const char *load_signs_query =
    +
    95  "select x, y, z, face, text from sign where p = ? and q = ?;";
    +
    96  static const char *get_key_query =
    +
    97  "select key from key where p = ? and q = ?;";
    +
    98  static const char *set_key_query =
    +
    99  "insert or replace into key (p, q, key) "
    +
    100  "values (?, ?, ?);";
    +
    101  int rc;
    +
    102  rc = sqlite3_open(path, &db);
    +
    103  if (rc) return rc;
    +
    104  rc = sqlite3_exec(db, create_query, NULL, NULL, NULL);
    +
    105  if (rc) return rc;
    +
    106  rc = sqlite3_prepare_v2(
    +
    107  db, insert_block_query, -1, &insert_block_stmt, NULL);
    +
    108  if (rc) return rc;
    +
    109  rc = sqlite3_prepare_v2(
    +
    110  db, insert_sign_query, -1, &insert_sign_stmt, NULL);
    +
    111  if (rc) return rc;
    +
    112  rc = sqlite3_prepare_v2(
    +
    113  db, delete_sign_query, -1, &delete_sign_stmt, NULL);
    +
    114  if (rc) return rc;
    +
    115  rc = sqlite3_prepare_v2(
    +
    116  db, delete_signs_query, -1, &delete_signs_stmt, NULL);
    +
    117  if (rc) return rc;
    +
    118  rc = sqlite3_prepare_v2(db, load_map_query, -1, &load_map_stmt, NULL);
    +
    119  if (rc) return rc;
    +
    120  rc = sqlite3_prepare_v2(db, load_signs_query, -1, &load_signs_stmt, NULL);
    +
    121  if (rc) return rc;
    +
    122  rc = sqlite3_prepare_v2(db, get_key_query, -1, &get_key_stmt, NULL);
    +
    123  if (rc) return rc;
    +
    124  rc = sqlite3_prepare_v2(db, set_key_query, -1, &set_key_stmt, NULL);
    +
    125  if (rc) return rc;
    +
    126  sqlite3_exec(db, "begin;", NULL, NULL, NULL);
    +
    127  db_worker_start();
    +
    128  return 0;
    +
    129 }
    +
    130 
    +
    131 void db_close() {
    +
    132  if (!db_enabled) {
    +
    133  return;
    +
    134  }
    +
    135  db_worker_stop();
    +
    136  sqlite3_exec(db, "commit;", NULL, NULL, NULL);
    +
    137  sqlite3_finalize(insert_block_stmt);
    +
    138  sqlite3_finalize(insert_sign_stmt);
    +
    139  sqlite3_finalize(delete_sign_stmt);
    +
    140  sqlite3_finalize(delete_signs_stmt);
    +
    141  sqlite3_finalize(load_map_stmt);
    +
    142  sqlite3_finalize(load_signs_stmt);
    +
    143  sqlite3_finalize(get_key_stmt);
    +
    144  sqlite3_finalize(set_key_stmt);
    +
    145  sqlite3_close(db);
    +
    146 }
    +
    147 
    +
    148 void db_commit() {
    +
    149  if (!db_enabled) {
    +
    150  return;
    +
    151  }
    +
    152  mtx_lock(&mtx);
    + +
    154  cnd_signal(&cnd);
    +
    155  mtx_unlock(&mtx);
    +
    156 }
    +
    157 
    +
    158 void _db_commit() {
    +
    159  sqlite3_exec(db, "commit; begin;", NULL, NULL, NULL);
    +
    160 }
    +
    161 
    +
    162 void db_auth_set(char *username, char *identity_token) {
    +
    163  if (!db_enabled) {
    +
    164  return;
    +
    165  }
    +
    166  static const char *query =
    +
    167  "insert or replace into auth.identity_token "
    +
    168  "(username, token, selected) values (?, ?, ?);";
    +
    169  sqlite3_stmt *stmt;
    +
    170  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    171  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    172  sqlite3_bind_text(stmt, 2, identity_token, -1, NULL);
    +
    173  sqlite3_bind_int(stmt, 3, 1);
    +
    174  sqlite3_step(stmt);
    +
    175  sqlite3_finalize(stmt);
    +
    176  db_auth_select(username);
    +
    177 }
    +
    178 
    +
    179 int db_auth_select(char *username) {
    +
    180  if (!db_enabled) {
    +
    181  return 0;
    +
    182  }
    + +
    184  static const char *query =
    +
    185  "update auth.identity_token set selected = 1 where username = ?;";
    +
    186  sqlite3_stmt *stmt;
    +
    187  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    188  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    189  sqlite3_step(stmt);
    +
    190  sqlite3_finalize(stmt);
    +
    191  return sqlite3_changes(db);
    +
    192 }
    +
    193 
    + +
    195  if (!db_enabled) {
    +
    196  return;
    +
    197  }
    +
    198  sqlite3_exec(db, "update auth.identity_token set selected = 0;",
    +
    199  NULL, NULL, NULL);
    +
    200 }
    +
    201 
    + +
    203  char *username,
    +
    204  char *identity_token, int identity_token_length)
    +
    205 {
    +
    206  if (!db_enabled) {
    +
    207  return 0;
    +
    208  }
    +
    209  static const char *query =
    +
    210  "select token from auth.identity_token "
    +
    211  "where username = ?;";
    +
    212  int result = 0;
    +
    213  sqlite3_stmt *stmt;
    +
    214  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    215  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    216  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    217  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    218  strncpy(identity_token, a, identity_token_length - 1);
    +
    219  identity_token[identity_token_length - 1] = '\0';
    +
    220  result = 1;
    +
    221  }
    +
    222  sqlite3_finalize(stmt);
    +
    223  return result;
    +
    224 }
    +
    225 
    + +
    227  char *username, int username_length,
    +
    228  char *identity_token, int identity_token_length)
    +
    229 {
    +
    230  if (!db_enabled) {
    +
    231  return 0;
    +
    232  }
    +
    233  static const char *query =
    +
    234  "select username, token from auth.identity_token "
    +
    235  "where selected = 1;";
    +
    236  int result = 0;
    +
    237  sqlite3_stmt *stmt;
    +
    238  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    239  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    240  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    241  const char *b = (const char *)sqlite3_column_text(stmt, 1);
    +
    242  strncpy(username, a, username_length - 1);
    +
    243  username[username_length - 1] = '\0';
    +
    244  strncpy(identity_token, b, identity_token_length - 1);
    +
    245  identity_token[identity_token_length - 1] = '\0';
    +
    246  result = 1;
    +
    247  }
    +
    248  sqlite3_finalize(stmt);
    +
    249  return result;
    +
    250 }
    +
    251 
    +
    252 void db_save_state(float x, float y, float z, float rx, float ry) {
    +
    253  if (!db_enabled) {
    +
    254  return;
    +
    255  }
    +
    256  static const char *query =
    +
    257  "insert into state (x, y, z, rx, ry) values (?, ?, ?, ?, ?);";
    +
    258  sqlite3_stmt *stmt;
    +
    259  sqlite3_exec(db, "delete from state;", NULL, NULL, NULL);
    +
    260  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    261  sqlite3_bind_double(stmt, 1, x);
    +
    262  sqlite3_bind_double(stmt, 2, y);
    +
    263  sqlite3_bind_double(stmt, 3, z);
    +
    264  sqlite3_bind_double(stmt, 4, rx);
    +
    265  sqlite3_bind_double(stmt, 5, ry);
    +
    266  sqlite3_step(stmt);
    +
    267  sqlite3_finalize(stmt);
    +
    268 }
    +
    269 
    +
    270 int db_load_state(float *x, float *y, float *z, float *rx, float *ry) {
    +
    271  if (!db_enabled) {
    +
    272  return 0;
    +
    273  }
    +
    274  static const char *query =
    +
    275  "select x, y, z, rx, ry from state;";
    +
    276  int result = 0;
    +
    277  sqlite3_stmt *stmt;
    +
    278  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    279  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    280  *x = sqlite3_column_double(stmt, 0);
    +
    281  *y = sqlite3_column_double(stmt, 1);
    +
    282  *z = sqlite3_column_double(stmt, 2);
    +
    283  *rx = sqlite3_column_double(stmt, 3);
    +
    284  *ry = sqlite3_column_double(stmt, 4);
    +
    285  result = 1;
    +
    286  }
    +
    287  sqlite3_finalize(stmt);
    +
    288  return result;
    +
    289 }
    +
    290 
    +
    291 void db_insert_block(int p, int q, int x, int y, int z, int w) {
    +
    292  if (!db_enabled) {
    +
    293  return;
    +
    294  }
    +
    295  mtx_lock(&mtx);
    +
    296  ring_put_block(&ring, p, q, x, y, z, w);
    +
    297  cnd_signal(&cnd);
    +
    298  mtx_unlock(&mtx);
    +
    299 }
    +
    300 
    +
    301 void _db_insert_block(int p, int q, int x, int y, int z, int w) {
    +
    302  sqlite3_reset(insert_block_stmt);
    +
    303  sqlite3_bind_int(insert_block_stmt, 1, p);
    +
    304  sqlite3_bind_int(insert_block_stmt, 2, q);
    +
    305  sqlite3_bind_int(insert_block_stmt, 3, x);
    +
    306  sqlite3_bind_int(insert_block_stmt, 4, y);
    +
    307  sqlite3_bind_int(insert_block_stmt, 5, z);
    +
    308  sqlite3_bind_int(insert_block_stmt, 6, w);
    +
    309  sqlite3_step(insert_block_stmt);
    +
    310 }
    +
    311 
    + +
    313  int p, int q, int x, int y, int z, int face, const char *text)
    +
    314 {
    +
    315  if (!db_enabled) {
    +
    316  return;
    +
    317  }
    +
    318  sqlite3_reset(insert_sign_stmt);
    +
    319  sqlite3_bind_int(insert_sign_stmt, 1, p);
    +
    320  sqlite3_bind_int(insert_sign_stmt, 2, q);
    +
    321  sqlite3_bind_int(insert_sign_stmt, 3, x);
    +
    322  sqlite3_bind_int(insert_sign_stmt, 4, y);
    +
    323  sqlite3_bind_int(insert_sign_stmt, 5, z);
    +
    324  sqlite3_bind_int(insert_sign_stmt, 6, face);
    +
    325  sqlite3_bind_text(insert_sign_stmt, 7, text, -1, NULL);
    +
    326  sqlite3_step(insert_sign_stmt);
    +
    327 }
    +
    328 
    +
    329 void db_delete_sign(int x, int y, int z, int face) {
    +
    330  if (!db_enabled) {
    +
    331  return;
    +
    332  }
    +
    333  sqlite3_reset(delete_sign_stmt);
    +
    334  sqlite3_bind_int(delete_sign_stmt, 1, x);
    +
    335  sqlite3_bind_int(delete_sign_stmt, 2, y);
    +
    336  sqlite3_bind_int(delete_sign_stmt, 3, z);
    +
    337  sqlite3_bind_int(delete_sign_stmt, 4, face);
    +
    338  sqlite3_step(delete_sign_stmt);
    +
    339 }
    +
    340 
    +
    341 void db_delete_signs(int x, int y, int z) {
    +
    342  if (!db_enabled) {
    +
    343  return;
    +
    344  }
    +
    345  sqlite3_reset(delete_signs_stmt);
    +
    346  sqlite3_bind_int(delete_signs_stmt, 1, x);
    +
    347  sqlite3_bind_int(delete_signs_stmt, 2, y);
    +
    348  sqlite3_bind_int(delete_signs_stmt, 3, z);
    +
    349  sqlite3_step(delete_signs_stmt);
    +
    350 }
    +
    351 
    + +
    353  if (!db_enabled) {
    +
    354  return;
    +
    355  }
    +
    356  sqlite3_exec(db, "delete from sign;", NULL, NULL, NULL);
    +
    357 }
    +
    358 
    +
    359 void db_load_map(Map *map, int p, int q) {
    +
    360  if (!db_enabled) {
    +
    361  return;
    +
    362  }
    +
    363  sqlite3_reset(load_map_stmt);
    +
    364  sqlite3_bind_int(load_map_stmt, 1, p);
    +
    365  sqlite3_bind_int(load_map_stmt, 2, q);
    +
    366  while (sqlite3_step(load_map_stmt) == SQLITE_ROW) {
    +
    367  int x = sqlite3_column_int(load_map_stmt, 0);
    +
    368  int y = sqlite3_column_int(load_map_stmt, 1);
    +
    369  int z = sqlite3_column_int(load_map_stmt, 2);
    +
    370  int w = sqlite3_column_int(load_map_stmt, 3);
    +
    371  map_set(map, x, y, z, w);
    +
    372  }
    +
    373 }
    +
    374 
    +
    375 void db_load_signs(SignList *list, int p, int q) {
    +
    376  if (!db_enabled) {
    +
    377  return;
    +
    378  }
    +
    379  sqlite3_reset(load_signs_stmt);
    +
    380  sqlite3_bind_int(load_signs_stmt, 1, p);
    +
    381  sqlite3_bind_int(load_signs_stmt, 2, q);
    +
    382  while (sqlite3_step(load_signs_stmt) == SQLITE_ROW) {
    +
    383  int x = sqlite3_column_int(load_signs_stmt, 0);
    +
    384  int y = sqlite3_column_int(load_signs_stmt, 1);
    +
    385  int z = sqlite3_column_int(load_signs_stmt, 2);
    +
    386  int face = sqlite3_column_int(load_signs_stmt, 3);
    +
    387  const char *text = (const char *)sqlite3_column_text(
    +
    388  load_signs_stmt, 4);
    +
    389  sign_list_add(list, x, y, z, face, text);
    +
    390  }
    +
    391 }
    +
    392 
    +
    393 int db_get_key(int p, int q) {
    +
    394  if (!db_enabled) {
    +
    395  return 0;
    +
    396  }
    +
    397  sqlite3_reset(get_key_stmt);
    +
    398  sqlite3_bind_int(get_key_stmt, 1, p);
    +
    399  sqlite3_bind_int(get_key_stmt, 2, q);
    +
    400  if (sqlite3_step(get_key_stmt) == SQLITE_ROW) {
    +
    401  return sqlite3_column_int(get_key_stmt, 0);
    +
    402  }
    +
    403  return 0;
    +
    404 }
    +
    405 
    +
    406 void db_set_key(int p, int q, int key) {
    +
    407  if (!db_enabled) {
    +
    408  return;
    +
    409  }
    +
    410  mtx_lock(&mtx);
    +
    411  ring_put_key(&ring, p, q, key);
    +
    412  cnd_signal(&cnd);
    +
    413  mtx_unlock(&mtx);
    +
    414 }
    +
    415 
    +
    416 void _db_set_key(int p, int q, int key) {
    +
    417  sqlite3_reset(set_key_stmt);
    +
    418  sqlite3_bind_int(set_key_stmt, 1, p);
    +
    419  sqlite3_bind_int(set_key_stmt, 2, q);
    +
    420  sqlite3_bind_int(set_key_stmt, 3, key);
    +
    421  sqlite3_step(set_key_stmt);
    +
    422 }
    +
    423 
    +
    424 void db_worker_start(char *path) {
    +
    425  if (!db_enabled) {
    +
    426  return;
    +
    427  }
    +
    428  ring_alloc(&ring, 1024);
    +
    429  mtx_init(&mtx, mtx_plain);
    +
    430  cnd_init(&cnd);
    +
    431  thrd_create(&thrd, db_worker_run, path);
    +
    432 }
    +
    433 
    + +
    435  if (!db_enabled) {
    +
    436  return;
    +
    437  }
    +
    438  mtx_lock(&mtx);
    + +
    440  cnd_signal(&cnd);
    +
    441  mtx_unlock(&mtx);
    +
    442  thrd_join(thrd, NULL);
    +
    443  cnd_destroy(&cnd);
    +
    444  mtx_destroy(&mtx);
    +
    445  ring_free(&ring);
    +
    446 }
    +
    447 
    +
    448 int db_worker_run(void *arg) {
    +
    449  int running = 1;
    +
    450  while (running) {
    +
    451  RingEntry e;
    +
    452  mtx_lock(&mtx);
    +
    453  while (!ring_get(&ring, &e)) {
    +
    454  cnd_wait(&cnd, &mtx);
    +
    455  }
    +
    456  mtx_unlock(&mtx);
    +
    457  switch (e.type) {
    +
    458  case BLOCK:
    +
    459  _db_insert_block(e.p, e.q, e.x, e.y, e.z, e.w);
    +
    460  break;
    +
    461  case KEY:
    +
    462  _db_set_key(e.p, e.q, e.key);
    +
    463  break;
    +
    464  case COMMIT:
    +
    465  _db_commit();
    +
    466  break;
    +
    467  case EXIT:
    +
    468  running = 0;
    +
    469  break;
    +
    470  }
    +
    471  }
    +
    472  return 0;
    +
    473 }
    +
    static int running
    Definition: client.c:21
    +
    static sqlite3_stmt * load_map_stmt
    Definition: db.c:14
    +
    void db_disable()
    Definition: db.c:28
    +
    void _db_commit()
    Definition: db.c:158
    +
    void db_commit()
    Definition: db.c:148
    +
    void _db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:301
    +
    void _db_set_key(int p, int q, int key)
    Definition: db.c:416
    +
    static sqlite3_stmt * delete_signs_stmt
    Definition: db.c:13
    +
    static sqlite3_stmt * insert_sign_stmt
    Definition: db.c:11
    +
    void db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text)
    Definition: db.c:312
    +
    static sqlite3_stmt * insert_block_stmt
    Definition: db.c:10
    +
    static int db_enabled
    Definition: db.c:7
    +
    static sqlite3_stmt * get_key_stmt
    Definition: db.c:16
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    static thrd_t thrd
    Definition: db.c:20
    +
    int db_get_key(int p, int q)
    Definition: db.c:393
    +
    void db_save_state(float x, float y, float z, float rx, float ry)
    Definition: db.c:252
    +
    void db_set_key(int p, int q, int key)
    Definition: db.c:406
    +
    void db_worker_stop()
    Definition: db.c:434
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    static cnd_t cnd
    Definition: db.c:22
    +
    void db_load_signs(SignList *list, int p, int q)
    Definition: db.c:375
    +
    void db_load_map(Map *map, int p, int q)
    Definition: db.c:359
    +
    void db_close()
    Definition: db.c:131
    +
    static sqlite3_stmt * delete_sign_stmt
    Definition: db.c:12
    +
    void db_delete_sign(int x, int y, int z, int face)
    Definition: db.c:329
    +
    int get_db_enabled()
    Definition: db.c:32
    +
    int db_auth_get(char *username, char *identity_token, int identity_token_length)
    Definition: db.c:202
    +
    void db_delete_all_signs()
    Definition: db.c:352
    +
    int db_load_state(float *x, float *y, float *z, float *rx, float *ry)
    Definition: db.c:270
    +
    static sqlite3_stmt * load_signs_stmt
    Definition: db.c:15
    +
    void db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:291
    +
    static sqlite3 * db
    Definition: db.c:9
    +
    int db_worker_run(void *arg)
    Definition: db.c:448
    +
    void db_auth_set(char *username, char *identity_token)
    Definition: db.c:162
    +
    void db_delete_signs(int x, int y, int z)
    Definition: db.c:341
    +
    static mtx_t mtx
    Definition: db.c:21
    +
    int db_init(char *path)
    Definition: db.c:36
    +
    int db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length)
    Definition: db.c:226
    +
    void db_worker_start(char *path)
    Definition: db.c:424
    +
    static Ring ring
    Definition: db.c:19
    +
    static sqlite3_stmt * set_key_stmt
    Definition: db.c:17
    +
    void db_enable()
    Definition: db.c:24
    + +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    void ring_put_exit(Ring *ring)
    Definition: ring.c:83
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    void ring_put_key(Ring *ring, int p, int q, int key)
    Definition: ring.c:68
    +
    void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w)
    Definition: ring.c:56
    +
    void ring_put_commit(Ring *ring)
    Definition: ring.c:77
    +
    void ring_free(Ring *ring)
    Definition: ring.c:12
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    + +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    +
    Definition: map.h:22
    +
    Definition: ring.h:11
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int key
    Definition: ring.h:19
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    Definition: ring.h:22
    +
    Definition: sign.h:14
    +
    + + + + diff --git a/documentation/html/db_8h.html b/documentation/html/db_8h.html new file mode 100644 index 000000000..ed8bd82d2 --- /dev/null +++ b/documentation/html/db_8h.html @@ -0,0 +1,1331 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/db.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    db.h File Reference
    +
    +
    +
    #include "map.h"
    +#include "sign.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void db_enable ()
     
    void db_disable ()
     
    int get_db_enabled ()
     
    int db_init (char *path)
     
    void db_close ()
     
    void db_commit ()
     
    void db_auth_set (char *username, char *identity_token)
     
    int db_auth_select (char *username)
     
    void db_auth_select_none ()
     
    int db_auth_get (char *username, char *identity_token, int identity_token_length)
     
    int db_auth_get_selected (char *username, int username_length, char *identity_token, int identity_token_length)
     
    void db_save_state (float x, float y, float z, float rx, float ry)
     
    int db_load_state (float *x, float *y, float *z, float *rx, float *ry)
     
    void db_insert_block (int p, int q, int x, int y, int z, int w)
     
    void db_insert_sign (int p, int q, int x, int y, int z, int face, const char *text)
     
    void db_delete_sign (int x, int y, int z, int face)
     
    void db_delete_signs (int x, int y, int z)
     
    void db_delete_all_signs ()
     
    void db_load_map (Map *map, int p, int q)
     
    void db_load_signs (SignList *list, int p, int q)
     
    int db_get_key (int p, int q)
     
    void db_set_key (int p, int q, int key)
     
    void db_worker_start ()
     
    void db_worker_stop ()
     
    int db_worker_run (void *arg)
     
    +

    Function Documentation

    + +

    ◆ db_auth_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_auth_get (char * username,
    char * identity_token,
    int identity_token_length 
    )
    +
    + +

    Definition at line 202 of file db.c.

    +
    205 {
    +
    206  if (!db_enabled) {
    +
    207  return 0;
    +
    208  }
    +
    209  static const char *query =
    +
    210  "select token from auth.identity_token "
    +
    211  "where username = ?;";
    +
    212  int result = 0;
    +
    213  sqlite3_stmt *stmt;
    +
    214  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    215  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    216  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    217  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    218  strncpy(identity_token, a, identity_token_length - 1);
    +
    219  identity_token[identity_token_length - 1] = '\0';
    +
    220  result = 1;
    +
    221  }
    +
    222  sqlite3_finalize(stmt);
    +
    223  return result;
    +
    224 }
    +
    static int db_enabled
    Definition: db.c:7
    +
    static sqlite3 * db
    Definition: db.c:9
    +
    +
    +
    + +

    ◆ db_auth_get_selected()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_auth_get_selected (char * username,
    int username_length,
    char * identity_token,
    int identity_token_length 
    )
    +
    + +

    Definition at line 226 of file db.c.

    +
    229 {
    +
    230  if (!db_enabled) {
    +
    231  return 0;
    +
    232  }
    +
    233  static const char *query =
    +
    234  "select username, token from auth.identity_token "
    +
    235  "where selected = 1;";
    +
    236  int result = 0;
    +
    237  sqlite3_stmt *stmt;
    +
    238  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    239  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    240  const char *a = (const char *)sqlite3_column_text(stmt, 0);
    +
    241  const char *b = (const char *)sqlite3_column_text(stmt, 1);
    +
    242  strncpy(username, a, username_length - 1);
    +
    243  username[username_length - 1] = '\0';
    +
    244  strncpy(identity_token, b, identity_token_length - 1);
    +
    245  identity_token[identity_token_length - 1] = '\0';
    +
    246  result = 1;
    +
    247  }
    +
    248  sqlite3_finalize(stmt);
    +
    249  return result;
    +
    250 }
    +
    +
    +
    + +

    ◆ db_auth_select()

    + +
    +
    + + + + + + + + +
    int db_auth_select (char * username)
    +
    + +

    Definition at line 179 of file db.c.

    +
    179  {
    +
    180  if (!db_enabled) {
    +
    181  return 0;
    +
    182  }
    + +
    184  static const char *query =
    +
    185  "update auth.identity_token set selected = 1 where username = ?;";
    +
    186  sqlite3_stmt *stmt;
    +
    187  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    188  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    189  sqlite3_step(stmt);
    +
    190  sqlite3_finalize(stmt);
    +
    191  return sqlite3_changes(db);
    +
    192 }
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    +
    +
    + +

    ◆ db_auth_select_none()

    + +
    +
    + + + + + + + +
    void db_auth_select_none ()
    +
    + +

    Definition at line 194 of file db.c.

    +
    194  {
    +
    195  if (!db_enabled) {
    +
    196  return;
    +
    197  }
    +
    198  sqlite3_exec(db, "update auth.identity_token set selected = 0;",
    +
    199  NULL, NULL, NULL);
    +
    200 }
    +
    +
    +
    + +

    ◆ db_auth_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void db_auth_set (char * username,
    char * identity_token 
    )
    +
    + +

    Definition at line 162 of file db.c.

    +
    162  {
    +
    163  if (!db_enabled) {
    +
    164  return;
    +
    165  }
    +
    166  static const char *query =
    +
    167  "insert or replace into auth.identity_token "
    +
    168  "(username, token, selected) values (?, ?, ?);";
    +
    169  sqlite3_stmt *stmt;
    +
    170  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    171  sqlite3_bind_text(stmt, 1, username, -1, NULL);
    +
    172  sqlite3_bind_text(stmt, 2, identity_token, -1, NULL);
    +
    173  sqlite3_bind_int(stmt, 3, 1);
    +
    174  sqlite3_step(stmt);
    +
    175  sqlite3_finalize(stmt);
    +
    176  db_auth_select(username);
    +
    177 }
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    +
    +
    + +

    ◆ db_close()

    + +
    +
    + + + + + + + +
    void db_close ()
    +
    + +

    Definition at line 131 of file db.c.

    +
    131  {
    +
    132  if (!db_enabled) {
    +
    133  return;
    +
    134  }
    +
    135  db_worker_stop();
    +
    136  sqlite3_exec(db, "commit;", NULL, NULL, NULL);
    +
    137  sqlite3_finalize(insert_block_stmt);
    +
    138  sqlite3_finalize(insert_sign_stmt);
    +
    139  sqlite3_finalize(delete_sign_stmt);
    +
    140  sqlite3_finalize(delete_signs_stmt);
    +
    141  sqlite3_finalize(load_map_stmt);
    +
    142  sqlite3_finalize(load_signs_stmt);
    +
    143  sqlite3_finalize(get_key_stmt);
    +
    144  sqlite3_finalize(set_key_stmt);
    +
    145  sqlite3_close(db);
    +
    146 }
    +
    static sqlite3_stmt * load_map_stmt
    Definition: db.c:14
    +
    static sqlite3_stmt * delete_signs_stmt
    Definition: db.c:13
    +
    static sqlite3_stmt * insert_sign_stmt
    Definition: db.c:11
    +
    static sqlite3_stmt * insert_block_stmt
    Definition: db.c:10
    +
    static sqlite3_stmt * get_key_stmt
    Definition: db.c:16
    +
    void db_worker_stop()
    Definition: db.c:434
    +
    static sqlite3_stmt * delete_sign_stmt
    Definition: db.c:12
    +
    static sqlite3_stmt * load_signs_stmt
    Definition: db.c:15
    +
    static sqlite3_stmt * set_key_stmt
    Definition: db.c:17
    +
    +
    +
    + +

    ◆ db_commit()

    + +
    +
    + + + + + + + +
    void db_commit ()
    +
    + +

    Definition at line 148 of file db.c.

    +
    148  {
    +
    149  if (!db_enabled) {
    +
    150  return;
    +
    151  }
    +
    152  mtx_lock(&mtx);
    + +
    154  cnd_signal(&cnd);
    +
    155  mtx_unlock(&mtx);
    +
    156 }
    +
    static cnd_t cnd
    Definition: db.c:22
    +
    static mtx_t mtx
    Definition: db.c:21
    +
    static Ring ring
    Definition: db.c:19
    +
    void ring_put_commit(Ring *ring)
    Definition: ring.c:77
    +
    +
    +
    + +

    ◆ db_delete_all_signs()

    + +
    +
    + + + + + + + +
    void db_delete_all_signs ()
    +
    + +

    Definition at line 352 of file db.c.

    +
    352  {
    +
    353  if (!db_enabled) {
    +
    354  return;
    +
    355  }
    +
    356  sqlite3_exec(db, "delete from sign;", NULL, NULL, NULL);
    +
    357 }
    +
    +
    +
    + +

    ◆ db_delete_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_delete_sign (int x,
    int y,
    int z,
    int face 
    )
    +
    + +

    Definition at line 329 of file db.c.

    +
    329  {
    +
    330  if (!db_enabled) {
    +
    331  return;
    +
    332  }
    +
    333  sqlite3_reset(delete_sign_stmt);
    +
    334  sqlite3_bind_int(delete_sign_stmt, 1, x);
    +
    335  sqlite3_bind_int(delete_sign_stmt, 2, y);
    +
    336  sqlite3_bind_int(delete_sign_stmt, 3, z);
    +
    337  sqlite3_bind_int(delete_sign_stmt, 4, face);
    +
    338  sqlite3_step(delete_sign_stmt);
    +
    339 }
    +
    +
    +
    + +

    ◆ db_delete_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_delete_signs (int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 341 of file db.c.

    +
    341  {
    +
    342  if (!db_enabled) {
    +
    343  return;
    +
    344  }
    +
    345  sqlite3_reset(delete_signs_stmt);
    +
    346  sqlite3_bind_int(delete_signs_stmt, 1, x);
    +
    347  sqlite3_bind_int(delete_signs_stmt, 2, y);
    +
    348  sqlite3_bind_int(delete_signs_stmt, 3, z);
    +
    349  sqlite3_step(delete_signs_stmt);
    +
    350 }
    +
    +
    +
    + +

    ◆ db_disable()

    + +
    +
    + + + + + + + +
    void db_disable ()
    +
    + +

    Definition at line 28 of file db.c.

    +
    28  {
    +
    29  db_enabled = 0;
    +
    30 }
    +
    +
    +
    + +

    ◆ db_enable()

    + +
    +
    + + + + + + + +
    void db_enable ()
    +
    + +

    Definition at line 24 of file db.c.

    +
    24  {
    +
    25  db_enabled = 1;
    +
    26 }
    +
    +
    +
    + +

    ◆ db_get_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int db_get_key (int p,
    int q 
    )
    +
    + +

    Definition at line 393 of file db.c.

    +
    393  {
    +
    394  if (!db_enabled) {
    +
    395  return 0;
    +
    396  }
    +
    397  sqlite3_reset(get_key_stmt);
    +
    398  sqlite3_bind_int(get_key_stmt, 1, p);
    +
    399  sqlite3_bind_int(get_key_stmt, 2, q);
    +
    400  if (sqlite3_step(get_key_stmt) == SQLITE_ROW) {
    +
    401  return sqlite3_column_int(get_key_stmt, 0);
    +
    402  }
    +
    403  return 0;
    +
    404 }
    +
    +
    +
    + +

    ◆ db_init()

    + +
    +
    + + + + + + + + +
    int db_init (char * path)
    +
    + +

    Definition at line 36 of file db.c.

    +
    36  {
    +
    37  if (!db_enabled) {
    +
    38  return 0;
    +
    39  }
    +
    40  static const char *create_query =
    +
    41  "attach database 'auth.db' as auth;"
    +
    42  "create table if not exists auth.identity_token ("
    +
    43  " username text not null,"
    +
    44  " token text not null,"
    +
    45  " selected int not null"
    +
    46  ");"
    +
    47  "create unique index if not exists auth.identity_token_username_idx"
    +
    48  " on identity_token (username);"
    +
    49  "create table if not exists state ("
    +
    50  " x float not null,"
    +
    51  " y float not null,"
    +
    52  " z float not null,"
    +
    53  " rx float not null,"
    +
    54  " ry float not null"
    +
    55  ");"
    +
    56  "create table if not exists block ("
    +
    57  " p int not null,"
    +
    58  " q int not null,"
    +
    59  " x int not null,"
    +
    60  " y int not null,"
    +
    61  " z int not null,"
    +
    62  " w int not null"
    +
    63  ");"
    +
    64  "create table if not exists key ("
    +
    65  " p int not null,"
    +
    66  " q int not null,"
    +
    67  " key int not null"
    +
    68  ");"
    +
    69  "create table if not exists sign ("
    +
    70  " p int not null,"
    +
    71  " q int not null,"
    +
    72  " x int not null,"
    +
    73  " y int not null,"
    +
    74  " z int not null,"
    +
    75  " face int not null,"
    +
    76  " text text not null"
    +
    77  ");"
    +
    78  "create unique index if not exists block_pqxyz_idx on block (p, q, x, y, z);"
    +
    79  "create unique index if not exists key_pq_idx on key (p, q);"
    +
    80  "create unique index if not exists sign_xyzface_idx on sign (x, y, z, face);"
    +
    81  "create index if not exists sign_pq_idx on sign (p, q);";
    +
    82  static const char *insert_block_query =
    +
    83  "insert or replace into block (p, q, x, y, z, w) "
    +
    84  "values (?, ?, ?, ?, ?, ?);";
    +
    85  static const char *insert_sign_query =
    +
    86  "insert or replace into sign (p, q, x, y, z, face, text) "
    +
    87  "values (?, ?, ?, ?, ?, ?, ?);";
    +
    88  static const char *delete_sign_query =
    +
    89  "delete from sign where x = ? and y = ? and z = ? and face = ?;";
    +
    90  static const char *delete_signs_query =
    +
    91  "delete from sign where x = ? and y = ? and z = ?;";
    +
    92  static const char *load_map_query =
    +
    93  "select x, y, z, w from block where p = ? and q = ?;";
    +
    94  static const char *load_signs_query =
    +
    95  "select x, y, z, face, text from sign where p = ? and q = ?;";
    +
    96  static const char *get_key_query =
    +
    97  "select key from key where p = ? and q = ?;";
    +
    98  static const char *set_key_query =
    +
    99  "insert or replace into key (p, q, key) "
    +
    100  "values (?, ?, ?);";
    +
    101  int rc;
    +
    102  rc = sqlite3_open(path, &db);
    +
    103  if (rc) return rc;
    +
    104  rc = sqlite3_exec(db, create_query, NULL, NULL, NULL);
    +
    105  if (rc) return rc;
    +
    106  rc = sqlite3_prepare_v2(
    +
    107  db, insert_block_query, -1, &insert_block_stmt, NULL);
    +
    108  if (rc) return rc;
    +
    109  rc = sqlite3_prepare_v2(
    +
    110  db, insert_sign_query, -1, &insert_sign_stmt, NULL);
    +
    111  if (rc) return rc;
    +
    112  rc = sqlite3_prepare_v2(
    +
    113  db, delete_sign_query, -1, &delete_sign_stmt, NULL);
    +
    114  if (rc) return rc;
    +
    115  rc = sqlite3_prepare_v2(
    +
    116  db, delete_signs_query, -1, &delete_signs_stmt, NULL);
    +
    117  if (rc) return rc;
    +
    118  rc = sqlite3_prepare_v2(db, load_map_query, -1, &load_map_stmt, NULL);
    +
    119  if (rc) return rc;
    +
    120  rc = sqlite3_prepare_v2(db, load_signs_query, -1, &load_signs_stmt, NULL);
    +
    121  if (rc) return rc;
    +
    122  rc = sqlite3_prepare_v2(db, get_key_query, -1, &get_key_stmt, NULL);
    +
    123  if (rc) return rc;
    +
    124  rc = sqlite3_prepare_v2(db, set_key_query, -1, &set_key_stmt, NULL);
    +
    125  if (rc) return rc;
    +
    126  sqlite3_exec(db, "begin;", NULL, NULL, NULL);
    +
    127  db_worker_start();
    +
    128  return 0;
    +
    129 }
    +
    void db_worker_start(char *path)
    Definition: db.c:424
    +
    +
    +
    + +

    ◆ db_insert_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_insert_block (int p,
    int q,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 291 of file db.c.

    +
    291  {
    +
    292  if (!db_enabled) {
    +
    293  return;
    +
    294  }
    +
    295  mtx_lock(&mtx);
    +
    296  ring_put_block(&ring, p, q, x, y, z, w);
    +
    297  cnd_signal(&cnd);
    +
    298  mtx_unlock(&mtx);
    +
    299 }
    +
    void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w)
    Definition: ring.c:56
    +
    +
    +
    + +

    ◆ db_insert_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_insert_sign (int p,
    int q,
    int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 312 of file db.c.

    +
    314 {
    +
    315  if (!db_enabled) {
    +
    316  return;
    +
    317  }
    +
    318  sqlite3_reset(insert_sign_stmt);
    +
    319  sqlite3_bind_int(insert_sign_stmt, 1, p);
    +
    320  sqlite3_bind_int(insert_sign_stmt, 2, q);
    +
    321  sqlite3_bind_int(insert_sign_stmt, 3, x);
    +
    322  sqlite3_bind_int(insert_sign_stmt, 4, y);
    +
    323  sqlite3_bind_int(insert_sign_stmt, 5, z);
    +
    324  sqlite3_bind_int(insert_sign_stmt, 6, face);
    +
    325  sqlite3_bind_text(insert_sign_stmt, 7, text, -1, NULL);
    +
    326  sqlite3_step(insert_sign_stmt);
    +
    327 }
    +
    +
    +
    + +

    ◆ db_load_map()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_load_map (Mapmap,
    int p,
    int q 
    )
    +
    + +

    Definition at line 359 of file db.c.

    +
    359  {
    +
    360  if (!db_enabled) {
    +
    361  return;
    +
    362  }
    +
    363  sqlite3_reset(load_map_stmt);
    +
    364  sqlite3_bind_int(load_map_stmt, 1, p);
    +
    365  sqlite3_bind_int(load_map_stmt, 2, q);
    +
    366  while (sqlite3_step(load_map_stmt) == SQLITE_ROW) {
    +
    367  int x = sqlite3_column_int(load_map_stmt, 0);
    +
    368  int y = sqlite3_column_int(load_map_stmt, 1);
    +
    369  int z = sqlite3_column_int(load_map_stmt, 2);
    +
    370  int w = sqlite3_column_int(load_map_stmt, 3);
    +
    371  map_set(map, x, y, z, w);
    +
    372  }
    +
    373 }
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    +
    +
    + +

    ◆ db_load_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_load_signs (SignListlist,
    int p,
    int q 
    )
    +
    + +

    Definition at line 375 of file db.c.

    +
    375  {
    +
    376  if (!db_enabled) {
    +
    377  return;
    +
    378  }
    +
    379  sqlite3_reset(load_signs_stmt);
    +
    380  sqlite3_bind_int(load_signs_stmt, 1, p);
    +
    381  sqlite3_bind_int(load_signs_stmt, 2, q);
    +
    382  while (sqlite3_step(load_signs_stmt) == SQLITE_ROW) {
    +
    383  int x = sqlite3_column_int(load_signs_stmt, 0);
    +
    384  int y = sqlite3_column_int(load_signs_stmt, 1);
    +
    385  int z = sqlite3_column_int(load_signs_stmt, 2);
    +
    386  int face = sqlite3_column_int(load_signs_stmt, 3);
    +
    387  const char *text = (const char *)sqlite3_column_text(
    +
    388  load_signs_stmt, 4);
    +
    389  sign_list_add(list, x, y, z, face, text);
    +
    390  }
    +
    391 }
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    +
    +
    +
    + +

    ◆ db_load_state()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int db_load_state (float * x,
    float * y,
    float * z,
    float * rx,
    float * ry 
    )
    +
    + +

    Definition at line 270 of file db.c.

    +
    270  {
    +
    271  if (!db_enabled) {
    +
    272  return 0;
    +
    273  }
    +
    274  static const char *query =
    +
    275  "select x, y, z, rx, ry from state;";
    +
    276  int result = 0;
    +
    277  sqlite3_stmt *stmt;
    +
    278  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    279  if (sqlite3_step(stmt) == SQLITE_ROW) {
    +
    280  *x = sqlite3_column_double(stmt, 0);
    +
    281  *y = sqlite3_column_double(stmt, 1);
    +
    282  *z = sqlite3_column_double(stmt, 2);
    +
    283  *rx = sqlite3_column_double(stmt, 3);
    +
    284  *ry = sqlite3_column_double(stmt, 4);
    +
    285  result = 1;
    +
    286  }
    +
    287  sqlite3_finalize(stmt);
    +
    288  return result;
    +
    289 }
    +
    +
    +
    + +

    ◆ db_save_state()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_save_state (float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 252 of file db.c.

    +
    252  {
    +
    253  if (!db_enabled) {
    +
    254  return;
    +
    255  }
    +
    256  static const char *query =
    +
    257  "insert into state (x, y, z, rx, ry) values (?, ?, ?, ?, ?);";
    +
    258  sqlite3_stmt *stmt;
    +
    259  sqlite3_exec(db, "delete from state;", NULL, NULL, NULL);
    +
    260  sqlite3_prepare_v2(db, query, -1, &stmt, NULL);
    +
    261  sqlite3_bind_double(stmt, 1, x);
    +
    262  sqlite3_bind_double(stmt, 2, y);
    +
    263  sqlite3_bind_double(stmt, 3, z);
    +
    264  sqlite3_bind_double(stmt, 4, rx);
    +
    265  sqlite3_bind_double(stmt, 5, ry);
    +
    266  sqlite3_step(stmt);
    +
    267  sqlite3_finalize(stmt);
    +
    268 }
    +
    +
    +
    + +

    ◆ db_set_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void db_set_key (int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 406 of file db.c.

    +
    406  {
    +
    407  if (!db_enabled) {
    +
    408  return;
    +
    409  }
    +
    410  mtx_lock(&mtx);
    +
    411  ring_put_key(&ring, p, q, key);
    +
    412  cnd_signal(&cnd);
    +
    413  mtx_unlock(&mtx);
    +
    414 }
    +
    void ring_put_key(Ring *ring, int p, int q, int key)
    Definition: ring.c:68
    +
    +
    +
    + +

    ◆ db_worker_run()

    + +
    +
    + + + + + + + + +
    int db_worker_run (void * arg)
    +
    + +

    Definition at line 448 of file db.c.

    +
    448  {
    +
    449  int running = 1;
    +
    450  while (running) {
    +
    451  RingEntry e;
    +
    452  mtx_lock(&mtx);
    +
    453  while (!ring_get(&ring, &e)) {
    +
    454  cnd_wait(&cnd, &mtx);
    +
    455  }
    +
    456  mtx_unlock(&mtx);
    +
    457  switch (e.type) {
    +
    458  case BLOCK:
    +
    459  _db_insert_block(e.p, e.q, e.x, e.y, e.z, e.w);
    +
    460  break;
    +
    461  case KEY:
    +
    462  _db_set_key(e.p, e.q, e.key);
    +
    463  break;
    +
    464  case COMMIT:
    +
    465  _db_commit();
    +
    466  break;
    +
    467  case EXIT:
    +
    468  running = 0;
    +
    469  break;
    +
    470  }
    +
    471  }
    +
    472  return 0;
    +
    473 }
    +
    static int running
    Definition: client.c:21
    +
    void _db_commit()
    Definition: db.c:158
    +
    void _db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:301
    +
    void _db_set_key(int p, int q, int key)
    Definition: db.c:416
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    Definition: ring.h:11
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int key
    Definition: ring.h:19
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    +
    +
    + +

    ◆ db_worker_start()

    + +
    +
    + + + + + + + +
    void db_worker_start ()
    +
    + +
    +
    + +

    ◆ db_worker_stop()

    + +
    +
    + + + + + + + +
    void db_worker_stop ()
    +
    + +

    Definition at line 434 of file db.c.

    +
    434  {
    +
    435  if (!db_enabled) {
    +
    436  return;
    +
    437  }
    +
    438  mtx_lock(&mtx);
    + +
    440  cnd_signal(&cnd);
    +
    441  mtx_unlock(&mtx);
    +
    442  thrd_join(thrd, NULL);
    +
    443  cnd_destroy(&cnd);
    +
    444  mtx_destroy(&mtx);
    +
    445  ring_free(&ring);
    +
    446 }
    +
    static thrd_t thrd
    Definition: db.c:20
    +
    void ring_put_exit(Ring *ring)
    Definition: ring.c:83
    +
    void ring_free(Ring *ring)
    Definition: ring.c:12
    +
    +
    +
    + +

    ◆ get_db_enabled()

    + +
    +
    + + + + + + + +
    int get_db_enabled ()
    +
    + +

    Definition at line 32 of file db.c.

    +
    32  {
    +
    33  return db_enabled;
    +
    34 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/db_8h_source.html b/documentation/html/db_8h_source.html new file mode 100644 index 000000000..038cd5bca --- /dev/null +++ b/documentation/html/db_8h_source.html @@ -0,0 +1,145 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/db.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    db.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _db_h_
    +
    2 #define _db_h_
    +
    3 
    +
    4 #include "map.h"
    +
    5 #include "sign.h"
    +
    6 
    +
    7 void db_enable();
    +
    8 void db_disable();
    +
    9 int get_db_enabled();
    +
    10 int db_init(char *path);
    +
    11 void db_close();
    +
    12 void db_commit();
    +
    13 void db_auth_set(char *username, char *identity_token);
    +
    14 int db_auth_select(char *username);
    +
    15 void db_auth_select_none();
    +
    16 int db_auth_get(
    +
    17  char *username,
    +
    18  char *identity_token, int identity_token_length);
    + +
    20  char *username, int username_length,
    +
    21  char *identity_token, int identity_token_length);
    +
    22 void db_save_state(float x, float y, float z, float rx, float ry);
    +
    23 int db_load_state(float *x, float *y, float *z, float *rx, float *ry);
    +
    24 void db_insert_block(int p, int q, int x, int y, int z, int w);
    +
    25 void db_insert_sign(
    +
    26  int p, int q, int x, int y, int z, int face, const char *text);
    +
    27 void db_delete_sign(int x, int y, int z, int face);
    +
    28 void db_delete_signs(int x, int y, int z);
    +
    29 void db_delete_all_signs();
    +
    30 void db_load_map(Map *map, int p, int q);
    +
    31 void db_load_signs(SignList *list, int p, int q);
    +
    32 int db_get_key(int p, int q);
    +
    33 void db_set_key(int p, int q, int key);
    + +
    35 void db_worker_stop();
    +
    36 int db_worker_run(void *arg);
    +
    37 
    +
    38 #endif
    +
    void db_disable()
    Definition: db.c:28
    +
    void db_commit()
    Definition: db.c:148
    +
    void db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text)
    Definition: db.c:312
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    int db_get_key(int p, int q)
    Definition: db.c:393
    +
    void db_save_state(float x, float y, float z, float rx, float ry)
    Definition: db.c:252
    +
    void db_set_key(int p, int q, int key)
    Definition: db.c:406
    +
    void db_worker_stop()
    Definition: db.c:434
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    void db_load_signs(SignList *list, int p, int q)
    Definition: db.c:375
    +
    void db_load_map(Map *map, int p, int q)
    Definition: db.c:359
    +
    void db_close()
    Definition: db.c:131
    +
    void db_delete_sign(int x, int y, int z, int face)
    Definition: db.c:329
    +
    int get_db_enabled()
    Definition: db.c:32
    +
    int db_auth_get(char *username, char *identity_token, int identity_token_length)
    Definition: db.c:202
    +
    void db_delete_all_signs()
    Definition: db.c:352
    +
    int db_load_state(float *x, float *y, float *z, float *rx, float *ry)
    Definition: db.c:270
    +
    void db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:291
    +
    int db_worker_run(void *arg)
    Definition: db.c:448
    +
    void db_auth_set(char *username, char *identity_token)
    Definition: db.c:162
    +
    void db_delete_signs(int x, int y, int z)
    Definition: db.c:341
    +
    int db_init(char *path)
    Definition: db.c:36
    +
    int db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length)
    Definition: db.c:226
    +
    void db_worker_start()
    +
    void db_enable()
    Definition: db.c:24
    + + +
    Definition: map.h:22
    +
    Definition: sign.h:14
    +
    + + + + diff --git a/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 000000000..a96d0e181 --- /dev/null +++ b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,130 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    src Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

    file  auth.c [code]
     
    file  auth.h [code]
     
    file  client.c [code]
     
    file  client.h [code]
     
    file  config.h [code]
     
    file  cube.c [code]
     
    file  cube.h [code]
     
    file  db.c [code]
     
    file  db.h [code]
     
    file  item.c [code]
     
    file  item.h [code]
     
    file  main.c [code]
     
    file  map.c [code]
     
    file  map.h [code]
     
    file  matrix.c [code]
     
    file  matrix.h [code]
     
    file  ring.c [code]
     
    file  ring.h [code]
     
    file  sign.c [code]
     
    file  sign.h [code]
     
    file  util.c [code]
     
    file  util.h [code]
     
    file  world.c [code]
     
    file  world.h [code]
     
    +
    + + + + diff --git a/documentation/html/doc.png b/documentation/html/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..17edabff95f7b8da13c9516a04efe05493c29501 GIT binary patch literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t literal 0 HcmV?d00001 diff --git a/documentation/html/doxygen.css b/documentation/html/doxygen.css new file mode 100644 index 000000000..90d02c463 --- /dev/null +++ b/documentation/html/doxygen.css @@ -0,0 +1,1799 @@ +/* The standard CSS for doxygen 1.9.2 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/documentation/html/doxygen.svg b/documentation/html/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/documentation/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/html/dynsections.js b/documentation/html/dynsections.js new file mode 100644 index 000000000..88f2c27e6 --- /dev/null +++ b/documentation/html/dynsections.js @@ -0,0 +1,128 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +Craft: File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    File List
    +
    +
    +
    Here is a list of all files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      src
     auth.c
     auth.h
     client.c
     client.h
     config.h
     cube.c
     cube.h
     db.c
     db.h
     item.c
     item.h
     main.c
     map.c
     map.h
     matrix.c
     matrix.h
     ring.c
     ring.h
     sign.c
     sign.h
     util.c
     util.h
     world.c
     world.h
     builder.py
     server.py
     world.py
    +
    +
    + + + + diff --git a/documentation/html/folderclosed.png b/documentation/html/folderclosed.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8ab35edce8e97554e360005ee9fc5bffb36e66 GIT binary patch literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA literal 0 HcmV?d00001 diff --git a/documentation/html/functions.html b/documentation/html/functions.html new file mode 100644 index 000000000..0214b7345 --- /dev/null +++ b/documentation/html/functions.html @@ -0,0 +1,667 @@ + + + + + + + +Craft: Class Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all class members with links to the classes they belong to:
    + +

    - _ -

    + + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - i -

    + + +

    - k -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - q -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    + + +

    - x -

    + + +

    - y -

    + + +

    - z -

    +
    + + + + diff --git a/documentation/html/functions_func.html b/documentation/html/functions_func.html new file mode 100644 index 000000000..1da1bb337 --- /dev/null +++ b/documentation/html/functions_func.html @@ -0,0 +1,272 @@ + + + + + + + +Craft: Class Members - Functions + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - _ -

    + + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - h -

    + + +

    - n -

    + + +

    - o -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    +
    + + + + diff --git a/documentation/html/functions_vars.html b/documentation/html/functions_vars.html new file mode 100644 index 000000000..faf5c11e1 --- /dev/null +++ b/documentation/html/functions_vars.html @@ -0,0 +1,515 @@ + + + + + + + +Craft: Class Members - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - h -

    + + +

    - i -

    + + +

    - k -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - q -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    + + +

    - x -

    + + +

    - y -

    + + +

    - z -

    +
    + + + + diff --git a/documentation/html/globals.html b/documentation/html/globals.html new file mode 100644 index 000000000..34e695113 --- /dev/null +++ b/documentation/html/globals.html @@ -0,0 +1,101 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - _ -

      +
    • _db_commit() +: db.c +
    • +
    • _db_insert_block() +: db.c +
    • +
    • _db_set_key() +: db.c +
    • +
    • _gen_sign_buffer() +: main.c +
    • +
    • _hit_test() +: main.c +
    • +
    • _make_sphere() +: cube.c +
    • +
    • _set_block() +: main.c +
    • +
    • _set_sign() +: main.c +
    • +
    • _sign_list_add() +: sign.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_a.html b/documentation/html/globals_a.html new file mode 100644 index 000000000..0df94396a --- /dev/null +++ b/documentation/html/globals_a.html @@ -0,0 +1,89 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - a -

    +
    + + + + diff --git a/documentation/html/globals_b.html b/documentation/html/globals_b.html new file mode 100644 index 000000000..8af4c1cb1 --- /dev/null +++ b/documentation/html/globals_b.html @@ -0,0 +1,96 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - b -

    +
    + + + + diff --git a/documentation/html/globals_c.html b/documentation/html/globals_c.html new file mode 100644 index 000000000..f9d43b2f2 --- /dev/null +++ b/documentation/html/globals_c.html @@ -0,0 +1,342 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - c -

    +
    + + + + diff --git a/documentation/html/globals_d.html b/documentation/html/globals_d.html new file mode 100644 index 000000000..73ecf9dfc --- /dev/null +++ b/documentation/html/globals_d.html @@ -0,0 +1,261 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - d -

    +
    + + + + diff --git a/documentation/html/globals_defs.html b/documentation/html/globals_defs.html new file mode 100644 index 000000000..b6a998bf8 --- /dev/null +++ b/documentation/html/globals_defs.html @@ -0,0 +1,539 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - f -

    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

    + + +

    - m -

    + + +

    - p -

    + + +

    - q -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - u -

    + + +

    - v -

    + + +

    - w -

    + + +

    - y -

    +
    + + + + diff --git a/documentation/html/globals_e.html b/documentation/html/globals_e.html new file mode 100644 index 000000000..7cf7a0a36 --- /dev/null +++ b/documentation/html/globals_e.html @@ -0,0 +1,89 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - e -

    +
    + + + + diff --git a/documentation/html/globals_enum.html b/documentation/html/globals_enum.html new file mode 100644 index 000000000..e57745fe4 --- /dev/null +++ b/documentation/html/globals_enum.html @@ -0,0 +1,75 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/documentation/html/globals_eval.html b/documentation/html/globals_eval.html new file mode 100644 index 000000000..82044dc84 --- /dev/null +++ b/documentation/html/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/documentation/html/globals_f.html b/documentation/html/globals_f.html new file mode 100644 index 000000000..4717a5fb5 --- /dev/null +++ b/documentation/html/globals_f.html @@ -0,0 +1,93 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - f -

    +
    + + + + diff --git a/documentation/html/globals_func.html b/documentation/html/globals_func.html new file mode 100644 index 000000000..6dd81ba26 --- /dev/null +++ b/documentation/html/globals_func.html @@ -0,0 +1,101 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - _ -

      +
    • _db_commit() +: db.c +
    • +
    • _db_insert_block() +: db.c +
    • +
    • _db_set_key() +: db.c +
    • +
    • _gen_sign_buffer() +: main.c +
    • +
    • _hit_test() +: main.c +
    • +
    • _make_sphere() +: cube.c +
    • +
    • _set_block() +: main.c +
    • +
    • _set_sign() +: main.c +
    • +
    • _sign_list_add() +: sign.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_func_a.html b/documentation/html/globals_func_a.html new file mode 100644 index 000000000..592b9a53e --- /dev/null +++ b/documentation/html/globals_func_a.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    +
    + + + + diff --git a/documentation/html/globals_func_b.html b/documentation/html/globals_func_b.html new file mode 100644 index 000000000..b8f6a81b7 --- /dev/null +++ b/documentation/html/globals_func_b.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - b -

      +
    • builder_block() +: main.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_func_c.html b/documentation/html/globals_func_c.html new file mode 100644 index 000000000..c2f3db76d --- /dev/null +++ b/documentation/html/globals_func_c.html @@ -0,0 +1,168 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - c -

    +
    + + + + diff --git a/documentation/html/globals_func_d.html b/documentation/html/globals_func_d.html new file mode 100644 index 000000000..83fb57d8d --- /dev/null +++ b/documentation/html/globals_func_d.html @@ -0,0 +1,225 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - d -

    +
    + + + + diff --git a/documentation/html/globals_func_e.html b/documentation/html/globals_func_e.html new file mode 100644 index 000000000..ab20f8966 --- /dev/null +++ b/documentation/html/globals_func_e.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - e -

      +
    • ensure_chunks() +: main.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_func_f.html b/documentation/html/globals_func_f.html new file mode 100644 index 000000000..f98b100cc --- /dev/null +++ b/documentation/html/globals_func_f.html @@ -0,0 +1,90 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - f -

    +
    + + + + diff --git a/documentation/html/globals_func_g.html b/documentation/html/globals_func_g.html new file mode 100644 index 000000000..4d5eb500d --- /dev/null +++ b/documentation/html/globals_func_g.html @@ -0,0 +1,136 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - g -

    +
    + + + + diff --git a/documentation/html/globals_func_h.html b/documentation/html/globals_func_h.html new file mode 100644 index 000000000..e6ea66a70 --- /dev/null +++ b/documentation/html/globals_func_h.html @@ -0,0 +1,110 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - h -

      +
    • handle_fall_damage() +: main.c +
    • +
    • handle_lava_damage() +: main.c +
    • +
    • handle_mouse_input() +: main.c +
    • +
    • handle_movement() +: main.c +
    • +
    • handle_player_health() +: main.c +
    • +
    • handle_player_speed() +: main.c +
    • +
    • hash() +: map.c +
    • +
    • hash_int() +: map.c +
    • +
    • heal_damage() +: main.c +
    • +
    • highest_block() +: main.c +
    • +
    • hit_test() +: main.c +
    • +
    • hit_test_face() +: main.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_func_i.html b/documentation/html/globals_func_i.html new file mode 100644 index 000000000..23107a530 --- /dev/null +++ b/documentation/html/globals_func_i.html @@ -0,0 +1,107 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - i -

    +
    + + + + diff --git a/documentation/html/globals_func_l.html b/documentation/html/globals_func_l.html new file mode 100644 index 000000000..1332429f2 --- /dev/null +++ b/documentation/html/globals_func_l.html @@ -0,0 +1,92 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - l -

    +
    + + + + diff --git a/documentation/html/globals_func_m.html b/documentation/html/globals_func_m.html new file mode 100644 index 000000000..3b46210e1 --- /dev/null +++ b/documentation/html/globals_func_m.html @@ -0,0 +1,180 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - m -

    +
    + + + + diff --git a/documentation/html/globals_func_n.html b/documentation/html/globals_func_n.html new file mode 100644 index 000000000..d667d4c31 --- /dev/null +++ b/documentation/html/globals_func_n.html @@ -0,0 +1,78 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - n -

    +
    + + + + diff --git a/documentation/html/globals_func_o.html b/documentation/html/globals_func_o.html new file mode 100644 index 000000000..a47b5aa58 --- /dev/null +++ b/documentation/html/globals_func_o.html @@ -0,0 +1,98 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - o -

    +
    + + + + diff --git a/documentation/html/globals_func_p.html b/documentation/html/globals_func_p.html new file mode 100644 index 000000000..eae2e50f5 --- /dev/null +++ b/documentation/html/globals_func_p.html @@ -0,0 +1,95 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - p -

      +
    • parse_buffer() +: main.c +
    • +
    • parse_command() +: main.c +
    • +
    • paste() +: main.c +
    • +
    • player_crosshair() +: main.c +
    • +
    • player_crosshair_distance() +: main.c +
    • +
    • player_intersects_block() +: main.c +
    • +
    • player_player_distance() +: main.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_func_r.html b/documentation/html/globals_func_r.html new file mode 100644 index 000000000..7540a7ab5 --- /dev/null +++ b/documentation/html/globals_func_r.html @@ -0,0 +1,166 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - r -

    +
    + + + + diff --git a/documentation/html/globals_func_s.html b/documentation/html/globals_func_s.html new file mode 100644 index 000000000..03866d410 --- /dev/null +++ b/documentation/html/globals_func_s.html @@ -0,0 +1,123 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - s -

    +
    + + + + diff --git a/documentation/html/globals_func_t.html b/documentation/html/globals_func_t.html new file mode 100644 index 000000000..d74b00ef0 --- /dev/null +++ b/documentation/html/globals_func_t.html @@ -0,0 +1,84 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - t -

    +
    + + + + diff --git a/documentation/html/globals_func_u.html b/documentation/html/globals_func_u.html new file mode 100644 index 000000000..6010afd6b --- /dev/null +++ b/documentation/html/globals_func_u.html @@ -0,0 +1,87 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - u -

    +
    + + + + diff --git a/documentation/html/globals_func_w.html b/documentation/html/globals_func_w.html new file mode 100644 index 000000000..e3f670ad1 --- /dev/null +++ b/documentation/html/globals_func_w.html @@ -0,0 +1,81 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - w -

    +
    + + + + diff --git a/documentation/html/globals_g.html b/documentation/html/globals_g.html new file mode 100644 index 000000000..b35b299c9 --- /dev/null +++ b/documentation/html/globals_g.html @@ -0,0 +1,148 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - g -

    +
    + + + + diff --git a/documentation/html/globals_h.html b/documentation/html/globals_h.html new file mode 100644 index 000000000..ac820f6b2 --- /dev/null +++ b/documentation/html/globals_h.html @@ -0,0 +1,110 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - h -

      +
    • handle_fall_damage() +: main.c +
    • +
    • handle_lava_damage() +: main.c +
    • +
    • handle_mouse_input() +: main.c +
    • +
    • handle_movement() +: main.c +
    • +
    • handle_player_health() +: main.c +
    • +
    • handle_player_speed() +: main.c +
    • +
    • hash() +: map.c +
    • +
    • hash_int() +: map.c +
    • +
    • heal_damage() +: main.c +
    • +
    • highest_block() +: main.c +
    • +
    • hit_test() +: main.c +
    • +
    • hit_test_face() +: main.c +
    • +
    +
    + + + + diff --git a/documentation/html/globals_i.html b/documentation/html/globals_i.html new file mode 100644 index 000000000..f013e4db0 --- /dev/null +++ b/documentation/html/globals_i.html @@ -0,0 +1,124 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - i -

    +
    + + + + diff --git a/documentation/html/globals_k.html b/documentation/html/globals_k.html new file mode 100644 index 000000000..8aa002c91 --- /dev/null +++ b/documentation/html/globals_k.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - k -

    +
    + + + + diff --git a/documentation/html/globals_l.html b/documentation/html/globals_l.html new file mode 100644 index 000000000..4148fe2d2 --- /dev/null +++ b/documentation/html/globals_l.html @@ -0,0 +1,110 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - l -

    +
    + + + + diff --git a/documentation/html/globals_m.html b/documentation/html/globals_m.html new file mode 100644 index 000000000..efe1f66ef --- /dev/null +++ b/documentation/html/globals_m.html @@ -0,0 +1,240 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - m -

    +
    + + + + diff --git a/documentation/html/globals_n.html b/documentation/html/globals_n.html new file mode 100644 index 000000000..c4ba59923 --- /dev/null +++ b/documentation/html/globals_n.html @@ -0,0 +1,78 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - n -

    +
    + + + + diff --git a/documentation/html/globals_o.html b/documentation/html/globals_o.html new file mode 100644 index 000000000..695366eba --- /dev/null +++ b/documentation/html/globals_o.html @@ -0,0 +1,98 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - o -

    +
    + + + + diff --git a/documentation/html/globals_p.html b/documentation/html/globals_p.html new file mode 100644 index 000000000..5fa7baf2a --- /dev/null +++ b/documentation/html/globals_p.html @@ -0,0 +1,108 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - p -

    +
    + + + + diff --git a/documentation/html/globals_q.html b/documentation/html/globals_q.html new file mode 100644 index 000000000..59e7b7211 --- /dev/null +++ b/documentation/html/globals_q.html @@ -0,0 +1,83 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - q -

    +
    + + + + diff --git a/documentation/html/globals_r.html b/documentation/html/globals_r.html new file mode 100644 index 000000000..388fc3920 --- /dev/null +++ b/documentation/html/globals_r.html @@ -0,0 +1,196 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - r -

    +
    + + + + diff --git a/documentation/html/globals_s.html b/documentation/html/globals_s.html new file mode 100644 index 000000000..16f873aae --- /dev/null +++ b/documentation/html/globals_s.html @@ -0,0 +1,174 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - s -

    +
    + + + + diff --git a/documentation/html/globals_t.html b/documentation/html/globals_t.html new file mode 100644 index 000000000..071ded18d --- /dev/null +++ b/documentation/html/globals_t.html @@ -0,0 +1,90 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - t -

    +
    + + + + diff --git a/documentation/html/globals_type.html b/documentation/html/globals_type.html new file mode 100644 index 000000000..7c7c00040 --- /dev/null +++ b/documentation/html/globals_type.html @@ -0,0 +1,75 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/documentation/html/globals_u.html b/documentation/html/globals_u.html new file mode 100644 index 000000000..f7e5a849c --- /dev/null +++ b/documentation/html/globals_u.html @@ -0,0 +1,90 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - u -

    +
    + + + + diff --git a/documentation/html/globals_v.html b/documentation/html/globals_v.html new file mode 100644 index 000000000..0fe7a6ecc --- /dev/null +++ b/documentation/html/globals_v.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - v -

    +
    + + + + diff --git a/documentation/html/globals_vars.html b/documentation/html/globals_vars.html new file mode 100644 index 000000000..34bf99338 --- /dev/null +++ b/documentation/html/globals_vars.html @@ -0,0 +1,209 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - b -

    + + +

    - c -

    + + +

    - d -

      +
    • db +: db.c +
    • +
    • db_enabled +: db.c +
    • +
    • delete_sign_stmt +: db.c +
    • +
    • delete_signs_stmt +: db.c +
    • +
    + + +

    - g -

    + + +

    - i -

    + + +

    - l -

      +
    • load_map_stmt +: db.c +
    • +
    • load_signs_stmt +: db.c +
    • +
    + + +

    - m -

    + + +

    - p -

    + + +

    - q -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    +
    + + + + diff --git a/documentation/html/globals_w.html b/documentation/html/globals_w.html new file mode 100644 index 000000000..44159a9bd --- /dev/null +++ b/documentation/html/globals_w.html @@ -0,0 +1,99 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - w -

    +
    + + + + diff --git a/documentation/html/globals_y.html b/documentation/html/globals_y.html new file mode 100644 index 000000000..2456d3c48 --- /dev/null +++ b/documentation/html/globals_y.html @@ -0,0 +1,77 @@ + + + + + + + +Craft: File Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all file members with links to the files they belong to:
    + +

    - y -

    +
    + + + + diff --git a/documentation/html/hierarchy.html b/documentation/html/hierarchy.html new file mode 100644 index 000000000..b950ff960 --- /dev/null +++ b/documentation/html/hierarchy.html @@ -0,0 +1,102 @@ + + + + + + + +Craft: Class Hierarchy + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Class Hierarchy
    +
    +
    +
    This inheritance list is sorted roughly, but not completely, alphabetically:
    +
    [detail level 12]
    + + + + + + + + + + + + + + + + + + + + + + + + +
     CAttrib
     CSocketServer.BaseRequestHandler
     Cserver.Handler
     CBlock
     CChunk
     CFPS
     CMap
     CMapEntry
     CModel
     Cobject
     Cbuilder.Client
     Cserver.Model
     Cserver.RateLimiter
     Cworld.World
     CPlayer
     CRing
     CRingEntry
     CSign
     CSignList
     CState
     CSocketServer.TCPServer
     Cserver.Server
     CSocketServer.ThreadingMixIn
     Cserver.Server
    +
    +
    + + + + diff --git a/documentation/html/index.html b/documentation/html/index.html new file mode 100644 index 000000000..ff9a34f51 --- /dev/null +++ b/documentation/html/index.html @@ -0,0 +1,74 @@ + + + + + + + +Craft: Main Page + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Craft Documentation
    +
    +
    +
    + + + + diff --git a/documentation/html/item_8c.html b/documentation/html/item_8c.html new file mode 100644 index 000000000..e86723b7e --- /dev/null +++ b/documentation/html/item_8c.html @@ -0,0 +1,399 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/item.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    item.c File Reference
    +
    +
    +
    #include "item.h"
    +#include "util.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + +

    +Functions

    int is_plant (int w)
     
    int is_obstacle (int w)
     
    int is_transparent (int w)
     
    int is_alpha (int w)
     
    int is_destructable (int w)
     
    int is_slowing (int w)
     
    + + + + + + + + + +

    +Variables

    const int items []
     
    const int item_count = sizeof(items) / sizeof(int)
     
    const int blocks [256][6]
     
    const int plants [256]
     
    +

    Function Documentation

    + +

    ◆ is_alpha()

    + +
    +
    + + + + + + + + +
    int is_alpha (int w)
    +
    + +

    Definition at line 200 of file item.c.

    +
    200  {
    +
    201  return 0;
    +
    202 }
    +
    +
    +
    + +

    ◆ is_destructable()

    + +
    +
    + + + + + + + + +
    int is_destructable (int w)
    +
    + +

    Definition at line 204 of file item.c.

    +
    204  {
    +
    205  switch (w) {
    +
    206  case EMPTY:
    +
    207  case CLOUD:
    +
    208  return 0;
    +
    209  default:
    +
    210  return 1;
    +
    211  }
    +
    212 }
    +
    #define EMPTY
    Definition: item.h:4
    +
    #define CLOUD
    Definition: item.h:20
    +
    +
    +
    + +

    ◆ is_obstacle()

    + +
    +
    + + + + + + + + +
    int is_obstacle (int w)
    +
    + +

    Definition at line 163 of file item.c.

    +
    163  {
    +
    164  w = ABS(w);
    +
    165  if (is_plant(w)) {
    +
    166  return 0;
    +
    167  }
    +
    168  switch (w) {
    +
    169  case EMPTY:
    +
    170  case CLOUD:
    +
    171  case LAVA:
    +
    172  case RAIN:
    +
    173  case WATER:
    +
    174  return 0;
    +
    175  default:
    +
    176  return 1;
    +
    177  }
    +
    178 }
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    #define LAVA
    Definition: item.h:28
    +
    #define WATER
    Definition: item.h:62
    +
    #define RAIN
    Definition: item.h:29
    +
    #define ABS(x)
    Definition: util.h:11
    +
    +
    +
    + +

    ◆ is_plant()

    + +
    +
    + + + + + + + + +
    int is_plant (int w)
    +
    + +

    Definition at line 148 of file item.c.

    +
    148  {
    +
    149  switch (w) {
    +
    150  case TALL_GRASS:
    +
    151  case YELLOW_FLOWER:
    +
    152  case RED_FLOWER:
    +
    153  case PURPLE_FLOWER:
    +
    154  case SUN_FLOWER:
    +
    155  case WHITE_FLOWER:
    +
    156  case BLUE_FLOWER:
    +
    157  return 1;
    +
    158  default:
    +
    159  return 0;
    +
    160  }
    +
    161 }
    +
    #define YELLOW_FLOWER
    Definition: item.h:22
    +
    #define RED_FLOWER
    Definition: item.h:23
    +
    #define SUN_FLOWER
    Definition: item.h:25
    +
    #define WHITE_FLOWER
    Definition: item.h:26
    +
    #define TALL_GRASS
    Definition: item.h:21
    +
    #define BLUE_FLOWER
    Definition: item.h:27
    +
    #define PURPLE_FLOWER
    Definition: item.h:24
    +
    +
    +
    + +

    ◆ is_slowing()

    + +
    +
    + + + + + + + + +
    int is_slowing (int w)
    +
    + +

    Definition at line 214 of file item.c.

    +
    214  {
    +
    215  // The player must be able to pass through the item for it to slow them.
    +
    216  if (is_obstacle(w)) return 0;
    +
    217 
    +
    218  switch (w) {
    +
    219  case WATER:
    +
    220  case LAVA:
    +
    221  return 1;
    +
    222  default:
    +
    223  return 0;
    +
    224  }
    +
    225 }
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    +
    +
    + +

    ◆ is_transparent()

    + +
    +
    + + + + + + + + +
    int is_transparent (int w)
    +
    + +

    Definition at line 180 of file item.c.

    +
    180  {
    +
    181  if (w == EMPTY) {
    +
    182  return 1;
    +
    183  }
    +
    184  w = ABS(w);
    +
    185  if (is_plant(w)) {
    +
    186  return 1;
    +
    187  }
    +
    188  switch (w) {
    +
    189  case EMPTY:
    +
    190  case GLASS:
    +
    191  case LEAVES:
    +
    192  case WATER:
    +
    193  case RAIN:
    +
    194  return 1;
    +
    195  default:
    +
    196  return 0;
    +
    197  }
    +
    198 }
    +
    #define LEAVES
    Definition: item.h:19
    +
    #define GLASS
    Definition: item.h:14
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ blocks

    + +
    +
    + + + + +
    const int blocks[256][6]
    +
    + +

    Definition at line 67 of file item.c.

    + +
    +
    + +

    ◆ item_count

    + +
    +
    + + + + +
    const int item_count = sizeof(items) / sizeof(int)
    +
    + +

    Definition at line 65 of file item.c.

    + +
    +
    + +

    ◆ items

    + +
    +
    + + + + +
    const int items[]
    +
    + +

    Definition at line 4 of file item.c.

    + +
    +
    + +

    ◆ plants

    + +
    +
    + + + + +
    const int plants[256]
    +
    +Initial value:
    = {
    +
    +
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    48,
    +
    49,
    +
    50,
    +
    51,
    +
    52,
    +
    53,
    +
    54,
    +
    }
    +
    +

    Definition at line 136 of file item.c.

    + +
    +
    +
    + + + + diff --git a/documentation/html/item_8c_source.html b/documentation/html/item_8c_source.html new file mode 100644 index 000000000..ac3e07a92 --- /dev/null +++ b/documentation/html/item_8c_source.html @@ -0,0 +1,375 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/item.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    item.c
    +
    +
    +Go to the documentation of this file.
    1 #include "item.h"
    +
    2 #include "util.h"
    +
    3 
    +
    4 const int items[] = {
    +
    5  // items the user can build
    +
    6  GRASS,
    +
    7  SAND,
    +
    8  STONE,
    +
    9  BRICK,
    +
    10  WOOD,
    +
    11  CEMENT,
    +
    12  DIRT,
    +
    13  PLANK,
    +
    14  SNOW,
    +
    15  GLASS,
    +
    16  COBBLE,
    + +
    18  DARK_STONE,
    +
    19  CHEST,
    +
    20  LEAVES,
    +
    21  TALL_GRASS,
    + +
    23  RED_FLOWER,
    + +
    25  SUN_FLOWER,
    + + +
    28  LAVA,
    +
    29  RAIN,
    +
    30  COLOR_00,
    +
    31  COLOR_01,
    +
    32  COLOR_02,
    +
    33  COLOR_03,
    +
    34  COLOR_04,
    +
    35  COLOR_05,
    +
    36  COLOR_06,
    +
    37  COLOR_07,
    +
    38  COLOR_08,
    +
    39  COLOR_09,
    +
    40  COLOR_10,
    +
    41  COLOR_11,
    +
    42  COLOR_12,
    +
    43  COLOR_13,
    +
    44  COLOR_14,
    +
    45  COLOR_15,
    +
    46  COLOR_16,
    +
    47  COLOR_17,
    +
    48  COLOR_18,
    +
    49  COLOR_19,
    +
    50  COLOR_20,
    +
    51  COLOR_21,
    +
    52  COLOR_22,
    +
    53  COLOR_23,
    +
    54  COLOR_24,
    +
    55  COLOR_25,
    +
    56  COLOR_26,
    +
    57  COLOR_27,
    +
    58  COLOR_28,
    +
    59  COLOR_29,
    +
    60  COLOR_30,
    +
    61  COLOR_31,
    +
    62  WATER
    +
    63 };
    +
    64 
    +
    65 const int item_count = sizeof(items) / sizeof(int);
    +
    66 
    +
    67 const int blocks[256][6] = {
    +
    68  // w => (left, right, top, bottom, front, back) tiles
    +
    69  {0, 0, 0, 0, 0, 0}, // 0 - empty
    +
    70  {16, 16, 32, 0, 16, 16}, // 1 - grass
    +
    71  {1, 1, 1, 1, 1, 1}, // 2 - sand
    +
    72  {2, 2, 2, 2, 2, 2}, // 3 - stone
    +
    73  {3, 3, 3, 3, 3, 3}, // 4 - brick
    +
    74  {20, 20, 36, 4, 20, 20}, // 5 - wood
    +
    75  {5, 5, 5, 5, 5, 5}, // 6 - cement
    +
    76  {6, 6, 6, 6, 6, 6}, // 7 - dirt
    +
    77  {7, 7, 7, 7, 7, 7}, // 8 - plank
    +
    78  {24, 24, 40, 8, 24, 24}, // 9 - snow
    +
    79  {9, 9, 9, 9, 9, 9}, // 10 - glass
    +
    80  {10, 10, 10, 10, 10, 10}, // 11 - cobble
    +
    81  {11, 11, 11, 11, 11, 11}, // 12 - light stone
    +
    82  {12, 12, 12, 12, 12, 12}, // 13 - dark stone
    +
    83  {13, 13, 13, 13, 13, 13}, // 14 - chest
    +
    84  {14, 14, 14, 14, 14, 14}, // 15 - leaves
    +
    85  {15, 15, 15, 15, 15, 15}, // 16 - cloud
    +
    86  {0, 0, 0, 0, 0, 0}, // 17
    +
    87  {0, 0, 0, 0, 0, 0}, // 18
    +
    88  {0, 0, 0, 0, 0, 0}, // 19
    +
    89  {0, 0, 0, 0, 0, 0}, // 20
    +
    90  {0, 0, 0, 0, 0, 0}, // 21
    +
    91  {0, 0, 0, 0, 0, 0}, // 22
    +
    92  {0, 0, 0, 0, 0, 0}, // 23
    +
    93  {240, 240, 240, 240, 240, 240}, // 24 lava
    +
    94  {17, 17, 18, 19, 17, 17}, // 25 rain
    +
    95  {0, 0, 0, 0, 0, 0}, // 26
    +
    96  {0, 0, 0, 0, 0, 0}, // 27
    +
    97  {0, 0, 0, 0, 0, 0}, // 28
    +
    98  {0, 0, 0, 0, 0, 0}, // 29
    +
    99  {0, 0, 0, 0, 0, 0}, // 30
    +
    100  {0, 0, 0, 0, 0, 0}, // 31
    +
    101  {176, 176, 176, 176, 176, 176}, // 32
    +
    102  {177, 177, 177, 177, 177, 177}, // 33
    +
    103  {178, 178, 178, 178, 178, 178}, // 34
    +
    104  {179, 179, 179, 179, 179, 179}, // 35
    +
    105  {180, 180, 180, 180, 180, 180}, // 36
    +
    106  {181, 181, 181, 181, 181, 181}, // 37
    +
    107  {182, 182, 182, 182, 182, 182}, // 38
    +
    108  {183, 183, 183, 183, 183, 183}, // 39
    +
    109  {184, 184, 184, 184, 184, 184}, // 40
    +
    110  {185, 185, 185, 185, 185, 185}, // 41
    +
    111  {186, 186, 186, 186, 186, 186}, // 42
    +
    112  {187, 187, 187, 187, 187, 187}, // 43
    +
    113  {188, 188, 188, 188, 188, 188}, // 44
    +
    114  {189, 189, 189, 189, 189, 189}, // 45
    +
    115  {190, 190, 190, 190, 190, 190}, // 46
    +
    116  {191, 191, 191, 191, 191, 191}, // 47
    +
    117  {192, 192, 192, 192, 192, 192}, // 48
    +
    118  {193, 193, 193, 193, 193, 193}, // 49
    +
    119  {194, 194, 194, 194, 194, 194}, // 50
    +
    120  {195, 195, 195, 195, 195, 195}, // 51
    +
    121  {196, 196, 196, 196, 196, 196}, // 52
    +
    122  {197, 197, 197, 197, 197, 197}, // 53
    +
    123  {198, 198, 198, 198, 198, 198}, // 54
    +
    124  {199, 199, 199, 199, 199, 199}, // 55
    +
    125  {200, 200, 200, 200, 200, 200}, // 56
    +
    126  {201, 201, 201, 201, 201, 201}, // 57
    +
    127  {202, 202, 202, 202, 202, 202}, // 58
    +
    128  {203, 203, 203, 203, 203, 203}, // 59
    +
    129  {204, 204, 204, 204, 204, 204}, // 60
    +
    130  {205, 205, 205, 205, 205, 205}, // 61
    +
    131  {206, 206, 206, 206, 206, 206}, // 62
    +
    132  {207, 207, 207, 207, 207, 207}, // 63
    +
    133  {255, 255, 255, 255, 255, 255}, // 64
    +
    134 };
    +
    135 
    +
    136 const int plants[256] = {
    +
    137  // w => tile
    +
    138  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 16
    +
    139  48, // 17 - tall grass
    +
    140  49, // 18 - yellow flower
    +
    141  50, // 19 - red flower
    +
    142  51, // 20 - purple flower
    +
    143  52, // 21 - sun flower
    +
    144  53, // 22 - white flower
    +
    145  54, // 23 - blue flower
    +
    146 };
    +
    147 
    +
    148 int is_plant(int w) {
    +
    149  switch (w) {
    +
    150  case TALL_GRASS:
    +
    151  case YELLOW_FLOWER:
    +
    152  case RED_FLOWER:
    +
    153  case PURPLE_FLOWER:
    +
    154  case SUN_FLOWER:
    +
    155  case WHITE_FLOWER:
    +
    156  case BLUE_FLOWER:
    +
    157  return 1;
    +
    158  default:
    +
    159  return 0;
    +
    160  }
    +
    161 }
    +
    162 
    +
    163 int is_obstacle(int w) {
    +
    164  w = ABS(w);
    +
    165  if (is_plant(w)) {
    +
    166  return 0;
    +
    167  }
    +
    168  switch (w) {
    +
    169  case EMPTY:
    +
    170  case CLOUD:
    +
    171  case LAVA:
    +
    172  case RAIN:
    +
    173  case WATER:
    +
    174  return 0;
    +
    175  default:
    +
    176  return 1;
    +
    177  }
    +
    178 }
    +
    179 
    +
    180 int is_transparent(int w) {
    +
    181  if (w == EMPTY) {
    +
    182  return 1;
    +
    183  }
    +
    184  w = ABS(w);
    +
    185  if (is_plant(w)) {
    +
    186  return 1;
    +
    187  }
    +
    188  switch (w) {
    +
    189  case EMPTY:
    +
    190  case GLASS:
    +
    191  case LEAVES:
    +
    192  case WATER:
    +
    193  case RAIN:
    +
    194  return 1;
    +
    195  default:
    +
    196  return 0;
    +
    197  }
    +
    198 }
    +
    199 
    +
    200 int is_alpha(int w) {
    +
    201  return 0;
    +
    202 }
    +
    203 
    +
    204 int is_destructable(int w) {
    +
    205  switch (w) {
    +
    206  case EMPTY:
    +
    207  case CLOUD:
    +
    208  return 0;
    +
    209  default:
    +
    210  return 1;
    +
    211  }
    +
    212 }
    +
    213 
    +
    214 int is_slowing(int w) {
    +
    215  // The player must be able to pass through the item for it to slow them.
    +
    216  if (is_obstacle(w)) return 0;
    +
    217 
    +
    218  switch (w) {
    +
    219  case WATER:
    +
    220  case LAVA:
    +
    221  return 1;
    +
    222  default:
    +
    223  return 0;
    +
    224  }
    +
    225 }
    +
    const int items[]
    Definition: item.c:4
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    const int plants[256]
    Definition: item.c:136
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    int is_transparent(int w)
    Definition: item.c:180
    +
    int is_destructable(int w)
    Definition: item.c:204
    +
    int is_slowing(int w)
    Definition: item.c:214
    +
    int is_alpha(int w)
    Definition: item.c:200
    +
    const int item_count
    Definition: item.c:65
    + +
    #define YELLOW_FLOWER
    Definition: item.h:22
    +
    #define GRASS
    Definition: item.h:5
    +
    #define COLOR_28
    Definition: item.h:58
    +
    #define COLOR_31
    Definition: item.h:61
    +
    #define LAVA
    Definition: item.h:28
    +
    #define COLOR_20
    Definition: item.h:50
    +
    #define EMPTY
    Definition: item.h:4
    +
    #define COLOR_26
    Definition: item.h:56
    +
    #define COLOR_04
    Definition: item.h:34
    +
    #define COLOR_22
    Definition: item.h:52
    +
    #define COLOR_29
    Definition: item.h:59
    +
    #define COLOR_23
    Definition: item.h:53
    +
    #define STONE
    Definition: item.h:7
    +
    #define CLOUD
    Definition: item.h:20
    +
    #define COLOR_13
    Definition: item.h:43
    +
    #define COLOR_12
    Definition: item.h:42
    +
    #define COLOR_30
    Definition: item.h:60
    +
    #define RED_FLOWER
    Definition: item.h:23
    +
    #define COLOR_06
    Definition: item.h:36
    +
    #define COLOR_05
    Definition: item.h:35
    +
    #define WATER
    Definition: item.h:62
    +
    #define SUN_FLOWER
    Definition: item.h:25
    +
    #define RAIN
    Definition: item.h:29
    +
    #define COLOR_09
    Definition: item.h:39
    +
    #define CHEST
    Definition: item.h:18
    +
    #define COLOR_10
    Definition: item.h:40
    +
    #define COLOR_25
    Definition: item.h:55
    +
    #define WOOD
    Definition: item.h:9
    +
    #define WHITE_FLOWER
    Definition: item.h:26
    +
    #define DIRT
    Definition: item.h:11
    +
    #define COLOR_11
    Definition: item.h:41
    +
    #define COLOR_15
    Definition: item.h:45
    +
    #define COBBLE
    Definition: item.h:15
    +
    #define SNOW
    Definition: item.h:13
    +
    #define TALL_GRASS
    Definition: item.h:21
    +
    #define COLOR_07
    Definition: item.h:37
    +
    #define LEAVES
    Definition: item.h:19
    +
    #define PLANK
    Definition: item.h:12
    +
    #define COLOR_19
    Definition: item.h:49
    +
    #define SAND
    Definition: item.h:6
    +
    #define BLUE_FLOWER
    Definition: item.h:27
    +
    #define LIGHT_STONE
    Definition: item.h:16
    +
    #define GLASS
    Definition: item.h:14
    +
    #define BRICK
    Definition: item.h:8
    +
    #define COLOR_18
    Definition: item.h:48
    +
    #define COLOR_08
    Definition: item.h:38
    +
    #define PURPLE_FLOWER
    Definition: item.h:24
    +
    #define COLOR_00
    Definition: item.h:30
    +
    #define CEMENT
    Definition: item.h:10
    +
    #define COLOR_21
    Definition: item.h:51
    +
    #define COLOR_27
    Definition: item.h:57
    +
    #define COLOR_16
    Definition: item.h:46
    +
    #define COLOR_24
    Definition: item.h:54
    +
    #define COLOR_03
    Definition: item.h:33
    +
    #define COLOR_01
    Definition: item.h:31
    +
    #define COLOR_02
    Definition: item.h:32
    +
    #define DARK_STONE
    Definition: item.h:17
    +
    #define COLOR_17
    Definition: item.h:47
    +
    #define COLOR_14
    Definition: item.h:44
    + +
    #define ABS(x)
    Definition: util.h:11
    +
    + + + + diff --git a/documentation/html/item_8h.html b/documentation/html/item_8h.html new file mode 100644 index 000000000..a3fb4bb58 --- /dev/null +++ b/documentation/html/item_8h.html @@ -0,0 +1,1485 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/item.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    item.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define EMPTY   0
     
    #define GRASS   1
     
    #define SAND   2
     
    #define STONE   3
     
    #define BRICK   4
     
    #define WOOD   5
     
    #define CEMENT   6
     
    #define DIRT   7
     
    #define PLANK   8
     
    #define SNOW   9
     
    #define GLASS   10
     
    #define COBBLE   11
     
    #define LIGHT_STONE   12
     
    #define DARK_STONE   13
     
    #define CHEST   14
     
    #define LEAVES   15
     
    #define CLOUD   16
     
    #define TALL_GRASS   17
     
    #define YELLOW_FLOWER   18
     
    #define RED_FLOWER   19
     
    #define PURPLE_FLOWER   20
     
    #define SUN_FLOWER   21
     
    #define WHITE_FLOWER   22
     
    #define BLUE_FLOWER   23
     
    #define LAVA   24
     
    #define RAIN   25
     
    #define COLOR_00   32
     
    #define COLOR_01   33
     
    #define COLOR_02   34
     
    #define COLOR_03   35
     
    #define COLOR_04   36
     
    #define COLOR_05   37
     
    #define COLOR_06   38
     
    #define COLOR_07   39
     
    #define COLOR_08   40
     
    #define COLOR_09   41
     
    #define COLOR_10   42
     
    #define COLOR_11   43
     
    #define COLOR_12   44
     
    #define COLOR_13   45
     
    #define COLOR_14   46
     
    #define COLOR_15   47
     
    #define COLOR_16   48
     
    #define COLOR_17   49
     
    #define COLOR_18   50
     
    #define COLOR_19   51
     
    #define COLOR_20   52
     
    #define COLOR_21   53
     
    #define COLOR_22   54
     
    #define COLOR_23   55
     
    #define COLOR_24   56
     
    #define COLOR_25   57
     
    #define COLOR_26   58
     
    #define COLOR_27   59
     
    #define COLOR_28   60
     
    #define COLOR_29   61
     
    #define COLOR_30   62
     
    #define COLOR_31   63
     
    #define WATER   64
     
    + + + + + + + + + + + + + +

    +Functions

    int is_plant (int w)
     
    int is_obstacle (int w)
     
    int is_transparent (int w)
     
    int is_alpha (int w)
     
    int is_destructable (int w)
     
    int is_slowing (int w)
     
    + + + + + + + + + +

    +Variables

    const int items []
     
    const int item_count
     
    const int blocks [256][6]
     
    const int plants [256]
     
    +

    Macro Definition Documentation

    + +

    ◆ BLUE_FLOWER

    + +
    +
    + + + + +
    #define BLUE_FLOWER   23
    +
    + +

    Definition at line 27 of file item.h.

    + +
    +
    + +

    ◆ BRICK

    + +
    +
    + + + + +
    #define BRICK   4
    +
    + +

    Definition at line 8 of file item.h.

    + +
    +
    + +

    ◆ CEMENT

    + +
    +
    + + + + +
    #define CEMENT   6
    +
    + +

    Definition at line 10 of file item.h.

    + +
    +
    + +

    ◆ CHEST

    + +
    +
    + + + + +
    #define CHEST   14
    +
    + +

    Definition at line 18 of file item.h.

    + +
    +
    + +

    ◆ CLOUD

    + +
    +
    + + + + +
    #define CLOUD   16
    +
    + +

    Definition at line 20 of file item.h.

    + +
    +
    + +

    ◆ COBBLE

    + +
    +
    + + + + +
    #define COBBLE   11
    +
    + +

    Definition at line 15 of file item.h.

    + +
    +
    + +

    ◆ COLOR_00

    + +
    +
    + + + + +
    #define COLOR_00   32
    +
    + +

    Definition at line 30 of file item.h.

    + +
    +
    + +

    ◆ COLOR_01

    + +
    +
    + + + + +
    #define COLOR_01   33
    +
    + +

    Definition at line 31 of file item.h.

    + +
    +
    + +

    ◆ COLOR_02

    + +
    +
    + + + + +
    #define COLOR_02   34
    +
    + +

    Definition at line 32 of file item.h.

    + +
    +
    + +

    ◆ COLOR_03

    + +
    +
    + + + + +
    #define COLOR_03   35
    +
    + +

    Definition at line 33 of file item.h.

    + +
    +
    + +

    ◆ COLOR_04

    + +
    +
    + + + + +
    #define COLOR_04   36
    +
    + +

    Definition at line 34 of file item.h.

    + +
    +
    + +

    ◆ COLOR_05

    + +
    +
    + + + + +
    #define COLOR_05   37
    +
    + +

    Definition at line 35 of file item.h.

    + +
    +
    + +

    ◆ COLOR_06

    + +
    +
    + + + + +
    #define COLOR_06   38
    +
    + +

    Definition at line 36 of file item.h.

    + +
    +
    + +

    ◆ COLOR_07

    + +
    +
    + + + + +
    #define COLOR_07   39
    +
    + +

    Definition at line 37 of file item.h.

    + +
    +
    + +

    ◆ COLOR_08

    + +
    +
    + + + + +
    #define COLOR_08   40
    +
    + +

    Definition at line 38 of file item.h.

    + +
    +
    + +

    ◆ COLOR_09

    + +
    +
    + + + + +
    #define COLOR_09   41
    +
    + +

    Definition at line 39 of file item.h.

    + +
    +
    + +

    ◆ COLOR_10

    + +
    +
    + + + + +
    #define COLOR_10   42
    +
    + +

    Definition at line 40 of file item.h.

    + +
    +
    + +

    ◆ COLOR_11

    + +
    +
    + + + + +
    #define COLOR_11   43
    +
    + +

    Definition at line 41 of file item.h.

    + +
    +
    + +

    ◆ COLOR_12

    + +
    +
    + + + + +
    #define COLOR_12   44
    +
    + +

    Definition at line 42 of file item.h.

    + +
    +
    + +

    ◆ COLOR_13

    + +
    +
    + + + + +
    #define COLOR_13   45
    +
    + +

    Definition at line 43 of file item.h.

    + +
    +
    + +

    ◆ COLOR_14

    + +
    +
    + + + + +
    #define COLOR_14   46
    +
    + +

    Definition at line 44 of file item.h.

    + +
    +
    + +

    ◆ COLOR_15

    + +
    +
    + + + + +
    #define COLOR_15   47
    +
    + +

    Definition at line 45 of file item.h.

    + +
    +
    + +

    ◆ COLOR_16

    + +
    +
    + + + + +
    #define COLOR_16   48
    +
    + +

    Definition at line 46 of file item.h.

    + +
    +
    + +

    ◆ COLOR_17

    + +
    +
    + + + + +
    #define COLOR_17   49
    +
    + +

    Definition at line 47 of file item.h.

    + +
    +
    + +

    ◆ COLOR_18

    + +
    +
    + + + + +
    #define COLOR_18   50
    +
    + +

    Definition at line 48 of file item.h.

    + +
    +
    + +

    ◆ COLOR_19

    + +
    +
    + + + + +
    #define COLOR_19   51
    +
    + +

    Definition at line 49 of file item.h.

    + +
    +
    + +

    ◆ COLOR_20

    + +
    +
    + + + + +
    #define COLOR_20   52
    +
    + +

    Definition at line 50 of file item.h.

    + +
    +
    + +

    ◆ COLOR_21

    + +
    +
    + + + + +
    #define COLOR_21   53
    +
    + +

    Definition at line 51 of file item.h.

    + +
    +
    + +

    ◆ COLOR_22

    + +
    +
    + + + + +
    #define COLOR_22   54
    +
    + +

    Definition at line 52 of file item.h.

    + +
    +
    + +

    ◆ COLOR_23

    + +
    +
    + + + + +
    #define COLOR_23   55
    +
    + +

    Definition at line 53 of file item.h.

    + +
    +
    + +

    ◆ COLOR_24

    + +
    +
    + + + + +
    #define COLOR_24   56
    +
    + +

    Definition at line 54 of file item.h.

    + +
    +
    + +

    ◆ COLOR_25

    + +
    +
    + + + + +
    #define COLOR_25   57
    +
    + +

    Definition at line 55 of file item.h.

    + +
    +
    + +

    ◆ COLOR_26

    + +
    +
    + + + + +
    #define COLOR_26   58
    +
    + +

    Definition at line 56 of file item.h.

    + +
    +
    + +

    ◆ COLOR_27

    + +
    +
    + + + + +
    #define COLOR_27   59
    +
    + +

    Definition at line 57 of file item.h.

    + +
    +
    + +

    ◆ COLOR_28

    + +
    +
    + + + + +
    #define COLOR_28   60
    +
    + +

    Definition at line 58 of file item.h.

    + +
    +
    + +

    ◆ COLOR_29

    + +
    +
    + + + + +
    #define COLOR_29   61
    +
    + +

    Definition at line 59 of file item.h.

    + +
    +
    + +

    ◆ COLOR_30

    + +
    +
    + + + + +
    #define COLOR_30   62
    +
    + +

    Definition at line 60 of file item.h.

    + +
    +
    + +

    ◆ COLOR_31

    + +
    +
    + + + + +
    #define COLOR_31   63
    +
    + +

    Definition at line 61 of file item.h.

    + +
    +
    + +

    ◆ DARK_STONE

    + +
    +
    + + + + +
    #define DARK_STONE   13
    +
    + +

    Definition at line 17 of file item.h.

    + +
    +
    + +

    ◆ DIRT

    + +
    +
    + + + + +
    #define DIRT   7
    +
    + +

    Definition at line 11 of file item.h.

    + +
    +
    + +

    ◆ EMPTY

    + +
    +
    + + + + +
    #define EMPTY   0
    +
    + +

    Definition at line 4 of file item.h.

    + +
    +
    + +

    ◆ GLASS

    + +
    +
    + + + + +
    #define GLASS   10
    +
    + +

    Definition at line 14 of file item.h.

    + +
    +
    + +

    ◆ GRASS

    + +
    +
    + + + + +
    #define GRASS   1
    +
    + +

    Definition at line 5 of file item.h.

    + +
    +
    + +

    ◆ LAVA

    + +
    +
    + + + + +
    #define LAVA   24
    +
    + +

    Definition at line 28 of file item.h.

    + +
    +
    + +

    ◆ LEAVES

    + +
    +
    + + + + +
    #define LEAVES   15
    +
    + +

    Definition at line 19 of file item.h.

    + +
    +
    + +

    ◆ LIGHT_STONE

    + +
    +
    + + + + +
    #define LIGHT_STONE   12
    +
    + +

    Definition at line 16 of file item.h.

    + +
    +
    + +

    ◆ PLANK

    + +
    +
    + + + + +
    #define PLANK   8
    +
    + +

    Definition at line 12 of file item.h.

    + +
    +
    + +

    ◆ PURPLE_FLOWER

    + +
    +
    + + + + +
    #define PURPLE_FLOWER   20
    +
    + +

    Definition at line 24 of file item.h.

    + +
    +
    + +

    ◆ RAIN

    + +
    +
    + + + + +
    #define RAIN   25
    +
    + +

    Definition at line 29 of file item.h.

    + +
    +
    + +

    ◆ RED_FLOWER

    + +
    +
    + + + + +
    #define RED_FLOWER   19
    +
    + +

    Definition at line 23 of file item.h.

    + +
    +
    + +

    ◆ SAND

    + +
    +
    + + + + +
    #define SAND   2
    +
    + +

    Definition at line 6 of file item.h.

    + +
    +
    + +

    ◆ SNOW

    + +
    +
    + + + + +
    #define SNOW   9
    +
    + +

    Definition at line 13 of file item.h.

    + +
    +
    + +

    ◆ STONE

    + +
    +
    + + + + +
    #define STONE   3
    +
    + +

    Definition at line 7 of file item.h.

    + +
    +
    + +

    ◆ SUN_FLOWER

    + +
    +
    + + + + +
    #define SUN_FLOWER   21
    +
    + +

    Definition at line 25 of file item.h.

    + +
    +
    + +

    ◆ TALL_GRASS

    + +
    +
    + + + + +
    #define TALL_GRASS   17
    +
    + +

    Definition at line 21 of file item.h.

    + +
    +
    + +

    ◆ WATER

    + +
    +
    + + + + +
    #define WATER   64
    +
    + +

    Definition at line 62 of file item.h.

    + +
    +
    + +

    ◆ WHITE_FLOWER

    + +
    +
    + + + + +
    #define WHITE_FLOWER   22
    +
    + +

    Definition at line 26 of file item.h.

    + +
    +
    + +

    ◆ WOOD

    + +
    +
    + + + + +
    #define WOOD   5
    +
    + +

    Definition at line 9 of file item.h.

    + +
    +
    + +

    ◆ YELLOW_FLOWER

    + +
    +
    + + + + +
    #define YELLOW_FLOWER   18
    +
    + +

    Definition at line 22 of file item.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ is_alpha()

    + +
    +
    + + + + + + + + +
    int is_alpha (int w)
    +
    + +

    Definition at line 200 of file item.c.

    +
    200  {
    +
    201  return 0;
    +
    202 }
    +
    +
    +
    + +

    ◆ is_destructable()

    + +
    +
    + + + + + + + + +
    int is_destructable (int w)
    +
    + +

    Definition at line 204 of file item.c.

    +
    204  {
    +
    205  switch (w) {
    +
    206  case EMPTY:
    +
    207  case CLOUD:
    +
    208  return 0;
    +
    209  default:
    +
    210  return 1;
    +
    211  }
    +
    212 }
    +
    #define EMPTY
    Definition: item.h:4
    +
    #define CLOUD
    Definition: item.h:20
    +
    +
    +
    + +

    ◆ is_obstacle()

    + +
    +
    + + + + + + + + +
    int is_obstacle (int w)
    +
    + +

    Definition at line 163 of file item.c.

    +
    163  {
    +
    164  w = ABS(w);
    +
    165  if (is_plant(w)) {
    +
    166  return 0;
    +
    167  }
    +
    168  switch (w) {
    +
    169  case EMPTY:
    +
    170  case CLOUD:
    +
    171  case LAVA:
    +
    172  case RAIN:
    +
    173  case WATER:
    +
    174  return 0;
    +
    175  default:
    +
    176  return 1;
    +
    177  }
    +
    178 }
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    #define LAVA
    Definition: item.h:28
    +
    #define WATER
    Definition: item.h:62
    +
    #define RAIN
    Definition: item.h:29
    +
    #define ABS(x)
    Definition: util.h:11
    +
    +
    +
    + +

    ◆ is_plant()

    + +
    +
    + + + + + + + + +
    int is_plant (int w)
    +
    + +

    Definition at line 148 of file item.c.

    +
    148  {
    +
    149  switch (w) {
    +
    150  case TALL_GRASS:
    +
    151  case YELLOW_FLOWER:
    +
    152  case RED_FLOWER:
    +
    153  case PURPLE_FLOWER:
    +
    154  case SUN_FLOWER:
    +
    155  case WHITE_FLOWER:
    +
    156  case BLUE_FLOWER:
    +
    157  return 1;
    +
    158  default:
    +
    159  return 0;
    +
    160  }
    +
    161 }
    +
    #define YELLOW_FLOWER
    Definition: item.h:22
    +
    #define RED_FLOWER
    Definition: item.h:23
    +
    #define SUN_FLOWER
    Definition: item.h:25
    +
    #define WHITE_FLOWER
    Definition: item.h:26
    +
    #define TALL_GRASS
    Definition: item.h:21
    +
    #define BLUE_FLOWER
    Definition: item.h:27
    +
    #define PURPLE_FLOWER
    Definition: item.h:24
    +
    +
    +
    + +

    ◆ is_slowing()

    + +
    +
    + + + + + + + + +
    int is_slowing (int w)
    +
    + +

    Definition at line 214 of file item.c.

    +
    214  {
    +
    215  // The player must be able to pass through the item for it to slow them.
    +
    216  if (is_obstacle(w)) return 0;
    +
    217 
    +
    218  switch (w) {
    +
    219  case WATER:
    +
    220  case LAVA:
    +
    221  return 1;
    +
    222  default:
    +
    223  return 0;
    +
    224  }
    +
    225 }
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    +
    +
    + +

    ◆ is_transparent()

    + +
    +
    + + + + + + + + +
    int is_transparent (int w)
    +
    + +

    Definition at line 180 of file item.c.

    +
    180  {
    +
    181  if (w == EMPTY) {
    +
    182  return 1;
    +
    183  }
    +
    184  w = ABS(w);
    +
    185  if (is_plant(w)) {
    +
    186  return 1;
    +
    187  }
    +
    188  switch (w) {
    +
    189  case EMPTY:
    +
    190  case GLASS:
    +
    191  case LEAVES:
    +
    192  case WATER:
    +
    193  case RAIN:
    +
    194  return 1;
    +
    195  default:
    +
    196  return 0;
    +
    197  }
    +
    198 }
    +
    #define LEAVES
    Definition: item.h:19
    +
    #define GLASS
    Definition: item.h:14
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ blocks

    + +
    +
    + + + + + +
    + + + + +
    const int blocks[256][6]
    +
    +extern
    +
    + +

    Definition at line 67 of file item.c.

    + +
    +
    + +

    ◆ item_count

    + +
    +
    + + + + + +
    + + + + +
    const int item_count
    +
    +extern
    +
    + +

    Definition at line 65 of file item.c.

    + +
    +
    + +

    ◆ items

    + +
    +
    + + + + + +
    + + + + +
    const int items[]
    +
    +extern
    +
    + +

    Definition at line 4 of file item.c.

    + +
    +
    + +

    ◆ plants

    + +
    +
    + + + + + +
    + + + + +
    const int plants[256]
    +
    +extern
    +
    + +

    Definition at line 136 of file item.c.

    + +
    +
    +
    + + + + diff --git a/documentation/html/item_8h_source.html b/documentation/html/item_8h_source.html new file mode 100644 index 000000000..cef116b72 --- /dev/null +++ b/documentation/html/item_8h_source.html @@ -0,0 +1,164 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/item.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    item.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _item_h_
    +
    2 #define _item_h_
    +
    3 
    +
    4 #define EMPTY 0
    +
    5 #define GRASS 1
    +
    6 #define SAND 2
    +
    7 #define STONE 3
    +
    8 #define BRICK 4
    +
    9 #define WOOD 5
    +
    10 #define CEMENT 6
    +
    11 #define DIRT 7
    +
    12 #define PLANK 8
    +
    13 #define SNOW 9
    +
    14 #define GLASS 10
    +
    15 #define COBBLE 11
    +
    16 #define LIGHT_STONE 12
    +
    17 #define DARK_STONE 13
    +
    18 #define CHEST 14
    +
    19 #define LEAVES 15
    +
    20 #define CLOUD 16
    +
    21 #define TALL_GRASS 17
    +
    22 #define YELLOW_FLOWER 18
    +
    23 #define RED_FLOWER 19
    +
    24 #define PURPLE_FLOWER 20
    +
    25 #define SUN_FLOWER 21
    +
    26 #define WHITE_FLOWER 22
    +
    27 #define BLUE_FLOWER 23
    +
    28 #define LAVA 24
    +
    29 #define RAIN 25
    +
    30 #define COLOR_00 32
    +
    31 #define COLOR_01 33
    +
    32 #define COLOR_02 34
    +
    33 #define COLOR_03 35
    +
    34 #define COLOR_04 36
    +
    35 #define COLOR_05 37
    +
    36 #define COLOR_06 38
    +
    37 #define COLOR_07 39
    +
    38 #define COLOR_08 40
    +
    39 #define COLOR_09 41
    +
    40 #define COLOR_10 42
    +
    41 #define COLOR_11 43
    +
    42 #define COLOR_12 44
    +
    43 #define COLOR_13 45
    +
    44 #define COLOR_14 46
    +
    45 #define COLOR_15 47
    +
    46 #define COLOR_16 48
    +
    47 #define COLOR_17 49
    +
    48 #define COLOR_18 50
    +
    49 #define COLOR_19 51
    +
    50 #define COLOR_20 52
    +
    51 #define COLOR_21 53
    +
    52 #define COLOR_22 54
    +
    53 #define COLOR_23 55
    +
    54 #define COLOR_24 56
    +
    55 #define COLOR_25 57
    +
    56 #define COLOR_26 58
    +
    57 #define COLOR_27 59
    +
    58 #define COLOR_28 60
    +
    59 #define COLOR_29 61
    +
    60 #define COLOR_30 62
    +
    61 #define COLOR_31 63
    +
    62 #define WATER 64
    +
    63 
    +
    64 extern const int items[];
    +
    65 extern const int item_count;
    +
    66 extern const int blocks[256][6];
    +
    67 extern const int plants[256];
    +
    68 
    +
    69 int is_plant(int w);
    +
    70 int is_obstacle(int w);
    +
    71 int is_transparent(int w);
    +
    72 int is_alpha(int w);
    +
    73 int is_destructable(int w);
    +
    74 int is_slowing(int w);
    +
    75 
    +
    76 #endif
    +
    const int items[]
    Definition: item.c:4
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    const int plants[256]
    Definition: item.c:136
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    int is_transparent(int w)
    Definition: item.c:180
    +
    int is_destructable(int w)
    Definition: item.c:204
    +
    int is_slowing(int w)
    Definition: item.c:214
    +
    int is_alpha(int w)
    Definition: item.c:200
    +
    const int item_count
    Definition: item.c:65
    +
    + + + + diff --git a/documentation/html/jquery.js b/documentation/html/jquery.js new file mode 100644 index 000000000..103c32d79 --- /dev/null +++ b/documentation/html/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
    ",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
    "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
    ").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
    "),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
    "),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/documentation/html/main_8c.html b/documentation/html/main_8c.html new file mode 100644 index 000000000..4adbe871f --- /dev/null +++ b/documentation/html/main_8c.html @@ -0,0 +1,6609 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    main.c File Reference
    +
    +
    +
    #include <GL/glew.h>
    +#include <GLFW/glfw3.h>
    +#include <curl/curl.h>
    +#include <math.h>
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +#include <time.h>
    +#include "auth.h"
    +#include "client.h"
    +#include "config.h"
    +#include "cube.h"
    +#include "db.h"
    +#include "item.h"
    +#include "map.h"
    +#include "matrix.h"
    +#include "noise.h"
    +#include "sign.h"
    +#include "util.h"
    +#include "world.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + +

    +Classes

    struct  Chunk
     
    struct  Block
     
    struct  State
     
    struct  Player
     
    struct  Attrib
     
    struct  Model
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    #define MAX_CHUNKS   8192
     
    #define MAX_PLAYERS   128
     
    #define MAX_TEXT_LENGTH   256
     
    #define MAX_NAME_LENGTH   32
     
    #define MAX_PATH_LENGTH   256
     
    #define MAX_ADDR_LENGTH   256
     
    #define ALIGN_LEFT   0
     
    #define ALIGN_CENTER   1
     
    #define ALIGN_RIGHT   2
     
    #define MODE_OFFLINE   0
     
    #define MODE_ONLINE   1
     
    #define MOUSE_SENSITIVITY   0.001;
     
    #define MAX_PLAYER_HEALTH   10
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int chunked (float x)
     
    float time_of_day ()
     
    float get_daylight ()
     
    int get_scale_factor ()
     
    void get_sight_vector (float rx, float ry, float *vx, float *vy, float *vz)
     
    void get_motion_vector (int flying, int sz, int sx, float rx, float ry, float *vx, float *vy, float *vz)
     
    GLuint gen_crosshair_buffer ()
     
    GLuint gen_wireframe_buffer (float x, float y, float z, float n)
     
    GLuint gen_sky_buffer ()
     
    GLuint gen_cube_buffer (float x, float y, float z, float n, int w)
     
    GLuint gen_plant_buffer (float x, float y, float z, float n, int w)
     
    GLuint gen_player_buffer (float x, float y, float z, float rx, float ry)
     
    GLuint gen_text_buffer (float x, float y, float n, char *text)
     
    void draw_triangles_3d_ao (Attrib *attrib, GLuint buffer, int count)
     
    void draw_triangles_3d_text (Attrib *attrib, GLuint buffer, int count)
     
    void draw_triangles_3d (Attrib *attrib, GLuint buffer, int count)
     
    void draw_triangles_2d (Attrib *attrib, GLuint buffer, int count)
     
    void draw_lines (Attrib *attrib, GLuint buffer, int components, int count)
     
    void draw_chunk (Attrib *attrib, Chunk *chunk)
     
    void draw_item (Attrib *attrib, GLuint buffer, int count)
     
    void draw_text (Attrib *attrib, GLuint buffer, int length)
     
    void draw_signs (Attrib *attrib, Chunk *chunk)
     
    void draw_sign (Attrib *attrib, GLuint buffer, int length)
     
    void draw_cube (Attrib *attrib, GLuint buffer)
     
    void draw_plant (Attrib *attrib, GLuint buffer)
     
    void draw_player (Attrib *attrib, Player *player)
     
    Playerfind_player (int id)
     
    void update_player (Player *player, float x, float y, float z, float rx, float ry, int interpolate)
     
    void interpolate_player (Player *player)
     
    void delete_player (int id)
     
    void delete_all_players ()
     
    float player_player_distance (Player *p1, Player *p2)
     
    float player_crosshair_distance (Player *p1, Player *p2)
     
    Playerplayer_crosshair (Player *player)
     
    Chunkfind_chunk (int p, int q)
     
    int chunk_distance (Chunk *chunk, int p, int q)
     
    int chunk_visible (float planes[6][4], int p, int q, int miny, int maxy)
     
    int highest_block (float x, float z)
     
    int _hit_test (Map *map, float max_distance, int previous, float x, float y, float z, float vx, float vy, float vz, int *hx, int *hy, int *hz)
     
    int hit_test (int previous, float x, float y, float z, float rx, float ry, int *bx, int *by, int *bz)
     
    int hit_test_face (Player *player, int *x, int *y, int *z, int *face)
     
    int collide (int height, float *x, float *y, float *z)
     
    int player_intersects_block (int height, float x, float y, float z, int hx, int hy, int hz)
     
    int _gen_sign_buffer (GLfloat *data, float x, float y, float z, int face, const char *text)
     
    void gen_sign_buffer (Chunk *chunk)
     
    void occlusion (char neighbors[27], float result[6][4])
     
    void gen_chunk_buffer (Chunk *chunk)
     
    void map_set_func (int x, int y, int z, int w, void *arg)
     
    void create_chunk (Chunk *chunk, int p, int q)
     
    void delete_chunks ()
     
    void delete_all_chunks ()
     
    void force_chunks (Player *player)
     
    void ensure_chunks (Player *player)
     
    void unset_sign (int x, int y, int z)
     
    void unset_sign_face (int x, int y, int z, int face)
     
    void _set_sign (int p, int q, int x, int y, int z, int face, const char *text, int dirty)
     
    void set_sign (int x, int y, int z, int face, const char *text)
     
    void _set_block (int p, int q, int x, int y, int z, int w, int dirty)
     
    void set_block (int x, int y, int z, int w)
     
    void record_block (int x, int y, int z, int w)
     
    int get_block (int x, int y, int z)
     
    void builder_block (int x, int y, int z, int w)
     
    int render_chunks (Attrib *attrib, Player *player)
     
    void render_signs (Attrib *attrib, Player *player)
     
    void render_sign (Attrib *attrib, Player *player)
     
    void render_players (Attrib *attrib, Player *player)
     
    void render_sky (Attrib *attrib, Player *player, GLuint buffer)
     
    void render_wireframe (Attrib *attrib, Player *player)
     
    void render_crosshairs (Attrib *attrib)
     
    void render_item (Attrib *attrib)
     
    void render_text (Attrib *attrib, int justify, float x, float y, float n, char *text)
     
    void add_message (const char *text)
     
    void login ()
     
    void copy ()
     
    void paste ()
     
    void cube (Block *b1, Block *b2, int fill)
     
    void sphere (Block *center, int radius, int fill, int fx, int fy, int fz)
     
    void cylinder (Block *b1, Block *b2, int radius, int fill)
     
    void tree (Block *block)
     
    void parse_command (const char *buffer, int forward)
     
    void on_left_click ()
     
    void on_right_click ()
     
    void on_middle_click ()
     
    void on_key (GLFWwindow *window, int key, int scancode, int action, int mods)
     
    void on_char (GLFWwindow *window, unsigned int u)
     
    void on_scroll (GLFWwindow *window, double xdelta, double ydelta)
     
    void on_mouse_button (GLFWwindow *window, int button, int action, int mods)
     
    void create_window ()
     
    void handle_mouse_input ()
     
    int is_movement_slowed (Player *player)
     
    void handle_player_health ()
     
    void handle_lava_damage ()
     
    void handle_fall_damage (float dy)
     
    void inflict_damage (float damage)
     
    void heal_damage (float healing)
     
    float handle_player_speed ()
     
    void handle_movement (double dt)
     
    void parse_buffer (char *buffer)
     
    void reset_model ()
     
    int main (int argc, char **argv)
     
    + + + + + +

    +Variables

    static Model model
     
    static Modelg = &model
     
    +

    Macro Definition Documentation

    + +

    ◆ ALIGN_CENTER

    + +
    +
    + + + + +
    #define ALIGN_CENTER   1
    +
    + +

    Definition at line 30 of file main.c.

    + +
    +
    + +

    ◆ ALIGN_LEFT

    + +
    +
    + + + + +
    #define ALIGN_LEFT   0
    +
    + +

    Definition at line 29 of file main.c.

    + +
    +
    + +

    ◆ ALIGN_RIGHT

    + +
    +
    + + + + +
    #define ALIGN_RIGHT   2
    +
    + +

    Definition at line 31 of file main.c.

    + +
    +
    + +

    ◆ MAX_ADDR_LENGTH

    + +
    +
    + + + + +
    #define MAX_ADDR_LENGTH   256
    +
    + +

    Definition at line 27 of file main.c.

    + +
    +
    + +

    ◆ MAX_CHUNKS

    + +
    +
    + + + + +
    #define MAX_CHUNKS   8192
    +
    + +

    Definition at line 22 of file main.c.

    + +
    +
    + +

    ◆ MAX_NAME_LENGTH

    + +
    +
    + + + + +
    #define MAX_NAME_LENGTH   32
    +
    + +

    Definition at line 25 of file main.c.

    + +
    +
    + +

    ◆ MAX_PATH_LENGTH

    + +
    +
    + + + + +
    #define MAX_PATH_LENGTH   256
    +
    + +

    Definition at line 26 of file main.c.

    + +
    +
    + +

    ◆ MAX_PLAYER_HEALTH

    + +
    +
    + + + + +
    #define MAX_PLAYER_HEALTH   10
    +
    + +

    Definition at line 38 of file main.c.

    + +
    +
    + +

    ◆ MAX_PLAYERS

    + +
    +
    + + + + +
    #define MAX_PLAYERS   128
    +
    + +

    Definition at line 23 of file main.c.

    + +
    +
    + +

    ◆ MAX_TEXT_LENGTH

    + +
    +
    + + + + +
    #define MAX_TEXT_LENGTH   256
    +
    + +

    Definition at line 24 of file main.c.

    + +
    +
    + +

    ◆ MODE_OFFLINE

    + +
    +
    + + + + +
    #define MODE_OFFLINE   0
    +
    + +

    Definition at line 33 of file main.c.

    + +
    +
    + +

    ◆ MODE_ONLINE

    + +
    +
    + + + + +
    #define MODE_ONLINE   1
    +
    + +

    Definition at line 34 of file main.c.

    + +
    +
    + +

    ◆ MOUSE_SENSITIVITY

    + +
    +
    + + + + +
    #define MOUSE_SENSITIVITY   0.001;
    +
    + +

    Definition at line 36 of file main.c.

    + +
    +
    +

    Function Documentation

    + +

    ◆ _gen_sign_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int _gen_sign_buffer (GLfloat * data,
    float x,
    float y,
    float z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 725 of file main.c.

    +
    727 {
    +
    728  static const int glyph_dx[8] = {0, 0, -1, 1, 1, 0, -1, 0};
    +
    729  static const int glyph_dz[8] = {1, -1, 0, 0, 0, -1, 0, 1};
    +
    730  static const int line_dx[8] = {0, 0, 0, 0, 0, 1, 0, -1};
    +
    731  static const int line_dy[8] = {-1, -1, -1, -1, 0, 0, 0, 0};
    +
    732  static const int line_dz[8] = {0, 0, 0, 0, 1, 0, -1, 0};
    +
    733  if (face < 0 || face >= 8) {
    +
    734  return 0;
    +
    735  }
    +
    736  int count = 0;
    +
    737  float max_width = 64;
    +
    738  float line_height = 1.25;
    +
    739  char lines[1024];
    +
    740  int rows = wrap(text, max_width, lines, 1024);
    +
    741  rows = MIN(rows, 5);
    +
    742  int dx = glyph_dx[face];
    +
    743  int dz = glyph_dz[face];
    +
    744  int ldx = line_dx[face];
    +
    745  int ldy = line_dy[face];
    +
    746  int ldz = line_dz[face];
    +
    747  float n = 1.0 / (max_width / 10);
    +
    748  float sx = x - n * (rows - 1) * (line_height / 2) * ldx;
    +
    749  float sy = y - n * (rows - 1) * (line_height / 2) * ldy;
    +
    750  float sz = z - n * (rows - 1) * (line_height / 2) * ldz;
    +
    751  char *key;
    +
    752  char *line = tokenize(lines, "\n", &key);
    +
    753  while (line) {
    +
    754  int length = strlen(line);
    +
    755  int line_width = string_width(line);
    +
    756  line_width = MIN(line_width, max_width);
    +
    757  float rx = sx - dx * line_width / max_width / 2;
    +
    758  float ry = sy;
    +
    759  float rz = sz - dz * line_width / max_width / 2;
    +
    760  for (int i = 0; i < length; i++) {
    +
    761  int width = char_width(line[i]);
    +
    762  line_width -= width;
    +
    763  if (line_width < 0) {
    +
    764  break;
    +
    765  }
    +
    766  rx += dx * width / max_width / 2;
    +
    767  rz += dz * width / max_width / 2;
    +
    768  if (line[i] != ' ') {
    + +
    770  data + count * 30, rx, ry, rz, n / 2, face, line[i]);
    +
    771  count++;
    +
    772  }
    +
    773  rx += dx * width / max_width / 2;
    +
    774  rz += dz * width / max_width / 2;
    +
    775  }
    +
    776  sx += n * line_height * ldx;
    +
    777  sy += n * line_height * ldy;
    +
    778  sz += n * line_height * ldz;
    +
    779  line = tokenize(NULL, "\n", &key);
    +
    780  rows--;
    +
    781  if (rows <= 0) {
    +
    782  break;
    +
    783  }
    +
    784  }
    +
    785  return count;
    +
    786 }
    +
    void make_character_3d(float *data, float x, float y, float z, float n, int face, char c)
    Definition: cube.c:231
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    int char_width(char input)
    Definition: util.c:163
    +
    int wrap(const char *input, int max_width, char *output, int max_length)
    Definition: util.c:186
    +
    #define MIN(a, b)
    Definition: util.h:12
    +
    +
    +
    + +

    ◆ _hit_test()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int _hit_test (Mapmap,
    float max_distance,
    int previous,
    float x,
    float y,
    float z,
    float vx,
    float vy,
    float vz,
    int * hx,
    int * hy,
    int * hz 
    )
    +
    + +

    Definition at line 572 of file main.c.

    +
    577 {
    +
    578  int m = 32;
    +
    579  int px = 0;
    +
    580  int py = 0;
    +
    581  int pz = 0;
    +
    582  for (int i = 0; i < max_distance * m; i++) {
    +
    583  int nx = roundf(x);
    +
    584  int ny = roundf(y);
    +
    585  int nz = roundf(z);
    +
    586  if (nx != px || ny != py || nz != pz) {
    +
    587  int hw = map_get(map, nx, ny, nz);
    +
    588  if (hw > 0) {
    +
    589  if (previous) {
    +
    590  *hx = px; *hy = py; *hz = pz;
    +
    591  }
    +
    592  else {
    +
    593  *hx = nx; *hy = ny; *hz = nz;
    +
    594  }
    +
    595  return hw;
    +
    596  }
    +
    597  px = nx; py = ny; pz = nz;
    +
    598  }
    +
    599  x += vx / m; y += vy / m; z += vz / m;
    +
    600  }
    +
    601  return 0;
    +
    602 }
    +
    int map_get(Map *map, int x, int y, int z)
    Definition: map.c:63
    +
    +
    +
    + +

    ◆ _set_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void _set_block (int p,
    int q,
    int x,
    int y,
    int z,
    int w,
    int dirty 
    )
    +
    + +

    Definition at line 1163 of file main.c.

    +
    1163  {
    +
    1164  Chunk *chunk = find_chunk(p, q);
    +
    1165  if (chunk) {
    +
    1166  Map *map = &chunk->map;
    +
    1167  if (map_set(map, x, y, z, w)) {
    +
    1168  if (dirty) {
    +
    1169  chunk->dirty = 1;
    +
    1170  }
    +
    1171  db_insert_block(p, q, x, y, z, w);
    +
    1172  }
    +
    1173  }
    +
    1174  else {
    +
    1175  db_insert_block(p, q, x, y, z, w);
    +
    1176  }
    +
    1177  if (w == 0 && chunked(x) == p && chunked(z) == q) {
    +
    1178  unset_sign(x, y, z);
    +
    1179  }
    +
    1180 }
    +
    void db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:291
    +
    int chunked(float x)
    Definition: main.c:137
    +
    void unset_sign(int x, int y, int z)
    Definition: main.c:1106
    +
    Chunk * find_chunk(int p, int q)
    Definition: main.c:497
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    Definition: main.c:40
    +
    int dirty
    Definition: main.c:48
    +
    Map map
    Definition: main.c:41
    +
    Definition: map.h:22
    +
    +
    +
    + +

    ◆ _set_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void _set_sign (int p,
    int q,
    int x,
    int y,
    int z,
    int face,
    const char * text,
    int dirty 
    )
    +
    + +

    Definition at line 1138 of file main.c.

    +
    1140 {
    +
    1141  if (strlen(text) == 0) {
    +
    1142  unset_sign_face(x, y, z, face);
    +
    1143  return;
    +
    1144  }
    +
    1145  Chunk *chunk = find_chunk(p, q);
    +
    1146  if (chunk) {
    +
    1147  SignList *signs = &chunk->signs;
    +
    1148  sign_list_add(signs, x, y, z, face, text);
    +
    1149  if (dirty) {
    +
    1150  chunk->dirty = 1;
    +
    1151  }
    +
    1152  }
    +
    1153  db_insert_sign(p, q, x, y, z, face, text);
    +
    1154 }
    +
    void db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text)
    Definition: db.c:312
    +
    void unset_sign_face(int x, int y, int z, int face)
    Definition: main.c:1122
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    +
    SignList signs
    Definition: main.c:42
    +
    Definition: sign.h:14
    +
    +
    +
    + +

    ◆ add_message()

    + +
    +
    + + + + + + + + +
    void add_message (const char * text)
    +
    + +

    Definition at line 1429 of file main.c.

    +
    1429  {
    +
    1430  printf("%s\n", text);
    +
    1431  snprintf(
    +
    1432  g->messages[g->message_index], MAX_TEXT_LENGTH, "%s", text);
    + +
    1434 }
    +
    #define MAX_MESSAGES
    Definition: config.h:11
    +
    #define MAX_TEXT_LENGTH
    Definition: main.c:24
    +
    static Model * g
    Definition: main.c:135
    +
    int message_index
    Definition: main.c:110
    +
    char messages[MAX_MESSAGES][MAX_TEXT_LENGTH]
    Definition: main.c:111
    +
    +
    +
    + +

    ◆ builder_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void builder_block (int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 1222 of file main.c.

    +
    1222  {
    +
    1223  if (y <= 0 || y >= 256) {
    +
    1224  return;
    +
    1225  }
    +
    1226  if (is_destructable(get_block(x, y, z))) {
    +
    1227  set_block(x, y, z, 0);
    +
    1228  }
    +
    1229  if (w) {
    +
    1230  set_block(x, y, z, w);
    +
    1231  }
    +
    1232 }
    +
    int is_destructable(int w)
    Definition: item.c:204
    +
    int get_block(int x, int y, int z)
    Definition: main.c:1211
    +
    void set_block(int x, int y, int z, int w)
    Definition: main.c:1182
    +
    +
    +
    + +

    ◆ chunk_distance()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int chunk_distance (Chunkchunk,
    int p,
    int q 
    )
    +
    + +

    Definition at line 507 of file main.c.

    +
    507  {
    +
    508  int dp = ABS(chunk->p - p);
    +
    509  int dq = ABS(chunk->q - q);
    +
    510  return MAX(dp, dq);
    +
    511 }
    +
    int p
    Definition: main.c:43
    +
    int q
    Definition: main.c:44
    +
    #define ABS(x)
    Definition: util.h:11
    +
    #define MAX(a, b)
    Definition: util.h:13
    +
    +
    +
    + +

    ◆ chunk_visible()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int chunk_visible (float planes[6][4],
    int p,
    int q,
    int miny,
    int maxy 
    )
    +
    + +

    Definition at line 513 of file main.c.

    +
    513  {
    +
    514  int x = p * CHUNK_SIZE - 1;
    +
    515  int z = q * CHUNK_SIZE - 1;
    +
    516  int d = CHUNK_SIZE + 1;
    +
    517  float points[8][3] = {
    +
    518  {x + 0, miny, z + 0},
    +
    519  {x + d, miny, z + 0},
    +
    520  {x + 0, miny, z + d},
    +
    521  {x + d, miny, z + d},
    +
    522  {x + 0, maxy, z + 0},
    +
    523  {x + d, maxy, z + 0},
    +
    524  {x + 0, maxy, z + d},
    +
    525  {x + d, maxy, z + d}
    +
    526  };
    +
    527  int n = g->ortho ? 4 : 6;
    +
    528  for (int i = 0; i < n; i++) {
    +
    529  int in = 0;
    +
    530  int out = 0;
    +
    531  for (int j = 0; j < 8; j++) {
    +
    532  float d =
    +
    533  planes[i][0] * points[j][0] +
    +
    534  planes[i][1] * points[j][1] +
    +
    535  planes[i][2] * points[j][2] +
    +
    536  planes[i][3];
    +
    537  if (d < 0) {
    +
    538  out++;
    +
    539  }
    +
    540  else {
    +
    541  in++;
    +
    542  }
    +
    543  if (in && out) {
    +
    544  break;
    +
    545  }
    +
    546  }
    +
    547  if (in == 0) {
    +
    548  return 0;
    +
    549  }
    +
    550  }
    +
    551  return 1;
    +
    552 }
    +
    #define CHUNK_SIZE
    Definition: config.h:51
    +
    int ortho
    Definition: main.c:120
    +
    +
    +
    + +

    ◆ chunked()

    + +
    +
    + + + + + + + + +
    int chunked (float x)
    +
    + +

    Definition at line 137 of file main.c.

    +
    137  {
    +
    138  return floorf(roundf(x) / CHUNK_SIZE);
    +
    139 }
    +
    +
    +
    + +

    ◆ collide()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int collide (int height,
    float * x,
    float * y,
    float * z 
    )
    +
    + +

    Definition at line 668 of file main.c.

    +
    668  {
    +
    669  int result = 0;
    +
    670  int p = chunked(*x);
    +
    671  int q = chunked(*z);
    +
    672  Chunk *chunk = find_chunk(p, q);
    +
    673  if (!chunk) {
    +
    674  return result;
    +
    675  }
    +
    676  Map *map = &chunk->map;
    +
    677  int nx = roundf(*x);
    +
    678  int ny = roundf(*y);
    +
    679  int nz = roundf(*z);
    +
    680  float px = *x - nx;
    +
    681  float py = *y - ny;
    +
    682  float pz = *z - nz;
    +
    683  float pad = 0.25;
    +
    684  for (int dy = 0; dy < height; dy++) {
    +
    685  if (px < -pad && is_obstacle(map_get(map, nx - 1, ny - dy, nz))) {
    +
    686  *x = nx - pad;
    +
    687  }
    +
    688  if (px > pad && is_obstacle(map_get(map, nx + 1, ny - dy, nz))) {
    +
    689  *x = nx + pad;
    +
    690  }
    +
    691  if (py < -pad && is_obstacle(map_get(map, nx, ny - dy - 1, nz))) {
    +
    692  *y = ny - pad;
    +
    693  result = 1;
    +
    694  }
    +
    695  if (py > pad && is_obstacle(map_get(map, nx, ny - dy + 1, nz))) {
    +
    696  *y = ny + pad;
    +
    697  result = 1;
    +
    698  }
    +
    699  if (pz < -pad && is_obstacle(map_get(map, nx, ny - dy, nz - 1))) {
    +
    700  *z = nz - pad;
    +
    701  }
    +
    702  if (pz > pad && is_obstacle(map_get(map, nx, ny - dy, nz + 1))) {
    +
    703  *z = nz + pad;
    +
    704  }
    +
    705  }
    +
    706  return result;
    +
    707 }
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    +
    +
    + +

    ◆ copy()

    + +
    +
    + + + + + + + +
    void copy ()
    +
    + +

    Definition at line 1459 of file main.c.

    +
    1459  {
    +
    1460  memcpy(&g->copy0, &g->block0, sizeof(Block));
    +
    1461  memcpy(&g->copy1, &g->block1, sizeof(Block));
    +
    1462 }
    +
    Definition: main.c:56
    +
    Block block1
    Definition: main.c:129
    +
    Block copy0
    Definition: main.c:130
    +
    Block copy1
    Definition: main.c:131
    +
    Block block0
    Definition: main.c:128
    +
    +
    +
    + +

    ◆ create_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void create_chunk (Chunkchunk,
    int p,
    int q 
    )
    +
    + +

    Definition at line 970 of file main.c.

    +
    970  {
    +
    971  chunk->p = p;
    +
    972  chunk->q = q;
    +
    973  chunk->faces = 0;
    +
    974  chunk->alpha_faces = 0;
    +
    975  chunk->sign_faces = 0;
    +
    976  chunk->dirty = 1;
    +
    977  chunk->buffer = 0;
    +
    978  chunk->alpha_buffer = 0;
    +
    979  chunk->sign_buffer = 0;
    +
    980  Map *map = &chunk->map;
    +
    981  SignList *signs = &chunk->signs;
    +
    982  map_alloc(map);
    +
    983  sign_list_alloc(signs, 16);
    +
    984  create_world(p, q, map_set_func, map);
    +
    985  db_load_map(map, p, q);
    +
    986  db_load_signs(signs, p, q);
    +
    987  gen_chunk_buffer(chunk);
    +
    988  int key = db_get_key(p, q);
    +
    989  client_chunk(p, q, key);
    +
    990 }
    +
    void client_chunk(int p, int q, int key)
    Definition: client.c:107
    +
    int db_get_key(int p, int q)
    Definition: db.c:393
    +
    void db_load_signs(SignList *list, int p, int q)
    Definition: db.c:375
    +
    void db_load_map(Map *map, int p, int q)
    Definition: db.c:359
    +
    void map_set_func(int x, int y, int z, int w, void *arg)
    Definition: main.c:965
    +
    void gen_chunk_buffer(Chunk *chunk)
    Definition: main.c:833
    +
    void map_alloc(Map *map)
    Definition: map.c:21
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    GLuint buffer
    Definition: main.c:51
    +
    int alpha_faces
    Definition: main.c:46
    +
    int sign_faces
    Definition: main.c:47
    +
    GLuint sign_buffer
    Definition: main.c:53
    +
    GLuint alpha_buffer
    Definition: main.c:52
    +
    int faces
    Definition: main.c:45
    +
    void create_world(int p, int q, world_func func, void *arg)
    Definition: world.c:5
    +
    +
    +
    + +

    ◆ create_window()

    + +
    +
    + + + + + + + +
    void create_window ()
    +
    + +

    Definition at line 1945 of file main.c.

    +
    1945  {
    +
    1946  int window_width = WINDOW_WIDTH;
    +
    1947  int window_height = WINDOW_HEIGHT;
    +
    1948  GLFWmonitor *monitor = NULL;
    +
    1949  if (FULLSCREEN) {
    +
    1950  int mode_count;
    +
    1951  monitor = glfwGetPrimaryMonitor();
    +
    1952  const GLFWvidmode *modes = glfwGetVideoModes(monitor, &mode_count);
    +
    1953  window_width = modes[mode_count - 1].width;
    +
    1954  window_height = modes[mode_count - 1].height;
    +
    1955  }
    +
    1956  g->window = glfwCreateWindow(
    +
    1957  window_width, window_height, "Craft", monitor, NULL);
    +
    1958 }
    +
    #define WINDOW_WIDTH
    Definition: config.h:7
    +
    #define WINDOW_HEIGHT
    Definition: config.h:8
    +
    #define FULLSCREEN
    Definition: config.h:6
    +
    GLFWwindow * window
    Definition: main.c:98
    +
    +
    +
    + +

    ◆ cube()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void cube (Blockb1,
    Blockb2,
    int fill 
    )
    +
    + +

    Definition at line 1486 of file main.c.

    +
    1486  {
    +
    1487  if (b1->w != b2->w) {
    +
    1488  return;
    +
    1489  }
    +
    1490  int w = b1->w;
    +
    1491  int x1 = MIN(b1->x, b2->x);
    +
    1492  int y1 = MIN(b1->y, b2->y);
    +
    1493  int z1 = MIN(b1->z, b2->z);
    +
    1494  int x2 = MAX(b1->x, b2->x);
    +
    1495  int y2 = MAX(b1->y, b2->y);
    +
    1496  int z2 = MAX(b1->z, b2->z);
    +
    1497  int a = (x1 == x2) + (y1 == y2) + (z1 == z2);
    +
    1498  for (int x = x1; x <= x2; x++) {
    +
    1499  for (int y = y1; y <= y2; y++) {
    +
    1500  for (int z = z1; z <= z2; z++) {
    +
    1501  if (!fill) {
    +
    1502  int n = 0;
    +
    1503  n += x == x1 || x == x2;
    +
    1504  n += y == y1 || y == y2;
    +
    1505  n += z == z1 || z == z2;
    +
    1506  if (n <= a) {
    +
    1507  continue;
    +
    1508  }
    +
    1509  }
    +
    1510  builder_block(x, y, z, w);
    +
    1511  }
    +
    1512  }
    +
    1513  }
    +
    1514 }
    +
    void builder_block(int x, int y, int z, int w)
    Definition: main.c:1222
    +
    int x
    Definition: main.c:57
    +
    int y
    Definition: main.c:58
    +
    int w
    Definition: main.c:60
    +
    int z
    Definition: main.c:59
    +
    +
    +
    + +

    ◆ cylinder()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void cylinder (Blockb1,
    Blockb2,
    int radius,
    int fill 
    )
    +
    + +

    Definition at line 1565 of file main.c.

    +
    1565  {
    +
    1566  if (b1->w != b2->w) {
    +
    1567  return;
    +
    1568  }
    +
    1569  int w = b1->w;
    +
    1570  int x1 = MIN(b1->x, b2->x);
    +
    1571  int y1 = MIN(b1->y, b2->y);
    +
    1572  int z1 = MIN(b1->z, b2->z);
    +
    1573  int x2 = MAX(b1->x, b2->x);
    +
    1574  int y2 = MAX(b1->y, b2->y);
    +
    1575  int z2 = MAX(b1->z, b2->z);
    +
    1576  int fx = x1 != x2;
    +
    1577  int fy = y1 != y2;
    +
    1578  int fz = z1 != z2;
    +
    1579  if (fx + fy + fz != 1) {
    +
    1580  return;
    +
    1581  }
    +
    1582  Block block = {x1, y1, z1, w};
    +
    1583  if (fx) {
    +
    1584  for (int x = x1; x <= x2; x++) {
    +
    1585  block.x = x;
    +
    1586  sphere(&block, radius, fill, 1, 0, 0);
    +
    1587  }
    +
    1588  }
    +
    1589  if (fy) {
    +
    1590  for (int y = y1; y <= y2; y++) {
    +
    1591  block.y = y;
    +
    1592  sphere(&block, radius, fill, 0, 1, 0);
    +
    1593  }
    +
    1594  }
    +
    1595  if (fz) {
    +
    1596  for (int z = z1; z <= z2; z++) {
    +
    1597  block.z = z;
    +
    1598  sphere(&block, radius, fill, 0, 0, 1);
    +
    1599  }
    +
    1600  }
    +
    1601 }
    +
    void sphere(Block *center, int radius, int fill, int fx, int fy, int fz)
    Definition: main.c:1516
    +
    +
    +
    + +

    ◆ delete_all_chunks()

    + +
    +
    + + + + + + + +
    void delete_all_chunks ()
    +
    + +

    Definition at line 1023 of file main.c.

    +
    1023  {
    +
    1024  for (int i = 0; i < g->chunk_count; i++) {
    +
    1025  Chunk *chunk = g->chunks + i;
    +
    1026  map_free(&chunk->map);
    +
    1027  sign_list_free(&chunk->signs);
    +
    1028  del_buffer(chunk->buffer);
    +
    1029  del_buffer(chunk->sign_buffer);
    +
    1030  }
    +
    1031  g->chunk_count = 0;
    +
    1032 }
    +
    void map_free(Map *map)
    Definition: map.c:27
    +
    void sign_list_free(SignList *list)
    Definition: sign.c:11
    +
    Chunk chunks[MAX_CHUNKS]
    Definition: main.c:100
    +
    int chunk_count
    Definition: main.c:101
    +
    void del_buffer(GLuint buffer)
    Definition: util.c:49
    +
    +
    +
    + +

    ◆ delete_all_players()

    + +
    +
    + + + + + + + +
    void delete_all_players ()
    +
    + +

    Definition at line 444 of file main.c.

    +
    444  {
    +
    445  for (int i = 0; i < g->player_count; i++) {
    +
    446  Player *player = g->players + i;
    +
    447  del_buffer(player->buffer);
    +
    448  }
    +
    449  g->player_count = 0;
    +
    450 }
    +
    Player players[MAX_PLAYERS]
    Definition: main.c:106
    +
    int player_count
    Definition: main.c:107
    +
    Definition: main.c:72
    +
    GLuint buffer
    Definition: main.c:79
    +
    +
    +
    + +

    ◆ delete_chunks()

    + +
    +
    + + + + + + + +
    void delete_chunks ()
    +
    + +

    Definition at line 992 of file main.c.

    +
    992  {
    +
    993  int count = g->chunk_count;
    +
    994  State *s1 = &g->players->state;
    +
    995  State *s2 = &(g->players + g->observe1)->state;
    +
    996  State *s3 = &(g->players + g->observe2)->state;
    +
    997  State *states[3] = {s1, s2, s3};
    +
    998  for (int i = 0; i < count; i++) {
    +
    999  Chunk *chunk = g->chunks + i;
    +
    1000  int delete = 1;
    +
    1001  for (int j = 0; j < 3; j++) {
    +
    1002  State *s = states[j];
    +
    1003  int p = chunked(s->x);
    +
    1004  int q = chunked(s->z);
    +
    1005  if (chunk_distance(chunk, p, q) < g->delete_radius) {
    +
    1006  delete = 0;
    +
    1007  break;
    +
    1008  }
    +
    1009  }
    +
    1010  if (delete) {
    +
    1011  map_free(&chunk->map);
    +
    1012  sign_list_free(&chunk->signs);
    +
    1013  del_buffer(chunk->buffer);
    +
    1014  del_buffer(chunk->alpha_buffer);
    +
    1015  del_buffer(chunk->sign_buffer);
    +
    1016  Chunk *other = g->chunks + (--count);
    +
    1017  memcpy(chunk, other, sizeof(Chunk));
    +
    1018  }
    +
    1019  }
    +
    1020  g->chunk_count = count;
    +
    1021 }
    +
    int chunk_distance(Chunk *chunk, int p, int q)
    Definition: main.c:507
    +
    int observe1
    Definition: main.c:114
    +
    int delete_radius
    Definition: main.c:104
    +
    int observe2
    Definition: main.c:115
    +
    State state
    Definition: main.c:76
    +
    Definition: main.c:63
    +
    float x
    Definition: main.c:64
    +
    float z
    Definition: main.c:66
    +
    +
    +
    + +

    ◆ delete_player()

    + +
    +
    + + + + + + + + +
    void delete_player (int id)
    +
    + +

    Definition at line 432 of file main.c.

    +
    432  {
    +
    433  Player *player = find_player(id);
    +
    434  if (!player) {
    +
    435  return;
    +
    436  }
    +
    437  int count = g->player_count;
    +
    438  del_buffer(player->buffer);
    +
    439  Player *other = g->players + (--count);
    +
    440  memcpy(player, other, sizeof(Player));
    +
    441  g->player_count = count;
    +
    442 }
    +
    Player * find_player(int id)
    Definition: main.c:380
    +
    +
    +
    + +

    ◆ draw_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void draw_chunk (Attribattrib,
    Chunkchunk 
    )
    +
    + +

    Definition at line 339 of file main.c.

    +
    339  {
    +
    340  draw_triangles_3d_ao(attrib, chunk->buffer, chunk->faces * 6);
    +
    341 }
    +
    void draw_triangles_3d_ao(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:265
    +
    +
    +
    + +

    ◆ draw_cube()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void draw_cube (Attribattrib,
    GLuint buffer 
    )
    +
    + +

    Definition at line 368 of file main.c.

    +
    368  {
    +
    369  draw_item(attrib, buffer, 36);
    +
    370 }
    +
    void draw_item(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:343
    +
    +
    +
    + +

    ◆ draw_item()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_item (Attribattrib,
    GLuint buffer,
    int count 
    )
    +
    + +

    Definition at line 343 of file main.c.

    +
    343  {
    +
    344  draw_triangles_3d_ao(attrib, buffer, count);
    +
    345 }
    +
    +
    +
    + +

    ◆ draw_lines()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_lines (Attribattrib,
    GLuint buffer,
    int components,
    int count 
    )
    +
    + +

    Definition at line 329 of file main.c.

    +
    329  {
    +
    330  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    331  glEnableVertexAttribArray(attrib->position);
    +
    332  glVertexAttribPointer(
    +
    333  attrib->position, components, GL_FLOAT, GL_FALSE, 0, 0);
    +
    334  glDrawArrays(GL_LINES, 0, count);
    +
    335  glDisableVertexAttribArray(attrib->position);
    +
    336  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    337 }
    +
    GLuint position
    Definition: main.c:84
    +
    +
    +
    + +

    ◆ draw_plant()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void draw_plant (Attribattrib,
    GLuint buffer 
    )
    +
    + +

    Definition at line 372 of file main.c.

    +
    372  {
    +
    373  draw_item(attrib, buffer, 24);
    +
    374 }
    +
    +
    +
    + +

    ◆ draw_player()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void draw_player (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 376 of file main.c.

    +
    376  {
    +
    377  draw_cube(attrib, player->buffer);
    +
    378 }
    +
    void draw_cube(Attrib *attrib, GLuint buffer)
    Definition: main.c:368
    +
    +
    +
    + +

    ◆ draw_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_sign (Attribattrib,
    GLuint buffer,
    int length 
    )
    +
    + +

    Definition at line 361 of file main.c.

    +
    361  {
    +
    362  glEnable(GL_POLYGON_OFFSET_FILL);
    +
    363  glPolygonOffset(-8, -1024);
    +
    364  draw_triangles_3d_text(attrib, buffer, length * 6);
    +
    365  glDisable(GL_POLYGON_OFFSET_FILL);
    +
    366 }
    +
    void draw_triangles_3d_text(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:283
    +
    +
    +
    + +

    ◆ draw_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void draw_signs (Attribattrib,
    Chunkchunk 
    )
    +
    + +

    Definition at line 354 of file main.c.

    +
    354  {
    +
    355  glEnable(GL_POLYGON_OFFSET_FILL);
    +
    356  glPolygonOffset(-8, -1024);
    +
    357  draw_triangles_3d_text(attrib, chunk->sign_buffer, chunk->sign_faces * 6);
    +
    358  glDisable(GL_POLYGON_OFFSET_FILL);
    +
    359 }
    +
    +
    +
    + +

    ◆ draw_text()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_text (Attribattrib,
    GLuint buffer,
    int length 
    )
    +
    + +

    Definition at line 347 of file main.c.

    +
    347  {
    +
    348  glEnable(GL_BLEND);
    +
    349  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    +
    350  draw_triangles_2d(attrib, buffer, length * 6);
    +
    351  glDisable(GL_BLEND);
    +
    352 }
    +
    void draw_triangles_2d(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:315
    +
    +
    +
    + +

    ◆ draw_triangles_2d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_triangles_2d (Attribattrib,
    GLuint buffer,
    int count 
    )
    +
    + +

    Definition at line 315 of file main.c.

    +
    315  {
    +
    316  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    317  glEnableVertexAttribArray(attrib->position);
    +
    318  glEnableVertexAttribArray(attrib->uv);
    +
    319  glVertexAttribPointer(attrib->position, 2, GL_FLOAT, GL_FALSE,
    +
    320  sizeof(GLfloat) * 4, 0);
    +
    321  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    322  sizeof(GLfloat) * 4, (GLvoid *)(sizeof(GLfloat) * 2));
    +
    323  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    324  glDisableVertexAttribArray(attrib->position);
    +
    325  glDisableVertexAttribArray(attrib->uv);
    +
    326  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    327 }
    +
    GLuint uv
    Definition: main.c:86
    +
    +
    +
    + +

    ◆ draw_triangles_3d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_triangles_3d (Attribattrib,
    GLuint buffer,
    int count 
    )
    +
    + +

    Definition at line 297 of file main.c.

    +
    297  {
    +
    298  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    299  glEnableVertexAttribArray(attrib->position);
    +
    300  glEnableVertexAttribArray(attrib->normal);
    +
    301  glEnableVertexAttribArray(attrib->uv);
    +
    302  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    303  sizeof(GLfloat) * 8, 0);
    +
    304  glVertexAttribPointer(attrib->normal, 3, GL_FLOAT, GL_FALSE,
    +
    305  sizeof(GLfloat) * 8, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    306  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    307  sizeof(GLfloat) * 8, (GLvoid *)(sizeof(GLfloat) * 6));
    +
    308  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    309  glDisableVertexAttribArray(attrib->position);
    +
    310  glDisableVertexAttribArray(attrib->normal);
    +
    311  glDisableVertexAttribArray(attrib->uv);
    +
    312  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    313 }
    +
    GLuint normal
    Definition: main.c:85
    +
    +
    +
    + +

    ◆ draw_triangles_3d_ao()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_triangles_3d_ao (Attribattrib,
    GLuint buffer,
    int count 
    )
    +
    + +

    Definition at line 265 of file main.c.

    +
    265  {
    +
    266  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    267  glEnableVertexAttribArray(attrib->position);
    +
    268  glEnableVertexAttribArray(attrib->normal);
    +
    269  glEnableVertexAttribArray(attrib->uv);
    +
    270  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    271  sizeof(GLfloat) * 9, 0);
    +
    272  glVertexAttribPointer(attrib->normal, 3, GL_FLOAT, GL_FALSE,
    +
    273  sizeof(GLfloat) * 9, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    274  glVertexAttribPointer(attrib->uv, 3, GL_FLOAT, GL_FALSE,
    +
    275  sizeof(GLfloat) * 9, (GLvoid *)(sizeof(GLfloat) * 6));
    +
    276  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    277  glDisableVertexAttribArray(attrib->position);
    +
    278  glDisableVertexAttribArray(attrib->normal);
    +
    279  glDisableVertexAttribArray(attrib->uv);
    +
    280  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    281 }
    +
    +
    +
    + +

    ◆ draw_triangles_3d_text()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void draw_triangles_3d_text (Attribattrib,
    GLuint buffer,
    int count 
    )
    +
    + +

    Definition at line 283 of file main.c.

    +
    283  {
    +
    284  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    285  glEnableVertexAttribArray(attrib->position);
    +
    286  glEnableVertexAttribArray(attrib->uv);
    +
    287  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    288  sizeof(GLfloat) * 5, 0);
    +
    289  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    290  sizeof(GLfloat) * 5, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    291  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    292  glDisableVertexAttribArray(attrib->position);
    +
    293  glDisableVertexAttribArray(attrib->uv);
    +
    294  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    295 }
    +
    +
    +
    + +

    ◆ ensure_chunks()

    + +
    +
    + + + + + + + + +
    void ensure_chunks (Playerplayer)
    +
    + +

    Definition at line 1057 of file main.c.

    +
    1057  {
    +
    1058  force_chunks(player);
    +
    1059  State *s = &player->state;
    +
    1060  float matrix[16];
    +
    1061  set_matrix_3d(
    +
    1062  matrix, g->width, g->height,
    +
    1063  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1064  float planes[6][4];
    +
    1065  frustum_planes(planes, g->render_radius, matrix);
    +
    1066  int p = chunked(s->x);
    +
    1067  int q = chunked(s->z);
    +
    1068  int r = g->create_radius;
    +
    1069  int start = 0x0fffffff;
    +
    1070  int best_score = start;
    +
    1071  int best_a = 0;
    +
    1072  int best_b = 0;
    +
    1073  for (int dp = -r; dp <= r; dp++) {
    +
    1074  for (int dq = -r; dq <= r; dq++) {
    +
    1075  int a = p + dp;
    +
    1076  int b = q + dq;
    +
    1077  Chunk *chunk = find_chunk(a, b);
    +
    1078  if (chunk && !chunk->dirty) {
    +
    1079  continue;
    +
    1080  }
    +
    1081  int distance = MAX(ABS(dp), ABS(dq));
    +
    1082  int invisible = !chunk_visible(planes, a, b, 0, 256);
    +
    1083  int score = (invisible << 16) | distance;
    +
    1084  if (score < best_score) {
    +
    1085  best_score = score;
    +
    1086  best_a = a;
    +
    1087  best_b = b;
    +
    1088  }
    +
    1089  }
    +
    1090  }
    +
    1091  if (best_score == start) {
    +
    1092  return;
    +
    1093  }
    +
    1094  int a = best_a;
    +
    1095  int b = best_b;
    +
    1096  Chunk *chunk = find_chunk(a, b);
    +
    1097  if (chunk) {
    +
    1098  gen_chunk_buffer(chunk);
    +
    1099  }
    +
    1100  else if (g->chunk_count < MAX_CHUNKS) {
    +
    1101  create_chunk(g->chunks + g->chunk_count, a, b);
    +
    1102  g->chunk_count++;
    +
    1103  }
    +
    1104 }
    +
    void force_chunks(Player *player)
    Definition: main.c:1034
    +
    int chunk_visible(float planes[6][4], int p, int q, int miny, int maxy)
    Definition: main.c:513
    +
    #define MAX_CHUNKS
    Definition: main.c:22
    +
    void create_chunk(Chunk *chunk, int p, int q)
    Definition: main.c:970
    +
    void set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
    Definition: matrix.c:211
    +
    void frustum_planes(float planes[6][4], int radius, float *matrix)
    Definition: matrix.c:118
    +
    int height
    Definition: main.c:113
    +
    int render_radius
    Definition: main.c:103
    +
    int width
    Definition: main.c:112
    +
    int create_radius
    Definition: main.c:102
    +
    float fov
    Definition: main.c:121
    +
    float rx
    Definition: main.c:67
    +
    float y
    Definition: main.c:65
    +
    float ry
    Definition: main.c:68
    +
    +
    +
    + +

    ◆ find_chunk()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    Chunk* find_chunk (int p,
    int q 
    )
    +
    + +

    Definition at line 497 of file main.c.

    +
    497  {
    +
    498  for (int i = 0; i < g->chunk_count; i++) {
    +
    499  Chunk *chunk = g->chunks + i;
    +
    500  if (chunk->p == p && chunk->q == q) {
    +
    501  return chunk;
    +
    502  }
    +
    503  }
    +
    504  return 0;
    +
    505 }
    +
    +
    +
    + +

    ◆ find_player()

    + +
    +
    + + + + + + + + +
    Player* find_player (int id)
    +
    + +

    Definition at line 380 of file main.c.

    +
    380  {
    +
    381  for (int i = 0; i < g->player_count; i++) {
    +
    382  Player *player = g->players + i;
    +
    383  if (player->id == id) {
    +
    384  return player;
    +
    385  }
    +
    386  }
    +
    387  return 0;
    +
    388 }
    +
    int id
    Definition: main.c:73
    +
    +
    +
    + +

    ◆ force_chunks()

    + +
    +
    + + + + + + + + +
    void force_chunks (Playerplayer)
    +
    + +

    Definition at line 1034 of file main.c.

    +
    1034  {
    +
    1035  State *s = &player->state;
    +
    1036  int p = chunked(s->x);
    +
    1037  int q = chunked(s->z);
    +
    1038  int r = 1;
    +
    1039  for (int dp = -r; dp <= r; dp++) {
    +
    1040  for (int dq = -r; dq <= r; dq++) {
    +
    1041  int a = p + dp;
    +
    1042  int b = q + dq;
    +
    1043  Chunk *chunk = find_chunk(a, b);
    +
    1044  if (chunk) {
    +
    1045  if (chunk->dirty) {
    +
    1046  gen_chunk_buffer(chunk);
    +
    1047  }
    +
    1048  }
    +
    1049  else if (g->chunk_count < MAX_CHUNKS) {
    +
    1050  create_chunk(g->chunks + g->chunk_count, a, b);
    +
    1051  g->chunk_count++;
    +
    1052  }
    +
    1053  }
    +
    1054  }
    +
    1055 }
    +
    +
    +
    + +

    ◆ gen_chunk_buffer()

    + +
    +
    + + + + + + + + +
    void gen_chunk_buffer (Chunkchunk)
    +
    + +

    Definition at line 833 of file main.c.

    +
    833  {
    +
    834  static char blocks[CHUNK_SIZE + 2][258][CHUNK_SIZE + 2];
    +
    835  static char neighbors[27];
    +
    836  memset(blocks, 0, sizeof(blocks));
    +
    837  memset(neighbors, 0, sizeof(neighbors));
    +
    838  int ox = chunk->p * CHUNK_SIZE - 1;
    +
    839  int oy = -1;
    +
    840  int oz = chunk->q * CHUNK_SIZE - 1;
    +
    841 
    +
    842  Map *map = &chunk->map;
    +
    843  chunk->miny = 256;
    +
    844  chunk->maxy = 0;
    +
    845 
    +
    846  // first pass - populate blocks array
    +
    847  MAP_FOR_EACH(map, e) {
    +
    848  int x = e->x - ox;
    +
    849  int y = e->y - oy;
    +
    850  int z = e->z - oz;
    +
    851  // TODO: this should be unnecessary
    +
    852  if (x < 0 || y < 0 || z < 0) {
    +
    853  continue;
    +
    854  }
    +
    855  if (x >= CHUNK_SIZE + 2 || y >= 258 || z >= CHUNK_SIZE + 2) {
    +
    856  continue;
    +
    857  }
    +
    858  // END TODO
    +
    859  blocks[x][y][z] = e->w;
    + +
    861 
    +
    862  // second pass - count exposed faces
    +
    863  int faces = 0;
    +
    864  int alpha_faces = 0;
    +
    865  MAP_FOR_EACH(map, e) {
    +
    866  if (e->w <= 0) {
    +
    867  continue;
    +
    868  }
    +
    869  int x = e->x - ox;
    +
    870  int y = e->y - oy;
    +
    871  int z = e->z - oz;
    +
    872  int f1 = is_transparent(blocks[x - 1][y][z]);
    +
    873  int f2 = is_transparent(blocks[x + 1][y][z]);
    +
    874  int f3 = is_transparent(blocks[x][y + 1][z]);
    +
    875  int f4 = is_transparent(blocks[x][y - 1][z]) && (e->y > 0);
    +
    876  int f5 = is_transparent(blocks[x][y][z - 1]);
    +
    877  int f6 = is_transparent(blocks[x][y][z + 1]);
    +
    878  int total = f1 + f2 + f3 + f4 + f5 + f6;
    +
    879  if (is_plant(e->w)) {
    +
    880  total = total ? 4 : 0;
    +
    881  }
    +
    882  if (is_alpha(e->w)) {
    +
    883  alpha_faces += total;
    +
    884  }
    +
    885  else {
    +
    886  faces += total;
    +
    887  }
    + +
    889 
    +
    890  // third pass - generate geometry
    +
    891  GLfloat *data = malloc_faces(9, faces);
    +
    892  GLfloat *alpha_data = malloc_faces(9, alpha_faces);
    +
    893  int offset = 0;
    +
    894  int alpha_offset = 0;
    +
    895  MAP_FOR_EACH(map, e) {
    +
    896  if (e->w <= 0) {
    +
    897  continue;
    +
    898  }
    +
    899  int x = e->x - ox;
    +
    900  int y = e->y - oy;
    +
    901  int z = e->z - oz;
    +
    902  int f1 = is_transparent(blocks[x - 1][y][z]);
    +
    903  int f2 = is_transparent(blocks[x + 1][y][z]);
    +
    904  int f3 = is_transparent(blocks[x][y + 1][z]);
    +
    905  int f4 = is_transparent(blocks[x][y - 1][z]) && (e->y > 0);
    +
    906  int f5 = is_transparent(blocks[x][y][z - 1]);
    +
    907  int f6 = is_transparent(blocks[x][y][z + 1]);
    +
    908  int total = f1 + f2 + f3 + f4 + f5 + f6;
    +
    909  if (is_plant(e->w)) {
    +
    910  total = total ? 4 : 0;
    +
    911  }
    +
    912  if (total == 0) {
    +
    913  continue;
    +
    914  }
    +
    915  chunk->miny = MIN(chunk->miny, e->y);
    +
    916  chunk->maxy = MAX(chunk->maxy, e->y);
    +
    917  if (is_plant(e->w)) {
    +
    918  float rotation = simplex2(e->x, e->z, 4, 0.5, 2) * 360;
    +
    919  make_plant(
    +
    920  data + offset,
    +
    921  e->x, e->y, e->z, 0.5, e->w, rotation);
    +
    922  offset += total * 54;
    +
    923  }
    +
    924  else {
    +
    925  int index = 0;
    +
    926  for (int dx = -1; dx <= 1; dx++) {
    +
    927  for (int dy = -1; dy <= 1; dy++) {
    +
    928  for (int dz = -1; dz <= 1; dz++) {
    +
    929  int w = blocks[x + dx][y + dy][z + dz];
    +
    930  neighbors[index++] = !is_transparent(w);
    +
    931  }
    +
    932  }
    +
    933  }
    +
    934  float ao[6][4];
    +
    935  occlusion(neighbors, ao);
    +
    936  if (is_alpha(e->w)) {
    +
    937  make_cube(
    +
    938  alpha_data + alpha_offset, ao,
    +
    939  f1, f2, f3, f4, f5, f6,
    +
    940  e->x, e->y, e->z, 0.5, e->w);
    +
    941  alpha_offset += total * 54;
    +
    942  }
    +
    943  else {
    +
    944  make_cube(
    +
    945  data + offset, ao,
    +
    946  f1, f2, f3, f4, f5, f6,
    +
    947  e->x, e->y, e->z, 0.5, e->w);
    +
    948  offset += total * 54;
    +
    949  }
    +
    950  }
    + +
    952 
    +
    953  del_buffer(chunk->buffer);
    +
    954  del_buffer(chunk->alpha_buffer);
    +
    955  chunk->buffer = gen_faces(9, faces, data);
    +
    956  chunk->alpha_buffer = gen_faces(9, alpha_faces, alpha_data);
    +
    957  chunk->faces = faces;
    +
    958  chunk->alpha_faces = alpha_faces;
    +
    959 
    +
    960  gen_sign_buffer(chunk);
    +
    961 
    +
    962  chunk->dirty = 0;
    +
    963 }
    +
    void make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
    Definition: cube.c:81
    +
    void make_plant(float *data, float px, float py, float pz, float n, int w, float rotation)
    Definition: cube.c:99
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    int is_transparent(int w)
    Definition: item.c:180
    +
    int is_alpha(int w)
    Definition: item.c:200
    +
    void occlusion(char neighbors[27], float result[6][4])
    Definition: main.c:812
    +
    void gen_sign_buffer(Chunk *chunk)
    Definition: main.c:788
    +
    #define END_MAP_FOR_EACH
    Definition: map.h:13
    +
    #define MAP_FOR_EACH(map, entry)
    Definition: map.h:6
    +
    int maxy
    Definition: main.c:50
    +
    int miny
    Definition: main.c:49
    +
    GLfloat * malloc_faces(int components, int faces)
    Definition: util.c:53
    +
    GLuint gen_faces(int components, int faces, GLfloat *data)
    Definition: util.c:57
    +
    +
    +
    + +

    ◆ gen_crosshair_buffer()

    + +
    +
    + + + + + + + +
    GLuint gen_crosshair_buffer ()
    +
    + +

    Definition at line 213 of file main.c.

    +
    213  {
    +
    214  int x = g->width / 2;
    +
    215  int y = g->height / 2;
    +
    216  int p = 10 * g->scale;
    +
    217  float data[] = {
    +
    218  x, y - p, x, y + p,
    +
    219  x - p, y, x + p, y
    +
    220  };
    +
    221  return gen_buffer(sizeof(data), data);
    +
    222 }
    +
    int scale
    Definition: main.c:119
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    +
    +
    + +

    ◆ gen_cube_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_cube_buffer (float x,
    float y,
    float z,
    float n,
    int w 
    )
    +
    + +

    Definition at line 236 of file main.c.

    +
    236  {
    +
    237  GLfloat *data = malloc_faces(9, 6);
    +
    238  float ao[6][4] = {0};
    +
    239  make_cube(data, ao, 1, 1, 1, 1, 1, 1, x, y, z, n, w);
    +
    240  return gen_faces(9, 6, data);
    +
    241 }
    +
    +
    +
    + +

    ◆ gen_plant_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_plant_buffer (float x,
    float y,
    float z,
    float n,
    int w 
    )
    +
    + +

    Definition at line 243 of file main.c.

    +
    243  {
    +
    244  GLfloat *data = malloc_faces(9, 4);
    +
    245  make_plant(data, x, y, z, n, w, 45);
    +
    246  return gen_faces(9, 4, data);
    +
    247 }
    +
    +
    +
    + +

    ◆ gen_player_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_player_buffer (float x,
    float y,
    float z,
    float rx,
    float ry 
    )
    +
    + +

    Definition at line 249 of file main.c.

    +
    249  {
    +
    250  GLfloat *data = malloc_faces(9, 6);
    +
    251  make_player(data, x, y, z, rx, ry);
    +
    252  return gen_faces(9, 6, data);
    +
    253 }
    +
    void make_player(float *data, float x, float y, float z, float rx, float ry)
    Definition: cube.c:158
    +
    +
    +
    + +

    ◆ gen_sign_buffer()

    + +
    +
    + + + + + + + + +
    void gen_sign_buffer (Chunkchunk)
    +
    + +

    Definition at line 788 of file main.c.

    +
    788  {
    +
    789  SignList *signs = &chunk->signs;
    +
    790 
    +
    791  // first pass - count characters
    +
    792  int max_faces = 0;
    +
    793  for (int i = 0; i < signs->size; i++) {
    +
    794  Sign *e = signs->data + i;
    +
    795  max_faces += strlen(e->text);
    +
    796  }
    +
    797 
    +
    798  // second pass - generate geometry
    +
    799  GLfloat *data = malloc_faces(5, max_faces);
    +
    800  int faces = 0;
    +
    801  for (int i = 0; i < signs->size; i++) {
    +
    802  Sign *e = signs->data + i;
    +
    803  faces += _gen_sign_buffer(
    +
    804  data + faces * 30, e->x, e->y, e->z, e->face, e->text);
    +
    805  }
    +
    806 
    +
    807  del_buffer(chunk->sign_buffer);
    +
    808  chunk->sign_buffer = gen_faces(5, faces, data);
    +
    809  chunk->sign_faces = faces;
    +
    810 }
    +
    int _gen_sign_buffer(GLfloat *data, float x, float y, float z, int face, const char *text)
    Definition: main.c:725
    +
    unsigned int size
    Definition: sign.h:16
    +
    Sign * data
    Definition: sign.h:17
    +
    Definition: sign.h:6
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    char text[MAX_SIGN_LENGTH]
    Definition: sign.h:11
    +
    int y
    Definition: sign.h:8
    +
    +
    +
    + +

    ◆ gen_sky_buffer()

    + +
    +
    + + + + + + + +
    GLuint gen_sky_buffer ()
    +
    + +

    Definition at line 230 of file main.c.

    +
    230  {
    +
    231  float data[12288];
    +
    232  make_sphere(data, 1, 3);
    +
    233  return gen_buffer(sizeof(data), data);
    +
    234 }
    +
    void make_sphere(float *data, float r, int detail)
    Definition: cube.c:336
    +
    +
    +
    + +

    ◆ gen_text_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_text_buffer (float x,
    float y,
    float n,
    char * text 
    )
    +
    + +

    Definition at line 255 of file main.c.

    +
    255  {
    +
    256  int length = strlen(text);
    +
    257  GLfloat *data = malloc_faces(4, length);
    +
    258  for (int i = 0; i < length; i++) {
    +
    259  make_character(data + i * 24, x, y, n / 2, n, text[i]);
    +
    260  x += n;
    +
    261  }
    +
    262  return gen_faces(4, length, data);
    +
    263 }
    +
    void make_character(float *data, float x, float y, float n, float m, char c)
    Definition: cube.c:206
    +
    +
    +
    + +

    ◆ gen_wireframe_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_wireframe_buffer (float x,
    float y,
    float z,
    float n 
    )
    +
    + +

    Definition at line 224 of file main.c.

    +
    224  {
    +
    225  float data[72];
    +
    226  make_cube_wireframe(data, x, y, z, n);
    +
    227  return gen_buffer(sizeof(data), data);
    +
    228 }
    +
    void make_cube_wireframe(float *data, float x, float y, float z, float n)
    Definition: cube.c:181
    +
    +
    +
    + +

    ◆ get_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int get_block (int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 1211 of file main.c.

    +
    1211  {
    +
    1212  int p = chunked(x);
    +
    1213  int q = chunked(z);
    +
    1214  Chunk *chunk = find_chunk(p, q);
    +
    1215  if (chunk) {
    +
    1216  Map *map = &chunk->map;
    +
    1217  return map_get(map, x, y, z);
    +
    1218  }
    +
    1219  return 0;
    +
    1220 }
    +
    +
    +
    + +

    ◆ get_daylight()

    + +
    +
    + + + + + + + +
    float get_daylight ()
    +
    + +

    Definition at line 153 of file main.c.

    +
    153  {
    +
    154  float timer = time_of_day();
    +
    155  if (timer < 0.5) {
    +
    156  float t = (timer - 0.25) * 100;
    +
    157  return 1 / (1 + powf(2, -t));
    +
    158  }
    +
    159  else {
    +
    160  float t = (timer - 0.90) * 100;
    +
    161  return 1 - 1 / (1 + powf(2, -t));
    +
    162  }
    +
    163 }
    +
    float time_of_day()
    Definition: main.c:141
    +
    +
    +
    + +

    ◆ get_motion_vector()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void get_motion_vector (int flying,
    int sz,
    int sx,
    float rx,
    float ry,
    float * vx,
    float * vy,
    float * vz 
    )
    +
    + +

    Definition at line 183 of file main.c.

    +
    184  {
    +
    185  *vx = 0; *vy = 0; *vz = 0;
    +
    186  if (!sz && !sx) {
    +
    187  return;
    +
    188  }
    +
    189  float strafe = atan2f(sz, sx);
    +
    190  if (flying) {
    +
    191  float m = cosf(ry);
    +
    192  float y = sinf(ry);
    +
    193  if (sx) {
    +
    194  if (!sz) {
    +
    195  y = 0;
    +
    196  }
    +
    197  m = 1;
    +
    198  }
    +
    199  if (sz > 0) {
    +
    200  y = -y;
    +
    201  }
    +
    202  *vx = cosf(rx + strafe) * m;
    +
    203  *vy = y;
    +
    204  *vz = sinf(rx + strafe) * m;
    +
    205  }
    +
    206  else {
    +
    207  *vx = cosf(rx + strafe);
    +
    208  *vy = 0;
    +
    209  *vz = sinf(rx + strafe);
    +
    210  }
    +
    211 }
    +
    +
    +
    + +

    ◆ get_scale_factor()

    + +
    +
    + + + + + + + +
    int get_scale_factor ()
    +
    + +

    Definition at line 165 of file main.c.

    +
    165  {
    +
    166  int window_width, window_height;
    +
    167  int buffer_width, buffer_height;
    +
    168  glfwGetWindowSize(g->window, &window_width, &window_height);
    +
    169  glfwGetFramebufferSize(g->window, &buffer_width, &buffer_height);
    +
    170  int result = buffer_width / window_width;
    +
    171  result = MAX(1, result);
    +
    172  result = MIN(2, result);
    +
    173  return result;
    +
    174 }
    +
    +
    +
    + +

    ◆ get_sight_vector()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void get_sight_vector (float rx,
    float ry,
    float * vx,
    float * vy,
    float * vz 
    )
    +
    + +

    Definition at line 176 of file main.c.

    +
    176  {
    +
    177  float m = cosf(ry);
    +
    178  *vx = cosf(rx - RADIANS(90)) * m;
    +
    179  *vy = sinf(ry);
    +
    180  *vz = sinf(rx - RADIANS(90)) * m;
    +
    181 }
    +
    #define RADIANS(degrees)
    Definition: util.h:10
    +
    +
    +
    + +

    ◆ handle_fall_damage()

    + +
    +
    + + + + + + + + +
    void handle_fall_damage (float dy)
    +
    + +

    Definition at line 2070 of file main.c.

    +
    2070  {
    +
    2071  // If a player's downward velocity is 15 or more...
    +
    2072  if (dy <= -15) {
    +
    2073  float damage = dy / -5.25;
    +
    2074  inflict_damage(damage);
    +
    2075  }
    +
    2076 }
    +
    void inflict_damage(float damage)
    Definition: main.c:2080
    +
    +
    +
    + +

    ◆ handle_lava_damage()

    + +
    +
    + + + + + + + +
    void handle_lava_damage ()
    +
    + +

    Definition at line 2047 of file main.c.

    +
    2047  {
    +
    2048  int p = chunked(g->players->state.x);
    +
    2049  int q = chunked(g->players->state.z);
    +
    2050  Chunk *chunk = find_chunk(p, q);
    +
    2051  if (!chunk) {
    +
    2052  return;
    +
    2053  }
    +
    2054  Map *map = &chunk->map;
    +
    2055  int rx = roundf(g->players->state.x);
    +
    2056  int ry = roundf(g->players->state.y);
    +
    2057  int rz = roundf(g->players->state.z);
    +
    2058 
    +
    2059  int chunkTypeUpperBody = map_get(map, rx, ry, rz);
    +
    2060  int chunkTypeLowerBody = map_get(map, rx, ry-1, rz);
    +
    2061 
    +
    2062  if (chunkTypeUpperBody == LAVA || chunkTypeLowerBody == LAVA) {
    +
    2063  inflict_damage(.05);
    +
    2064  }
    +
    2065 
    +
    2066 }
    +
    #define LAVA
    Definition: item.h:28
    +
    +
    +
    + +

    ◆ handle_mouse_input()

    + +
    +
    + + + + + + + +
    void handle_mouse_input ()
    +
    + +

    Definition at line 1960 of file main.c.

    +
    1960  {
    +
    1961  int exclusive =
    +
    1962  glfwGetInputMode(g->window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1963  static double px = 0;
    +
    1964  static double py = 0;
    +
    1965  State *s = &g->players->state;
    +
    1966  if (exclusive && (px || py)) {
    +
    1967  double mx, my;
    +
    1968  glfwGetCursorPos(g->window, &mx, &my);
    +
    1969  s->rx += (mx - px) * g->sensitivity;
    +
    1970  if (INVERT_MOUSE) {
    +
    1971  s->ry += (my - py) * g->sensitivity;
    +
    1972  }
    +
    1973  else {
    +
    1974  s->ry -= (my - py) * g->sensitivity;
    +
    1975  }
    +
    1976  if (s->rx < 0) {
    +
    1977  s->rx += RADIANS(360);
    +
    1978  }
    +
    1979  if (s->rx >= RADIANS(360)){
    +
    1980  s->rx -= RADIANS(360);
    +
    1981  }
    +
    1982  s->ry = MAX(s->ry, -RADIANS(90));
    +
    1983  s->ry = MIN(s->ry, RADIANS(90));
    +
    1984  px = mx;
    +
    1985  py = my;
    +
    1986  }
    +
    1987  else {
    +
    1988  glfwGetCursorPos(g->window, &px, &py);
    +
    1989  }
    +
    1990 }
    +
    #define INVERT_MOUSE
    Definition: config.h:15
    +
    float sensitivity
    Definition: main.c:99
    +
    +
    +
    + +

    ◆ handle_movement()

    + +
    +
    + + + + + + + + +
    void handle_movement (double dt)
    +
    + +

    Definition at line 2102 of file main.c.

    +
    2102  {
    +
    2103  static float dy = 0;
    +
    2104  State *s = &g->players->state;
    +
    2105  int sz = 0;
    +
    2106  int sx = 0;
    +
    2107  if (!g->typing) {
    +
    2108  float m = dt * 1.0;
    +
    2109  g->ortho = glfwGetKey(g->window, CRAFT_KEY_ORTHO) ? 64 : 0;
    +
    2110  g->fov = glfwGetKey(g->window, CRAFT_KEY_ZOOM) ? 15 : 65;
    +
    2111  if (glfwGetKey(g->window, CRAFT_KEY_FORWARD)) sz--;
    +
    2112  if (glfwGetKey(g->window, CRAFT_KEY_BACKWARD)) sz++;
    +
    2113  if (glfwGetKey(g->window, CRAFT_KEY_LEFT)) sx--;
    +
    2114  if (glfwGetKey(g->window, CRAFT_KEY_RIGHT)) sx++;
    +
    2115  if (glfwGetKey(g->window, GLFW_KEY_LEFT)) s->rx -= m;
    +
    2116  if (glfwGetKey(g->window, GLFW_KEY_RIGHT)) s->rx += m;
    +
    2117  if (glfwGetKey(g->window, GLFW_KEY_UP)) s->ry += m;
    +
    2118  if (glfwGetKey(g->window, GLFW_KEY_DOWN)) s->ry -= m;
    +
    2119  if (glfwGetKey(g->window, GLFW_KEY_M)) g->sensitivity *= 1.1;
    +
    2120  if (glfwGetKey(g->window, GLFW_KEY_N)) g->sensitivity *= 0.9;
    +
    2121  }
    +
    2122  float vx, vy, vz;
    +
    2123  get_motion_vector(g->flying, sz, sx, s->rx, s->ry, &vx, &vy, &vz);
    +
    2124  if (!g->typing) {
    +
    2125  if (glfwGetKey(g->window, CRAFT_KEY_JUMP)) {
    +
    2126  if (g->flying) {
    +
    2127  vy = 1;
    +
    2128  }
    +
    2129  else if (dy == 0) {
    +
    2130  dy = 8;
    +
    2131  }
    +
    2132  }
    +
    2133  }
    +
    2134  float speed = handle_player_speed();
    +
    2135  int estimate = roundf(sqrtf(
    +
    2136  powf(vx * speed, 2) +
    +
    2137  powf(vy * speed + ABS(dy) * 2, 2) +
    +
    2138  powf(vz * speed, 2)) * dt * 8);
    +
    2139  int step = MAX(8, estimate);
    +
    2140  float ut = dt / step;
    +
    2141  vx = vx * ut * speed;
    +
    2142  vy = vy * ut * speed;
    +
    2143  vz = vz * ut * speed;
    +
    2144  float dyAtCollision = 0;
    +
    2145  for (int i = 0; i < step; i++) {
    +
    2146  if (g->flying) {
    +
    2147  dy = 0;
    +
    2148  }
    +
    2149  else {
    +
    2150  dy -= ut * 25;
    +
    2151  dy = MAX(dy, -250);
    +
    2152  }
    +
    2153  s->x += vx;
    +
    2154  s->y += vy + dy * ut;
    +
    2155  s->z += vz;
    +
    2156  if (collide(2, &s->x, &s->y, &s->z)) {
    +
    2157  if (!dyAtCollision)
    +
    2158  dyAtCollision = dy;
    +
    2159  dy = 0;
    +
    2160  }
    +
    2161  }
    +
    2162  handle_fall_damage(dyAtCollision);
    +
    2163 
    +
    2164  if (s->y < 0) {
    +
    2165  s->y = highest_block(s->x, s->z) + 2;
    +
    2166  }
    +
    2167 }
    +
    #define CRAFT_KEY_ORTHO
    Definition: config.h:41
    +
    #define CRAFT_KEY_FORWARD
    Definition: config.h:30
    +
    #define CRAFT_KEY_ZOOM
    Definition: config.h:40
    +
    #define CRAFT_KEY_RIGHT
    Definition: config.h:33
    +
    #define CRAFT_KEY_JUMP
    Definition: config.h:34
    +
    #define CRAFT_KEY_LEFT
    Definition: config.h:32
    +
    #define CRAFT_KEY_BACKWARD
    Definition: config.h:31
    +
    int highest_block(float x, float z)
    Definition: main.c:554
    +
    void get_motion_vector(int flying, int sz, int sx, float rx, float ry, float *vx, float *vy, float *vz)
    Definition: main.c:183
    +
    void handle_fall_damage(float dy)
    Definition: main.c:2070
    +
    int collide(int height, float *x, float *y, float *z)
    Definition: main.c:668
    +
    float handle_player_speed()
    Definition: main.c:2091
    +
    int typing
    Definition: main.c:108
    +
    int flying
    Definition: main.c:116
    +
    +
    +
    + +

    ◆ handle_player_health()

    + +
    +
    + + + + + + + +
    void handle_player_health ()
    +
    + +

    Definition at line 2031 of file main.c.

    +
    2031  {
    +
    2032  // If player has no more health...
    +
    2033  if (g->players->health <= 0) {
    +
    2034  // Reset the player health.
    + +
    2036  // Respawn.
    +
    2037  g->players->state.x = 0;
    +
    2038  g->players->state.y = highest_block(0, 0) + 2; // Player's vertical position should be the highest block at position(0, 0) plus 2 for the player's height.
    +
    2039  g->players->state.z = 0;
    +
    2040  }
    +
    2041 
    +
    2042  heal_damage(0.001);
    + +
    2044 }
    +
    void heal_damage(float healing)
    Definition: main.c:2085
    +
    void handle_lava_damage()
    Definition: main.c:2047
    +
    #define MAX_PLAYER_HEALTH
    Definition: main.c:38
    +
    float health
    Definition: main.c:75
    +
    +
    +
    + +

    ◆ handle_player_speed()

    + +
    +
    + + + + + + + +
    float handle_player_speed ()
    +
    + +

    Definition at line 2091 of file main.c.

    +
    2091  {
    + +
    2093 
    +
    2094  // Only slow movement if the player is not flying.
    +
    2095  float speed = g->flying ? 20 : (g->slowed ? 1 : 5);
    +
    2096  if(glfwGetKey(g->window, GLFW_KEY_LEFT_CONTROL) && !g->flying) {
    +
    2097  speed *= 1.5f;
    +
    2098  }
    +
    2099  return speed;
    +
    2100 }
    +
    int is_movement_slowed(Player *player)
    Definition: main.c:1994
    +
    int slowed
    Definition: main.c:117
    +
    +
    +
    + +

    ◆ heal_damage()

    + +
    +
    + + + + + + + + +
    void heal_damage (float healing)
    +
    + +

    Definition at line 2085 of file main.c.

    +
    2085  {
    +
    2086  if(g->players->health < MAX_PLAYER_HEALTH) g->players->health += healing;
    +
    2087 }
    +
    +
    +
    + +

    ◆ highest_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int highest_block (float x,
    float z 
    )
    +
    + +

    Definition at line 554 of file main.c.

    +
    554  {
    +
    555  int result = -1;
    +
    556  int nx = roundf(x);
    +
    557  int nz = roundf(z);
    +
    558  int p = chunked(x);
    +
    559  int q = chunked(z);
    +
    560  Chunk *chunk = find_chunk(p, q);
    +
    561  if (chunk) {
    +
    562  Map *map = &chunk->map;
    +
    563  MAP_FOR_EACH(map, e) {
    +
    564  if (is_obstacle(e->w) && e->x == nx && e->z == nz) {
    +
    565  result = MAX(result, e->y);
    +
    566  }
    + +
    568  }
    +
    569  return result;
    +
    570 }
    +
    +
    +
    + +

    ◆ hit_test()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int hit_test (int previous,
    float x,
    float y,
    float z,
    float rx,
    float ry,
    int * bx,
    int * by,
    int * bz 
    )
    +
    + +

    Definition at line 604 of file main.c.

    +
    607 {
    +
    608  int result = 0;
    +
    609  float best = 0;
    +
    610  int p = chunked(x);
    +
    611  int q = chunked(z);
    +
    612  float vx, vy, vz;
    +
    613  get_sight_vector(rx, ry, &vx, &vy, &vz);
    +
    614  for (int i = 0; i < g->chunk_count; i++) {
    +
    615  Chunk *chunk = g->chunks + i;
    +
    616  if (chunk_distance(chunk, p, q) > 1) {
    +
    617  continue;
    +
    618  }
    +
    619  int hx, hy, hz;
    +
    620  int hw = _hit_test(&chunk->map, 8, previous,
    +
    621  x, y, z, vx, vy, vz, &hx, &hy, &hz);
    +
    622  if (hw > 0) {
    +
    623  float d = sqrtf(
    +
    624  powf(hx - x, 2) + powf(hy - y, 2) + powf(hz - z, 2));
    +
    625  if (best == 0 || d < best) {
    +
    626  best = d;
    +
    627  *bx = hx; *by = hy; *bz = hz;
    +
    628  result = hw;
    +
    629  }
    +
    630  }
    +
    631  }
    +
    632  return result;
    +
    633 }
    +
    int _hit_test(Map *map, float max_distance, int previous, float x, float y, float z, float vx, float vy, float vz, int *hx, int *hy, int *hz)
    Definition: main.c:572
    +
    void get_sight_vector(float rx, float ry, float *vx, float *vy, float *vz)
    Definition: main.c:176
    +
    +
    +
    + +

    ◆ hit_test_face()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int hit_test_face (Playerplayer,
    int * x,
    int * y,
    int * z,
    int * face 
    )
    +
    + +

    Definition at line 635 of file main.c.

    +
    635  {
    +
    636  State *s = &player->state;
    +
    637  int w = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, x, y, z);
    +
    638  if (is_obstacle(w)) {
    +
    639  int hx, hy, hz;
    +
    640  hit_test(1, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    641  int dx = hx - *x;
    +
    642  int dy = hy - *y;
    +
    643  int dz = hz - *z;
    +
    644  if (dx == -1 && dy == 0 && dz == 0) {
    +
    645  *face = 0; return 1;
    +
    646  }
    +
    647  if (dx == 1 && dy == 0 && dz == 0) {
    +
    648  *face = 1; return 1;
    +
    649  }
    +
    650  if (dx == 0 && dy == 0 && dz == -1) {
    +
    651  *face = 2; return 1;
    +
    652  }
    +
    653  if (dx == 0 && dy == 0 && dz == 1) {
    +
    654  *face = 3; return 1;
    +
    655  }
    +
    656  if (dx == 0 && dy == 1 && dz == 0) {
    +
    657  int degrees = roundf(DEGREES(atan2f(s->x - hx, s->z - hz)));
    +
    658  if (degrees < 0) {
    +
    659  degrees += 360;
    +
    660  }
    +
    661  int top = ((degrees + 45) / 90) % 4;
    +
    662  *face = 4 + top; return 1;
    +
    663  }
    +
    664  }
    +
    665  return 0;
    +
    666 }
    +
    int hit_test(int previous, float x, float y, float z, float rx, float ry, int *bx, int *by, int *bz)
    Definition: main.c:604
    +
    #define DEGREES(radians)
    Definition: util.h:9
    +
    +
    +
    + +

    ◆ inflict_damage()

    + +
    +
    + + + + + + + + +
    void inflict_damage (float damage)
    +
    + +

    Definition at line 2080 of file main.c.

    +
    2080  {
    +
    2081  g->players->health -= damage;
    +
    2082 }
    +
    +
    +
    + +

    ◆ interpolate_player()

    + +
    +
    + + + + + + + + +
    void interpolate_player (Playerplayer)
    +
    + +

    Definition at line 414 of file main.c.

    +
    414  {
    +
    415  State *s1 = &player->state1;
    +
    416  State *s2 = &player->state2;
    +
    417  float t1 = s2->t - s1->t;
    +
    418  float t2 = glfwGetTime() - s2->t;
    +
    419  t1 = MIN(t1, 1);
    +
    420  t1 = MAX(t1, 0.1);
    +
    421  float p = MIN(t2 / t1, 1);
    + +
    423  player,
    +
    424  s1->x + (s2->x - s1->x) * p,
    +
    425  s1->y + (s2->y - s1->y) * p,
    +
    426  s1->z + (s2->z - s1->z) * p,
    +
    427  s1->rx + (s2->rx - s1->rx) * p,
    +
    428  s1->ry + (s2->ry - s1->ry) * p,
    +
    429  0);
    +
    430 }
    +
    void update_player(Player *player, float x, float y, float z, float rx, float ry, int interpolate)
    Definition: main.c:390
    +
    State state1
    Definition: main.c:77
    +
    State state2
    Definition: main.c:78
    +
    float t
    Definition: main.c:69
    +
    +
    +
    + +

    ◆ is_movement_slowed()

    + +
    +
    + + + + + + + + +
    int is_movement_slowed (Playerplayer)
    +
    + +

    Definition at line 1994 of file main.c.

    +
    1994  {
    +
    1995  int height = 2;
    +
    1996  float *x = &player->state.x;
    +
    1997  float *y = &player->state.y;
    +
    1998  float *z = &player->state.z;
    +
    1999 
    +
    2000  int result = 0;
    +
    2001  int p = chunked(*x);
    +
    2002  int q = chunked(*z);
    +
    2003  Chunk *chunk = find_chunk(p, q);
    +
    2004  if (!chunk) {
    +
    2005  return result;
    +
    2006  }
    +
    2007  Map *map = &chunk->map;
    +
    2008  int nx = roundf(*x);
    +
    2009  int ny = roundf(*y);
    +
    2010  int nz = roundf(*z);
    +
    2011  float px = *x - nx;
    +
    2012  float py = *y - ny;
    +
    2013  float pz = *z - nz;
    +
    2014  float pad = 0.25;
    +
    2015  for (int dy = 0; dy < height; dy++) {
    +
    2016  // Check if player is intersecting with an item that is slowing.
    +
    2017  if ( px < -pad && is_slowing(map_get(map, nx - 1, ny - dy, nz))
    +
    2018  || px > pad && is_slowing(map_get(map, nx + 1, ny - dy, nz))
    +
    2019  || py < -pad && is_slowing(map_get(map, nx, ny - dy - 1, nz))
    +
    2020  || py > pad && is_slowing(map_get(map, nx, ny - dy + 1, nz))
    +
    2021  || pz < -pad && is_slowing(map_get(map, nx, ny - dy, nz - 1))
    +
    2022  || pz > pad && is_slowing(map_get(map, nx, ny - dy, nz + 1))
    +
    2023  ) {
    +
    2024  result = 1;
    +
    2025  }
    +
    2026  }
    +
    2027  return result;
    +
    2028 }
    +
    int is_slowing(int w)
    Definition: item.c:214
    +
    +
    +
    + +

    ◆ login()

    + +
    +
    + + + + + + + +
    void login ()
    +
    + +

    Definition at line 1436 of file main.c.

    +
    1436  {
    +
    1437  char username[128] = {0};
    +
    1438  char identity_token[128] = {0};
    +
    1439  char access_token[128] = {0};
    +
    1440  if (db_auth_get_selected(username, 128, identity_token, 128)) {
    +
    1441  printf("Contacting login server for username: %s\n", username);
    +
    1442  if (get_access_token(
    +
    1443  access_token, 128, username, identity_token))
    +
    1444  {
    +
    1445  printf("Successfully authenticated with the login server\n");
    +
    1446  client_login(username, access_token);
    +
    1447  }
    +
    1448  else {
    +
    1449  printf("Failed to authenticate with the login server\n");
    +
    1450  client_login("", "");
    +
    1451  }
    +
    1452  }
    +
    1453  else {
    +
    1454  printf("Logging in anonymously\n");
    +
    1455  client_login("", "");
    +
    1456  }
    +
    1457 }
    +
    int get_access_token(char *result, int length, char *username, char *identity_token)
    Definition: auth.c:21
    +
    void client_login(const char *username, const char *identity_token)
    Definition: client.c:78
    +
    int db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length)
    Definition: db.c:226
    +
    +
    +
    + +

    ◆ main()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int main (int argc,
    char ** argv 
    )
    +
    + +

    Definition at line 2267 of file main.c.

    +
    2267  {
    +
    2268  // INITIALIZATION //
    +
    2269  curl_global_init(CURL_GLOBAL_DEFAULT);
    +
    2270  srand(time(NULL));
    +
    2271  rand();
    +
    2272 
    +
    2273  // WINDOW INITIALIZATION //
    +
    2274  if (!glfwInit()) {
    +
    2275  return -1;
    +
    2276  }
    +
    2277  create_window();
    +
    2278  if (!g->window) {
    +
    2279  glfwTerminate();
    +
    2280  return -1;
    +
    2281  }
    +
    2282 
    +
    2283  glfwMakeContextCurrent(g->window);
    +
    2284  glfwSwapInterval(VSYNC);
    +
    2285  glfwSetInputMode(g->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    +
    2286  glfwSetKeyCallback(g->window, on_key);
    +
    2287  glfwSetCharCallback(g->window, on_char);
    +
    2288  glfwSetMouseButtonCallback(g->window, on_mouse_button);
    +
    2289  glfwSetScrollCallback(g->window, on_scroll);
    +
    2290 
    +
    2291  if (glewInit() != GLEW_OK) {
    +
    2292  return -1;
    +
    2293  }
    +
    2294 
    +
    2295  glEnable(GL_CULL_FACE);
    +
    2296  glEnable(GL_DEPTH_TEST);
    +
    2297  glLogicOp(GL_INVERT);
    +
    2298  glClearColor(0, 0, 0, 1);
    +
    2299 
    +
    2300  // LOAD TEXTURES //
    +
    2301  GLuint texture;
    +
    2302  glGenTextures(1, &texture);
    +
    2303  glActiveTexture(GL_TEXTURE0);
    +
    2304  glBindTexture(GL_TEXTURE_2D, texture);
    +
    2305  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    +
    2306  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    +
    2307  load_png_texture("textures/texture.png");
    +
    2308 
    +
    2309  GLuint font;
    +
    2310  glGenTextures(1, &font);
    +
    2311  glActiveTexture(GL_TEXTURE1);
    +
    2312  glBindTexture(GL_TEXTURE_2D, font);
    +
    2313  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    +
    2314  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    +
    2315  load_png_texture("textures/font.png");
    +
    2316 
    +
    2317  GLuint sky;
    +
    2318  glGenTextures(1, &sky);
    +
    2319  glActiveTexture(GL_TEXTURE2);
    +
    2320  glBindTexture(GL_TEXTURE_2D, sky);
    +
    2321  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    +
    2322  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    +
    2323  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    +
    2324  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    +
    2325  load_png_texture("textures/sky.png");
    +
    2326 
    +
    2327  GLuint sign;
    +
    2328  glGenTextures(1, &sign);
    +
    2329  glActiveTexture(GL_TEXTURE3);
    +
    2330  glBindTexture(GL_TEXTURE_2D, sign);
    +
    2331  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    +
    2332  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    +
    2333  load_png_texture("textures/sign.png");
    +
    2334 
    +
    2335  // LOAD SHADERS //
    +
    2336  Attrib block_attrib = {0};
    +
    2337  Attrib line_attrib = {0};
    +
    2338  Attrib text_attrib = {0};
    +
    2339  Attrib sky_attrib = {0};
    +
    2340  GLuint program;
    +
    2341 
    +
    2342  program = load_program(
    +
    2343  "shaders/block_vertex.glsl", "shaders/block_fragment.glsl");
    +
    2344  block_attrib.program = program;
    +
    2345  block_attrib.position = glGetAttribLocation(program, "position");
    +
    2346  block_attrib.normal = glGetAttribLocation(program, "normal");
    +
    2347  block_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2348  block_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2349  block_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2350  block_attrib.extra1 = glGetUniformLocation(program, "sky_sampler");
    +
    2351  block_attrib.extra2 = glGetUniformLocation(program, "daylight");
    +
    2352  block_attrib.extra3 = glGetUniformLocation(program, "fog_distance");
    +
    2353  block_attrib.extra4 = glGetUniformLocation(program, "ortho");
    +
    2354  block_attrib.camera = glGetUniformLocation(program, "camera");
    +
    2355  block_attrib.timer = glGetUniformLocation(program, "timer");
    +
    2356 
    +
    2357  program = load_program(
    +
    2358  "shaders/line_vertex.glsl", "shaders/line_fragment.glsl");
    +
    2359  line_attrib.program = program;
    +
    2360  line_attrib.position = glGetAttribLocation(program, "position");
    +
    2361  line_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2362 
    +
    2363  program = load_program(
    +
    2364  "shaders/text_vertex.glsl", "shaders/text_fragment.glsl");
    +
    2365  text_attrib.program = program;
    +
    2366  text_attrib.position = glGetAttribLocation(program, "position");
    +
    2367  text_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2368  text_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2369  text_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2370  text_attrib.extra1 = glGetUniformLocation(program, "is_sign");
    +
    2371 
    +
    2372  program = load_program(
    +
    2373  "shaders/sky_vertex.glsl", "shaders/sky_fragment.glsl");
    +
    2374  sky_attrib.program = program;
    +
    2375  sky_attrib.position = glGetAttribLocation(program, "position");
    +
    2376  sky_attrib.normal = glGetAttribLocation(program, "normal");
    +
    2377  sky_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2378  sky_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2379  sky_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2380  sky_attrib.timer = glGetUniformLocation(program, "timer");
    +
    2381 
    +
    2382  // CHECK COMMAND LINE ARGUMENTS //
    +
    2383  if (argc == 2 || argc == 3) {
    +
    2384  g->mode = MODE_ONLINE;
    +
    2385  strncpy(g->server_addr, argv[1], MAX_ADDR_LENGTH);
    +
    2386  g->server_port = argc == 3 ? atoi(argv[2]) : DEFAULT_PORT;
    +
    2387  snprintf(g->db_path, MAX_PATH_LENGTH,
    +
    2388  "cache.%s.%d.db", g->server_addr, g->server_port);
    +
    2389  }
    +
    2390  else {
    +
    2391  g->mode = MODE_OFFLINE;
    +
    2392  snprintf(g->db_path, MAX_PATH_LENGTH, "%s", DB_PATH);
    +
    2393  }
    +
    2394 
    + + + + +
    2399 
    +
    2400  // OUTER LOOP //
    +
    2401  int running = 1;
    +
    2402  while (running) {
    +
    2403  // DATABASE INITIALIZATION //
    +
    2404  if (g->mode == MODE_OFFLINE || USE_CACHE) {
    +
    2405  db_enable();
    +
    2406  if (db_init(g->db_path)) {
    +
    2407  return -1;
    +
    2408  }
    +
    2409  if (g->mode == MODE_ONLINE) {
    +
    2410  // TODO: support proper caching of signs (handle deletions)
    + +
    2412  }
    +
    2413  }
    +
    2414 
    +
    2415  // CLIENT INITIALIZATION //
    +
    2416  if (g->mode == MODE_ONLINE) {
    +
    2417  client_enable();
    + +
    2419  client_start();
    +
    2420  client_version(1);
    +
    2421  login();
    +
    2422  }
    +
    2423 
    +
    2424  // LOCAL VARIABLES //
    +
    2425  reset_model();
    +
    2426  FPS fps = {0, 0, 0};
    +
    2427  double last_commit = glfwGetTime();
    +
    2428  double last_update = glfwGetTime();
    +
    2429  GLuint sky_buffer = gen_sky_buffer();
    +
    2430 
    +
    2431  Player *me = g->players;
    +
    2432  State *s = &g->players->state;
    + +
    2434  me->id = 0;
    +
    2435  me->name[0] = '\0';
    +
    2436  me->health = MAX_PLAYER_HEALTH;
    +
    2437  me->buffer = 0;
    +
    2438  g->player_count = 1;
    +
    2439 
    +
    2440  // LOAD STATE FROM DATABASE //
    +
    2441  int loaded = db_load_state(&s->x, &s->y, &s->z, &s->rx, &s->ry);
    +
    2442  force_chunks(me);
    +
    2443  if (!loaded) {
    +
    2444  s->y = highest_block(s->x, s->z) + 2;
    +
    2445  }
    +
    2446 
    +
    2447  // BEGIN MAIN LOOP //
    +
    2448  double previous = glfwGetTime();
    +
    2449  while (1) {
    +
    2450  // WINDOW SIZE AND SCALE //
    +
    2451  g->scale = get_scale_factor();
    +
    2452  glfwGetFramebufferSize(g->window, &g->width, &g->height);
    +
    2453  glViewport(0, 0, g->width, g->height);
    +
    2454 
    +
    2455  // FRAME RATE //
    +
    2456  update_fps(&fps);
    +
    2457  double now = glfwGetTime();
    +
    2458  double dt = MIN(now - previous, 0.2);
    +
    2459  previous = now;
    +
    2460 
    +
    2461  // HANDLE MOUSE INPUT //
    + +
    2463 
    +
    2464  // HANDLE MOVEMENT //
    +
    2465  handle_movement(dt);
    +
    2466 
    + +
    2468 
    +
    2469  // HANDLE DATA FROM SERVER //
    +
    2470  char *buffer = client_recv();
    +
    2471  if (buffer) {
    +
    2472  parse_buffer(buffer);
    +
    2473  free(buffer);
    +
    2474  }
    +
    2475 
    +
    2476  // FLUSH DATABASE //
    +
    2477  if (now - last_commit > COMMIT_INTERVAL) {
    +
    2478  last_commit = now;
    +
    2479  db_commit();
    +
    2480  }
    +
    2481 
    +
    2482  // SEND POSITION TO SERVER //
    +
    2483  if (now - last_update > 0.1) {
    +
    2484  last_update = now;
    +
    2485  client_position(s->x, s->y, s->z, s->rx, s->ry);
    +
    2486  }
    +
    2487 
    +
    2488  // PREPARE TO RENDER //
    +
    2489  g->observe1 = g->observe1 % g->player_count;
    +
    2490  g->observe2 = g->observe2 % g->player_count;
    +
    2491  delete_chunks();
    +
    2492  del_buffer(me->buffer);
    +
    2493  me->buffer = gen_player_buffer(s->x, s->y, s->z, s->rx, s->ry);
    +
    2494  for (int i = 1; i < g->player_count; i++) {
    + +
    2496  }
    +
    2497  Player *player = g->players + g->observe1;
    +
    2498 
    +
    2499  // RENDER 3-D SCENE //
    +
    2500  glClear(GL_COLOR_BUFFER_BIT);
    +
    2501  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2502  render_sky(&sky_attrib, player, sky_buffer);
    +
    2503  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2504  int face_count = render_chunks(&block_attrib, player);
    +
    2505  render_signs(&text_attrib, player);
    +
    2506  render_sign(&text_attrib, player);
    +
    2507  render_players(&block_attrib, player);
    +
    2508  if (SHOW_WIREFRAME) {
    +
    2509  render_wireframe(&line_attrib, player);
    +
    2510  }
    +
    2511 
    +
    2512  // RENDER HUD //
    +
    2513  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2514  if (SHOW_CROSSHAIRS) {
    +
    2515  render_crosshairs(&line_attrib);
    +
    2516  }
    +
    2517  if (SHOW_ITEM) {
    +
    2518  render_item(&block_attrib);
    +
    2519  }
    +
    2520 
    +
    2521  // RENDER TEXT //
    +
    2522  char text_buffer[1024];
    +
    2523  float ts = 12 * g->scale;
    +
    2524  float tx = ts / 2;
    +
    2525  float ty = g->height - ts;
    +
    2526  if (SHOW_INFO_TEXT) {
    +
    2527  int hour = time_of_day() * 24;
    +
    2528  char am_pm = hour < 12 ? 'a' : 'p';
    +
    2529  hour = hour % 12;
    +
    2530  hour = hour ? hour : 12;
    +
    2531  snprintf(
    +
    2532  text_buffer, 1024,
    +
    2533  "(%d, %d) (%.2f, %.2f, %.2f) [%d, %d, %d] %d%cm %dfps -- Player Health: %.2f",
    +
    2534  chunked(s->x), chunked(s->z), s->x, s->y, s->z,
    + +
    2536  face_count * 2, hour, am_pm, fps.fps, g->players->health);
    +
    2537  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts, text_buffer);
    +
    2538  ty -= ts * 2;
    +
    2539  }
    +
    2540  if (SHOW_CHAT_TEXT) {
    +
    2541  for (int i = 0; i < MAX_MESSAGES; i++) {
    +
    2542  int index = (g->message_index + i) % MAX_MESSAGES;
    +
    2543  if (strlen(g->messages[index])) {
    +
    2544  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts,
    +
    2545  g->messages[index]);
    +
    2546  ty -= ts * 2;
    +
    2547  }
    +
    2548  }
    +
    2549  }
    +
    2550  if (g->typing) {
    +
    2551  snprintf(text_buffer, 1024, "> %s", g->typing_buffer);
    +
    2552  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts, text_buffer);
    +
    2553  ty -= ts * 2;
    +
    2554  }
    +
    2555  if (SHOW_PLAYER_NAMES) {
    +
    2556  if (player != me) {
    +
    2557  render_text(&text_attrib, ALIGN_CENTER,
    +
    2558  g->width / 2, ts, ts, player->name);
    +
    2559  }
    +
    2560  Player *other = player_crosshair(player);
    +
    2561  if (other) {
    +
    2562  render_text(&text_attrib, ALIGN_CENTER,
    +
    2563  g->width / 2, g->height / 2 - ts - 24, ts,
    +
    2564  other->name);
    +
    2565  }
    +
    2566  }
    +
    2567 
    +
    2568  // RENDER PICTURE IN PICTURE //
    +
    2569  if (g->observe2) {
    +
    2570  player = g->players + g->observe2;
    +
    2571 
    +
    2572  int pw = 256 * g->scale;
    +
    2573  int ph = 256 * g->scale;
    +
    2574  int offset = 32 * g->scale;
    +
    2575  int pad = 3 * g->scale;
    +
    2576  int sw = pw + pad * 2;
    +
    2577  int sh = ph + pad * 2;
    +
    2578 
    +
    2579  glEnable(GL_SCISSOR_TEST);
    +
    2580  glScissor(g->width - sw - offset + pad, offset - pad, sw, sh);
    +
    2581  glClear(GL_COLOR_BUFFER_BIT);
    +
    2582  glDisable(GL_SCISSOR_TEST);
    +
    2583  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2584  glViewport(g->width - pw - offset, offset, pw, ph);
    +
    2585 
    +
    2586  g->width = pw;
    +
    2587  g->height = ph;
    +
    2588  g->ortho = 0;
    +
    2589  g->fov = 65;
    +
    2590 
    +
    2591  render_sky(&sky_attrib, player, sky_buffer);
    +
    2592  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2593  render_chunks(&block_attrib, player);
    +
    2594  render_signs(&text_attrib, player);
    +
    2595  render_players(&block_attrib, player);
    +
    2596  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2597  if (SHOW_PLAYER_NAMES) {
    +
    2598  render_text(&text_attrib, ALIGN_CENTER,
    +
    2599  pw / 2, ts, ts, player->name);
    +
    2600  }
    +
    2601  }
    +
    2602 
    +
    2603  // SWAP AND POLL //
    +
    2604  glfwSwapBuffers(g->window);
    +
    2605  glfwPollEvents();
    +
    2606  if (!g->typing && glfwGetKey(g->window, CRAFT_KEY_QUIT)) {
    +
    2607  running = 0;
    +
    2608  break;
    +
    2609  }
    +
    2610  if (glfwWindowShouldClose(g->window)) {
    +
    2611  running = 0;
    +
    2612  break;
    +
    2613  }
    +
    2614  if (g->mode_changed) {
    +
    2615  g->mode_changed = 0;
    +
    2616  break;
    +
    2617  }
    +
    2618  }
    +
    2619 
    +
    2620  // SHUTDOWN //
    +
    2621  db_save_state(s->x, s->y, s->z, s->rx, s->ry);
    +
    2622  db_close();
    +
    2623  db_disable();
    +
    2624  client_stop();
    +
    2625  client_disable();
    +
    2626  del_buffer(sky_buffer);
    + + +
    2629  }
    +
    2630 
    +
    2631  glfwTerminate();
    +
    2632  curl_global_cleanup();
    +
    2633  return 0;
    +
    2634 }
    +
    char * client_recv()
    Definition: client.c:146
    +
    static int running
    Definition: client.c:21
    +
    void client_version(int version)
    Definition: client.c:69
    +
    void client_connect(char *hostname, int port)
    Definition: client.c:203
    +
    void client_disable()
    Definition: client.c:34
    +
    void client_position(float x, float y, float z, float rx, float ry)
    Definition: client.c:87
    +
    void client_start()
    Definition: client.c:227
    +
    void client_enable()
    Definition: client.c:30
    +
    void client_stop()
    Definition: client.c:241
    +
    #define DEFAULT_PORT
    Definition: client.h:4
    +
    #define VSYNC
    Definition: config.h:9
    +
    #define DB_PATH
    Definition: config.h:12
    +
    #define SHOW_INFO_TEXT
    Definition: config.h:24
    +
    #define COMMIT_INTERVAL
    Definition: config.h:52
    +
    #define RENDER_SIGN_RADIUS
    Definition: config.h:49
    +
    #define USE_CACHE
    Definition: config.h:13
    +
    #define SHOW_CROSSHAIRS
    Definition: config.h:22
    +
    #define SHOW_WIREFRAME
    Definition: config.h:23
    +
    #define SHOW_PLAYER_NAMES
    Definition: config.h:26
    +
    #define RENDER_CHUNK_RADIUS
    Definition: config.h:48
    +
    #define CRAFT_KEY_QUIT
    Definition: config.h:29
    +
    #define CREATE_CHUNK_RADIUS
    Definition: config.h:47
    +
    #define DELETE_CHUNK_RADIUS
    Definition: config.h:50
    +
    #define SHOW_CHAT_TEXT
    Definition: config.h:25
    +
    #define SHOW_ITEM
    Definition: config.h:21
    +
    void db_disable()
    Definition: db.c:28
    +
    void db_commit()
    Definition: db.c:148
    +
    void db_save_state(float x, float y, float z, float rx, float ry)
    Definition: db.c:252
    +
    void db_close()
    Definition: db.c:131
    +
    void db_delete_all_signs()
    Definition: db.c:352
    +
    int db_load_state(float *x, float *y, float *z, float *rx, float *ry)
    Definition: db.c:270
    +
    int db_init(char *path)
    Definition: db.c:36
    +
    void db_enable()
    Definition: db.c:24
    +
    void delete_all_players()
    Definition: main.c:444
    +
    #define MODE_OFFLINE
    Definition: main.c:33
    +
    #define ALIGN_CENTER
    Definition: main.c:30
    +
    void reset_model()
    Definition: main.c:2251
    +
    void render_crosshairs(Attrib *attrib)
    Definition: main.c:1379
    +
    int get_scale_factor()
    Definition: main.c:165
    +
    void render_players(Attrib *attrib, Player *player)
    Definition: main.c:1327
    +
    void delete_all_chunks()
    Definition: main.c:1023
    +
    void on_mouse_button(GLFWwindow *window, int button, int action, int mods)
    Definition: main.c:1913
    +
    Player * player_crosshair(Player *player)
    Definition: main.c:476
    +
    #define ALIGN_LEFT
    Definition: main.c:29
    +
    void render_signs(Attrib *attrib, Player *player)
    Definition: main.c:1272
    +
    void render_sky(Attrib *attrib, Player *player, GLuint buffer)
    Definition: main.c:1346
    +
    void delete_chunks()
    Definition: main.c:992
    +
    void on_key(GLFWwindow *window, int key, int scancode, int action, int mods)
    Definition: main.c:1764
    +
    void interpolate_player(Player *player)
    Definition: main.c:414
    +
    #define MAX_PATH_LENGTH
    Definition: main.c:26
    +
    void on_char(GLFWwindow *window, unsigned int u)
    Definition: main.c:1864
    +
    GLuint gen_player_buffer(float x, float y, float z, float rx, float ry)
    Definition: main.c:249
    +
    void handle_player_health()
    Definition: main.c:2031
    +
    void render_wireframe(Attrib *attrib, Player *player)
    Definition: main.c:1359
    +
    #define MODE_ONLINE
    Definition: main.c:34
    +
    void on_scroll(GLFWwindow *window, double xdelta, double ydelta)
    Definition: main.c:1897
    +
    GLuint gen_sky_buffer()
    Definition: main.c:230
    +
    void render_text(Attrib *attrib, int justify, float x, float y, float n, char *text)
    Definition: main.c:1413
    +
    void create_window()
    Definition: main.c:1945
    +
    void parse_buffer(char *buffer)
    Definition: main.c:2169
    +
    int render_chunks(Attrib *attrib, Player *player)
    Definition: main.c:1234
    +
    void render_sign(Attrib *attrib, Player *player)
    Definition: main.c:1300
    +
    #define MOUSE_SENSITIVITY
    Definition: main.c:36
    +
    void render_item(Attrib *attrib)
    Definition: main.c:1392
    +
    #define MAX_ADDR_LENGTH
    Definition: main.c:27
    +
    void handle_mouse_input()
    Definition: main.c:1960
    +
    void login()
    Definition: main.c:1436
    +
    void handle_movement(double dt)
    Definition: main.c:2102
    +
    Definition: main.c:82
    +
    GLuint extra1
    Definition: main.c:91
    +
    GLuint extra2
    Definition: main.c:92
    +
    GLuint extra4
    Definition: main.c:94
    +
    GLuint extra3
    Definition: main.c:93
    +
    GLuint camera
    Definition: main.c:89
    +
    GLuint timer
    Definition: main.c:90
    +
    GLuint sampler
    Definition: main.c:88
    +
    GLuint matrix
    Definition: main.c:87
    +
    GLuint program
    Definition: main.c:83
    +
    Definition: util.h:22
    +
    unsigned int fps
    Definition: util.h:23
    +
    int sign_radius
    Definition: main.c:105
    +
    int mode_changed
    Definition: main.c:124
    +
    char typing_buffer[MAX_TEXT_LENGTH]
    Definition: main.c:109
    +
    char server_addr[MAX_ADDR_LENGTH]
    Definition: main.c:126
    +
    int server_port
    Definition: main.c:127
    +
    int mode
    Definition: main.c:123
    +
    char db_path[MAX_PATH_LENGTH]
    Definition: main.c:125
    +
    char name[MAX_NAME_LENGTH]
    Definition: main.c:74
    +
    GLuint load_program(const char *path1, const char *path2)
    Definition: util.c:110
    +
    void load_png_texture(const char *file_name)
    Definition: util.c:131
    +
    void update_fps(FPS *fps)
    Definition: util.c:18
    +
    +
    +
    + +

    ◆ map_set_func()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void map_set_func (int x,
    int y,
    int z,
    int w,
    void * arg 
    )
    +
    + +

    Definition at line 965 of file main.c.

    +
    965  {
    +
    966  Map *map = (Map *)arg;
    +
    967  map_set(map, x, y, z, w);
    +
    968 }
    +
    +
    +
    + +

    ◆ occlusion()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void occlusion (char neighbors[27],
    float result[6][4] 
    )
    +
    + +

    Definition at line 812 of file main.c.

    +
    812  {
    +
    813  static const int lookup[6][4][3] = {
    +
    814  {{0, 1, 3}, {2, 1, 5}, {6, 3, 7}, {8, 5, 7}},
    +
    815  {{18, 19, 21}, {20, 19, 23}, {24, 21, 25}, {26, 23, 25}},
    +
    816  {{6, 7, 15}, {8, 7, 17}, {24, 15, 25}, {26, 17, 25}},
    +
    817  {{0, 1, 9}, {2, 1, 11}, {18, 9, 19}, {20, 11, 19}},
    +
    818  {{0, 3, 9}, {6, 3, 15}, {18, 9, 21}, {24, 15, 21}},
    +
    819  {{2, 5, 11}, {8, 5, 17}, {20, 11, 23}, {26, 17, 23}}
    +
    820  };
    +
    821  static const float curve[4] = {0.0, 0.5, 0.75, 1.0};
    +
    822  for (int i = 0; i < 6; i++) {
    +
    823  for (int j = 0; j < 4; j++) {
    +
    824  int corner = neighbors[lookup[i][j][0]];
    +
    825  int side1 = neighbors[lookup[i][j][1]];
    +
    826  int side2 = neighbors[lookup[i][j][2]];
    +
    827  int value = side1 && side2 ? 3 : corner + side1 + side2;
    +
    828  result[i][j] = curve[value];
    +
    829  }
    +
    830  }
    +
    831 }
    +
    +
    +
    + +

    ◆ on_char()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void on_char (GLFWwindow * window,
    unsigned int u 
    )
    +
    + +

    Definition at line 1864 of file main.c.

    +
    1864  {
    +
    1865  if (g->suppress_char) {
    +
    1866  g->suppress_char = 0;
    +
    1867  return;
    +
    1868  }
    +
    1869  if (g->typing) {
    +
    1870  if (u >= 32 && u < 128) {
    +
    1871  char c = (char)u;
    +
    1872  int n = strlen(g->typing_buffer);
    +
    1873  if (n < MAX_TEXT_LENGTH - 1) {
    +
    1874  g->typing_buffer[n] = c;
    +
    1875  g->typing_buffer[n + 1] = '\0';
    +
    1876  }
    +
    1877  }
    +
    1878  }
    +
    1879  else {
    +
    1880  if (u == CRAFT_KEY_CHAT) {
    +
    1881  g->typing = 1;
    +
    1882  g->typing_buffer[0] = '\0';
    +
    1883  }
    +
    1884  if (u == CRAFT_KEY_COMMAND) {
    +
    1885  g->typing = 1;
    +
    1886  g->typing_buffer[0] = '/';
    +
    1887  g->typing_buffer[1] = '\0';
    +
    1888  }
    +
    1889  if (u == CRAFT_KEY_SIGN) {
    +
    1890  g->typing = 1;
    + +
    1892  g->typing_buffer[1] = '\0';
    +
    1893  }
    +
    1894  }
    +
    1895 }
    +
    #define CRAFT_KEY_CHAT
    Definition: config.h:42
    +
    #define CRAFT_KEY_COMMAND
    Definition: config.h:43
    +
    #define CRAFT_KEY_SIGN
    Definition: config.h:44
    +
    int suppress_char
    Definition: main.c:122
    +
    +
    +
    + +

    ◆ on_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void on_key (GLFWwindow * window,
    int key,
    int scancode,
    int action,
    int mods 
    )
    +
    + +

    Definition at line 1764 of file main.c.

    +
    1764  {
    +
    1765  int control = mods & (GLFW_MOD_CONTROL | GLFW_MOD_SUPER);
    +
    1766  int exclusive =
    +
    1767  glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1768  if (action == GLFW_RELEASE) {
    +
    1769  return;
    +
    1770  }
    +
    1771  if (key == GLFW_KEY_BACKSPACE) {
    +
    1772  if (g->typing) {
    +
    1773  int n = strlen(g->typing_buffer);
    +
    1774  if (n > 0) {
    +
    1775  g->typing_buffer[n - 1] = '\0';
    +
    1776  }
    +
    1777  }
    +
    1778  }
    +
    1779  if (action != GLFW_PRESS) {
    +
    1780  return;
    +
    1781  }
    +
    1782  if (key == GLFW_KEY_ESCAPE) {
    +
    1783  if (g->typing) {
    +
    1784  g->typing = 0;
    +
    1785  }
    +
    1786  else if (exclusive) {
    +
    1787  glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
    +
    1788  }
    +
    1789  }
    +
    1790  if (key == GLFW_KEY_ENTER) {
    +
    1791  if (g->typing) {
    +
    1792  if (mods & GLFW_MOD_SHIFT) {
    +
    1793  int n = strlen(g->typing_buffer);
    +
    1794  if (n < MAX_TEXT_LENGTH - 1) {
    +
    1795  g->typing_buffer[n] = '\r';
    +
    1796  g->typing_buffer[n + 1] = '\0';
    +
    1797  }
    +
    1798  }
    +
    1799  else {
    +
    1800  g->typing = 0;
    +
    1801  if (g->typing_buffer[0] == CRAFT_KEY_SIGN) {
    +
    1802  Player *player = g->players;
    +
    1803  int x, y, z, face;
    +
    1804  if (hit_test_face(player, &x, &y, &z, &face)) {
    +
    1805  set_sign(x, y, z, face, g->typing_buffer + 1);
    +
    1806  }
    +
    1807  }
    +
    1808  else if (g->typing_buffer[0] == '/') {
    + +
    1810  }
    +
    1811  else {
    + +
    1813  }
    +
    1814  }
    +
    1815  }
    +
    1816  else {
    +
    1817  if (control) {
    +
    1818  on_right_click();
    +
    1819  }
    +
    1820  else {
    +
    1821  on_left_click();
    +
    1822  }
    +
    1823  }
    +
    1824  }
    +
    1825  if (control && key == 'V') {
    +
    1826  const char *buffer = glfwGetClipboardString(window);
    +
    1827  if (g->typing) {
    +
    1828  g->suppress_char = 1;
    +
    1829  strncat(g->typing_buffer, buffer,
    +
    1830  MAX_TEXT_LENGTH - strlen(g->typing_buffer) - 1);
    +
    1831  }
    +
    1832  else {
    +
    1833  parse_command(buffer, 0);
    +
    1834  }
    +
    1835  }
    +
    1836  if (!g->typing) {
    +
    1837  if (key == CRAFT_KEY_FLY) {
    +
    1838  g->flying = !g->flying;
    +
    1839  }
    +
    1840  if (key >= '1' && key <= '9') {
    +
    1841  g->item_index = key - '1';
    +
    1842  }
    +
    1843  if (key == '0') {
    +
    1844  g->item_index = 9;
    +
    1845  }
    +
    1846  if (key == CRAFT_KEY_ITEM_NEXT) {
    +
    1847  g->item_index = (g->item_index + 1) % item_count;
    +
    1848  }
    +
    1849  if (key == CRAFT_KEY_ITEM_PREV) {
    +
    1850  g->item_index--;
    +
    1851  if (g->item_index < 0) {
    +
    1852  g->item_index = item_count - 1;
    +
    1853  }
    +
    1854  }
    +
    1855  if (key == CRAFT_KEY_OBSERVE) {
    +
    1856  g->observe1 = (g->observe1 + 1) % g->player_count;
    +
    1857  }
    +
    1858  if (key == CRAFT_KEY_OBSERVE_INSET) {
    +
    1859  g->observe2 = (g->observe2 + 1) % g->player_count;
    +
    1860  }
    +
    1861  }
    +
    1862 }
    +
    void client_talk(const char *text)
    Definition: client.c:134
    +
    #define CRAFT_KEY_ITEM_NEXT
    Definition: config.h:38
    +
    #define CRAFT_KEY_OBSERVE
    Definition: config.h:36
    +
    #define CRAFT_KEY_ITEM_PREV
    Definition: config.h:39
    +
    #define CRAFT_KEY_OBSERVE_INSET
    Definition: config.h:37
    +
    #define CRAFT_KEY_FLY
    Definition: config.h:35
    +
    const int item_count
    Definition: item.c:65
    +
    void on_left_click()
    Definition: main.c:1727
    +
    void set_sign(int x, int y, int z, int face, const char *text)
    Definition: main.c:1156
    +
    void on_right_click()
    Definition: main.c:1740
    +
    int hit_test_face(Player *player, int *x, int *y, int *z, int *face)
    Definition: main.c:635
    +
    void parse_command(const char *buffer, int forward)
    Definition: main.c:1623
    +
    int item_index
    Definition: main.c:118
    +
    +
    +
    + +

    ◆ on_left_click()

    + +
    +
    + + + + + + + +
    void on_left_click ()
    +
    + +

    Definition at line 1727 of file main.c.

    +
    1727  {
    +
    1728  State *s = &g->players->state;
    +
    1729  int hx, hy, hz;
    +
    1730  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1731  if (hy > 0 && hy < 256 && is_destructable(hw)) {
    +
    1732  set_block(hx, hy, hz, 0);
    +
    1733  record_block(hx, hy, hz, 0);
    +
    1734  if (is_plant(get_block(hx, hy + 1, hz))) {
    +
    1735  set_block(hx, hy + 1, hz, 0);
    +
    1736  }
    +
    1737  }
    +
    1738 }
    +
    void record_block(int x, int y, int z, int w)
    Definition: main.c:1203
    +
    +
    +
    + +

    ◆ on_middle_click()

    + +
    +
    + + + + + + + +
    void on_middle_click ()
    +
    + +

    Definition at line 1752 of file main.c.

    +
    1752  {
    +
    1753  State *s = &g->players->state;
    +
    1754  int hx, hy, hz;
    +
    1755  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1756  for (int i = 0; i < item_count; i++) {
    +
    1757  if (items[i] == hw) {
    +
    1758  g->item_index = i;
    +
    1759  break;
    +
    1760  }
    +
    1761  }
    +
    1762 }
    +
    const int items[]
    Definition: item.c:4
    +
    +
    +
    + +

    ◆ on_mouse_button()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void on_mouse_button (GLFWwindow * window,
    int button,
    int action,
    int mods 
    )
    +
    + +

    Definition at line 1913 of file main.c.

    +
    1913  {
    +
    1914  int control = mods & (GLFW_MOD_CONTROL | GLFW_MOD_SUPER);
    +
    1915  int exclusive =
    +
    1916  glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1917  if (action != GLFW_PRESS) {
    +
    1918  return;
    +
    1919  }
    +
    1920  if (button == GLFW_MOUSE_BUTTON_LEFT) {
    +
    1921  if (exclusive) {
    +
    1922  if (control) {
    +
    1923  on_right_click();
    +
    1924  }
    +
    1925  else {
    +
    1926  on_left_click();
    +
    1927  }
    +
    1928  }
    +
    1929  else {
    +
    1930  glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    +
    1931  }
    +
    1932  }
    +
    1933  if (button == GLFW_MOUSE_BUTTON_RIGHT) {
    +
    1934  if (exclusive) {
    +
    1935  on_right_click();
    +
    1936  }
    +
    1937  }
    +
    1938  if (button == GLFW_MOUSE_BUTTON_MIDDLE) {
    +
    1939  if (exclusive) {
    +
    1940  on_middle_click();
    +
    1941  }
    +
    1942  }
    +
    1943 }
    +
    void on_middle_click()
    Definition: main.c:1752
    +
    +
    +
    + +

    ◆ on_right_click()

    + +
    +
    + + + + + + + +
    void on_right_click ()
    +
    + +

    Definition at line 1740 of file main.c.

    +
    1740  {
    +
    1741  State *s = &g->players->state;
    +
    1742  int hx, hy, hz;
    +
    1743  int hw = hit_test(1, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1744  if (hy > 0 && hy < 256 && is_obstacle(hw)) {
    +
    1745  if (!player_intersects_block(2, s->x, s->y, s->z, hx, hy, hz)) {
    +
    1746  set_block(hx, hy, hz, items[g->item_index]);
    +
    1747  record_block(hx, hy, hz, items[g->item_index]);
    +
    1748  }
    +
    1749  }
    +
    1750 }
    +
    int player_intersects_block(int height, float x, float y, float z, int hx, int hy, int hz)
    Definition: main.c:709
    +
    +
    +
    + +

    ◆ on_scroll()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void on_scroll (GLFWwindow * window,
    double xdelta,
    double ydelta 
    )
    +
    + +

    Definition at line 1897 of file main.c.

    +
    1897  {
    +
    1898  static double ypos = 0;
    +
    1899  ypos += ydelta;
    +
    1900  if (ypos < -SCROLL_THRESHOLD) {
    +
    1901  g->item_index = (g->item_index + 1) % item_count;
    +
    1902  ypos = 0;
    +
    1903  }
    +
    1904  if (ypos > SCROLL_THRESHOLD) {
    +
    1905  g->item_index--;
    +
    1906  if (g->item_index < 0) {
    +
    1907  g->item_index = item_count - 1;
    +
    1908  }
    +
    1909  ypos = 0;
    +
    1910  }
    +
    1911 }
    +
    #define SCROLL_THRESHOLD
    Definition: config.h:10
    +
    +
    +
    + +

    ◆ parse_buffer()

    + +
    +
    + + + + + + + + +
    void parse_buffer (char * buffer)
    +
    + +

    Definition at line 2169 of file main.c.

    +
    2169  {
    +
    2170  Player *me = g->players;
    +
    2171  State *s = &g->players->state;
    +
    2172  char *key;
    +
    2173  char *line = tokenize(buffer, "\n", &key);
    +
    2174  while (line) {
    +
    2175  int pid;
    +
    2176  float ux, uy, uz, urx, ury;
    +
    2177  if (sscanf(line, "U,%d,%f,%f,%f,%f,%f",
    +
    2178  &pid, &ux, &uy, &uz, &urx, &ury) == 6)
    +
    2179  {
    +
    2180  me->id = pid;
    +
    2181  s->x = ux; s->y = uy; s->z = uz; s->rx = urx; s->ry = ury;
    +
    2182  force_chunks(me);
    +
    2183  }
    +
    2184  int bp, bq, bx, by, bz, bw;
    +
    2185  if (sscanf(line, "B,%d,%d,%d,%d,%d,%d",
    +
    2186  &bp, &bq, &bx, &by, &bz, &bw) == 6)
    +
    2187  {
    +
    2188  _set_block(bp, bq, bx, by, bz, bw, 0);
    +
    2189  if (player_intersects_block(2, s->x, s->y, s->z, bx, by, bz)) {
    +
    2190  s->y = highest_block(s->x, s->z) + 2;
    +
    2191  }
    +
    2192  }
    +
    2193  float px, py, pz, prx, pry;
    +
    2194  if (sscanf(line, "P,%d,%f,%f,%f,%f,%f",
    +
    2195  &pid, &px, &py, &pz, &prx, &pry) == 6)
    +
    2196  {
    +
    2197  Player *player = find_player(pid);
    +
    2198  if (!player && g->player_count < MAX_PLAYERS) {
    +
    2199  player = g->players + g->player_count;
    +
    2200  g->player_count++;
    +
    2201  player->id = pid;
    +
    2202  player->buffer = 0;
    +
    2203  snprintf(player->name, MAX_NAME_LENGTH, "player%d", pid);
    +
    2204  update_player(player, px, py, pz, prx, pry, 1); // twice
    +
    2205  }
    +
    2206  if (player) {
    +
    2207  update_player(player, px, py, pz, prx, pry, 1);
    +
    2208  }
    +
    2209  }
    +
    2210  if (sscanf(line, "D,%d", &pid) == 1) {
    +
    2211  delete_player(pid);
    +
    2212  }
    +
    2213  int kp, kq, kk;
    +
    2214  if (sscanf(line, "K,%d,%d,%d", &kp, &kq, &kk) == 3) {
    +
    2215  db_set_key(kp, kq, kk);
    +
    2216  }
    +
    2217  if (sscanf(line, "R,%d,%d", &kp, &kq) == 2) {
    +
    2218  Chunk *chunk = find_chunk(kp, kq);
    +
    2219  if (chunk) {
    +
    2220  chunk->dirty = 1;
    +
    2221  }
    +
    2222  }
    +
    2223  if (line[0] == 'T' && line[1] == ',') {
    +
    2224  char *text = line + 2;
    +
    2225  add_message(text);
    +
    2226  }
    +
    2227  char format[64];
    +
    2228  snprintf(
    +
    2229  format, sizeof(format), "N,%%d,%%%ds", MAX_NAME_LENGTH - 1);
    +
    2230  char name[MAX_NAME_LENGTH];
    +
    2231  if (sscanf(line, format, &pid, name) == 2) {
    +
    2232  Player *player = find_player(pid);
    +
    2233  if (player) {
    +
    2234  strncpy(player->name, name, MAX_NAME_LENGTH);
    +
    2235  }
    +
    2236  }
    +
    2237  snprintf(
    +
    2238  format, sizeof(format),
    +
    2239  "S,%%d,%%d,%%d,%%d,%%d,%%d,%%%d[^\n]", MAX_SIGN_LENGTH - 1);
    +
    2240  int face;
    +
    2241  char text[MAX_SIGN_LENGTH] = {0};
    +
    2242  if (sscanf(line, format,
    +
    2243  &bp, &bq, &bx, &by, &bz, &face, text) >= 6)
    +
    2244  {
    +
    2245  _set_sign(bp, bq, bx, by, bz, face, text, 0);
    +
    2246  }
    +
    2247  line = tokenize(NULL, "\n", &key);
    +
    2248  }
    +
    2249 }
    +
    void db_set_key(int p, int q, int key)
    Definition: db.c:406
    +
    #define MAX_NAME_LENGTH
    Definition: main.c:25
    +
    #define MAX_PLAYERS
    Definition: main.c:23
    +
    void _set_block(int p, int q, int x, int y, int z, int w, int dirty)
    Definition: main.c:1163
    +
    void _set_sign(int p, int q, int x, int y, int z, int face, const char *text, int dirty)
    Definition: main.c:1138
    +
    void delete_player(int id)
    Definition: main.c:432
    +
    void add_message(const char *text)
    Definition: main.c:1429
    +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    +
    +
    + +

    ◆ parse_command()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void parse_command (const char * buffer,
    int forward 
    )
    +
    + +

    Definition at line 1623 of file main.c.

    +
    1623  {
    +
    1624  char username[128] = {0};
    +
    1625  char token[128] = {0};
    +
    1626  char server_addr[MAX_ADDR_LENGTH];
    +
    1627  int server_port = DEFAULT_PORT;
    +
    1628  char filename[MAX_PATH_LENGTH];
    +
    1629  int radius;
    +
    1630  if (sscanf(buffer, "/identity %128s %128s", username, token) == 2) {
    +
    1631  db_auth_set(username, token);
    +
    1632  add_message("Successfully imported identity token!");
    +
    1633  login();
    +
    1634  }
    +
    1635  else if (strcmp(buffer, "/logout") == 0) {
    + +
    1637  login();
    +
    1638  }
    +
    1639  else if (sscanf(buffer, "/login %128s", username) == 1) {
    +
    1640  if (db_auth_select(username)) {
    +
    1641  login();
    +
    1642  }
    +
    1643  else {
    +
    1644  add_message("Unknown username.");
    +
    1645  }
    +
    1646  }
    +
    1647  else if (sscanf(buffer,
    +
    1648  "/online %128s %d", server_addr, &server_port) >= 1)
    +
    1649  {
    +
    1650  g->mode_changed = 1;
    +
    1651  g->mode = MODE_ONLINE;
    +
    1652  strncpy(g->server_addr, server_addr, MAX_ADDR_LENGTH);
    +
    1653  g->server_port = server_port;
    +
    1654  snprintf(g->db_path, MAX_PATH_LENGTH,
    +
    1655  "cache.%s.%d.db", g->server_addr, g->server_port);
    +
    1656  }
    +
    1657  else if (sscanf(buffer, "/offline %128s", filename) == 1) {
    +
    1658  g->mode_changed = 1;
    +
    1659  g->mode = MODE_OFFLINE;
    +
    1660  snprintf(g->db_path, MAX_PATH_LENGTH, "%s.db", filename);
    +
    1661  }
    +
    1662  else if (strcmp(buffer, "/offline") == 0) {
    +
    1663  g->mode_changed = 1;
    +
    1664  g->mode = MODE_OFFLINE;
    +
    1665  snprintf(g->db_path, MAX_PATH_LENGTH, "%s", DB_PATH);
    +
    1666  }
    +
    1667  else if (sscanf(buffer, "/view %d", &radius) == 1) {
    +
    1668  if (radius >= 1 && radius <= 24) {
    +
    1669  g->create_radius = radius;
    +
    1670  g->render_radius = radius;
    +
    1671  g->delete_radius = radius + 4;
    +
    1672  }
    +
    1673  else {
    +
    1674  add_message("Viewing distance must be between 1 and 24.");
    +
    1675  }
    +
    1676  }
    +
    1677  else if (strcmp(buffer, "/copy") == 0) {
    +
    1678  copy();
    +
    1679  }
    +
    1680  else if (strcmp(buffer, "/paste") == 0) {
    +
    1681  paste();
    +
    1682  }
    +
    1683  else if (strcmp(buffer, "/tree") == 0) {
    +
    1684  tree(&g->block0);
    +
    1685  }
    +
    1686  else if (strcmp(buffer, "/fcube") == 0) {
    +
    1687  cube(&g->block0, &g->block1, 1);
    +
    1688  }
    +
    1689  else if (strcmp(buffer, "/cube") == 0) {
    +
    1690  cube(&g->block0, &g->block1, 0);
    +
    1691  }
    +
    1692  else if (sscanf(buffer, "/fsphere %d", &radius) == 1) {
    +
    1693  sphere(&g->block0, radius, 1, 0, 0, 0);
    +
    1694  }
    +
    1695  else if (sscanf(buffer, "/sphere %d", &radius) == 1) {
    +
    1696  sphere(&g->block0, radius, 0, 0, 0, 0);
    +
    1697  }
    +
    1698  else if (sscanf(buffer, "/fcirclex %d", &radius) == 1) {
    +
    1699  sphere(&g->block0, radius, 1, 1, 0, 0);
    +
    1700  }
    +
    1701  else if (sscanf(buffer, "/circlex %d", &radius) == 1) {
    +
    1702  sphere(&g->block0, radius, 0, 1, 0, 0);
    +
    1703  }
    +
    1704  else if (sscanf(buffer, "/fcircley %d", &radius) == 1) {
    +
    1705  sphere(&g->block0, radius, 1, 0, 1, 0);
    +
    1706  }
    +
    1707  else if (sscanf(buffer, "/circley %d", &radius) == 1) {
    +
    1708  sphere(&g->block0, radius, 0, 0, 1, 0);
    +
    1709  }
    +
    1710  else if (sscanf(buffer, "/fcirclez %d", &radius) == 1) {
    +
    1711  sphere(&g->block0, radius, 1, 0, 0, 1);
    +
    1712  }
    +
    1713  else if (sscanf(buffer, "/circlez %d", &radius) == 1) {
    +
    1714  sphere(&g->block0, radius, 0, 0, 0, 1);
    +
    1715  }
    +
    1716  else if (sscanf(buffer, "/fcylinder %d", &radius) == 1) {
    +
    1717  cylinder(&g->block0, &g->block1, radius, 1);
    +
    1718  }
    +
    1719  else if (sscanf(buffer, "/cylinder %d", &radius) == 1) {
    +
    1720  cylinder(&g->block0, &g->block1, radius, 0);
    +
    1721  }
    +
    1722  else if (forward) {
    +
    1723  client_talk(buffer);
    +
    1724  }
    +
    1725 }
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    void db_auth_set(char *username, char *identity_token)
    Definition: db.c:162
    +
    void cube(Block *b1, Block *b2, int fill)
    Definition: main.c:1486
    +
    void copy()
    Definition: main.c:1459
    +
    void tree(Block *block)
    Definition: main.c:1603
    +
    void cylinder(Block *b1, Block *b2, int radius, int fill)
    Definition: main.c:1565
    +
    void paste()
    Definition: main.c:1464
    +
    +
    +
    + +

    ◆ paste()

    + +
    +
    + + + + + + + +
    void paste ()
    +
    + +

    Definition at line 1464 of file main.c.

    +
    1464  {
    +
    1465  Block *c1 = &g->copy1;
    +
    1466  Block *c2 = &g->copy0;
    +
    1467  Block *p1 = &g->block1;
    +
    1468  Block *p2 = &g->block0;
    +
    1469  int scx = SIGN(c2->x - c1->x);
    +
    1470  int scz = SIGN(c2->z - c1->z);
    +
    1471  int spx = SIGN(p2->x - p1->x);
    +
    1472  int spz = SIGN(p2->z - p1->z);
    +
    1473  int oy = p1->y - c1->y;
    +
    1474  int dx = ABS(c2->x - c1->x);
    +
    1475  int dz = ABS(c2->z - c1->z);
    +
    1476  for (int y = 0; y < 256; y++) {
    +
    1477  for (int x = 0; x <= dx; x++) {
    +
    1478  for (int z = 0; z <= dz; z++) {
    +
    1479  int w = get_block(c1->x + x * scx, y, c1->z + z * scz);
    +
    1480  builder_block(p1->x + x * spx, y + oy, p1->z + z * spz, w);
    +
    1481  }
    +
    1482  }
    +
    1483  }
    +
    1484 }
    +
    #define SIGN(x)
    Definition: util.h:14
    +
    +
    +
    + +

    ◆ player_crosshair()

    + +
    +
    + + + + + + + + +
    Player* player_crosshair (Playerplayer)
    +
    + +

    Definition at line 476 of file main.c.

    +
    476  {
    +
    477  Player *result = 0;
    +
    478  float threshold = RADIANS(5);
    +
    479  float best = 0;
    +
    480  for (int i = 0; i < g->player_count; i++) {
    +
    481  Player *other = g->players + i;
    +
    482  if (other == player) {
    +
    483  continue;
    +
    484  }
    +
    485  float p = player_crosshair_distance(player, other);
    +
    486  float d = player_player_distance(player, other);
    +
    487  if (d < 96 && p / d < threshold) {
    +
    488  if (best == 0 || d < best) {
    +
    489  best = d;
    +
    490  result = other;
    +
    491  }
    +
    492  }
    +
    493  }
    +
    494  return result;
    +
    495 }
    +
    float player_crosshair_distance(Player *p1, Player *p2)
    Definition: main.c:461
    +
    float player_player_distance(Player *p1, Player *p2)
    Definition: main.c:452
    +
    +
    +
    + +

    ◆ player_crosshair_distance()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    float player_crosshair_distance (Playerp1,
    Playerp2 
    )
    +
    + +

    Definition at line 461 of file main.c.

    +
    461  {
    +
    462  State *s1 = &p1->state;
    +
    463  State *s2 = &p2->state;
    +
    464  float d = player_player_distance(p1, p2);
    +
    465  float vx, vy, vz;
    +
    466  get_sight_vector(s1->rx, s1->ry, &vx, &vy, &vz);
    +
    467  vx *= d; vy *= d; vz *= d;
    +
    468  float px, py, pz;
    +
    469  px = s1->x + vx; py = s1->y + vy; pz = s1->z + vz;
    +
    470  float x = s2->x - px;
    +
    471  float y = s2->y - py;
    +
    472  float z = s2->z - pz;
    +
    473  return sqrtf(x * x + y * y + z * z);
    +
    474 }
    +
    +
    +
    + +

    ◆ player_intersects_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int player_intersects_block (int height,
    float x,
    float y,
    float z,
    int hx,
    int hy,
    int hz 
    )
    +
    + +

    Definition at line 709 of file main.c.

    +
    713 {
    +
    714  int nx = roundf(x);
    +
    715  int ny = roundf(y);
    +
    716  int nz = roundf(z);
    +
    717  for (int i = 0; i < height; i++) {
    +
    718  if (nx == hx && ny - i == hy && nz == hz) {
    +
    719  return 1;
    +
    720  }
    +
    721  }
    +
    722  return 0;
    +
    723 }
    +
    +
    +
    + +

    ◆ player_player_distance()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    float player_player_distance (Playerp1,
    Playerp2 
    )
    +
    + +

    Definition at line 452 of file main.c.

    +
    452  {
    +
    453  State *s1 = &p1->state;
    +
    454  State *s2 = &p2->state;
    +
    455  float x = s2->x - s1->x;
    +
    456  float y = s2->y - s1->y;
    +
    457  float z = s2->z - s1->z;
    +
    458  return sqrtf(x * x + y * y + z * z);
    +
    459 }
    +
    +
    +
    + +

    ◆ record_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void record_block (int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 1203 of file main.c.

    +
    1203  {
    +
    1204  memcpy(&g->block1, &g->block0, sizeof(Block));
    +
    1205  g->block0.x = x;
    +
    1206  g->block0.y = y;
    +
    1207  g->block0.z = z;
    +
    1208  g->block0.w = w;
    +
    1209 }
    +
    +
    +
    + +

    ◆ render_chunks()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int render_chunks (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 1234 of file main.c.

    +
    1234  {
    +
    1235  int result = 0;
    +
    1236  State *s = &player->state;
    +
    1237  ensure_chunks(player);
    +
    1238  int p = chunked(s->x);
    +
    1239  int q = chunked(s->z);
    +
    1240  float light = get_daylight();
    +
    1241  float matrix[16];
    +
    1242  set_matrix_3d(
    +
    1243  matrix, g->width, g->height,
    +
    1244  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1245  float planes[6][4];
    +
    1246  frustum_planes(planes, g->render_radius, matrix);
    +
    1247  glUseProgram(attrib->program);
    +
    1248  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1249  glUniform3f(attrib->camera, s->x, s->y, s->z);
    +
    1250  glUniform1i(attrib->sampler, 0);
    +
    1251  glUniform1i(attrib->extra1, 2);
    +
    1252  glUniform1f(attrib->extra2, light);
    +
    1253  glUniform1f(attrib->extra3, g->render_radius * CHUNK_SIZE);
    +
    1254  glUniform1i(attrib->extra4, g->ortho);
    +
    1255  glUniform1f(attrib->timer, time_of_day());
    +
    1256  for (int i = 0; i < g->chunk_count; i++) {
    +
    1257  Chunk *chunk = g->chunks + i;
    +
    1258  if (chunk_distance(chunk, p, q) > g->render_radius) {
    +
    1259  continue;
    +
    1260  }
    +
    1261  if (!chunk_visible(
    +
    1262  planes, chunk->p, chunk->q, chunk->miny, chunk->maxy))
    +
    1263  {
    +
    1264  continue;
    +
    1265  }
    +
    1266  draw_chunk(attrib, chunk);
    +
    1267  result += chunk->faces;
    +
    1268  }
    +
    1269  return result;
    +
    1270 }
    +
    void ensure_chunks(Player *player)
    Definition: main.c:1057
    +
    void draw_chunk(Attrib *attrib, Chunk *chunk)
    Definition: main.c:339
    +
    float get_daylight()
    Definition: main.c:153
    +
    +
    +
    + +

    ◆ render_crosshairs()

    + +
    +
    + + + + + + + + +
    void render_crosshairs (Attribattrib)
    +
    + +

    Definition at line 1379 of file main.c.

    +
    1379  {
    +
    1380  float matrix[16];
    +
    1381  set_matrix_2d(matrix, g->width, g->height);
    +
    1382  glUseProgram(attrib->program);
    +
    1383  glLineWidth(4 * g->scale);
    +
    1384  glEnable(GL_COLOR_LOGIC_OP);
    +
    1385  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1386  GLuint crosshair_buffer = gen_crosshair_buffer();
    +
    1387  draw_lines(attrib, crosshair_buffer, 2, 4);
    +
    1388  del_buffer(crosshair_buffer);
    +
    1389  glDisable(GL_COLOR_LOGIC_OP);
    +
    1390 }
    +
    void draw_lines(Attrib *attrib, GLuint buffer, int components, int count)
    Definition: main.c:329
    +
    GLuint gen_crosshair_buffer()
    Definition: main.c:213
    +
    void set_matrix_2d(float *matrix, int width, int height)
    Definition: matrix.c:207
    +
    +
    +
    + +

    ◆ render_item()

    + +
    +
    + + + + + + + + +
    void render_item (Attribattrib)
    +
    + +

    Definition at line 1392 of file main.c.

    +
    1392  {
    +
    1393  float matrix[16];
    +
    1394  set_matrix_item(matrix, g->width, g->height, g->scale);
    +
    1395  glUseProgram(attrib->program);
    +
    1396  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1397  glUniform3f(attrib->camera, 0, 0, 5);
    +
    1398  glUniform1i(attrib->sampler, 0);
    +
    1399  glUniform1f(attrib->timer, time_of_day());
    +
    1400  int w = items[g->item_index];
    +
    1401  if (is_plant(w)) {
    +
    1402  GLuint buffer = gen_plant_buffer(0, 0, 0, 0.5, w);
    +
    1403  draw_plant(attrib, buffer);
    +
    1404  del_buffer(buffer);
    +
    1405  }
    +
    1406  else {
    +
    1407  GLuint buffer = gen_cube_buffer(0, 0, 0, 0.5, w);
    +
    1408  draw_cube(attrib, buffer);
    +
    1409  del_buffer(buffer);
    +
    1410  }
    +
    1411 }
    +
    GLuint gen_cube_buffer(float x, float y, float z, float n, int w)
    Definition: main.c:236
    +
    GLuint gen_plant_buffer(float x, float y, float z, float n, int w)
    Definition: main.c:243
    +
    void draw_plant(Attrib *attrib, GLuint buffer)
    Definition: main.c:372
    +
    void set_matrix_item(float *matrix, int width, int height, int scale)
    Definition: matrix.c:240
    +
    +
    +
    + +

    ◆ render_players()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void render_players (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 1327 of file main.c.

    +
    1327  {
    +
    1328  State *s = &player->state;
    +
    1329  float matrix[16];
    +
    1330  set_matrix_3d(
    +
    1331  matrix, g->width, g->height,
    +
    1332  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1333  glUseProgram(attrib->program);
    +
    1334  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1335  glUniform3f(attrib->camera, s->x, s->y, s->z);
    +
    1336  glUniform1i(attrib->sampler, 0);
    +
    1337  glUniform1f(attrib->timer, time_of_day());
    +
    1338  for (int i = 0; i < g->player_count; i++) {
    +
    1339  Player *other = g->players + i;
    +
    1340  if (other != player) {
    +
    1341  draw_player(attrib, other);
    +
    1342  }
    +
    1343  }
    +
    1344 }
    +
    void draw_player(Attrib *attrib, Player *player)
    Definition: main.c:376
    +
    +
    +
    + +

    ◆ render_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void render_sign (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 1300 of file main.c.

    +
    1300  {
    +
    1301  if (!g->typing || g->typing_buffer[0] != CRAFT_KEY_SIGN) {
    +
    1302  return;
    +
    1303  }
    +
    1304  int x, y, z, face;
    +
    1305  if (!hit_test_face(player, &x, &y, &z, &face)) {
    +
    1306  return;
    +
    1307  }
    +
    1308  State *s = &player->state;
    +
    1309  float matrix[16];
    +
    1310  set_matrix_3d(
    +
    1311  matrix, g->width, g->height,
    +
    1312  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1313  glUseProgram(attrib->program);
    +
    1314  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1315  glUniform1i(attrib->sampler, 3);
    +
    1316  glUniform1i(attrib->extra1, 1);
    +
    1317  char text[MAX_SIGN_LENGTH];
    +
    1318  strncpy(text, g->typing_buffer + 1, MAX_SIGN_LENGTH);
    +
    1319  text[MAX_SIGN_LENGTH - 1] = '\0';
    +
    1320  GLfloat *data = malloc_faces(5, strlen(text));
    +
    1321  int length = _gen_sign_buffer(data, x, y, z, face, text);
    +
    1322  GLuint buffer = gen_faces(5, length, data);
    +
    1323  draw_sign(attrib, buffer, length);
    +
    1324  del_buffer(buffer);
    +
    1325 }
    +
    void draw_sign(Attrib *attrib, GLuint buffer, int length)
    Definition: main.c:361
    +
    +
    +
    + +

    ◆ render_signs()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void render_signs (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 1272 of file main.c.

    +
    1272  {
    +
    1273  State *s = &player->state;
    +
    1274  int p = chunked(s->x);
    +
    1275  int q = chunked(s->z);
    +
    1276  float matrix[16];
    +
    1277  set_matrix_3d(
    +
    1278  matrix, g->width, g->height,
    +
    1279  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1280  float planes[6][4];
    +
    1281  frustum_planes(planes, g->render_radius, matrix);
    +
    1282  glUseProgram(attrib->program);
    +
    1283  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1284  glUniform1i(attrib->sampler, 3);
    +
    1285  glUniform1i(attrib->extra1, 1);
    +
    1286  for (int i = 0; i < g->chunk_count; i++) {
    +
    1287  Chunk *chunk = g->chunks + i;
    +
    1288  if (chunk_distance(chunk, p, q) > g->sign_radius) {
    +
    1289  continue;
    +
    1290  }
    +
    1291  if (!chunk_visible(
    +
    1292  planes, chunk->p, chunk->q, chunk->miny, chunk->maxy))
    +
    1293  {
    +
    1294  continue;
    +
    1295  }
    +
    1296  draw_signs(attrib, chunk);
    +
    1297  }
    +
    1298 }
    +
    void draw_signs(Attrib *attrib, Chunk *chunk)
    Definition: main.c:354
    +
    +
    +
    + +

    ◆ render_sky()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void render_sky (Attribattrib,
    Playerplayer,
    GLuint buffer 
    )
    +
    + +

    Definition at line 1346 of file main.c.

    +
    1346  {
    +
    1347  State *s = &player->state;
    +
    1348  float matrix[16];
    +
    1349  set_matrix_3d(
    +
    1350  matrix, g->width, g->height,
    +
    1351  0, 0, 0, s->rx, s->ry, g->fov, 0, g->render_radius);
    +
    1352  glUseProgram(attrib->program);
    +
    1353  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1354  glUniform1i(attrib->sampler, 2);
    +
    1355  glUniform1f(attrib->timer, time_of_day());
    +
    1356  draw_triangles_3d(attrib, buffer, 512 * 3);
    +
    1357 }
    +
    void draw_triangles_3d(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:297
    +
    +
    +
    + +

    ◆ render_text()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void render_text (Attribattrib,
    int justify,
    float x,
    float y,
    float n,
    char * text 
    )
    +
    + +

    Definition at line 1413 of file main.c.

    +
    1415 {
    +
    1416  float matrix[16];
    +
    1417  set_matrix_2d(matrix, g->width, g->height);
    +
    1418  glUseProgram(attrib->program);
    +
    1419  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1420  glUniform1i(attrib->sampler, 1);
    +
    1421  glUniform1i(attrib->extra1, 0);
    +
    1422  int length = strlen(text);
    +
    1423  x -= n * justify * (length - 1) / 2;
    +
    1424  GLuint buffer = gen_text_buffer(x, y, n, text);
    +
    1425  draw_text(attrib, buffer, length);
    +
    1426  del_buffer(buffer);
    +
    1427 }
    +
    void draw_text(Attrib *attrib, GLuint buffer, int length)
    Definition: main.c:347
    +
    GLuint gen_text_buffer(float x, float y, float n, char *text)
    Definition: main.c:255
    +
    +
    +
    + +

    ◆ render_wireframe()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void render_wireframe (Attribattrib,
    Playerplayer 
    )
    +
    + +

    Definition at line 1359 of file main.c.

    +
    1359  {
    +
    1360  State *s = &player->state;
    +
    1361  float matrix[16];
    +
    1362  set_matrix_3d(
    +
    1363  matrix, g->width, g->height,
    +
    1364  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1365  int hx, hy, hz;
    +
    1366  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1367  if (is_obstacle(hw)) {
    +
    1368  glUseProgram(attrib->program);
    +
    1369  glLineWidth(1);
    +
    1370  glEnable(GL_COLOR_LOGIC_OP);
    +
    1371  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1372  GLuint wireframe_buffer = gen_wireframe_buffer(hx, hy, hz, 0.53);
    +
    1373  draw_lines(attrib, wireframe_buffer, 3, 24);
    +
    1374  del_buffer(wireframe_buffer);
    +
    1375  glDisable(GL_COLOR_LOGIC_OP);
    +
    1376  }
    +
    1377 }
    +
    GLuint gen_wireframe_buffer(float x, float y, float z, float n)
    Definition: main.c:224
    +
    +
    +
    + +

    ◆ reset_model()

    + +
    +
    + + + + + + + +
    void reset_model ()
    +
    + +

    Definition at line 2251 of file main.c.

    +
    2251  {
    +
    2252  memset(g->chunks, 0, sizeof(Chunk) * MAX_CHUNKS);
    +
    2253  g->chunk_count = 0;
    +
    2254  memset(g->players, 0, sizeof(Player) * MAX_PLAYERS);
    +
    2255  g->player_count = 0;
    +
    2256  g->observe1 = 0;
    +
    2257  g->observe2 = 0;
    +
    2258  g->flying = 0;
    +
    2259  g->slowed = 0;
    +
    2260  g->item_index = 0;
    +
    2261  memset(g->typing_buffer, 0, sizeof(char) * MAX_TEXT_LENGTH);
    +
    2262  g->typing = 0;
    +
    2263  memset(g->messages, 0, sizeof(char) * MAX_MESSAGES * MAX_TEXT_LENGTH);
    +
    2264  g->message_index = 0;
    +
    2265 }
    +
    +
    +
    + +

    ◆ set_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_block (int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 1182 of file main.c.

    +
    1182  {
    +
    1183  int p = chunked(x);
    +
    1184  int q = chunked(z);
    +
    1185  _set_block(p, q, x, y, z, w, 1);
    +
    1186  for (int dx = -1; dx <= 1; dx++) {
    +
    1187  for (int dz = -1; dz <= 1; dz++) {
    +
    1188  if (dx == 0 && dz == 0) {
    +
    1189  continue;
    +
    1190  }
    +
    1191  if (dx && chunked(x + dx) == p) {
    +
    1192  continue;
    +
    1193  }
    +
    1194  if (dz && chunked(z + dz) == q) {
    +
    1195  continue;
    +
    1196  }
    +
    1197  _set_block(p + dx, q + dz, x, y, z, -w, 1);
    +
    1198  }
    +
    1199  }
    +
    1200  client_block(x, y, z, w);
    +
    1201 }
    +
    void client_block(int x, int y, int z, int w)
    Definition: client.c:116
    +
    +
    +
    + +

    ◆ set_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_sign (int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 1156 of file main.c.

    +
    1156  {
    +
    1157  int p = chunked(x);
    +
    1158  int q = chunked(z);
    +
    1159  _set_sign(p, q, x, y, z, face, text, 1);
    +
    1160  client_sign(x, y, z, face, text);
    +
    1161 }
    +
    void client_sign(int x, int y, int z, int face, const char *text)
    Definition: client.c:125
    +
    +
    +
    + +

    ◆ sphere()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void sphere (Blockcenter,
    int radius,
    int fill,
    int fx,
    int fy,
    int fz 
    )
    +
    + +

    Definition at line 1516 of file main.c.

    +
    1516  {
    +
    1517  static float offsets[8][3] = {
    +
    1518  {-0.5, -0.5, -0.5},
    +
    1519  {-0.5, -0.5, 0.5},
    +
    1520  {-0.5, 0.5, -0.5},
    +
    1521  {-0.5, 0.5, 0.5},
    +
    1522  {0.5, -0.5, -0.5},
    +
    1523  {0.5, -0.5, 0.5},
    +
    1524  {0.5, 0.5, -0.5},
    +
    1525  {0.5, 0.5, 0.5}
    +
    1526  };
    +
    1527  int cx = center->x;
    +
    1528  int cy = center->y;
    +
    1529  int cz = center->z;
    +
    1530  int w = center->w;
    +
    1531  for (int x = cx - radius; x <= cx + radius; x++) {
    +
    1532  if (fx && x != cx) {
    +
    1533  continue;
    +
    1534  }
    +
    1535  for (int y = cy - radius; y <= cy + radius; y++) {
    +
    1536  if (fy && y != cy) {
    +
    1537  continue;
    +
    1538  }
    +
    1539  for (int z = cz - radius; z <= cz + radius; z++) {
    +
    1540  if (fz && z != cz) {
    +
    1541  continue;
    +
    1542  }
    +
    1543  int inside = 0;
    +
    1544  int outside = fill;
    +
    1545  for (int i = 0; i < 8; i++) {
    +
    1546  float dx = x + offsets[i][0] - cx;
    +
    1547  float dy = y + offsets[i][1] - cy;
    +
    1548  float dz = z + offsets[i][2] - cz;
    +
    1549  float d = sqrtf(dx * dx + dy * dy + dz * dz);
    +
    1550  if (d < radius) {
    +
    1551  inside = 1;
    +
    1552  }
    +
    1553  else {
    +
    1554  outside = 1;
    +
    1555  }
    +
    1556  }
    +
    1557  if (inside && outside) {
    +
    1558  builder_block(x, y, z, w);
    +
    1559  }
    +
    1560  }
    +
    1561  }
    +
    1562  }
    +
    1563 }
    +
    +
    +
    + +

    ◆ time_of_day()

    + +
    +
    + + + + + + + +
    float time_of_day ()
    +
    + +

    Definition at line 141 of file main.c.

    +
    141  {
    +
    142  if (DAY_LENGTH <= 0) {
    +
    143  return 0.5;
    +
    144  }
    +
    145  float t;
    +
    146  t = glfwGetTime();
    +
    147  t = t + DAY_LENGTH / 3.0;
    +
    148  t = t / DAY_LENGTH;
    +
    149  t = t - (int)t;
    +
    150  return t;
    +
    151 }
    +
    #define DAY_LENGTH
    Definition: config.h:14
    +
    +
    +
    + +

    ◆ tree()

    + +
    +
    + + + + + + + + +
    void tree (Blockblock)
    +
    + +

    Definition at line 1603 of file main.c.

    +
    1603  {
    +
    1604  int bx = block->x;
    +
    1605  int by = block->y;
    +
    1606  int bz = block->z;
    +
    1607  for (int y = by + 3; y < by + 8; y++) {
    +
    1608  for (int dx = -3; dx <= 3; dx++) {
    +
    1609  for (int dz = -3; dz <= 3; dz++) {
    +
    1610  int dy = y - (by + 4);
    +
    1611  int d = (dx * dx) + (dy * dy) + (dz * dz);
    +
    1612  if (d < 11) {
    +
    1613  builder_block(bx + dx, y, bz + dz, 15);
    +
    1614  }
    +
    1615  }
    +
    1616  }
    +
    1617  }
    +
    1618  for (int y = by; y < by + 7; y++) {
    +
    1619  builder_block(bx, y, bz, 5);
    +
    1620  }
    +
    1621 }
    +
    +
    +
    + +

    ◆ unset_sign()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void unset_sign (int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 1106 of file main.c.

    +
    1106  {
    +
    1107  int p = chunked(x);
    +
    1108  int q = chunked(z);
    +
    1109  Chunk *chunk = find_chunk(p, q);
    +
    1110  if (chunk) {
    +
    1111  SignList *signs = &chunk->signs;
    +
    1112  if (sign_list_remove_all(signs, x, y, z)) {
    +
    1113  chunk->dirty = 1;
    +
    1114  db_delete_signs(x, y, z);
    +
    1115  }
    +
    1116  }
    +
    1117  else {
    +
    1118  db_delete_signs(x, y, z);
    +
    1119  }
    +
    1120 }
    +
    void db_delete_signs(int x, int y, int z)
    Definition: db.c:341
    +
    int sign_list_remove_all(SignList *list, int x, int y, int z)
    Definition: sign.c:60
    +
    +
    +
    + +

    ◆ unset_sign_face()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void unset_sign_face (int x,
    int y,
    int z,
    int face 
    )
    +
    + +

    Definition at line 1122 of file main.c.

    +
    1122  {
    +
    1123  int p = chunked(x);
    +
    1124  int q = chunked(z);
    +
    1125  Chunk *chunk = find_chunk(p, q);
    +
    1126  if (chunk) {
    +
    1127  SignList *signs = &chunk->signs;
    +
    1128  if (sign_list_remove(signs, x, y, z, face)) {
    +
    1129  chunk->dirty = 1;
    +
    1130  db_delete_sign(x, y, z, face);
    +
    1131  }
    +
    1132  }
    +
    1133  else {
    +
    1134  db_delete_sign(x, y, z, face);
    +
    1135  }
    +
    1136 }
    +
    void db_delete_sign(int x, int y, int z, int face)
    Definition: db.c:329
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    +
    +
    + +

    ◆ update_player()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void update_player (Playerplayer,
    float x,
    float y,
    float z,
    float rx,
    float ry,
    int interpolate 
    )
    +
    + +

    Definition at line 390 of file main.c.

    +
    392 {
    +
    393  if (interpolate) {
    +
    394  State *s1 = &player->state1;
    +
    395  State *s2 = &player->state2;
    +
    396  memcpy(s1, s2, sizeof(State));
    +
    397  s2->x = x; s2->y = y; s2->z = z; s2->rx = rx; s2->ry = ry;
    +
    398  s2->t = glfwGetTime();
    +
    399  if (s2->rx - s1->rx > PI) {
    +
    400  s1->rx += 2 * PI;
    +
    401  }
    +
    402  if (s1->rx - s2->rx > PI) {
    +
    403  s1->rx -= 2 * PI;
    +
    404  }
    +
    405  }
    +
    406  else {
    +
    407  State *s = &player->state;
    +
    408  s->x = x; s->y = y; s->z = z; s->rx = rx; s->ry = ry;
    +
    409  del_buffer(player->buffer);
    +
    410  player->buffer = gen_player_buffer(s->x, s->y, s->z, s->rx, s->ry);
    +
    411  }
    +
    412 }
    +
    #define PI
    Definition: util.h:8
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ g

    + +
    +
    + + + + + +
    + + + + +
    Model* g = &model
    +
    +static
    +
    + +

    Definition at line 135 of file main.c.

    + +
    +
    + +

    ◆ model

    + +
    +
    + + + + + +
    + + + + +
    Model model
    +
    +static
    +
    + +

    Definition at line 134 of file main.c.

    + +
    +
    +
    + + + + diff --git a/documentation/html/main_8c_source.html b/documentation/html/main_8c_source.html new file mode 100644 index 000000000..dea391261 --- /dev/null +++ b/documentation/html/main_8c_source.html @@ -0,0 +1,3057 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    main.c
    +
    +
    +Go to the documentation of this file.
    1 #include <GL/glew.h>
    +
    2 #include <GLFW/glfw3.h>
    +
    3 #include <curl/curl.h>
    +
    4 #include <math.h>
    +
    5 #include <stdio.h>
    +
    6 #include <stdlib.h>
    +
    7 #include <string.h>
    +
    8 #include <time.h>
    +
    9 #include "auth.h"
    +
    10 #include "client.h"
    +
    11 #include "config.h"
    +
    12 #include "cube.h"
    +
    13 #include "db.h"
    +
    14 #include "item.h"
    +
    15 #include "map.h"
    +
    16 #include "matrix.h"
    +
    17 #include "noise.h"
    +
    18 #include "sign.h"
    +
    19 #include "util.h"
    +
    20 #include "world.h"
    +
    21 
    +
    22 #define MAX_CHUNKS 8192
    +
    23 #define MAX_PLAYERS 128
    +
    24 #define MAX_TEXT_LENGTH 256
    +
    25 #define MAX_NAME_LENGTH 32
    +
    26 #define MAX_PATH_LENGTH 256
    +
    27 #define MAX_ADDR_LENGTH 256
    +
    28 
    +
    29 #define ALIGN_LEFT 0
    +
    30 #define ALIGN_CENTER 1
    +
    31 #define ALIGN_RIGHT 2
    +
    32 
    +
    33 #define MODE_OFFLINE 0
    +
    34 #define MODE_ONLINE 1
    +
    35 
    +
    36 #define MOUSE_SENSITIVITY 0.001;
    +
    37 
    +
    38 #define MAX_PLAYER_HEALTH 10
    +
    39 
    +
    40 typedef struct {
    + + +
    43  int p;
    +
    44  int q;
    +
    45  int faces;
    + + +
    48  int dirty;
    +
    49  int miny;
    +
    50  int maxy;
    +
    51  GLuint buffer;
    +
    52  GLuint alpha_buffer;
    +
    53  GLuint sign_buffer;
    +
    54 } Chunk;
    +
    55 
    +
    56 typedef struct {
    +
    57  int x;
    +
    58  int y;
    +
    59  int z;
    +
    60  int w;
    +
    61 } Block;
    +
    62 
    +
    63 typedef struct {
    +
    64  float x;
    +
    65  float y;
    +
    66  float z;
    +
    67  float rx;
    +
    68  float ry;
    +
    69  float t;
    +
    70 } State;
    +
    71 
    +
    72 typedef struct {
    +
    73  int id;
    +
    74  char name[MAX_NAME_LENGTH];
    +
    75  float health;
    + + + +
    79  GLuint buffer;
    +
    80 } Player;
    +
    81 
    +
    82 typedef struct {
    +
    83  GLuint program;
    +
    84  GLuint position;
    +
    85  GLuint normal;
    +
    86  GLuint uv;
    +
    87  GLuint matrix;
    +
    88  GLuint sampler;
    +
    89  GLuint camera;
    +
    90  GLuint timer;
    +
    91  GLuint extra1;
    +
    92  GLuint extra2;
    +
    93  GLuint extra3;
    +
    94  GLuint extra4;
    +
    95 } Attrib;
    +
    96 
    +
    97 typedef struct {
    +
    98  GLFWwindow *window;
    +
    99  float sensitivity;
    +
    100  Chunk chunks[MAX_CHUNKS];
    + + + + + +
    106  Player players[MAX_PLAYERS];
    + +
    108  int typing;
    +
    109  char typing_buffer[MAX_TEXT_LENGTH];
    + +
    111  char messages[MAX_MESSAGES][MAX_TEXT_LENGTH];
    +
    112  int width;
    +
    113  int height;
    +
    114  int observe1;
    +
    115  int observe2;
    +
    116  int flying;
    +
    117  int slowed;
    + +
    119  int scale;
    +
    120  int ortho;
    +
    121  float fov;
    + +
    123  int mode;
    + +
    125  char db_path[MAX_PATH_LENGTH];
    +
    126  char server_addr[MAX_ADDR_LENGTH];
    + + + + + +
    132 } Model;
    +
    133 
    +
    134 static Model model;
    +
    135 static Model *g = &model;
    +
    136 
    +
    137 int chunked(float x) {
    +
    138  return floorf(roundf(x) / CHUNK_SIZE);
    +
    139 }
    +
    140 
    +
    141 float time_of_day() {
    +
    142  if (DAY_LENGTH <= 0) {
    +
    143  return 0.5;
    +
    144  }
    +
    145  float t;
    +
    146  t = glfwGetTime();
    +
    147  t = t + DAY_LENGTH / 3.0;
    +
    148  t = t / DAY_LENGTH;
    +
    149  t = t - (int)t;
    +
    150  return t;
    +
    151 }
    +
    152 
    +
    153 float get_daylight() {
    +
    154  float timer = time_of_day();
    +
    155  if (timer < 0.5) {
    +
    156  float t = (timer - 0.25) * 100;
    +
    157  return 1 / (1 + powf(2, -t));
    +
    158  }
    +
    159  else {
    +
    160  float t = (timer - 0.90) * 100;
    +
    161  return 1 - 1 / (1 + powf(2, -t));
    +
    162  }
    +
    163 }
    +
    164 
    + +
    166  int window_width, window_height;
    +
    167  int buffer_width, buffer_height;
    +
    168  glfwGetWindowSize(g->window, &window_width, &window_height);
    +
    169  glfwGetFramebufferSize(g->window, &buffer_width, &buffer_height);
    +
    170  int result = buffer_width / window_width;
    +
    171  result = MAX(1, result);
    +
    172  result = MIN(2, result);
    +
    173  return result;
    +
    174 }
    +
    175 
    +
    176 void get_sight_vector(float rx, float ry, float *vx, float *vy, float *vz) {
    +
    177  float m = cosf(ry);
    +
    178  *vx = cosf(rx - RADIANS(90)) * m;
    +
    179  *vy = sinf(ry);
    +
    180  *vz = sinf(rx - RADIANS(90)) * m;
    +
    181 }
    +
    182 
    +
    183 void get_motion_vector(int flying, int sz, int sx, float rx, float ry,
    +
    184  float *vx, float *vy, float *vz) {
    +
    185  *vx = 0; *vy = 0; *vz = 0;
    +
    186  if (!sz && !sx) {
    +
    187  return;
    +
    188  }
    +
    189  float strafe = atan2f(sz, sx);
    +
    190  if (flying) {
    +
    191  float m = cosf(ry);
    +
    192  float y = sinf(ry);
    +
    193  if (sx) {
    +
    194  if (!sz) {
    +
    195  y = 0;
    +
    196  }
    +
    197  m = 1;
    +
    198  }
    +
    199  if (sz > 0) {
    +
    200  y = -y;
    +
    201  }
    +
    202  *vx = cosf(rx + strafe) * m;
    +
    203  *vy = y;
    +
    204  *vz = sinf(rx + strafe) * m;
    +
    205  }
    +
    206  else {
    +
    207  *vx = cosf(rx + strafe);
    +
    208  *vy = 0;
    +
    209  *vz = sinf(rx + strafe);
    +
    210  }
    +
    211 }
    +
    212 
    + +
    214  int x = g->width / 2;
    +
    215  int y = g->height / 2;
    +
    216  int p = 10 * g->scale;
    +
    217  float data[] = {
    +
    218  x, y - p, x, y + p,
    +
    219  x - p, y, x + p, y
    +
    220  };
    +
    221  return gen_buffer(sizeof(data), data);
    +
    222 }
    +
    223 
    +
    224 GLuint gen_wireframe_buffer(float x, float y, float z, float n) {
    +
    225  float data[72];
    +
    226  make_cube_wireframe(data, x, y, z, n);
    +
    227  return gen_buffer(sizeof(data), data);
    +
    228 }
    +
    229 
    +
    230 GLuint gen_sky_buffer() {
    +
    231  float data[12288];
    +
    232  make_sphere(data, 1, 3);
    +
    233  return gen_buffer(sizeof(data), data);
    +
    234 }
    +
    235 
    +
    236 GLuint gen_cube_buffer(float x, float y, float z, float n, int w) {
    +
    237  GLfloat *data = malloc_faces(9, 6);
    +
    238  float ao[6][4] = {0};
    +
    239  make_cube(data, ao, 1, 1, 1, 1, 1, 1, x, y, z, n, w);
    +
    240  return gen_faces(9, 6, data);
    +
    241 }
    +
    242 
    +
    243 GLuint gen_plant_buffer(float x, float y, float z, float n, int w) {
    +
    244  GLfloat *data = malloc_faces(9, 4);
    +
    245  make_plant(data, x, y, z, n, w, 45);
    +
    246  return gen_faces(9, 4, data);
    +
    247 }
    +
    248 
    +
    249 GLuint gen_player_buffer(float x, float y, float z, float rx, float ry) {
    +
    250  GLfloat *data = malloc_faces(9, 6);
    +
    251  make_player(data, x, y, z, rx, ry);
    +
    252  return gen_faces(9, 6, data);
    +
    253 }
    +
    254 
    +
    255 GLuint gen_text_buffer(float x, float y, float n, char *text) {
    +
    256  int length = strlen(text);
    +
    257  GLfloat *data = malloc_faces(4, length);
    +
    258  for (int i = 0; i < length; i++) {
    +
    259  make_character(data + i * 24, x, y, n / 2, n, text[i]);
    +
    260  x += n;
    +
    261  }
    +
    262  return gen_faces(4, length, data);
    +
    263 }
    +
    264 
    +
    265 void draw_triangles_3d_ao(Attrib *attrib, GLuint buffer, int count) {
    +
    266  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    267  glEnableVertexAttribArray(attrib->position);
    +
    268  glEnableVertexAttribArray(attrib->normal);
    +
    269  glEnableVertexAttribArray(attrib->uv);
    +
    270  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    271  sizeof(GLfloat) * 9, 0);
    +
    272  glVertexAttribPointer(attrib->normal, 3, GL_FLOAT, GL_FALSE,
    +
    273  sizeof(GLfloat) * 9, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    274  glVertexAttribPointer(attrib->uv, 3, GL_FLOAT, GL_FALSE,
    +
    275  sizeof(GLfloat) * 9, (GLvoid *)(sizeof(GLfloat) * 6));
    +
    276  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    277  glDisableVertexAttribArray(attrib->position);
    +
    278  glDisableVertexAttribArray(attrib->normal);
    +
    279  glDisableVertexAttribArray(attrib->uv);
    +
    280  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    281 }
    +
    282 
    +
    283 void draw_triangles_3d_text(Attrib *attrib, GLuint buffer, int count) {
    +
    284  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    285  glEnableVertexAttribArray(attrib->position);
    +
    286  glEnableVertexAttribArray(attrib->uv);
    +
    287  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    288  sizeof(GLfloat) * 5, 0);
    +
    289  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    290  sizeof(GLfloat) * 5, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    291  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    292  glDisableVertexAttribArray(attrib->position);
    +
    293  glDisableVertexAttribArray(attrib->uv);
    +
    294  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    295 }
    +
    296 
    +
    297 void draw_triangles_3d(Attrib *attrib, GLuint buffer, int count) {
    +
    298  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    299  glEnableVertexAttribArray(attrib->position);
    +
    300  glEnableVertexAttribArray(attrib->normal);
    +
    301  glEnableVertexAttribArray(attrib->uv);
    +
    302  glVertexAttribPointer(attrib->position, 3, GL_FLOAT, GL_FALSE,
    +
    303  sizeof(GLfloat) * 8, 0);
    +
    304  glVertexAttribPointer(attrib->normal, 3, GL_FLOAT, GL_FALSE,
    +
    305  sizeof(GLfloat) * 8, (GLvoid *)(sizeof(GLfloat) * 3));
    +
    306  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    307  sizeof(GLfloat) * 8, (GLvoid *)(sizeof(GLfloat) * 6));
    +
    308  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    309  glDisableVertexAttribArray(attrib->position);
    +
    310  glDisableVertexAttribArray(attrib->normal);
    +
    311  glDisableVertexAttribArray(attrib->uv);
    +
    312  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    313 }
    +
    314 
    +
    315 void draw_triangles_2d(Attrib *attrib, GLuint buffer, int count) {
    +
    316  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    317  glEnableVertexAttribArray(attrib->position);
    +
    318  glEnableVertexAttribArray(attrib->uv);
    +
    319  glVertexAttribPointer(attrib->position, 2, GL_FLOAT, GL_FALSE,
    +
    320  sizeof(GLfloat) * 4, 0);
    +
    321  glVertexAttribPointer(attrib->uv, 2, GL_FLOAT, GL_FALSE,
    +
    322  sizeof(GLfloat) * 4, (GLvoid *)(sizeof(GLfloat) * 2));
    +
    323  glDrawArrays(GL_TRIANGLES, 0, count);
    +
    324  glDisableVertexAttribArray(attrib->position);
    +
    325  glDisableVertexAttribArray(attrib->uv);
    +
    326  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    327 }
    +
    328 
    +
    329 void draw_lines(Attrib *attrib, GLuint buffer, int components, int count) {
    +
    330  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    331  glEnableVertexAttribArray(attrib->position);
    +
    332  glVertexAttribPointer(
    +
    333  attrib->position, components, GL_FLOAT, GL_FALSE, 0, 0);
    +
    334  glDrawArrays(GL_LINES, 0, count);
    +
    335  glDisableVertexAttribArray(attrib->position);
    +
    336  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    337 }
    +
    338 
    +
    339 void draw_chunk(Attrib *attrib, Chunk *chunk) {
    +
    340  draw_triangles_3d_ao(attrib, chunk->buffer, chunk->faces * 6);
    +
    341 }
    +
    342 
    +
    343 void draw_item(Attrib *attrib, GLuint buffer, int count) {
    +
    344  draw_triangles_3d_ao(attrib, buffer, count);
    +
    345 }
    +
    346 
    +
    347 void draw_text(Attrib *attrib, GLuint buffer, int length) {
    +
    348  glEnable(GL_BLEND);
    +
    349  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    +
    350  draw_triangles_2d(attrib, buffer, length * 6);
    +
    351  glDisable(GL_BLEND);
    +
    352 }
    +
    353 
    +
    354 void draw_signs(Attrib *attrib, Chunk *chunk) {
    +
    355  glEnable(GL_POLYGON_OFFSET_FILL);
    +
    356  glPolygonOffset(-8, -1024);
    +
    357  draw_triangles_3d_text(attrib, chunk->sign_buffer, chunk->sign_faces * 6);
    +
    358  glDisable(GL_POLYGON_OFFSET_FILL);
    +
    359 }
    +
    360 
    +
    361 void draw_sign(Attrib *attrib, GLuint buffer, int length) {
    +
    362  glEnable(GL_POLYGON_OFFSET_FILL);
    +
    363  glPolygonOffset(-8, -1024);
    +
    364  draw_triangles_3d_text(attrib, buffer, length * 6);
    +
    365  glDisable(GL_POLYGON_OFFSET_FILL);
    +
    366 }
    +
    367 
    +
    368 void draw_cube(Attrib *attrib, GLuint buffer) {
    +
    369  draw_item(attrib, buffer, 36);
    +
    370 }
    +
    371 
    +
    372 void draw_plant(Attrib *attrib, GLuint buffer) {
    +
    373  draw_item(attrib, buffer, 24);
    +
    374 }
    +
    375 
    +
    376 void draw_player(Attrib *attrib, Player *player) {
    +
    377  draw_cube(attrib, player->buffer);
    +
    378 }
    +
    379 
    +
    380 Player *find_player(int id) {
    +
    381  for (int i = 0; i < g->player_count; i++) {
    +
    382  Player *player = g->players + i;
    +
    383  if (player->id == id) {
    +
    384  return player;
    +
    385  }
    +
    386  }
    +
    387  return 0;
    +
    388 }
    +
    389 
    +
    390 void update_player(Player *player,
    +
    391  float x, float y, float z, float rx, float ry, int interpolate)
    +
    392 {
    +
    393  if (interpolate) {
    +
    394  State *s1 = &player->state1;
    +
    395  State *s2 = &player->state2;
    +
    396  memcpy(s1, s2, sizeof(State));
    +
    397  s2->x = x; s2->y = y; s2->z = z; s2->rx = rx; s2->ry = ry;
    +
    398  s2->t = glfwGetTime();
    +
    399  if (s2->rx - s1->rx > PI) {
    +
    400  s1->rx += 2 * PI;
    +
    401  }
    +
    402  if (s1->rx - s2->rx > PI) {
    +
    403  s1->rx -= 2 * PI;
    +
    404  }
    +
    405  }
    +
    406  else {
    +
    407  State *s = &player->state;
    +
    408  s->x = x; s->y = y; s->z = z; s->rx = rx; s->ry = ry;
    +
    409  del_buffer(player->buffer);
    +
    410  player->buffer = gen_player_buffer(s->x, s->y, s->z, s->rx, s->ry);
    +
    411  }
    +
    412 }
    +
    413 
    +
    414 void interpolate_player(Player *player) {
    +
    415  State *s1 = &player->state1;
    +
    416  State *s2 = &player->state2;
    +
    417  float t1 = s2->t - s1->t;
    +
    418  float t2 = glfwGetTime() - s2->t;
    +
    419  t1 = MIN(t1, 1);
    +
    420  t1 = MAX(t1, 0.1);
    +
    421  float p = MIN(t2 / t1, 1);
    + +
    423  player,
    +
    424  s1->x + (s2->x - s1->x) * p,
    +
    425  s1->y + (s2->y - s1->y) * p,
    +
    426  s1->z + (s2->z - s1->z) * p,
    +
    427  s1->rx + (s2->rx - s1->rx) * p,
    +
    428  s1->ry + (s2->ry - s1->ry) * p,
    +
    429  0);
    +
    430 }
    +
    431 
    +
    432 void delete_player(int id) {
    +
    433  Player *player = find_player(id);
    +
    434  if (!player) {
    +
    435  return;
    +
    436  }
    +
    437  int count = g->player_count;
    +
    438  del_buffer(player->buffer);
    +
    439  Player *other = g->players + (--count);
    +
    440  memcpy(player, other, sizeof(Player));
    +
    441  g->player_count = count;
    +
    442 }
    +
    443 
    + +
    445  for (int i = 0; i < g->player_count; i++) {
    +
    446  Player *player = g->players + i;
    +
    447  del_buffer(player->buffer);
    +
    448  }
    +
    449  g->player_count = 0;
    +
    450 }
    +
    451 
    + +
    453  State *s1 = &p1->state;
    +
    454  State *s2 = &p2->state;
    +
    455  float x = s2->x - s1->x;
    +
    456  float y = s2->y - s1->y;
    +
    457  float z = s2->z - s1->z;
    +
    458  return sqrtf(x * x + y * y + z * z);
    +
    459 }
    +
    460 
    + +
    462  State *s1 = &p1->state;
    +
    463  State *s2 = &p2->state;
    +
    464  float d = player_player_distance(p1, p2);
    +
    465  float vx, vy, vz;
    +
    466  get_sight_vector(s1->rx, s1->ry, &vx, &vy, &vz);
    +
    467  vx *= d; vy *= d; vz *= d;
    +
    468  float px, py, pz;
    +
    469  px = s1->x + vx; py = s1->y + vy; pz = s1->z + vz;
    +
    470  float x = s2->x - px;
    +
    471  float y = s2->y - py;
    +
    472  float z = s2->z - pz;
    +
    473  return sqrtf(x * x + y * y + z * z);
    +
    474 }
    +
    475 
    + +
    477  Player *result = 0;
    +
    478  float threshold = RADIANS(5);
    +
    479  float best = 0;
    +
    480  for (int i = 0; i < g->player_count; i++) {
    +
    481  Player *other = g->players + i;
    +
    482  if (other == player) {
    +
    483  continue;
    +
    484  }
    +
    485  float p = player_crosshair_distance(player, other);
    +
    486  float d = player_player_distance(player, other);
    +
    487  if (d < 96 && p / d < threshold) {
    +
    488  if (best == 0 || d < best) {
    +
    489  best = d;
    +
    490  result = other;
    +
    491  }
    +
    492  }
    +
    493  }
    +
    494  return result;
    +
    495 }
    +
    496 
    +
    497 Chunk *find_chunk(int p, int q) {
    +
    498  for (int i = 0; i < g->chunk_count; i++) {
    +
    499  Chunk *chunk = g->chunks + i;
    +
    500  if (chunk->p == p && chunk->q == q) {
    +
    501  return chunk;
    +
    502  }
    +
    503  }
    +
    504  return 0;
    +
    505 }
    +
    506 
    +
    507 int chunk_distance(Chunk *chunk, int p, int q) {
    +
    508  int dp = ABS(chunk->p - p);
    +
    509  int dq = ABS(chunk->q - q);
    +
    510  return MAX(dp, dq);
    +
    511 }
    +
    512 
    +
    513 int chunk_visible(float planes[6][4], int p, int q, int miny, int maxy) {
    +
    514  int x = p * CHUNK_SIZE - 1;
    +
    515  int z = q * CHUNK_SIZE - 1;
    +
    516  int d = CHUNK_SIZE + 1;
    +
    517  float points[8][3] = {
    +
    518  {x + 0, miny, z + 0},
    +
    519  {x + d, miny, z + 0},
    +
    520  {x + 0, miny, z + d},
    +
    521  {x + d, miny, z + d},
    +
    522  {x + 0, maxy, z + 0},
    +
    523  {x + d, maxy, z + 0},
    +
    524  {x + 0, maxy, z + d},
    +
    525  {x + d, maxy, z + d}
    +
    526  };
    +
    527  int n = g->ortho ? 4 : 6;
    +
    528  for (int i = 0; i < n; i++) {
    +
    529  int in = 0;
    +
    530  int out = 0;
    +
    531  for (int j = 0; j < 8; j++) {
    +
    532  float d =
    +
    533  planes[i][0] * points[j][0] +
    +
    534  planes[i][1] * points[j][1] +
    +
    535  planes[i][2] * points[j][2] +
    +
    536  planes[i][3];
    +
    537  if (d < 0) {
    +
    538  out++;
    +
    539  }
    +
    540  else {
    +
    541  in++;
    +
    542  }
    +
    543  if (in && out) {
    +
    544  break;
    +
    545  }
    +
    546  }
    +
    547  if (in == 0) {
    +
    548  return 0;
    +
    549  }
    +
    550  }
    +
    551  return 1;
    +
    552 }
    +
    553 
    +
    554 int highest_block(float x, float z) {
    +
    555  int result = -1;
    +
    556  int nx = roundf(x);
    +
    557  int nz = roundf(z);
    +
    558  int p = chunked(x);
    +
    559  int q = chunked(z);
    +
    560  Chunk *chunk = find_chunk(p, q);
    +
    561  if (chunk) {
    +
    562  Map *map = &chunk->map;
    +
    563  MAP_FOR_EACH(map, e) {
    +
    564  if (is_obstacle(e->w) && e->x == nx && e->z == nz) {
    +
    565  result = MAX(result, e->y);
    +
    566  }
    + +
    568  }
    +
    569  return result;
    +
    570 }
    +
    571 
    + +
    573  Map *map, float max_distance, int previous,
    +
    574  float x, float y, float z,
    +
    575  float vx, float vy, float vz,
    +
    576  int *hx, int *hy, int *hz)
    +
    577 {
    +
    578  int m = 32;
    +
    579  int px = 0;
    +
    580  int py = 0;
    +
    581  int pz = 0;
    +
    582  for (int i = 0; i < max_distance * m; i++) {
    +
    583  int nx = roundf(x);
    +
    584  int ny = roundf(y);
    +
    585  int nz = roundf(z);
    +
    586  if (nx != px || ny != py || nz != pz) {
    +
    587  int hw = map_get(map, nx, ny, nz);
    +
    588  if (hw > 0) {
    +
    589  if (previous) {
    +
    590  *hx = px; *hy = py; *hz = pz;
    +
    591  }
    +
    592  else {
    +
    593  *hx = nx; *hy = ny; *hz = nz;
    +
    594  }
    +
    595  return hw;
    +
    596  }
    +
    597  px = nx; py = ny; pz = nz;
    +
    598  }
    +
    599  x += vx / m; y += vy / m; z += vz / m;
    +
    600  }
    +
    601  return 0;
    +
    602 }
    +
    603 
    + +
    605  int previous, float x, float y, float z, float rx, float ry,
    +
    606  int *bx, int *by, int *bz)
    +
    607 {
    +
    608  int result = 0;
    +
    609  float best = 0;
    +
    610  int p = chunked(x);
    +
    611  int q = chunked(z);
    +
    612  float vx, vy, vz;
    +
    613  get_sight_vector(rx, ry, &vx, &vy, &vz);
    +
    614  for (int i = 0; i < g->chunk_count; i++) {
    +
    615  Chunk *chunk = g->chunks + i;
    +
    616  if (chunk_distance(chunk, p, q) > 1) {
    +
    617  continue;
    +
    618  }
    +
    619  int hx, hy, hz;
    +
    620  int hw = _hit_test(&chunk->map, 8, previous,
    +
    621  x, y, z, vx, vy, vz, &hx, &hy, &hz);
    +
    622  if (hw > 0) {
    +
    623  float d = sqrtf(
    +
    624  powf(hx - x, 2) + powf(hy - y, 2) + powf(hz - z, 2));
    +
    625  if (best == 0 || d < best) {
    +
    626  best = d;
    +
    627  *bx = hx; *by = hy; *bz = hz;
    +
    628  result = hw;
    +
    629  }
    +
    630  }
    +
    631  }
    +
    632  return result;
    +
    633 }
    +
    634 
    +
    635 int hit_test_face(Player *player, int *x, int *y, int *z, int *face) {
    +
    636  State *s = &player->state;
    +
    637  int w = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, x, y, z);
    +
    638  if (is_obstacle(w)) {
    +
    639  int hx, hy, hz;
    +
    640  hit_test(1, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    641  int dx = hx - *x;
    +
    642  int dy = hy - *y;
    +
    643  int dz = hz - *z;
    +
    644  if (dx == -1 && dy == 0 && dz == 0) {
    +
    645  *face = 0; return 1;
    +
    646  }
    +
    647  if (dx == 1 && dy == 0 && dz == 0) {
    +
    648  *face = 1; return 1;
    +
    649  }
    +
    650  if (dx == 0 && dy == 0 && dz == -1) {
    +
    651  *face = 2; return 1;
    +
    652  }
    +
    653  if (dx == 0 && dy == 0 && dz == 1) {
    +
    654  *face = 3; return 1;
    +
    655  }
    +
    656  if (dx == 0 && dy == 1 && dz == 0) {
    +
    657  int degrees = roundf(DEGREES(atan2f(s->x - hx, s->z - hz)));
    +
    658  if (degrees < 0) {
    +
    659  degrees += 360;
    +
    660  }
    +
    661  int top = ((degrees + 45) / 90) % 4;
    +
    662  *face = 4 + top; return 1;
    +
    663  }
    +
    664  }
    +
    665  return 0;
    +
    666 }
    +
    667 
    +
    668 int collide(int height, float *x, float *y, float *z) {
    +
    669  int result = 0;
    +
    670  int p = chunked(*x);
    +
    671  int q = chunked(*z);
    +
    672  Chunk *chunk = find_chunk(p, q);
    +
    673  if (!chunk) {
    +
    674  return result;
    +
    675  }
    +
    676  Map *map = &chunk->map;
    +
    677  int nx = roundf(*x);
    +
    678  int ny = roundf(*y);
    +
    679  int nz = roundf(*z);
    +
    680  float px = *x - nx;
    +
    681  float py = *y - ny;
    +
    682  float pz = *z - nz;
    +
    683  float pad = 0.25;
    +
    684  for (int dy = 0; dy < height; dy++) {
    +
    685  if (px < -pad && is_obstacle(map_get(map, nx - 1, ny - dy, nz))) {
    +
    686  *x = nx - pad;
    +
    687  }
    +
    688  if (px > pad && is_obstacle(map_get(map, nx + 1, ny - dy, nz))) {
    +
    689  *x = nx + pad;
    +
    690  }
    +
    691  if (py < -pad && is_obstacle(map_get(map, nx, ny - dy - 1, nz))) {
    +
    692  *y = ny - pad;
    +
    693  result = 1;
    +
    694  }
    +
    695  if (py > pad && is_obstacle(map_get(map, nx, ny - dy + 1, nz))) {
    +
    696  *y = ny + pad;
    +
    697  result = 1;
    +
    698  }
    +
    699  if (pz < -pad && is_obstacle(map_get(map, nx, ny - dy, nz - 1))) {
    +
    700  *z = nz - pad;
    +
    701  }
    +
    702  if (pz > pad && is_obstacle(map_get(map, nx, ny - dy, nz + 1))) {
    +
    703  *z = nz + pad;
    +
    704  }
    +
    705  }
    +
    706  return result;
    +
    707 }
    +
    708 
    + +
    710  int height,
    +
    711  float x, float y, float z,
    +
    712  int hx, int hy, int hz)
    +
    713 {
    +
    714  int nx = roundf(x);
    +
    715  int ny = roundf(y);
    +
    716  int nz = roundf(z);
    +
    717  for (int i = 0; i < height; i++) {
    +
    718  if (nx == hx && ny - i == hy && nz == hz) {
    +
    719  return 1;
    +
    720  }
    +
    721  }
    +
    722  return 0;
    +
    723 }
    +
    724 
    + +
    726  GLfloat *data, float x, float y, float z, int face, const char *text)
    +
    727 {
    +
    728  static const int glyph_dx[8] = {0, 0, -1, 1, 1, 0, -1, 0};
    +
    729  static const int glyph_dz[8] = {1, -1, 0, 0, 0, -1, 0, 1};
    +
    730  static const int line_dx[8] = {0, 0, 0, 0, 0, 1, 0, -1};
    +
    731  static const int line_dy[8] = {-1, -1, -1, -1, 0, 0, 0, 0};
    +
    732  static const int line_dz[8] = {0, 0, 0, 0, 1, 0, -1, 0};
    +
    733  if (face < 0 || face >= 8) {
    +
    734  return 0;
    +
    735  }
    +
    736  int count = 0;
    +
    737  float max_width = 64;
    +
    738  float line_height = 1.25;
    +
    739  char lines[1024];
    +
    740  int rows = wrap(text, max_width, lines, 1024);
    +
    741  rows = MIN(rows, 5);
    +
    742  int dx = glyph_dx[face];
    +
    743  int dz = glyph_dz[face];
    +
    744  int ldx = line_dx[face];
    +
    745  int ldy = line_dy[face];
    +
    746  int ldz = line_dz[face];
    +
    747  float n = 1.0 / (max_width / 10);
    +
    748  float sx = x - n * (rows - 1) * (line_height / 2) * ldx;
    +
    749  float sy = y - n * (rows - 1) * (line_height / 2) * ldy;
    +
    750  float sz = z - n * (rows - 1) * (line_height / 2) * ldz;
    +
    751  char *key;
    +
    752  char *line = tokenize(lines, "\n", &key);
    +
    753  while (line) {
    +
    754  int length = strlen(line);
    +
    755  int line_width = string_width(line);
    +
    756  line_width = MIN(line_width, max_width);
    +
    757  float rx = sx - dx * line_width / max_width / 2;
    +
    758  float ry = sy;
    +
    759  float rz = sz - dz * line_width / max_width / 2;
    +
    760  for (int i = 0; i < length; i++) {
    +
    761  int width = char_width(line[i]);
    +
    762  line_width -= width;
    +
    763  if (line_width < 0) {
    +
    764  break;
    +
    765  }
    +
    766  rx += dx * width / max_width / 2;
    +
    767  rz += dz * width / max_width / 2;
    +
    768  if (line[i] != ' ') {
    + +
    770  data + count * 30, rx, ry, rz, n / 2, face, line[i]);
    +
    771  count++;
    +
    772  }
    +
    773  rx += dx * width / max_width / 2;
    +
    774  rz += dz * width / max_width / 2;
    +
    775  }
    +
    776  sx += n * line_height * ldx;
    +
    777  sy += n * line_height * ldy;
    +
    778  sz += n * line_height * ldz;
    +
    779  line = tokenize(NULL, "\n", &key);
    +
    780  rows--;
    +
    781  if (rows <= 0) {
    +
    782  break;
    +
    783  }
    +
    784  }
    +
    785  return count;
    +
    786 }
    +
    787 
    +
    788 void gen_sign_buffer(Chunk *chunk) {
    +
    789  SignList *signs = &chunk->signs;
    +
    790 
    +
    791  // first pass - count characters
    +
    792  int max_faces = 0;
    +
    793  for (int i = 0; i < signs->size; i++) {
    +
    794  Sign *e = signs->data + i;
    +
    795  max_faces += strlen(e->text);
    +
    796  }
    +
    797 
    +
    798  // second pass - generate geometry
    +
    799  GLfloat *data = malloc_faces(5, max_faces);
    +
    800  int faces = 0;
    +
    801  for (int i = 0; i < signs->size; i++) {
    +
    802  Sign *e = signs->data + i;
    +
    803  faces += _gen_sign_buffer(
    +
    804  data + faces * 30, e->x, e->y, e->z, e->face, e->text);
    +
    805  }
    +
    806 
    +
    807  del_buffer(chunk->sign_buffer);
    +
    808  chunk->sign_buffer = gen_faces(5, faces, data);
    +
    809  chunk->sign_faces = faces;
    +
    810 }
    +
    811 
    +
    812 void occlusion(char neighbors[27], float result[6][4]) {
    +
    813  static const int lookup[6][4][3] = {
    +
    814  {{0, 1, 3}, {2, 1, 5}, {6, 3, 7}, {8, 5, 7}},
    +
    815  {{18, 19, 21}, {20, 19, 23}, {24, 21, 25}, {26, 23, 25}},
    +
    816  {{6, 7, 15}, {8, 7, 17}, {24, 15, 25}, {26, 17, 25}},
    +
    817  {{0, 1, 9}, {2, 1, 11}, {18, 9, 19}, {20, 11, 19}},
    +
    818  {{0, 3, 9}, {6, 3, 15}, {18, 9, 21}, {24, 15, 21}},
    +
    819  {{2, 5, 11}, {8, 5, 17}, {20, 11, 23}, {26, 17, 23}}
    +
    820  };
    +
    821  static const float curve[4] = {0.0, 0.5, 0.75, 1.0};
    +
    822  for (int i = 0; i < 6; i++) {
    +
    823  for (int j = 0; j < 4; j++) {
    +
    824  int corner = neighbors[lookup[i][j][0]];
    +
    825  int side1 = neighbors[lookup[i][j][1]];
    +
    826  int side2 = neighbors[lookup[i][j][2]];
    +
    827  int value = side1 && side2 ? 3 : corner + side1 + side2;
    +
    828  result[i][j] = curve[value];
    +
    829  }
    +
    830  }
    +
    831 }
    +
    832 
    +
    833 void gen_chunk_buffer(Chunk *chunk) {
    +
    834  static char blocks[CHUNK_SIZE + 2][258][CHUNK_SIZE + 2];
    +
    835  static char neighbors[27];
    +
    836  memset(blocks, 0, sizeof(blocks));
    +
    837  memset(neighbors, 0, sizeof(neighbors));
    +
    838  int ox = chunk->p * CHUNK_SIZE - 1;
    +
    839  int oy = -1;
    +
    840  int oz = chunk->q * CHUNK_SIZE - 1;
    +
    841 
    +
    842  Map *map = &chunk->map;
    +
    843  chunk->miny = 256;
    +
    844  chunk->maxy = 0;
    +
    845 
    +
    846  // first pass - populate blocks array
    +
    847  MAP_FOR_EACH(map, e) {
    +
    848  int x = e->x - ox;
    +
    849  int y = e->y - oy;
    +
    850  int z = e->z - oz;
    +
    851  // TODO: this should be unnecessary
    +
    852  if (x < 0 || y < 0 || z < 0) {
    +
    853  continue;
    +
    854  }
    +
    855  if (x >= CHUNK_SIZE + 2 || y >= 258 || z >= CHUNK_SIZE + 2) {
    +
    856  continue;
    +
    857  }
    +
    858  // END TODO
    +
    859  blocks[x][y][z] = e->w;
    + +
    861 
    +
    862  // second pass - count exposed faces
    +
    863  int faces = 0;
    +
    864  int alpha_faces = 0;
    +
    865  MAP_FOR_EACH(map, e) {
    +
    866  if (e->w <= 0) {
    +
    867  continue;
    +
    868  }
    +
    869  int x = e->x - ox;
    +
    870  int y = e->y - oy;
    +
    871  int z = e->z - oz;
    +
    872  int f1 = is_transparent(blocks[x - 1][y][z]);
    +
    873  int f2 = is_transparent(blocks[x + 1][y][z]);
    +
    874  int f3 = is_transparent(blocks[x][y + 1][z]);
    +
    875  int f4 = is_transparent(blocks[x][y - 1][z]) && (e->y > 0);
    +
    876  int f5 = is_transparent(blocks[x][y][z - 1]);
    +
    877  int f6 = is_transparent(blocks[x][y][z + 1]);
    +
    878  int total = f1 + f2 + f3 + f4 + f5 + f6;
    +
    879  if (is_plant(e->w)) {
    +
    880  total = total ? 4 : 0;
    +
    881  }
    +
    882  if (is_alpha(e->w)) {
    +
    883  alpha_faces += total;
    +
    884  }
    +
    885  else {
    +
    886  faces += total;
    +
    887  }
    + +
    889 
    +
    890  // third pass - generate geometry
    +
    891  GLfloat *data = malloc_faces(9, faces);
    +
    892  GLfloat *alpha_data = malloc_faces(9, alpha_faces);
    +
    893  int offset = 0;
    +
    894  int alpha_offset = 0;
    +
    895  MAP_FOR_EACH(map, e) {
    +
    896  if (e->w <= 0) {
    +
    897  continue;
    +
    898  }
    +
    899  int x = e->x - ox;
    +
    900  int y = e->y - oy;
    +
    901  int z = e->z - oz;
    +
    902  int f1 = is_transparent(blocks[x - 1][y][z]);
    +
    903  int f2 = is_transparent(blocks[x + 1][y][z]);
    +
    904  int f3 = is_transparent(blocks[x][y + 1][z]);
    +
    905  int f4 = is_transparent(blocks[x][y - 1][z]) && (e->y > 0);
    +
    906  int f5 = is_transparent(blocks[x][y][z - 1]);
    +
    907  int f6 = is_transparent(blocks[x][y][z + 1]);
    +
    908  int total = f1 + f2 + f3 + f4 + f5 + f6;
    +
    909  if (is_plant(e->w)) {
    +
    910  total = total ? 4 : 0;
    +
    911  }
    +
    912  if (total == 0) {
    +
    913  continue;
    +
    914  }
    +
    915  chunk->miny = MIN(chunk->miny, e->y);
    +
    916  chunk->maxy = MAX(chunk->maxy, e->y);
    +
    917  if (is_plant(e->w)) {
    +
    918  float rotation = simplex2(e->x, e->z, 4, 0.5, 2) * 360;
    +
    919  make_plant(
    +
    920  data + offset,
    +
    921  e->x, e->y, e->z, 0.5, e->w, rotation);
    +
    922  offset += total * 54;
    +
    923  }
    +
    924  else {
    +
    925  int index = 0;
    +
    926  for (int dx = -1; dx <= 1; dx++) {
    +
    927  for (int dy = -1; dy <= 1; dy++) {
    +
    928  for (int dz = -1; dz <= 1; dz++) {
    +
    929  int w = blocks[x + dx][y + dy][z + dz];
    +
    930  neighbors[index++] = !is_transparent(w);
    +
    931  }
    +
    932  }
    +
    933  }
    +
    934  float ao[6][4];
    +
    935  occlusion(neighbors, ao);
    +
    936  if (is_alpha(e->w)) {
    +
    937  make_cube(
    +
    938  alpha_data + alpha_offset, ao,
    +
    939  f1, f2, f3, f4, f5, f6,
    +
    940  e->x, e->y, e->z, 0.5, e->w);
    +
    941  alpha_offset += total * 54;
    +
    942  }
    +
    943  else {
    +
    944  make_cube(
    +
    945  data + offset, ao,
    +
    946  f1, f2, f3, f4, f5, f6,
    +
    947  e->x, e->y, e->z, 0.5, e->w);
    +
    948  offset += total * 54;
    +
    949  }
    +
    950  }
    + +
    952 
    +
    953  del_buffer(chunk->buffer);
    +
    954  del_buffer(chunk->alpha_buffer);
    +
    955  chunk->buffer = gen_faces(9, faces, data);
    +
    956  chunk->alpha_buffer = gen_faces(9, alpha_faces, alpha_data);
    +
    957  chunk->faces = faces;
    +
    958  chunk->alpha_faces = alpha_faces;
    +
    959 
    +
    960  gen_sign_buffer(chunk);
    +
    961 
    +
    962  chunk->dirty = 0;
    +
    963 }
    +
    964 
    +
    965 void map_set_func(int x, int y, int z, int w, void *arg) {
    +
    966  Map *map = (Map *)arg;
    +
    967  map_set(map, x, y, z, w);
    +
    968 }
    +
    969 
    +
    970 void create_chunk(Chunk *chunk, int p, int q) {
    +
    971  chunk->p = p;
    +
    972  chunk->q = q;
    +
    973  chunk->faces = 0;
    +
    974  chunk->alpha_faces = 0;
    +
    975  chunk->sign_faces = 0;
    +
    976  chunk->dirty = 1;
    +
    977  chunk->buffer = 0;
    +
    978  chunk->alpha_buffer = 0;
    +
    979  chunk->sign_buffer = 0;
    +
    980  Map *map = &chunk->map;
    +
    981  SignList *signs = &chunk->signs;
    +
    982  map_alloc(map);
    +
    983  sign_list_alloc(signs, 16);
    +
    984  create_world(p, q, map_set_func, map);
    +
    985  db_load_map(map, p, q);
    +
    986  db_load_signs(signs, p, q);
    +
    987  gen_chunk_buffer(chunk);
    +
    988  int key = db_get_key(p, q);
    +
    989  client_chunk(p, q, key);
    +
    990 }
    +
    991 
    + +
    993  int count = g->chunk_count;
    +
    994  State *s1 = &g->players->state;
    +
    995  State *s2 = &(g->players + g->observe1)->state;
    +
    996  State *s3 = &(g->players + g->observe2)->state;
    +
    997  State *states[3] = {s1, s2, s3};
    +
    998  for (int i = 0; i < count; i++) {
    +
    999  Chunk *chunk = g->chunks + i;
    +
    1000  int delete = 1;
    +
    1001  for (int j = 0; j < 3; j++) {
    +
    1002  State *s = states[j];
    +
    1003  int p = chunked(s->x);
    +
    1004  int q = chunked(s->z);
    +
    1005  if (chunk_distance(chunk, p, q) < g->delete_radius) {
    +
    1006  delete = 0;
    +
    1007  break;
    +
    1008  }
    +
    1009  }
    +
    1010  if (delete) {
    +
    1011  map_free(&chunk->map);
    +
    1012  sign_list_free(&chunk->signs);
    +
    1013  del_buffer(chunk->buffer);
    +
    1014  del_buffer(chunk->alpha_buffer);
    +
    1015  del_buffer(chunk->sign_buffer);
    +
    1016  Chunk *other = g->chunks + (--count);
    +
    1017  memcpy(chunk, other, sizeof(Chunk));
    +
    1018  }
    +
    1019  }
    +
    1020  g->chunk_count = count;
    +
    1021 }
    +
    1022 
    + +
    1024  for (int i = 0; i < g->chunk_count; i++) {
    +
    1025  Chunk *chunk = g->chunks + i;
    +
    1026  map_free(&chunk->map);
    +
    1027  sign_list_free(&chunk->signs);
    +
    1028  del_buffer(chunk->buffer);
    +
    1029  del_buffer(chunk->sign_buffer);
    +
    1030  }
    +
    1031  g->chunk_count = 0;
    +
    1032 }
    +
    1033 
    +
    1034 void force_chunks(Player *player) {
    +
    1035  State *s = &player->state;
    +
    1036  int p = chunked(s->x);
    +
    1037  int q = chunked(s->z);
    +
    1038  int r = 1;
    +
    1039  for (int dp = -r; dp <= r; dp++) {
    +
    1040  for (int dq = -r; dq <= r; dq++) {
    +
    1041  int a = p + dp;
    +
    1042  int b = q + dq;
    +
    1043  Chunk *chunk = find_chunk(a, b);
    +
    1044  if (chunk) {
    +
    1045  if (chunk->dirty) {
    +
    1046  gen_chunk_buffer(chunk);
    +
    1047  }
    +
    1048  }
    +
    1049  else if (g->chunk_count < MAX_CHUNKS) {
    +
    1050  create_chunk(g->chunks + g->chunk_count, a, b);
    +
    1051  g->chunk_count++;
    +
    1052  }
    +
    1053  }
    +
    1054  }
    +
    1055 }
    +
    1056 
    +
    1057 void ensure_chunks(Player *player) {
    +
    1058  force_chunks(player);
    +
    1059  State *s = &player->state;
    +
    1060  float matrix[16];
    +
    1061  set_matrix_3d(
    +
    1062  matrix, g->width, g->height,
    +
    1063  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1064  float planes[6][4];
    +
    1065  frustum_planes(planes, g->render_radius, matrix);
    +
    1066  int p = chunked(s->x);
    +
    1067  int q = chunked(s->z);
    +
    1068  int r = g->create_radius;
    +
    1069  int start = 0x0fffffff;
    +
    1070  int best_score = start;
    +
    1071  int best_a = 0;
    +
    1072  int best_b = 0;
    +
    1073  for (int dp = -r; dp <= r; dp++) {
    +
    1074  for (int dq = -r; dq <= r; dq++) {
    +
    1075  int a = p + dp;
    +
    1076  int b = q + dq;
    +
    1077  Chunk *chunk = find_chunk(a, b);
    +
    1078  if (chunk && !chunk->dirty) {
    +
    1079  continue;
    +
    1080  }
    +
    1081  int distance = MAX(ABS(dp), ABS(dq));
    +
    1082  int invisible = !chunk_visible(planes, a, b, 0, 256);
    +
    1083  int score = (invisible << 16) | distance;
    +
    1084  if (score < best_score) {
    +
    1085  best_score = score;
    +
    1086  best_a = a;
    +
    1087  best_b = b;
    +
    1088  }
    +
    1089  }
    +
    1090  }
    +
    1091  if (best_score == start) {
    +
    1092  return;
    +
    1093  }
    +
    1094  int a = best_a;
    +
    1095  int b = best_b;
    +
    1096  Chunk *chunk = find_chunk(a, b);
    +
    1097  if (chunk) {
    +
    1098  gen_chunk_buffer(chunk);
    +
    1099  }
    +
    1100  else if (g->chunk_count < MAX_CHUNKS) {
    +
    1101  create_chunk(g->chunks + g->chunk_count, a, b);
    +
    1102  g->chunk_count++;
    +
    1103  }
    +
    1104 }
    +
    1105 
    +
    1106 void unset_sign(int x, int y, int z) {
    +
    1107  int p = chunked(x);
    +
    1108  int q = chunked(z);
    +
    1109  Chunk *chunk = find_chunk(p, q);
    +
    1110  if (chunk) {
    +
    1111  SignList *signs = &chunk->signs;
    +
    1112  if (sign_list_remove_all(signs, x, y, z)) {
    +
    1113  chunk->dirty = 1;
    +
    1114  db_delete_signs(x, y, z);
    +
    1115  }
    +
    1116  }
    +
    1117  else {
    +
    1118  db_delete_signs(x, y, z);
    +
    1119  }
    +
    1120 }
    +
    1121 
    +
    1122 void unset_sign_face(int x, int y, int z, int face) {
    +
    1123  int p = chunked(x);
    +
    1124  int q = chunked(z);
    +
    1125  Chunk *chunk = find_chunk(p, q);
    +
    1126  if (chunk) {
    +
    1127  SignList *signs = &chunk->signs;
    +
    1128  if (sign_list_remove(signs, x, y, z, face)) {
    +
    1129  chunk->dirty = 1;
    +
    1130  db_delete_sign(x, y, z, face);
    +
    1131  }
    +
    1132  }
    +
    1133  else {
    +
    1134  db_delete_sign(x, y, z, face);
    +
    1135  }
    +
    1136 }
    +
    1137 
    + +
    1139  int p, int q, int x, int y, int z, int face, const char *text, int dirty)
    +
    1140 {
    +
    1141  if (strlen(text) == 0) {
    +
    1142  unset_sign_face(x, y, z, face);
    +
    1143  return;
    +
    1144  }
    +
    1145  Chunk *chunk = find_chunk(p, q);
    +
    1146  if (chunk) {
    +
    1147  SignList *signs = &chunk->signs;
    +
    1148  sign_list_add(signs, x, y, z, face, text);
    +
    1149  if (dirty) {
    +
    1150  chunk->dirty = 1;
    +
    1151  }
    +
    1152  }
    +
    1153  db_insert_sign(p, q, x, y, z, face, text);
    +
    1154 }
    +
    1155 
    +
    1156 void set_sign(int x, int y, int z, int face, const char *text) {
    +
    1157  int p = chunked(x);
    +
    1158  int q = chunked(z);
    +
    1159  _set_sign(p, q, x, y, z, face, text, 1);
    +
    1160  client_sign(x, y, z, face, text);
    +
    1161 }
    +
    1162 
    +
    1163 void _set_block(int p, int q, int x, int y, int z, int w, int dirty) {
    +
    1164  Chunk *chunk = find_chunk(p, q);
    +
    1165  if (chunk) {
    +
    1166  Map *map = &chunk->map;
    +
    1167  if (map_set(map, x, y, z, w)) {
    +
    1168  if (dirty) {
    +
    1169  chunk->dirty = 1;
    +
    1170  }
    +
    1171  db_insert_block(p, q, x, y, z, w);
    +
    1172  }
    +
    1173  }
    +
    1174  else {
    +
    1175  db_insert_block(p, q, x, y, z, w);
    +
    1176  }
    +
    1177  if (w == 0 && chunked(x) == p && chunked(z) == q) {
    +
    1178  unset_sign(x, y, z);
    +
    1179  }
    +
    1180 }
    +
    1181 
    +
    1182 void set_block(int x, int y, int z, int w) {
    +
    1183  int p = chunked(x);
    +
    1184  int q = chunked(z);
    +
    1185  _set_block(p, q, x, y, z, w, 1);
    +
    1186  for (int dx = -1; dx <= 1; dx++) {
    +
    1187  for (int dz = -1; dz <= 1; dz++) {
    +
    1188  if (dx == 0 && dz == 0) {
    +
    1189  continue;
    +
    1190  }
    +
    1191  if (dx && chunked(x + dx) == p) {
    +
    1192  continue;
    +
    1193  }
    +
    1194  if (dz && chunked(z + dz) == q) {
    +
    1195  continue;
    +
    1196  }
    +
    1197  _set_block(p + dx, q + dz, x, y, z, -w, 1);
    +
    1198  }
    +
    1199  }
    +
    1200  client_block(x, y, z, w);
    +
    1201 }
    +
    1202 
    +
    1203 void record_block(int x, int y, int z, int w) {
    +
    1204  memcpy(&g->block1, &g->block0, sizeof(Block));
    +
    1205  g->block0.x = x;
    +
    1206  g->block0.y = y;
    +
    1207  g->block0.z = z;
    +
    1208  g->block0.w = w;
    +
    1209 }
    +
    1210 
    +
    1211 int get_block(int x, int y, int z) {
    +
    1212  int p = chunked(x);
    +
    1213  int q = chunked(z);
    +
    1214  Chunk *chunk = find_chunk(p, q);
    +
    1215  if (chunk) {
    +
    1216  Map *map = &chunk->map;
    +
    1217  return map_get(map, x, y, z);
    +
    1218  }
    +
    1219  return 0;
    +
    1220 }
    +
    1221 
    +
    1222 void builder_block(int x, int y, int z, int w) {
    +
    1223  if (y <= 0 || y >= 256) {
    +
    1224  return;
    +
    1225  }
    +
    1226  if (is_destructable(get_block(x, y, z))) {
    +
    1227  set_block(x, y, z, 0);
    +
    1228  }
    +
    1229  if (w) {
    +
    1230  set_block(x, y, z, w);
    +
    1231  }
    +
    1232 }
    +
    1233 
    +
    1234 int render_chunks(Attrib *attrib, Player *player) {
    +
    1235  int result = 0;
    +
    1236  State *s = &player->state;
    +
    1237  ensure_chunks(player);
    +
    1238  int p = chunked(s->x);
    +
    1239  int q = chunked(s->z);
    +
    1240  float light = get_daylight();
    +
    1241  float matrix[16];
    +
    1242  set_matrix_3d(
    +
    1243  matrix, g->width, g->height,
    +
    1244  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1245  float planes[6][4];
    +
    1246  frustum_planes(planes, g->render_radius, matrix);
    +
    1247  glUseProgram(attrib->program);
    +
    1248  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1249  glUniform3f(attrib->camera, s->x, s->y, s->z);
    +
    1250  glUniform1i(attrib->sampler, 0);
    +
    1251  glUniform1i(attrib->extra1, 2);
    +
    1252  glUniform1f(attrib->extra2, light);
    +
    1253  glUniform1f(attrib->extra3, g->render_radius * CHUNK_SIZE);
    +
    1254  glUniform1i(attrib->extra4, g->ortho);
    +
    1255  glUniform1f(attrib->timer, time_of_day());
    +
    1256  for (int i = 0; i < g->chunk_count; i++) {
    +
    1257  Chunk *chunk = g->chunks + i;
    +
    1258  if (chunk_distance(chunk, p, q) > g->render_radius) {
    +
    1259  continue;
    +
    1260  }
    +
    1261  if (!chunk_visible(
    +
    1262  planes, chunk->p, chunk->q, chunk->miny, chunk->maxy))
    +
    1263  {
    +
    1264  continue;
    +
    1265  }
    +
    1266  draw_chunk(attrib, chunk);
    +
    1267  result += chunk->faces;
    +
    1268  }
    +
    1269  return result;
    +
    1270 }
    +
    1271 
    +
    1272 void render_signs(Attrib *attrib, Player *player) {
    +
    1273  State *s = &player->state;
    +
    1274  int p = chunked(s->x);
    +
    1275  int q = chunked(s->z);
    +
    1276  float matrix[16];
    +
    1277  set_matrix_3d(
    +
    1278  matrix, g->width, g->height,
    +
    1279  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1280  float planes[6][4];
    +
    1281  frustum_planes(planes, g->render_radius, matrix);
    +
    1282  glUseProgram(attrib->program);
    +
    1283  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1284  glUniform1i(attrib->sampler, 3);
    +
    1285  glUniform1i(attrib->extra1, 1);
    +
    1286  for (int i = 0; i < g->chunk_count; i++) {
    +
    1287  Chunk *chunk = g->chunks + i;
    +
    1288  if (chunk_distance(chunk, p, q) > g->sign_radius) {
    +
    1289  continue;
    +
    1290  }
    +
    1291  if (!chunk_visible(
    +
    1292  planes, chunk->p, chunk->q, chunk->miny, chunk->maxy))
    +
    1293  {
    +
    1294  continue;
    +
    1295  }
    +
    1296  draw_signs(attrib, chunk);
    +
    1297  }
    +
    1298 }
    +
    1299 
    +
    1300 void render_sign(Attrib *attrib, Player *player) {
    +
    1301  if (!g->typing || g->typing_buffer[0] != CRAFT_KEY_SIGN) {
    +
    1302  return;
    +
    1303  }
    +
    1304  int x, y, z, face;
    +
    1305  if (!hit_test_face(player, &x, &y, &z, &face)) {
    +
    1306  return;
    +
    1307  }
    +
    1308  State *s = &player->state;
    +
    1309  float matrix[16];
    +
    1310  set_matrix_3d(
    +
    1311  matrix, g->width, g->height,
    +
    1312  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1313  glUseProgram(attrib->program);
    +
    1314  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1315  glUniform1i(attrib->sampler, 3);
    +
    1316  glUniform1i(attrib->extra1, 1);
    +
    1317  char text[MAX_SIGN_LENGTH];
    +
    1318  strncpy(text, g->typing_buffer + 1, MAX_SIGN_LENGTH);
    +
    1319  text[MAX_SIGN_LENGTH - 1] = '\0';
    +
    1320  GLfloat *data = malloc_faces(5, strlen(text));
    +
    1321  int length = _gen_sign_buffer(data, x, y, z, face, text);
    +
    1322  GLuint buffer = gen_faces(5, length, data);
    +
    1323  draw_sign(attrib, buffer, length);
    +
    1324  del_buffer(buffer);
    +
    1325 }
    +
    1326 
    +
    1327 void render_players(Attrib *attrib, Player *player) {
    +
    1328  State *s = &player->state;
    +
    1329  float matrix[16];
    +
    1330  set_matrix_3d(
    +
    1331  matrix, g->width, g->height,
    +
    1332  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1333  glUseProgram(attrib->program);
    +
    1334  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1335  glUniform3f(attrib->camera, s->x, s->y, s->z);
    +
    1336  glUniform1i(attrib->sampler, 0);
    +
    1337  glUniform1f(attrib->timer, time_of_day());
    +
    1338  for (int i = 0; i < g->player_count; i++) {
    +
    1339  Player *other = g->players + i;
    +
    1340  if (other != player) {
    +
    1341  draw_player(attrib, other);
    +
    1342  }
    +
    1343  }
    +
    1344 }
    +
    1345 
    +
    1346 void render_sky(Attrib *attrib, Player *player, GLuint buffer) {
    +
    1347  State *s = &player->state;
    +
    1348  float matrix[16];
    +
    1349  set_matrix_3d(
    +
    1350  matrix, g->width, g->height,
    +
    1351  0, 0, 0, s->rx, s->ry, g->fov, 0, g->render_radius);
    +
    1352  glUseProgram(attrib->program);
    +
    1353  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1354  glUniform1i(attrib->sampler, 2);
    +
    1355  glUniform1f(attrib->timer, time_of_day());
    +
    1356  draw_triangles_3d(attrib, buffer, 512 * 3);
    +
    1357 }
    +
    1358 
    +
    1359 void render_wireframe(Attrib *attrib, Player *player) {
    +
    1360  State *s = &player->state;
    +
    1361  float matrix[16];
    +
    1362  set_matrix_3d(
    +
    1363  matrix, g->width, g->height,
    +
    1364  s->x, s->y, s->z, s->rx, s->ry, g->fov, g->ortho, g->render_radius);
    +
    1365  int hx, hy, hz;
    +
    1366  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1367  if (is_obstacle(hw)) {
    +
    1368  glUseProgram(attrib->program);
    +
    1369  glLineWidth(1);
    +
    1370  glEnable(GL_COLOR_LOGIC_OP);
    +
    1371  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1372  GLuint wireframe_buffer = gen_wireframe_buffer(hx, hy, hz, 0.53);
    +
    1373  draw_lines(attrib, wireframe_buffer, 3, 24);
    +
    1374  del_buffer(wireframe_buffer);
    +
    1375  glDisable(GL_COLOR_LOGIC_OP);
    +
    1376  }
    +
    1377 }
    +
    1378 
    +
    1379 void render_crosshairs(Attrib *attrib) {
    +
    1380  float matrix[16];
    +
    1381  set_matrix_2d(matrix, g->width, g->height);
    +
    1382  glUseProgram(attrib->program);
    +
    1383  glLineWidth(4 * g->scale);
    +
    1384  glEnable(GL_COLOR_LOGIC_OP);
    +
    1385  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1386  GLuint crosshair_buffer = gen_crosshair_buffer();
    +
    1387  draw_lines(attrib, crosshair_buffer, 2, 4);
    +
    1388  del_buffer(crosshair_buffer);
    +
    1389  glDisable(GL_COLOR_LOGIC_OP);
    +
    1390 }
    +
    1391 
    +
    1392 void render_item(Attrib *attrib) {
    +
    1393  float matrix[16];
    +
    1394  set_matrix_item(matrix, g->width, g->height, g->scale);
    +
    1395  glUseProgram(attrib->program);
    +
    1396  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1397  glUniform3f(attrib->camera, 0, 0, 5);
    +
    1398  glUniform1i(attrib->sampler, 0);
    +
    1399  glUniform1f(attrib->timer, time_of_day());
    +
    1400  int w = items[g->item_index];
    +
    1401  if (is_plant(w)) {
    +
    1402  GLuint buffer = gen_plant_buffer(0, 0, 0, 0.5, w);
    +
    1403  draw_plant(attrib, buffer);
    +
    1404  del_buffer(buffer);
    +
    1405  }
    +
    1406  else {
    +
    1407  GLuint buffer = gen_cube_buffer(0, 0, 0, 0.5, w);
    +
    1408  draw_cube(attrib, buffer);
    +
    1409  del_buffer(buffer);
    +
    1410  }
    +
    1411 }
    +
    1412 
    + +
    1414  Attrib *attrib, int justify, float x, float y, float n, char *text)
    +
    1415 {
    +
    1416  float matrix[16];
    +
    1417  set_matrix_2d(matrix, g->width, g->height);
    +
    1418  glUseProgram(attrib->program);
    +
    1419  glUniformMatrix4fv(attrib->matrix, 1, GL_FALSE, matrix);
    +
    1420  glUniform1i(attrib->sampler, 1);
    +
    1421  glUniform1i(attrib->extra1, 0);
    +
    1422  int length = strlen(text);
    +
    1423  x -= n * justify * (length - 1) / 2;
    +
    1424  GLuint buffer = gen_text_buffer(x, y, n, text);
    +
    1425  draw_text(attrib, buffer, length);
    +
    1426  del_buffer(buffer);
    +
    1427 }
    +
    1428 
    +
    1429 void add_message(const char *text) {
    +
    1430  printf("%s\n", text);
    +
    1431  snprintf(
    +
    1432  g->messages[g->message_index], MAX_TEXT_LENGTH, "%s", text);
    + +
    1434 }
    +
    1435 
    +
    1436 void login() {
    +
    1437  char username[128] = {0};
    +
    1438  char identity_token[128] = {0};
    +
    1439  char access_token[128] = {0};
    +
    1440  if (db_auth_get_selected(username, 128, identity_token, 128)) {
    +
    1441  printf("Contacting login server for username: %s\n", username);
    +
    1442  if (get_access_token(
    +
    1443  access_token, 128, username, identity_token))
    +
    1444  {
    +
    1445  printf("Successfully authenticated with the login server\n");
    +
    1446  client_login(username, access_token);
    +
    1447  }
    +
    1448  else {
    +
    1449  printf("Failed to authenticate with the login server\n");
    +
    1450  client_login("", "");
    +
    1451  }
    +
    1452  }
    +
    1453  else {
    +
    1454  printf("Logging in anonymously\n");
    +
    1455  client_login("", "");
    +
    1456  }
    +
    1457 }
    +
    1458 
    +
    1459 void copy() {
    +
    1460  memcpy(&g->copy0, &g->block0, sizeof(Block));
    +
    1461  memcpy(&g->copy1, &g->block1, sizeof(Block));
    +
    1462 }
    +
    1463 
    +
    1464 void paste() {
    +
    1465  Block *c1 = &g->copy1;
    +
    1466  Block *c2 = &g->copy0;
    +
    1467  Block *p1 = &g->block1;
    +
    1468  Block *p2 = &g->block0;
    +
    1469  int scx = SIGN(c2->x - c1->x);
    +
    1470  int scz = SIGN(c2->z - c1->z);
    +
    1471  int spx = SIGN(p2->x - p1->x);
    +
    1472  int spz = SIGN(p2->z - p1->z);
    +
    1473  int oy = p1->y - c1->y;
    +
    1474  int dx = ABS(c2->x - c1->x);
    +
    1475  int dz = ABS(c2->z - c1->z);
    +
    1476  for (int y = 0; y < 256; y++) {
    +
    1477  for (int x = 0; x <= dx; x++) {
    +
    1478  for (int z = 0; z <= dz; z++) {
    +
    1479  int w = get_block(c1->x + x * scx, y, c1->z + z * scz);
    +
    1480  builder_block(p1->x + x * spx, y + oy, p1->z + z * spz, w);
    +
    1481  }
    +
    1482  }
    +
    1483  }
    +
    1484 }
    +
    1485 
    +
    1486 void cube(Block *b1, Block *b2, int fill) {
    +
    1487  if (b1->w != b2->w) {
    +
    1488  return;
    +
    1489  }
    +
    1490  int w = b1->w;
    +
    1491  int x1 = MIN(b1->x, b2->x);
    +
    1492  int y1 = MIN(b1->y, b2->y);
    +
    1493  int z1 = MIN(b1->z, b2->z);
    +
    1494  int x2 = MAX(b1->x, b2->x);
    +
    1495  int y2 = MAX(b1->y, b2->y);
    +
    1496  int z2 = MAX(b1->z, b2->z);
    +
    1497  int a = (x1 == x2) + (y1 == y2) + (z1 == z2);
    +
    1498  for (int x = x1; x <= x2; x++) {
    +
    1499  for (int y = y1; y <= y2; y++) {
    +
    1500  for (int z = z1; z <= z2; z++) {
    +
    1501  if (!fill) {
    +
    1502  int n = 0;
    +
    1503  n += x == x1 || x == x2;
    +
    1504  n += y == y1 || y == y2;
    +
    1505  n += z == z1 || z == z2;
    +
    1506  if (n <= a) {
    +
    1507  continue;
    +
    1508  }
    +
    1509  }
    +
    1510  builder_block(x, y, z, w);
    +
    1511  }
    +
    1512  }
    +
    1513  }
    +
    1514 }
    +
    1515 
    +
    1516 void sphere(Block *center, int radius, int fill, int fx, int fy, int fz) {
    +
    1517  static float offsets[8][3] = {
    +
    1518  {-0.5, -0.5, -0.5},
    +
    1519  {-0.5, -0.5, 0.5},
    +
    1520  {-0.5, 0.5, -0.5},
    +
    1521  {-0.5, 0.5, 0.5},
    +
    1522  {0.5, -0.5, -0.5},
    +
    1523  {0.5, -0.5, 0.5},
    +
    1524  {0.5, 0.5, -0.5},
    +
    1525  {0.5, 0.5, 0.5}
    +
    1526  };
    +
    1527  int cx = center->x;
    +
    1528  int cy = center->y;
    +
    1529  int cz = center->z;
    +
    1530  int w = center->w;
    +
    1531  for (int x = cx - radius; x <= cx + radius; x++) {
    +
    1532  if (fx && x != cx) {
    +
    1533  continue;
    +
    1534  }
    +
    1535  for (int y = cy - radius; y <= cy + radius; y++) {
    +
    1536  if (fy && y != cy) {
    +
    1537  continue;
    +
    1538  }
    +
    1539  for (int z = cz - radius; z <= cz + radius; z++) {
    +
    1540  if (fz && z != cz) {
    +
    1541  continue;
    +
    1542  }
    +
    1543  int inside = 0;
    +
    1544  int outside = fill;
    +
    1545  for (int i = 0; i < 8; i++) {
    +
    1546  float dx = x + offsets[i][0] - cx;
    +
    1547  float dy = y + offsets[i][1] - cy;
    +
    1548  float dz = z + offsets[i][2] - cz;
    +
    1549  float d = sqrtf(dx * dx + dy * dy + dz * dz);
    +
    1550  if (d < radius) {
    +
    1551  inside = 1;
    +
    1552  }
    +
    1553  else {
    +
    1554  outside = 1;
    +
    1555  }
    +
    1556  }
    +
    1557  if (inside && outside) {
    +
    1558  builder_block(x, y, z, w);
    +
    1559  }
    +
    1560  }
    +
    1561  }
    +
    1562  }
    +
    1563 }
    +
    1564 
    +
    1565 void cylinder(Block *b1, Block *b2, int radius, int fill) {
    +
    1566  if (b1->w != b2->w) {
    +
    1567  return;
    +
    1568  }
    +
    1569  int w = b1->w;
    +
    1570  int x1 = MIN(b1->x, b2->x);
    +
    1571  int y1 = MIN(b1->y, b2->y);
    +
    1572  int z1 = MIN(b1->z, b2->z);
    +
    1573  int x2 = MAX(b1->x, b2->x);
    +
    1574  int y2 = MAX(b1->y, b2->y);
    +
    1575  int z2 = MAX(b1->z, b2->z);
    +
    1576  int fx = x1 != x2;
    +
    1577  int fy = y1 != y2;
    +
    1578  int fz = z1 != z2;
    +
    1579  if (fx + fy + fz != 1) {
    +
    1580  return;
    +
    1581  }
    +
    1582  Block block = {x1, y1, z1, w};
    +
    1583  if (fx) {
    +
    1584  for (int x = x1; x <= x2; x++) {
    +
    1585  block.x = x;
    +
    1586  sphere(&block, radius, fill, 1, 0, 0);
    +
    1587  }
    +
    1588  }
    +
    1589  if (fy) {
    +
    1590  for (int y = y1; y <= y2; y++) {
    +
    1591  block.y = y;
    +
    1592  sphere(&block, radius, fill, 0, 1, 0);
    +
    1593  }
    +
    1594  }
    +
    1595  if (fz) {
    +
    1596  for (int z = z1; z <= z2; z++) {
    +
    1597  block.z = z;
    +
    1598  sphere(&block, radius, fill, 0, 0, 1);
    +
    1599  }
    +
    1600  }
    +
    1601 }
    +
    1602 
    +
    1603 void tree(Block *block) {
    +
    1604  int bx = block->x;
    +
    1605  int by = block->y;
    +
    1606  int bz = block->z;
    +
    1607  for (int y = by + 3; y < by + 8; y++) {
    +
    1608  for (int dx = -3; dx <= 3; dx++) {
    +
    1609  for (int dz = -3; dz <= 3; dz++) {
    +
    1610  int dy = y - (by + 4);
    +
    1611  int d = (dx * dx) + (dy * dy) + (dz * dz);
    +
    1612  if (d < 11) {
    +
    1613  builder_block(bx + dx, y, bz + dz, 15);
    +
    1614  }
    +
    1615  }
    +
    1616  }
    +
    1617  }
    +
    1618  for (int y = by; y < by + 7; y++) {
    +
    1619  builder_block(bx, y, bz, 5);
    +
    1620  }
    +
    1621 }
    +
    1622 
    +
    1623 void parse_command(const char *buffer, int forward) {
    +
    1624  char username[128] = {0};
    +
    1625  char token[128] = {0};
    +
    1626  char server_addr[MAX_ADDR_LENGTH];
    +
    1627  int server_port = DEFAULT_PORT;
    +
    1628  char filename[MAX_PATH_LENGTH];
    +
    1629  int radius;
    +
    1630  if (sscanf(buffer, "/identity %128s %128s", username, token) == 2) {
    +
    1631  db_auth_set(username, token);
    +
    1632  add_message("Successfully imported identity token!");
    +
    1633  login();
    +
    1634  }
    +
    1635  else if (strcmp(buffer, "/logout") == 0) {
    + +
    1637  login();
    +
    1638  }
    +
    1639  else if (sscanf(buffer, "/login %128s", username) == 1) {
    +
    1640  if (db_auth_select(username)) {
    +
    1641  login();
    +
    1642  }
    +
    1643  else {
    +
    1644  add_message("Unknown username.");
    +
    1645  }
    +
    1646  }
    +
    1647  else if (sscanf(buffer,
    +
    1648  "/online %128s %d", server_addr, &server_port) >= 1)
    +
    1649  {
    +
    1650  g->mode_changed = 1;
    +
    1651  g->mode = MODE_ONLINE;
    +
    1652  strncpy(g->server_addr, server_addr, MAX_ADDR_LENGTH);
    +
    1653  g->server_port = server_port;
    +
    1654  snprintf(g->db_path, MAX_PATH_LENGTH,
    +
    1655  "cache.%s.%d.db", g->server_addr, g->server_port);
    +
    1656  }
    +
    1657  else if (sscanf(buffer, "/offline %128s", filename) == 1) {
    +
    1658  g->mode_changed = 1;
    +
    1659  g->mode = MODE_OFFLINE;
    +
    1660  snprintf(g->db_path, MAX_PATH_LENGTH, "%s.db", filename);
    +
    1661  }
    +
    1662  else if (strcmp(buffer, "/offline") == 0) {
    +
    1663  g->mode_changed = 1;
    +
    1664  g->mode = MODE_OFFLINE;
    +
    1665  snprintf(g->db_path, MAX_PATH_LENGTH, "%s", DB_PATH);
    +
    1666  }
    +
    1667  else if (sscanf(buffer, "/view %d", &radius) == 1) {
    +
    1668  if (radius >= 1 && radius <= 24) {
    +
    1669  g->create_radius = radius;
    +
    1670  g->render_radius = radius;
    +
    1671  g->delete_radius = radius + 4;
    +
    1672  }
    +
    1673  else {
    +
    1674  add_message("Viewing distance must be between 1 and 24.");
    +
    1675  }
    +
    1676  }
    +
    1677  else if (strcmp(buffer, "/copy") == 0) {
    +
    1678  copy();
    +
    1679  }
    +
    1680  else if (strcmp(buffer, "/paste") == 0) {
    +
    1681  paste();
    +
    1682  }
    +
    1683  else if (strcmp(buffer, "/tree") == 0) {
    +
    1684  tree(&g->block0);
    +
    1685  }
    +
    1686  else if (strcmp(buffer, "/fcube") == 0) {
    +
    1687  cube(&g->block0, &g->block1, 1);
    +
    1688  }
    +
    1689  else if (strcmp(buffer, "/cube") == 0) {
    +
    1690  cube(&g->block0, &g->block1, 0);
    +
    1691  }
    +
    1692  else if (sscanf(buffer, "/fsphere %d", &radius) == 1) {
    +
    1693  sphere(&g->block0, radius, 1, 0, 0, 0);
    +
    1694  }
    +
    1695  else if (sscanf(buffer, "/sphere %d", &radius) == 1) {
    +
    1696  sphere(&g->block0, radius, 0, 0, 0, 0);
    +
    1697  }
    +
    1698  else if (sscanf(buffer, "/fcirclex %d", &radius) == 1) {
    +
    1699  sphere(&g->block0, radius, 1, 1, 0, 0);
    +
    1700  }
    +
    1701  else if (sscanf(buffer, "/circlex %d", &radius) == 1) {
    +
    1702  sphere(&g->block0, radius, 0, 1, 0, 0);
    +
    1703  }
    +
    1704  else if (sscanf(buffer, "/fcircley %d", &radius) == 1) {
    +
    1705  sphere(&g->block0, radius, 1, 0, 1, 0);
    +
    1706  }
    +
    1707  else if (sscanf(buffer, "/circley %d", &radius) == 1) {
    +
    1708  sphere(&g->block0, radius, 0, 0, 1, 0);
    +
    1709  }
    +
    1710  else if (sscanf(buffer, "/fcirclez %d", &radius) == 1) {
    +
    1711  sphere(&g->block0, radius, 1, 0, 0, 1);
    +
    1712  }
    +
    1713  else if (sscanf(buffer, "/circlez %d", &radius) == 1) {
    +
    1714  sphere(&g->block0, radius, 0, 0, 0, 1);
    +
    1715  }
    +
    1716  else if (sscanf(buffer, "/fcylinder %d", &radius) == 1) {
    +
    1717  cylinder(&g->block0, &g->block1, radius, 1);
    +
    1718  }
    +
    1719  else if (sscanf(buffer, "/cylinder %d", &radius) == 1) {
    +
    1720  cylinder(&g->block0, &g->block1, radius, 0);
    +
    1721  }
    +
    1722  else if (forward) {
    +
    1723  client_talk(buffer);
    +
    1724  }
    +
    1725 }
    +
    1726 
    + +
    1728  State *s = &g->players->state;
    +
    1729  int hx, hy, hz;
    +
    1730  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1731  if (hy > 0 && hy < 256 && is_destructable(hw)) {
    +
    1732  set_block(hx, hy, hz, 0);
    +
    1733  record_block(hx, hy, hz, 0);
    +
    1734  if (is_plant(get_block(hx, hy + 1, hz))) {
    +
    1735  set_block(hx, hy + 1, hz, 0);
    +
    1736  }
    +
    1737  }
    +
    1738 }
    +
    1739 
    + +
    1741  State *s = &g->players->state;
    +
    1742  int hx, hy, hz;
    +
    1743  int hw = hit_test(1, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1744  if (hy > 0 && hy < 256 && is_obstacle(hw)) {
    +
    1745  if (!player_intersects_block(2, s->x, s->y, s->z, hx, hy, hz)) {
    +
    1746  set_block(hx, hy, hz, items[g->item_index]);
    +
    1747  record_block(hx, hy, hz, items[g->item_index]);
    +
    1748  }
    +
    1749  }
    +
    1750 }
    +
    1751 
    + +
    1753  State *s = &g->players->state;
    +
    1754  int hx, hy, hz;
    +
    1755  int hw = hit_test(0, s->x, s->y, s->z, s->rx, s->ry, &hx, &hy, &hz);
    +
    1756  for (int i = 0; i < item_count; i++) {
    +
    1757  if (items[i] == hw) {
    +
    1758  g->item_index = i;
    +
    1759  break;
    +
    1760  }
    +
    1761  }
    +
    1762 }
    +
    1763 
    +
    1764 void on_key(GLFWwindow *window, int key, int scancode, int action, int mods) {
    +
    1765  int control = mods & (GLFW_MOD_CONTROL | GLFW_MOD_SUPER);
    +
    1766  int exclusive =
    +
    1767  glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1768  if (action == GLFW_RELEASE) {
    +
    1769  return;
    +
    1770  }
    +
    1771  if (key == GLFW_KEY_BACKSPACE) {
    +
    1772  if (g->typing) {
    +
    1773  int n = strlen(g->typing_buffer);
    +
    1774  if (n > 0) {
    +
    1775  g->typing_buffer[n - 1] = '\0';
    +
    1776  }
    +
    1777  }
    +
    1778  }
    +
    1779  if (action != GLFW_PRESS) {
    +
    1780  return;
    +
    1781  }
    +
    1782  if (key == GLFW_KEY_ESCAPE) {
    +
    1783  if (g->typing) {
    +
    1784  g->typing = 0;
    +
    1785  }
    +
    1786  else if (exclusive) {
    +
    1787  glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL);
    +
    1788  }
    +
    1789  }
    +
    1790  if (key == GLFW_KEY_ENTER) {
    +
    1791  if (g->typing) {
    +
    1792  if (mods & GLFW_MOD_SHIFT) {
    +
    1793  int n = strlen(g->typing_buffer);
    +
    1794  if (n < MAX_TEXT_LENGTH - 1) {
    +
    1795  g->typing_buffer[n] = '\r';
    +
    1796  g->typing_buffer[n + 1] = '\0';
    +
    1797  }
    +
    1798  }
    +
    1799  else {
    +
    1800  g->typing = 0;
    +
    1801  if (g->typing_buffer[0] == CRAFT_KEY_SIGN) {
    +
    1802  Player *player = g->players;
    +
    1803  int x, y, z, face;
    +
    1804  if (hit_test_face(player, &x, &y, &z, &face)) {
    +
    1805  set_sign(x, y, z, face, g->typing_buffer + 1);
    +
    1806  }
    +
    1807  }
    +
    1808  else if (g->typing_buffer[0] == '/') {
    + +
    1810  }
    +
    1811  else {
    + +
    1813  }
    +
    1814  }
    +
    1815  }
    +
    1816  else {
    +
    1817  if (control) {
    +
    1818  on_right_click();
    +
    1819  }
    +
    1820  else {
    +
    1821  on_left_click();
    +
    1822  }
    +
    1823  }
    +
    1824  }
    +
    1825  if (control && key == 'V') {
    +
    1826  const char *buffer = glfwGetClipboardString(window);
    +
    1827  if (g->typing) {
    +
    1828  g->suppress_char = 1;
    +
    1829  strncat(g->typing_buffer, buffer,
    +
    1830  MAX_TEXT_LENGTH - strlen(g->typing_buffer) - 1);
    +
    1831  }
    +
    1832  else {
    +
    1833  parse_command(buffer, 0);
    +
    1834  }
    +
    1835  }
    +
    1836  if (!g->typing) {
    +
    1837  if (key == CRAFT_KEY_FLY) {
    +
    1838  g->flying = !g->flying;
    +
    1839  }
    +
    1840  if (key >= '1' && key <= '9') {
    +
    1841  g->item_index = key - '1';
    +
    1842  }
    +
    1843  if (key == '0') {
    +
    1844  g->item_index = 9;
    +
    1845  }
    +
    1846  if (key == CRAFT_KEY_ITEM_NEXT) {
    +
    1847  g->item_index = (g->item_index + 1) % item_count;
    +
    1848  }
    +
    1849  if (key == CRAFT_KEY_ITEM_PREV) {
    +
    1850  g->item_index--;
    +
    1851  if (g->item_index < 0) {
    +
    1852  g->item_index = item_count - 1;
    +
    1853  }
    +
    1854  }
    +
    1855  if (key == CRAFT_KEY_OBSERVE) {
    +
    1856  g->observe1 = (g->observe1 + 1) % g->player_count;
    +
    1857  }
    +
    1858  if (key == CRAFT_KEY_OBSERVE_INSET) {
    +
    1859  g->observe2 = (g->observe2 + 1) % g->player_count;
    +
    1860  }
    +
    1861  }
    +
    1862 }
    +
    1863 
    +
    1864 void on_char(GLFWwindow *window, unsigned int u) {
    +
    1865  if (g->suppress_char) {
    +
    1866  g->suppress_char = 0;
    +
    1867  return;
    +
    1868  }
    +
    1869  if (g->typing) {
    +
    1870  if (u >= 32 && u < 128) {
    +
    1871  char c = (char)u;
    +
    1872  int n = strlen(g->typing_buffer);
    +
    1873  if (n < MAX_TEXT_LENGTH - 1) {
    +
    1874  g->typing_buffer[n] = c;
    +
    1875  g->typing_buffer[n + 1] = '\0';
    +
    1876  }
    +
    1877  }
    +
    1878  }
    +
    1879  else {
    +
    1880  if (u == CRAFT_KEY_CHAT) {
    +
    1881  g->typing = 1;
    +
    1882  g->typing_buffer[0] = '\0';
    +
    1883  }
    +
    1884  if (u == CRAFT_KEY_COMMAND) {
    +
    1885  g->typing = 1;
    +
    1886  g->typing_buffer[0] = '/';
    +
    1887  g->typing_buffer[1] = '\0';
    +
    1888  }
    +
    1889  if (u == CRAFT_KEY_SIGN) {
    +
    1890  g->typing = 1;
    + +
    1892  g->typing_buffer[1] = '\0';
    +
    1893  }
    +
    1894  }
    +
    1895 }
    +
    1896 
    +
    1897 void on_scroll(GLFWwindow *window, double xdelta, double ydelta) {
    +
    1898  static double ypos = 0;
    +
    1899  ypos += ydelta;
    +
    1900  if (ypos < -SCROLL_THRESHOLD) {
    +
    1901  g->item_index = (g->item_index + 1) % item_count;
    +
    1902  ypos = 0;
    +
    1903  }
    +
    1904  if (ypos > SCROLL_THRESHOLD) {
    +
    1905  g->item_index--;
    +
    1906  if (g->item_index < 0) {
    +
    1907  g->item_index = item_count - 1;
    +
    1908  }
    +
    1909  ypos = 0;
    +
    1910  }
    +
    1911 }
    +
    1912 
    +
    1913 void on_mouse_button(GLFWwindow *window, int button, int action, int mods) {
    +
    1914  int control = mods & (GLFW_MOD_CONTROL | GLFW_MOD_SUPER);
    +
    1915  int exclusive =
    +
    1916  glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1917  if (action != GLFW_PRESS) {
    +
    1918  return;
    +
    1919  }
    +
    1920  if (button == GLFW_MOUSE_BUTTON_LEFT) {
    +
    1921  if (exclusive) {
    +
    1922  if (control) {
    +
    1923  on_right_click();
    +
    1924  }
    +
    1925  else {
    +
    1926  on_left_click();
    +
    1927  }
    +
    1928  }
    +
    1929  else {
    +
    1930  glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    +
    1931  }
    +
    1932  }
    +
    1933  if (button == GLFW_MOUSE_BUTTON_RIGHT) {
    +
    1934  if (exclusive) {
    +
    1935  on_right_click();
    +
    1936  }
    +
    1937  }
    +
    1938  if (button == GLFW_MOUSE_BUTTON_MIDDLE) {
    +
    1939  if (exclusive) {
    +
    1940  on_middle_click();
    +
    1941  }
    +
    1942  }
    +
    1943 }
    +
    1944 
    + +
    1946  int window_width = WINDOW_WIDTH;
    +
    1947  int window_height = WINDOW_HEIGHT;
    +
    1948  GLFWmonitor *monitor = NULL;
    +
    1949  if (FULLSCREEN) {
    +
    1950  int mode_count;
    +
    1951  monitor = glfwGetPrimaryMonitor();
    +
    1952  const GLFWvidmode *modes = glfwGetVideoModes(monitor, &mode_count);
    +
    1953  window_width = modes[mode_count - 1].width;
    +
    1954  window_height = modes[mode_count - 1].height;
    +
    1955  }
    +
    1956  g->window = glfwCreateWindow(
    +
    1957  window_width, window_height, "Craft", monitor, NULL);
    +
    1958 }
    +
    1959 
    + +
    1961  int exclusive =
    +
    1962  glfwGetInputMode(g->window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED;
    +
    1963  static double px = 0;
    +
    1964  static double py = 0;
    +
    1965  State *s = &g->players->state;
    +
    1966  if (exclusive && (px || py)) {
    +
    1967  double mx, my;
    +
    1968  glfwGetCursorPos(g->window, &mx, &my);
    +
    1969  s->rx += (mx - px) * g->sensitivity;
    +
    1970  if (INVERT_MOUSE) {
    +
    1971  s->ry += (my - py) * g->sensitivity;
    +
    1972  }
    +
    1973  else {
    +
    1974  s->ry -= (my - py) * g->sensitivity;
    +
    1975  }
    +
    1976  if (s->rx < 0) {
    +
    1977  s->rx += RADIANS(360);
    +
    1978  }
    +
    1979  if (s->rx >= RADIANS(360)){
    +
    1980  s->rx -= RADIANS(360);
    +
    1981  }
    +
    1982  s->ry = MAX(s->ry, -RADIANS(90));
    +
    1983  s->ry = MIN(s->ry, RADIANS(90));
    +
    1984  px = mx;
    +
    1985  py = my;
    +
    1986  }
    +
    1987  else {
    +
    1988  glfwGetCursorPos(g->window, &px, &py);
    +
    1989  }
    +
    1990 }
    +
    1991 
    +
    1992 // Returns 1 if player intersects a MapEntry x where is_slowing(x)==1,
    +
    1993 // otherwise return 0.
    + +
    1995  int height = 2;
    +
    1996  float *x = &player->state.x;
    +
    1997  float *y = &player->state.y;
    +
    1998  float *z = &player->state.z;
    +
    1999 
    +
    2000  int result = 0;
    +
    2001  int p = chunked(*x);
    +
    2002  int q = chunked(*z);
    +
    2003  Chunk *chunk = find_chunk(p, q);
    +
    2004  if (!chunk) {
    +
    2005  return result;
    +
    2006  }
    +
    2007  Map *map = &chunk->map;
    +
    2008  int nx = roundf(*x);
    +
    2009  int ny = roundf(*y);
    +
    2010  int nz = roundf(*z);
    +
    2011  float px = *x - nx;
    +
    2012  float py = *y - ny;
    +
    2013  float pz = *z - nz;
    +
    2014  float pad = 0.25;
    +
    2015  for (int dy = 0; dy < height; dy++) {
    +
    2016  // Check if player is intersecting with an item that is slowing.
    +
    2017  if ( px < -pad && is_slowing(map_get(map, nx - 1, ny - dy, nz))
    +
    2018  || px > pad && is_slowing(map_get(map, nx + 1, ny - dy, nz))
    +
    2019  || py < -pad && is_slowing(map_get(map, nx, ny - dy - 1, nz))
    +
    2020  || py > pad && is_slowing(map_get(map, nx, ny - dy + 1, nz))
    +
    2021  || pz < -pad && is_slowing(map_get(map, nx, ny - dy, nz - 1))
    +
    2022  || pz > pad && is_slowing(map_get(map, nx, ny - dy, nz + 1))
    +
    2023  ) {
    +
    2024  result = 1;
    +
    2025  }
    +
    2026  }
    +
    2027  return result;
    +
    2028 }
    +
    2029 
    +
    2030 // This function looks at the current player's health, and performs actions based on the value.
    + +
    2032  // If player has no more health...
    +
    2033  if (g->players->health <= 0) {
    +
    2034  // Reset the player health.
    + +
    2036  // Respawn.
    +
    2037  g->players->state.x = 0;
    +
    2038  g->players->state.y = highest_block(0, 0) + 2; // Player's vertical position should be the highest block at position(0, 0) plus 2 for the player's height.
    +
    2039  g->players->state.z = 0;
    +
    2040  }
    +
    2041 
    +
    2042  heal_damage(0.001);
    + +
    2044 }
    +
    2045 
    +
    2046 // If player is in lava, inflict a small amount of damage.
    + +
    2048  int p = chunked(g->players->state.x);
    +
    2049  int q = chunked(g->players->state.z);
    +
    2050  Chunk *chunk = find_chunk(p, q);
    +
    2051  if (!chunk) {
    +
    2052  return;
    +
    2053  }
    +
    2054  Map *map = &chunk->map;
    +
    2055  int rx = roundf(g->players->state.x);
    +
    2056  int ry = roundf(g->players->state.y);
    +
    2057  int rz = roundf(g->players->state.z);
    +
    2058 
    +
    2059  int chunkTypeUpperBody = map_get(map, rx, ry, rz);
    +
    2060  int chunkTypeLowerBody = map_get(map, rx, ry-1, rz);
    +
    2061 
    +
    2062  if (chunkTypeUpperBody == LAVA || chunkTypeLowerBody == LAVA) {
    +
    2063  inflict_damage(.05);
    +
    2064  }
    +
    2065 
    +
    2066 }
    +
    2067 
    +
    2068 // Calculate the amount of damage that should be taken, based on a downward velocity at the point of collision.
    +
    2069 // Parameter: dy - the rate of change on the y axis.
    +
    2070 void handle_fall_damage(float dy) {
    +
    2071  // If a player's downward velocity is 15 or more...
    +
    2072  if (dy <= -15) {
    +
    2073  float damage = dy / -5.25;
    +
    2074  inflict_damage(damage);
    +
    2075  }
    +
    2076 }
    +
    2077 
    +
    2078 // Take damage from a player's health value.
    +
    2079 // Parameter: damage - A positive float that will be subtracted from player's health.
    +
    2080 void inflict_damage(float damage) {
    +
    2081  g->players->health -= damage;
    +
    2082 }
    +
    2083 
    +
    2084 //Heals the player for a set amount, not exceeding 10
    +
    2085 void heal_damage(float healing) {
    +
    2086  if(g->players->health < MAX_PLAYER_HEALTH) g->players->health += healing;
    +
    2087 }
    +
    2088 
    +
    2089 // Calculates the current movement speed of the player.
    +
    2090 // Returns the movement speed of the player.
    + + +
    2093 
    +
    2094  // Only slow movement if the player is not flying.
    +
    2095  float speed = g->flying ? 20 : (g->slowed ? 1 : 5);
    +
    2096  if(glfwGetKey(g->window, GLFW_KEY_LEFT_CONTROL) && !g->flying) {
    +
    2097  speed *= 1.5f;
    +
    2098  }
    +
    2099  return speed;
    +
    2100 }
    +
    2101 
    +
    2102 void handle_movement(double dt) {
    +
    2103  static float dy = 0;
    +
    2104  State *s = &g->players->state;
    +
    2105  int sz = 0;
    +
    2106  int sx = 0;
    +
    2107  if (!g->typing) {
    +
    2108  float m = dt * 1.0;
    +
    2109  g->ortho = glfwGetKey(g->window, CRAFT_KEY_ORTHO) ? 64 : 0;
    +
    2110  g->fov = glfwGetKey(g->window, CRAFT_KEY_ZOOM) ? 15 : 65;
    +
    2111  if (glfwGetKey(g->window, CRAFT_KEY_FORWARD)) sz--;
    +
    2112  if (glfwGetKey(g->window, CRAFT_KEY_BACKWARD)) sz++;
    +
    2113  if (glfwGetKey(g->window, CRAFT_KEY_LEFT)) sx--;
    +
    2114  if (glfwGetKey(g->window, CRAFT_KEY_RIGHT)) sx++;
    +
    2115  if (glfwGetKey(g->window, GLFW_KEY_LEFT)) s->rx -= m;
    +
    2116  if (glfwGetKey(g->window, GLFW_KEY_RIGHT)) s->rx += m;
    +
    2117  if (glfwGetKey(g->window, GLFW_KEY_UP)) s->ry += m;
    +
    2118  if (glfwGetKey(g->window, GLFW_KEY_DOWN)) s->ry -= m;
    +
    2119  if (glfwGetKey(g->window, GLFW_KEY_M)) g->sensitivity *= 1.1;
    +
    2120  if (glfwGetKey(g->window, GLFW_KEY_N)) g->sensitivity *= 0.9;
    +
    2121  }
    +
    2122  float vx, vy, vz;
    +
    2123  get_motion_vector(g->flying, sz, sx, s->rx, s->ry, &vx, &vy, &vz);
    +
    2124  if (!g->typing) {
    +
    2125  if (glfwGetKey(g->window, CRAFT_KEY_JUMP)) {
    +
    2126  if (g->flying) {
    +
    2127  vy = 1;
    +
    2128  }
    +
    2129  else if (dy == 0) {
    +
    2130  dy = 8;
    +
    2131  }
    +
    2132  }
    +
    2133  }
    +
    2134  float speed = handle_player_speed();
    +
    2135  int estimate = roundf(sqrtf(
    +
    2136  powf(vx * speed, 2) +
    +
    2137  powf(vy * speed + ABS(dy) * 2, 2) +
    +
    2138  powf(vz * speed, 2)) * dt * 8);
    +
    2139  int step = MAX(8, estimate);
    +
    2140  float ut = dt / step;
    +
    2141  vx = vx * ut * speed;
    +
    2142  vy = vy * ut * speed;
    +
    2143  vz = vz * ut * speed;
    +
    2144  float dyAtCollision = 0;
    +
    2145  for (int i = 0; i < step; i++) {
    +
    2146  if (g->flying) {
    +
    2147  dy = 0;
    +
    2148  }
    +
    2149  else {
    +
    2150  dy -= ut * 25;
    +
    2151  dy = MAX(dy, -250);
    +
    2152  }
    +
    2153  s->x += vx;
    +
    2154  s->y += vy + dy * ut;
    +
    2155  s->z += vz;
    +
    2156  if (collide(2, &s->x, &s->y, &s->z)) {
    +
    2157  if (!dyAtCollision)
    +
    2158  dyAtCollision = dy;
    +
    2159  dy = 0;
    +
    2160  }
    +
    2161  }
    +
    2162  handle_fall_damage(dyAtCollision);
    +
    2163 
    +
    2164  if (s->y < 0) {
    +
    2165  s->y = highest_block(s->x, s->z) + 2;
    +
    2166  }
    +
    2167 }
    +
    2168 
    +
    2169 void parse_buffer(char *buffer) {
    +
    2170  Player *me = g->players;
    +
    2171  State *s = &g->players->state;
    +
    2172  char *key;
    +
    2173  char *line = tokenize(buffer, "\n", &key);
    +
    2174  while (line) {
    +
    2175  int pid;
    +
    2176  float ux, uy, uz, urx, ury;
    +
    2177  if (sscanf(line, "U,%d,%f,%f,%f,%f,%f",
    +
    2178  &pid, &ux, &uy, &uz, &urx, &ury) == 6)
    +
    2179  {
    +
    2180  me->id = pid;
    +
    2181  s->x = ux; s->y = uy; s->z = uz; s->rx = urx; s->ry = ury;
    +
    2182  force_chunks(me);
    +
    2183  }
    +
    2184  int bp, bq, bx, by, bz, bw;
    +
    2185  if (sscanf(line, "B,%d,%d,%d,%d,%d,%d",
    +
    2186  &bp, &bq, &bx, &by, &bz, &bw) == 6)
    +
    2187  {
    +
    2188  _set_block(bp, bq, bx, by, bz, bw, 0);
    +
    2189  if (player_intersects_block(2, s->x, s->y, s->z, bx, by, bz)) {
    +
    2190  s->y = highest_block(s->x, s->z) + 2;
    +
    2191  }
    +
    2192  }
    +
    2193  float px, py, pz, prx, pry;
    +
    2194  if (sscanf(line, "P,%d,%f,%f,%f,%f,%f",
    +
    2195  &pid, &px, &py, &pz, &prx, &pry) == 6)
    +
    2196  {
    +
    2197  Player *player = find_player(pid);
    +
    2198  if (!player && g->player_count < MAX_PLAYERS) {
    +
    2199  player = g->players + g->player_count;
    +
    2200  g->player_count++;
    +
    2201  player->id = pid;
    +
    2202  player->buffer = 0;
    +
    2203  snprintf(player->name, MAX_NAME_LENGTH, "player%d", pid);
    +
    2204  update_player(player, px, py, pz, prx, pry, 1); // twice
    +
    2205  }
    +
    2206  if (player) {
    +
    2207  update_player(player, px, py, pz, prx, pry, 1);
    +
    2208  }
    +
    2209  }
    +
    2210  if (sscanf(line, "D,%d", &pid) == 1) {
    +
    2211  delete_player(pid);
    +
    2212  }
    +
    2213  int kp, kq, kk;
    +
    2214  if (sscanf(line, "K,%d,%d,%d", &kp, &kq, &kk) == 3) {
    +
    2215  db_set_key(kp, kq, kk);
    +
    2216  }
    +
    2217  if (sscanf(line, "R,%d,%d", &kp, &kq) == 2) {
    +
    2218  Chunk *chunk = find_chunk(kp, kq);
    +
    2219  if (chunk) {
    +
    2220  chunk->dirty = 1;
    +
    2221  }
    +
    2222  }
    +
    2223  if (line[0] == 'T' && line[1] == ',') {
    +
    2224  char *text = line + 2;
    +
    2225  add_message(text);
    +
    2226  }
    +
    2227  char format[64];
    +
    2228  snprintf(
    +
    2229  format, sizeof(format), "N,%%d,%%%ds", MAX_NAME_LENGTH - 1);
    +
    2230  char name[MAX_NAME_LENGTH];
    +
    2231  if (sscanf(line, format, &pid, name) == 2) {
    +
    2232  Player *player = find_player(pid);
    +
    2233  if (player) {
    +
    2234  strncpy(player->name, name, MAX_NAME_LENGTH);
    +
    2235  }
    +
    2236  }
    +
    2237  snprintf(
    +
    2238  format, sizeof(format),
    +
    2239  "S,%%d,%%d,%%d,%%d,%%d,%%d,%%%d[^\n]", MAX_SIGN_LENGTH - 1);
    +
    2240  int face;
    +
    2241  char text[MAX_SIGN_LENGTH] = {0};
    +
    2242  if (sscanf(line, format,
    +
    2243  &bp, &bq, &bx, &by, &bz, &face, text) >= 6)
    +
    2244  {
    +
    2245  _set_sign(bp, bq, bx, by, bz, face, text, 0);
    +
    2246  }
    +
    2247  line = tokenize(NULL, "\n", &key);
    +
    2248  }
    +
    2249 }
    +
    2250 
    +
    2251 void reset_model() {
    +
    2252  memset(g->chunks, 0, sizeof(Chunk) * MAX_CHUNKS);
    +
    2253  g->chunk_count = 0;
    +
    2254  memset(g->players, 0, sizeof(Player) * MAX_PLAYERS);
    +
    2255  g->player_count = 0;
    +
    2256  g->observe1 = 0;
    +
    2257  g->observe2 = 0;
    +
    2258  g->flying = 0;
    +
    2259  g->slowed = 0;
    +
    2260  g->item_index = 0;
    +
    2261  memset(g->typing_buffer, 0, sizeof(char) * MAX_TEXT_LENGTH);
    +
    2262  g->typing = 0;
    +
    2263  memset(g->messages, 0, sizeof(char) * MAX_MESSAGES * MAX_TEXT_LENGTH);
    +
    2264  g->message_index = 0;
    +
    2265 }
    +
    2266 
    +
    2267 int main(int argc, char **argv) {
    +
    2268  // INITIALIZATION //
    +
    2269  curl_global_init(CURL_GLOBAL_DEFAULT);
    +
    2270  srand(time(NULL));
    +
    2271  rand();
    +
    2272 
    +
    2273  // WINDOW INITIALIZATION //
    +
    2274  if (!glfwInit()) {
    +
    2275  return -1;
    +
    2276  }
    +
    2277  create_window();
    +
    2278  if (!g->window) {
    +
    2279  glfwTerminate();
    +
    2280  return -1;
    +
    2281  }
    +
    2282 
    +
    2283  glfwMakeContextCurrent(g->window);
    +
    2284  glfwSwapInterval(VSYNC);
    +
    2285  glfwSetInputMode(g->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
    +
    2286  glfwSetKeyCallback(g->window, on_key);
    +
    2287  glfwSetCharCallback(g->window, on_char);
    +
    2288  glfwSetMouseButtonCallback(g->window, on_mouse_button);
    +
    2289  glfwSetScrollCallback(g->window, on_scroll);
    +
    2290 
    +
    2291  if (glewInit() != GLEW_OK) {
    +
    2292  return -1;
    +
    2293  }
    +
    2294 
    +
    2295  glEnable(GL_CULL_FACE);
    +
    2296  glEnable(GL_DEPTH_TEST);
    +
    2297  glLogicOp(GL_INVERT);
    +
    2298  glClearColor(0, 0, 0, 1);
    +
    2299 
    +
    2300  // LOAD TEXTURES //
    +
    2301  GLuint texture;
    +
    2302  glGenTextures(1, &texture);
    +
    2303  glActiveTexture(GL_TEXTURE0);
    +
    2304  glBindTexture(GL_TEXTURE_2D, texture);
    +
    2305  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    +
    2306  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    +
    2307  load_png_texture("textures/texture.png");
    +
    2308 
    +
    2309  GLuint font;
    +
    2310  glGenTextures(1, &font);
    +
    2311  glActiveTexture(GL_TEXTURE1);
    +
    2312  glBindTexture(GL_TEXTURE_2D, font);
    +
    2313  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    +
    2314  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    +
    2315  load_png_texture("textures/font.png");
    +
    2316 
    +
    2317  GLuint sky;
    +
    2318  glGenTextures(1, &sky);
    +
    2319  glActiveTexture(GL_TEXTURE2);
    +
    2320  glBindTexture(GL_TEXTURE_2D, sky);
    +
    2321  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    +
    2322  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    +
    2323  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    +
    2324  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    +
    2325  load_png_texture("textures/sky.png");
    +
    2326 
    +
    2327  GLuint sign;
    +
    2328  glGenTextures(1, &sign);
    +
    2329  glActiveTexture(GL_TEXTURE3);
    +
    2330  glBindTexture(GL_TEXTURE_2D, sign);
    +
    2331  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    +
    2332  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    +
    2333  load_png_texture("textures/sign.png");
    +
    2334 
    +
    2335  // LOAD SHADERS //
    +
    2336  Attrib block_attrib = {0};
    +
    2337  Attrib line_attrib = {0};
    +
    2338  Attrib text_attrib = {0};
    +
    2339  Attrib sky_attrib = {0};
    +
    2340  GLuint program;
    +
    2341 
    +
    2342  program = load_program(
    +
    2343  "shaders/block_vertex.glsl", "shaders/block_fragment.glsl");
    +
    2344  block_attrib.program = program;
    +
    2345  block_attrib.position = glGetAttribLocation(program, "position");
    +
    2346  block_attrib.normal = glGetAttribLocation(program, "normal");
    +
    2347  block_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2348  block_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2349  block_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2350  block_attrib.extra1 = glGetUniformLocation(program, "sky_sampler");
    +
    2351  block_attrib.extra2 = glGetUniformLocation(program, "daylight");
    +
    2352  block_attrib.extra3 = glGetUniformLocation(program, "fog_distance");
    +
    2353  block_attrib.extra4 = glGetUniformLocation(program, "ortho");
    +
    2354  block_attrib.camera = glGetUniformLocation(program, "camera");
    +
    2355  block_attrib.timer = glGetUniformLocation(program, "timer");
    +
    2356 
    +
    2357  program = load_program(
    +
    2358  "shaders/line_vertex.glsl", "shaders/line_fragment.glsl");
    +
    2359  line_attrib.program = program;
    +
    2360  line_attrib.position = glGetAttribLocation(program, "position");
    +
    2361  line_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2362 
    +
    2363  program = load_program(
    +
    2364  "shaders/text_vertex.glsl", "shaders/text_fragment.glsl");
    +
    2365  text_attrib.program = program;
    +
    2366  text_attrib.position = glGetAttribLocation(program, "position");
    +
    2367  text_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2368  text_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2369  text_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2370  text_attrib.extra1 = glGetUniformLocation(program, "is_sign");
    +
    2371 
    +
    2372  program = load_program(
    +
    2373  "shaders/sky_vertex.glsl", "shaders/sky_fragment.glsl");
    +
    2374  sky_attrib.program = program;
    +
    2375  sky_attrib.position = glGetAttribLocation(program, "position");
    +
    2376  sky_attrib.normal = glGetAttribLocation(program, "normal");
    +
    2377  sky_attrib.uv = glGetAttribLocation(program, "uv");
    +
    2378  sky_attrib.matrix = glGetUniformLocation(program, "matrix");
    +
    2379  sky_attrib.sampler = glGetUniformLocation(program, "sampler");
    +
    2380  sky_attrib.timer = glGetUniformLocation(program, "timer");
    +
    2381 
    +
    2382  // CHECK COMMAND LINE ARGUMENTS //
    +
    2383  if (argc == 2 || argc == 3) {
    +
    2384  g->mode = MODE_ONLINE;
    +
    2385  strncpy(g->server_addr, argv[1], MAX_ADDR_LENGTH);
    +
    2386  g->server_port = argc == 3 ? atoi(argv[2]) : DEFAULT_PORT;
    +
    2387  snprintf(g->db_path, MAX_PATH_LENGTH,
    +
    2388  "cache.%s.%d.db", g->server_addr, g->server_port);
    +
    2389  }
    +
    2390  else {
    +
    2391  g->mode = MODE_OFFLINE;
    +
    2392  snprintf(g->db_path, MAX_PATH_LENGTH, "%s", DB_PATH);
    +
    2393  }
    +
    2394 
    + + + + +
    2399 
    +
    2400  // OUTER LOOP //
    +
    2401  int running = 1;
    +
    2402  while (running) {
    +
    2403  // DATABASE INITIALIZATION //
    +
    2404  if (g->mode == MODE_OFFLINE || USE_CACHE) {
    +
    2405  db_enable();
    +
    2406  if (db_init(g->db_path)) {
    +
    2407  return -1;
    +
    2408  }
    +
    2409  if (g->mode == MODE_ONLINE) {
    +
    2410  // TODO: support proper caching of signs (handle deletions)
    + +
    2412  }
    +
    2413  }
    +
    2414 
    +
    2415  // CLIENT INITIALIZATION //
    +
    2416  if (g->mode == MODE_ONLINE) {
    +
    2417  client_enable();
    + +
    2419  client_start();
    +
    2420  client_version(1);
    +
    2421  login();
    +
    2422  }
    +
    2423 
    +
    2424  // LOCAL VARIABLES //
    +
    2425  reset_model();
    +
    2426  FPS fps = {0, 0, 0};
    +
    2427  double last_commit = glfwGetTime();
    +
    2428  double last_update = glfwGetTime();
    +
    2429  GLuint sky_buffer = gen_sky_buffer();
    +
    2430 
    +
    2431  Player *me = g->players;
    +
    2432  State *s = &g->players->state;
    + +
    2434  me->id = 0;
    +
    2435  me->name[0] = '\0';
    +
    2436  me->health = MAX_PLAYER_HEALTH;
    +
    2437  me->buffer = 0;
    +
    2438  g->player_count = 1;
    +
    2439 
    +
    2440  // LOAD STATE FROM DATABASE //
    +
    2441  int loaded = db_load_state(&s->x, &s->y, &s->z, &s->rx, &s->ry);
    +
    2442  force_chunks(me);
    +
    2443  if (!loaded) {
    +
    2444  s->y = highest_block(s->x, s->z) + 2;
    +
    2445  }
    +
    2446 
    +
    2447  // BEGIN MAIN LOOP //
    +
    2448  double previous = glfwGetTime();
    +
    2449  while (1) {
    +
    2450  // WINDOW SIZE AND SCALE //
    +
    2451  g->scale = get_scale_factor();
    +
    2452  glfwGetFramebufferSize(g->window, &g->width, &g->height);
    +
    2453  glViewport(0, 0, g->width, g->height);
    +
    2454 
    +
    2455  // FRAME RATE //
    +
    2456  update_fps(&fps);
    +
    2457  double now = glfwGetTime();
    +
    2458  double dt = MIN(now - previous, 0.2);
    +
    2459  previous = now;
    +
    2460 
    +
    2461  // HANDLE MOUSE INPUT //
    + +
    2463 
    +
    2464  // HANDLE MOVEMENT //
    +
    2465  handle_movement(dt);
    +
    2466 
    + +
    2468 
    +
    2469  // HANDLE DATA FROM SERVER //
    +
    2470  char *buffer = client_recv();
    +
    2471  if (buffer) {
    +
    2472  parse_buffer(buffer);
    +
    2473  free(buffer);
    +
    2474  }
    +
    2475 
    +
    2476  // FLUSH DATABASE //
    +
    2477  if (now - last_commit > COMMIT_INTERVAL) {
    +
    2478  last_commit = now;
    +
    2479  db_commit();
    +
    2480  }
    +
    2481 
    +
    2482  // SEND POSITION TO SERVER //
    +
    2483  if (now - last_update > 0.1) {
    +
    2484  last_update = now;
    +
    2485  client_position(s->x, s->y, s->z, s->rx, s->ry);
    +
    2486  }
    +
    2487 
    +
    2488  // PREPARE TO RENDER //
    +
    2489  g->observe1 = g->observe1 % g->player_count;
    +
    2490  g->observe2 = g->observe2 % g->player_count;
    +
    2491  delete_chunks();
    +
    2492  del_buffer(me->buffer);
    +
    2493  me->buffer = gen_player_buffer(s->x, s->y, s->z, s->rx, s->ry);
    +
    2494  for (int i = 1; i < g->player_count; i++) {
    + +
    2496  }
    +
    2497  Player *player = g->players + g->observe1;
    +
    2498 
    +
    2499  // RENDER 3-D SCENE //
    +
    2500  glClear(GL_COLOR_BUFFER_BIT);
    +
    2501  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2502  render_sky(&sky_attrib, player, sky_buffer);
    +
    2503  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2504  int face_count = render_chunks(&block_attrib, player);
    +
    2505  render_signs(&text_attrib, player);
    +
    2506  render_sign(&text_attrib, player);
    +
    2507  render_players(&block_attrib, player);
    +
    2508  if (SHOW_WIREFRAME) {
    +
    2509  render_wireframe(&line_attrib, player);
    +
    2510  }
    +
    2511 
    +
    2512  // RENDER HUD //
    +
    2513  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2514  if (SHOW_CROSSHAIRS) {
    +
    2515  render_crosshairs(&line_attrib);
    +
    2516  }
    +
    2517  if (SHOW_ITEM) {
    +
    2518  render_item(&block_attrib);
    +
    2519  }
    +
    2520 
    +
    2521  // RENDER TEXT //
    +
    2522  char text_buffer[1024];
    +
    2523  float ts = 12 * g->scale;
    +
    2524  float tx = ts / 2;
    +
    2525  float ty = g->height - ts;
    +
    2526  if (SHOW_INFO_TEXT) {
    +
    2527  int hour = time_of_day() * 24;
    +
    2528  char am_pm = hour < 12 ? 'a' : 'p';
    +
    2529  hour = hour % 12;
    +
    2530  hour = hour ? hour : 12;
    +
    2531  snprintf(
    +
    2532  text_buffer, 1024,
    +
    2533  "(%d, %d) (%.2f, %.2f, %.2f) [%d, %d, %d] %d%cm %dfps -- Player Health: %.2f",
    +
    2534  chunked(s->x), chunked(s->z), s->x, s->y, s->z,
    + +
    2536  face_count * 2, hour, am_pm, fps.fps, g->players->health);
    +
    2537  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts, text_buffer);
    +
    2538  ty -= ts * 2;
    +
    2539  }
    +
    2540  if (SHOW_CHAT_TEXT) {
    +
    2541  for (int i = 0; i < MAX_MESSAGES; i++) {
    +
    2542  int index = (g->message_index + i) % MAX_MESSAGES;
    +
    2543  if (strlen(g->messages[index])) {
    +
    2544  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts,
    +
    2545  g->messages[index]);
    +
    2546  ty -= ts * 2;
    +
    2547  }
    +
    2548  }
    +
    2549  }
    +
    2550  if (g->typing) {
    +
    2551  snprintf(text_buffer, 1024, "> %s", g->typing_buffer);
    +
    2552  render_text(&text_attrib, ALIGN_LEFT, tx, ty, ts, text_buffer);
    +
    2553  ty -= ts * 2;
    +
    2554  }
    +
    2555  if (SHOW_PLAYER_NAMES) {
    +
    2556  if (player != me) {
    +
    2557  render_text(&text_attrib, ALIGN_CENTER,
    +
    2558  g->width / 2, ts, ts, player->name);
    +
    2559  }
    +
    2560  Player *other = player_crosshair(player);
    +
    2561  if (other) {
    +
    2562  render_text(&text_attrib, ALIGN_CENTER,
    +
    2563  g->width / 2, g->height / 2 - ts - 24, ts,
    +
    2564  other->name);
    +
    2565  }
    +
    2566  }
    +
    2567 
    +
    2568  // RENDER PICTURE IN PICTURE //
    +
    2569  if (g->observe2) {
    +
    2570  player = g->players + g->observe2;
    +
    2571 
    +
    2572  int pw = 256 * g->scale;
    +
    2573  int ph = 256 * g->scale;
    +
    2574  int offset = 32 * g->scale;
    +
    2575  int pad = 3 * g->scale;
    +
    2576  int sw = pw + pad * 2;
    +
    2577  int sh = ph + pad * 2;
    +
    2578 
    +
    2579  glEnable(GL_SCISSOR_TEST);
    +
    2580  glScissor(g->width - sw - offset + pad, offset - pad, sw, sh);
    +
    2581  glClear(GL_COLOR_BUFFER_BIT);
    +
    2582  glDisable(GL_SCISSOR_TEST);
    +
    2583  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2584  glViewport(g->width - pw - offset, offset, pw, ph);
    +
    2585 
    +
    2586  g->width = pw;
    +
    2587  g->height = ph;
    +
    2588  g->ortho = 0;
    +
    2589  g->fov = 65;
    +
    2590 
    +
    2591  render_sky(&sky_attrib, player, sky_buffer);
    +
    2592  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2593  render_chunks(&block_attrib, player);
    +
    2594  render_signs(&text_attrib, player);
    +
    2595  render_players(&block_attrib, player);
    +
    2596  glClear(GL_DEPTH_BUFFER_BIT);
    +
    2597  if (SHOW_PLAYER_NAMES) {
    +
    2598  render_text(&text_attrib, ALIGN_CENTER,
    +
    2599  pw / 2, ts, ts, player->name);
    +
    2600  }
    +
    2601  }
    +
    2602 
    +
    2603  // SWAP AND POLL //
    +
    2604  glfwSwapBuffers(g->window);
    +
    2605  glfwPollEvents();
    +
    2606  if (!g->typing && glfwGetKey(g->window, CRAFT_KEY_QUIT)) {
    +
    2607  running = 0;
    +
    2608  break;
    +
    2609  }
    +
    2610  if (glfwWindowShouldClose(g->window)) {
    +
    2611  running = 0;
    +
    2612  break;
    +
    2613  }
    +
    2614  if (g->mode_changed) {
    +
    2615  g->mode_changed = 0;
    +
    2616  break;
    +
    2617  }
    +
    2618  }
    +
    2619 
    +
    2620  // SHUTDOWN //
    +
    2621  db_save_state(s->x, s->y, s->z, s->rx, s->ry);
    +
    2622  db_close();
    +
    2623  db_disable();
    +
    2624  client_stop();
    +
    2625  client_disable();
    +
    2626  del_buffer(sky_buffer);
    + + +
    2629  }
    +
    2630 
    +
    2631  glfwTerminate();
    +
    2632  curl_global_cleanup();
    +
    2633  return 0;
    +
    2634 }
    +
    int get_access_token(char *result, int length, char *username, char *identity_token)
    Definition: auth.c:21
    + +
    char * client_recv()
    Definition: client.c:146
    +
    void client_block(int x, int y, int z, int w)
    Definition: client.c:116
    +
    static int running
    Definition: client.c:21
    +
    void client_login(const char *username, const char *identity_token)
    Definition: client.c:78
    +
    void client_chunk(int p, int q, int key)
    Definition: client.c:107
    +
    void client_version(int version)
    Definition: client.c:69
    +
    void client_sign(int x, int y, int z, int face, const char *text)
    Definition: client.c:125
    +
    void client_connect(char *hostname, int port)
    Definition: client.c:203
    +
    void client_disable()
    Definition: client.c:34
    +
    void client_position(float x, float y, float z, float rx, float ry)
    Definition: client.c:87
    +
    void client_start()
    Definition: client.c:227
    +
    void client_enable()
    Definition: client.c:30
    +
    void client_stop()
    Definition: client.c:241
    +
    void client_talk(const char *text)
    Definition: client.c:134
    + +
    #define DEFAULT_PORT
    Definition: client.h:4
    + +
    #define VSYNC
    Definition: config.h:9
    +
    #define DB_PATH
    Definition: config.h:12
    +
    #define SHOW_INFO_TEXT
    Definition: config.h:24
    +
    #define COMMIT_INTERVAL
    Definition: config.h:52
    +
    #define RENDER_SIGN_RADIUS
    Definition: config.h:49
    +
    #define DAY_LENGTH
    Definition: config.h:14
    +
    #define MAX_MESSAGES
    Definition: config.h:11
    +
    #define USE_CACHE
    Definition: config.h:13
    +
    #define SHOW_CROSSHAIRS
    Definition: config.h:22
    +
    #define SHOW_WIREFRAME
    Definition: config.h:23
    +
    #define CRAFT_KEY_ORTHO
    Definition: config.h:41
    +
    #define CRAFT_KEY_FORWARD
    Definition: config.h:30
    +
    #define CRAFT_KEY_CHAT
    Definition: config.h:42
    +
    #define WINDOW_WIDTH
    Definition: config.h:7
    +
    #define CRAFT_KEY_ZOOM
    Definition: config.h:40
    +
    #define CRAFT_KEY_ITEM_NEXT
    Definition: config.h:38
    +
    #define WINDOW_HEIGHT
    Definition: config.h:8
    +
    #define CRAFT_KEY_RIGHT
    Definition: config.h:33
    +
    #define SHOW_PLAYER_NAMES
    Definition: config.h:26
    +
    #define RENDER_CHUNK_RADIUS
    Definition: config.h:48
    +
    #define CRAFT_KEY_QUIT
    Definition: config.h:29
    +
    #define CRAFT_KEY_JUMP
    Definition: config.h:34
    +
    #define INVERT_MOUSE
    Definition: config.h:15
    +
    #define CRAFT_KEY_OBSERVE
    Definition: config.h:36
    +
    #define CRAFT_KEY_LEFT
    Definition: config.h:32
    +
    #define CREATE_CHUNK_RADIUS
    Definition: config.h:47
    +
    #define CRAFT_KEY_COMMAND
    Definition: config.h:43
    +
    #define FULLSCREEN
    Definition: config.h:6
    +
    #define CRAFT_KEY_BACKWARD
    Definition: config.h:31
    +
    #define CRAFT_KEY_SIGN
    Definition: config.h:44
    +
    #define DELETE_CHUNK_RADIUS
    Definition: config.h:50
    +
    #define SCROLL_THRESHOLD
    Definition: config.h:10
    +
    #define CRAFT_KEY_ITEM_PREV
    Definition: config.h:39
    +
    #define SHOW_CHAT_TEXT
    Definition: config.h:25
    +
    #define CRAFT_KEY_OBSERVE_INSET
    Definition: config.h:37
    +
    #define CRAFT_KEY_FLY
    Definition: config.h:35
    +
    #define CHUNK_SIZE
    Definition: config.h:51
    +
    #define SHOW_ITEM
    Definition: config.h:21
    +
    void make_character_3d(float *data, float x, float y, float z, float n, int face, char c)
    Definition: cube.c:231
    +
    void make_cube_wireframe(float *data, float x, float y, float z, float n)
    Definition: cube.c:181
    +
    void make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w)
    Definition: cube.c:81
    +
    void make_player(float *data, float x, float y, float z, float rx, float ry)
    Definition: cube.c:158
    +
    void make_character(float *data, float x, float y, float n, float m, char c)
    Definition: cube.c:206
    +
    void make_sphere(float *data, float r, int detail)
    Definition: cube.c:336
    +
    void make_plant(float *data, float px, float py, float pz, float n, int w, float rotation)
    Definition: cube.c:99
    + +
    void db_disable()
    Definition: db.c:28
    +
    void db_commit()
    Definition: db.c:148
    +
    void db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text)
    Definition: db.c:312
    +
    void db_auth_select_none()
    Definition: db.c:194
    +
    int db_get_key(int p, int q)
    Definition: db.c:393
    +
    void db_save_state(float x, float y, float z, float rx, float ry)
    Definition: db.c:252
    +
    void db_set_key(int p, int q, int key)
    Definition: db.c:406
    +
    int db_auth_select(char *username)
    Definition: db.c:179
    +
    void db_load_signs(SignList *list, int p, int q)
    Definition: db.c:375
    +
    void db_load_map(Map *map, int p, int q)
    Definition: db.c:359
    +
    void db_close()
    Definition: db.c:131
    +
    void db_delete_sign(int x, int y, int z, int face)
    Definition: db.c:329
    +
    void db_delete_all_signs()
    Definition: db.c:352
    +
    int db_load_state(float *x, float *y, float *z, float *rx, float *ry)
    Definition: db.c:270
    +
    void db_insert_block(int p, int q, int x, int y, int z, int w)
    Definition: db.c:291
    +
    void db_auth_set(char *username, char *identity_token)
    Definition: db.c:162
    +
    void db_delete_signs(int x, int y, int z)
    Definition: db.c:341
    +
    int db_init(char *path)
    Definition: db.c:36
    +
    int db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length)
    Definition: db.c:226
    +
    void db_enable()
    Definition: db.c:24
    + +
    const int items[]
    Definition: item.c:4
    +
    int is_plant(int w)
    Definition: item.c:148
    +
    int is_obstacle(int w)
    Definition: item.c:163
    +
    const int blocks[256][6]
    Definition: item.c:67
    +
    int is_transparent(int w)
    Definition: item.c:180
    +
    int is_destructable(int w)
    Definition: item.c:204
    +
    int is_slowing(int w)
    Definition: item.c:214
    +
    int is_alpha(int w)
    Definition: item.c:200
    +
    const int item_count
    Definition: item.c:65
    + +
    #define LAVA
    Definition: item.h:28
    +
    void delete_all_players()
    Definition: main.c:444
    +
    void heal_damage(float healing)
    Definition: main.c:2085
    +
    int highest_block(float x, float z)
    Definition: main.c:554
    +
    void handle_lava_damage()
    Definition: main.c:2047
    +
    #define MAX_NAME_LENGTH
    Definition: main.c:25
    +
    int chunk_distance(Chunk *chunk, int p, int q)
    Definition: main.c:507
    +
    float player_crosshair_distance(Player *p1, Player *p2)
    Definition: main.c:461
    +
    void occlusion(char neighbors[27], float result[6][4])
    Definition: main.c:812
    +
    void cube(Block *b1, Block *b2, int fill)
    Definition: main.c:1486
    +
    void map_set_func(int x, int y, int z, int w, void *arg)
    Definition: main.c:965
    +
    #define MODE_OFFLINE
    Definition: main.c:33
    +
    void draw_item(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:343
    +
    void on_left_click()
    Definition: main.c:1727
    +
    #define MAX_PLAYERS
    Definition: main.c:23
    +
    #define ALIGN_CENTER
    Definition: main.c:30
    +
    int _hit_test(Map *map, float max_distance, int previous, float x, float y, float z, float vx, float vy, float vz, int *hx, int *hy, int *hz)
    Definition: main.c:572
    +
    void reset_model()
    Definition: main.c:2251
    +
    void set_sign(int x, int y, int z, int face, const char *text)
    Definition: main.c:1156
    +
    void ensure_chunks(Player *player)
    Definition: main.c:1057
    +
    void render_crosshairs(Attrib *attrib)
    Definition: main.c:1379
    +
    void get_sight_vector(float rx, float ry, float *vx, float *vy, float *vz)
    Definition: main.c:176
    +
    void draw_text(Attrib *attrib, GLuint buffer, int length)
    Definition: main.c:347
    +
    void force_chunks(Player *player)
    Definition: main.c:1034
    +
    int main(int argc, char **argv)
    Definition: main.c:2267
    +
    void gen_sign_buffer(Chunk *chunk)
    Definition: main.c:788
    +
    void on_right_click()
    Definition: main.c:1740
    +
    void draw_triangles_3d_text(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:283
    +
    int get_scale_factor()
    Definition: main.c:165
    +
    void render_players(Attrib *attrib, Player *player)
    Definition: main.c:1327
    +
    int chunk_visible(float planes[6][4], int p, int q, int miny, int maxy)
    Definition: main.c:513
    +
    void get_motion_vector(int flying, int sz, int sx, float rx, float ry, float *vx, float *vy, float *vz)
    Definition: main.c:183
    +
    void delete_all_chunks()
    Definition: main.c:1023
    +
    void draw_lines(Attrib *attrib, GLuint buffer, int components, int count)
    Definition: main.c:329
    +
    void handle_fall_damage(float dy)
    Definition: main.c:2070
    +
    int get_block(int x, int y, int z)
    Definition: main.c:1211
    +
    void draw_chunk(Attrib *attrib, Chunk *chunk)
    Definition: main.c:339
    +
    void draw_player(Attrib *attrib, Player *player)
    Definition: main.c:376
    +
    void on_middle_click()
    Definition: main.c:1752
    +
    void on_mouse_button(GLFWwindow *window, int button, int action, int mods)
    Definition: main.c:1913
    +
    Player * player_crosshair(Player *player)
    Definition: main.c:476
    +
    GLuint gen_text_buffer(float x, float y, float n, char *text)
    Definition: main.c:255
    +
    #define ALIGN_LEFT
    Definition: main.c:29
    +
    #define MAX_PLAYER_HEALTH
    Definition: main.c:38
    +
    void draw_sign(Attrib *attrib, GLuint buffer, int length)
    Definition: main.c:361
    +
    void render_signs(Attrib *attrib, Player *player)
    Definition: main.c:1272
    +
    int collide(int height, float *x, float *y, float *z)
    Definition: main.c:668
    +
    void render_sky(Attrib *attrib, Player *player, GLuint buffer)
    Definition: main.c:1346
    +
    void inflict_damage(float damage)
    Definition: main.c:2080
    +
    Player * find_player(int id)
    Definition: main.c:380
    +
    void delete_chunks()
    Definition: main.c:992
    +
    void on_key(GLFWwindow *window, int key, int scancode, int action, int mods)
    Definition: main.c:1764
    +
    void draw_cube(Attrib *attrib, GLuint buffer)
    Definition: main.c:368
    +
    void _set_block(int p, int q, int x, int y, int z, int w, int dirty)
    Definition: main.c:1163
    +
    int hit_test(int previous, float x, float y, float z, float rx, float ry, int *bx, int *by, int *bz)
    Definition: main.c:604
    +
    void unset_sign_face(int x, int y, int z, int face)
    Definition: main.c:1122
    +
    void interpolate_player(Player *player)
    Definition: main.c:414
    +
    int is_movement_slowed(Player *player)
    Definition: main.c:1994
    +
    float get_daylight()
    Definition: main.c:153
    +
    #define MAX_TEXT_LENGTH
    Definition: main.c:24
    +
    #define MAX_CHUNKS
    Definition: main.c:22
    +
    #define MAX_PATH_LENGTH
    Definition: main.c:26
    +
    void builder_block(int x, int y, int z, int w)
    Definition: main.c:1222
    +
    void set_block(int x, int y, int z, int w)
    Definition: main.c:1182
    +
    void draw_triangles_3d_ao(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:265
    +
    GLuint gen_crosshair_buffer()
    Definition: main.c:213
    +
    static Model model
    Definition: main.c:134
    +
    void on_char(GLFWwindow *window, unsigned int u)
    Definition: main.c:1864
    +
    GLuint gen_player_buffer(float x, float y, float z, float rx, float ry)
    Definition: main.c:249
    +
    void handle_player_health()
    Definition: main.c:2031
    +
    void copy()
    Definition: main.c:1459
    +
    int player_intersects_block(int height, float x, float y, float z, int hx, int hy, int hz)
    Definition: main.c:709
    +
    void record_block(int x, int y, int z, int w)
    Definition: main.c:1203
    +
    void update_player(Player *player, float x, float y, float z, float rx, float ry, int interpolate)
    Definition: main.c:390
    +
    int hit_test_face(Player *player, int *x, int *y, int *z, int *face)
    Definition: main.c:635
    +
    void tree(Block *block)
    Definition: main.c:1603
    +
    void render_wireframe(Attrib *attrib, Player *player)
    Definition: main.c:1359
    +
    int _gen_sign_buffer(GLfloat *data, float x, float y, float z, int face, const char *text)
    Definition: main.c:725
    +
    void cylinder(Block *b1, Block *b2, int radius, int fill)
    Definition: main.c:1565
    +
    void sphere(Block *center, int radius, int fill, int fx, int fy, int fz)
    Definition: main.c:1516
    +
    void _set_sign(int p, int q, int x, int y, int z, int face, const char *text, int dirty)
    Definition: main.c:1138
    +
    GLuint gen_wireframe_buffer(float x, float y, float z, float n)
    Definition: main.c:224
    +
    void parse_command(const char *buffer, int forward)
    Definition: main.c:1623
    +
    void delete_player(int id)
    Definition: main.c:432
    +
    #define MODE_ONLINE
    Definition: main.c:34
    +
    int chunked(float x)
    Definition: main.c:137
    +
    void draw_signs(Attrib *attrib, Chunk *chunk)
    Definition: main.c:354
    +
    void on_scroll(GLFWwindow *window, double xdelta, double ydelta)
    Definition: main.c:1897
    +
    void create_chunk(Chunk *chunk, int p, int q)
    Definition: main.c:970
    +
    void unset_sign(int x, int y, int z)
    Definition: main.c:1106
    +
    GLuint gen_cube_buffer(float x, float y, float z, float n, int w)
    Definition: main.c:236
    +
    void draw_triangles_2d(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:315
    +
    GLuint gen_plant_buffer(float x, float y, float z, float n, int w)
    Definition: main.c:243
    +
    GLuint gen_sky_buffer()
    Definition: main.c:230
    +
    void render_text(Attrib *attrib, int justify, float x, float y, float n, char *text)
    Definition: main.c:1413
    +
    void paste()
    Definition: main.c:1464
    +
    float handle_player_speed()
    Definition: main.c:2091
    +
    void create_window()
    Definition: main.c:1945
    +
    float player_player_distance(Player *p1, Player *p2)
    Definition: main.c:452
    +
    void draw_triangles_3d(Attrib *attrib, GLuint buffer, int count)
    Definition: main.c:297
    +
    float time_of_day()
    Definition: main.c:141
    +
    void parse_buffer(char *buffer)
    Definition: main.c:2169
    +
    int render_chunks(Attrib *attrib, Player *player)
    Definition: main.c:1234
    +
    void gen_chunk_buffer(Chunk *chunk)
    Definition: main.c:833
    +
    void render_sign(Attrib *attrib, Player *player)
    Definition: main.c:1300
    +
    Chunk * find_chunk(int p, int q)
    Definition: main.c:497
    +
    #define MOUSE_SENSITIVITY
    Definition: main.c:36
    +
    static Model * g
    Definition: main.c:135
    +
    void draw_plant(Attrib *attrib, GLuint buffer)
    Definition: main.c:372
    +
    void render_item(Attrib *attrib)
    Definition: main.c:1392
    +
    void add_message(const char *text)
    Definition: main.c:1429
    +
    #define MAX_ADDR_LENGTH
    Definition: main.c:27
    +
    void handle_mouse_input()
    Definition: main.c:1960
    +
    void login()
    Definition: main.c:1436
    +
    void handle_movement(double dt)
    Definition: main.c:2102
    + +
    void map_free(Map *map)
    Definition: map.c:27
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    void map_alloc(Map *map)
    Definition: map.c:21
    +
    #define END_MAP_FOR_EACH
    Definition: map.h:13
    +
    #define MAP_FOR_EACH(map, entry)
    Definition: map.h:6
    +
    int map_get(Map *map, int x, int y, int z)
    Definition: map.c:63
    + +
    void set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
    Definition: matrix.c:211
    +
    void frustum_planes(float planes[6][4], int radius, float *matrix)
    Definition: matrix.c:118
    +
    void set_matrix_2d(float *matrix, int width, int height)
    Definition: matrix.c:207
    +
    void set_matrix_item(float *matrix, int width, int height, int scale)
    Definition: matrix.c:240
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    void sign_list_free(SignList *list)
    Definition: sign.c:11
    +
    int sign_list_remove_all(SignList *list, int x, int y, int z)
    Definition: sign.c:60
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    + +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    Definition: main.c:82
    +
    GLuint extra1
    Definition: main.c:91
    +
    GLuint normal
    Definition: main.c:85
    +
    GLuint position
    Definition: main.c:84
    +
    GLuint extra2
    Definition: main.c:92
    +
    GLuint extra4
    Definition: main.c:94
    +
    GLuint extra3
    Definition: main.c:93
    +
    GLuint camera
    Definition: main.c:89
    +
    GLuint uv
    Definition: main.c:86
    +
    GLuint timer
    Definition: main.c:90
    +
    GLuint sampler
    Definition: main.c:88
    +
    GLuint matrix
    Definition: main.c:87
    +
    GLuint program
    Definition: main.c:83
    +
    Definition: main.c:56
    +
    int x
    Definition: main.c:57
    +
    int y
    Definition: main.c:58
    +
    int w
    Definition: main.c:60
    +
    int z
    Definition: main.c:59
    +
    Definition: main.c:40
    +
    int p
    Definition: main.c:43
    +
    int q
    Definition: main.c:44
    +
    GLuint buffer
    Definition: main.c:51
    +
    int maxy
    Definition: main.c:50
    +
    int alpha_faces
    Definition: main.c:46
    +
    int miny
    Definition: main.c:49
    +
    int dirty
    Definition: main.c:48
    +
    int sign_faces
    Definition: main.c:47
    +
    GLuint sign_buffer
    Definition: main.c:53
    +
    GLuint alpha_buffer
    Definition: main.c:52
    +
    Map map
    Definition: main.c:41
    +
    SignList signs
    Definition: main.c:42
    +
    int faces
    Definition: main.c:45
    +
    Definition: util.h:22
    +
    unsigned int fps
    Definition: util.h:23
    +
    Definition: map.h:22
    +
    Definition: main.c:97
    +
    int sign_radius
    Definition: main.c:105
    +
    int scale
    Definition: main.c:119
    +
    int typing
    Definition: main.c:108
    +
    Player players[MAX_PLAYERS]
    Definition: main.c:106
    +
    Block block1
    Definition: main.c:129
    +
    int observe1
    Definition: main.c:114
    +
    Block copy0
    Definition: main.c:130
    +
    int delete_radius
    Definition: main.c:104
    +
    Chunk chunks[MAX_CHUNKS]
    Definition: main.c:100
    +
    int item_index
    Definition: main.c:118
    +
    float sensitivity
    Definition: main.c:99
    +
    int message_index
    Definition: main.c:110
    +
    int flying
    Definition: main.c:116
    +
    int mode_changed
    Definition: main.c:124
    +
    char typing_buffer[MAX_TEXT_LENGTH]
    Definition: main.c:109
    +
    int height
    Definition: main.c:113
    +
    int suppress_char
    Definition: main.c:122
    +
    int render_radius
    Definition: main.c:103
    +
    Block copy1
    Definition: main.c:131
    +
    char server_addr[MAX_ADDR_LENGTH]
    Definition: main.c:126
    +
    int width
    Definition: main.c:112
    +
    int observe2
    Definition: main.c:115
    +
    int ortho
    Definition: main.c:120
    +
    char messages[MAX_MESSAGES][MAX_TEXT_LENGTH]
    Definition: main.c:111
    +
    int player_count
    Definition: main.c:107
    +
    int slowed
    Definition: main.c:117
    +
    int create_radius
    Definition: main.c:102
    +
    float fov
    Definition: main.c:121
    +
    int server_port
    Definition: main.c:127
    +
    int chunk_count
    Definition: main.c:101
    +
    int mode
    Definition: main.c:123
    +
    GLFWwindow * window
    Definition: main.c:98
    +
    char db_path[MAX_PATH_LENGTH]
    Definition: main.c:125
    +
    Block block0
    Definition: main.c:128
    +
    Definition: main.c:72
    +
    char name[MAX_NAME_LENGTH]
    Definition: main.c:74
    +
    int id
    Definition: main.c:73
    +
    GLuint buffer
    Definition: main.c:79
    +
    State state1
    Definition: main.c:77
    +
    State state2
    Definition: main.c:78
    +
    State state
    Definition: main.c:76
    +
    float health
    Definition: main.c:75
    +
    Definition: sign.h:14
    +
    unsigned int size
    Definition: sign.h:16
    +
    Sign * data
    Definition: sign.h:17
    +
    Definition: sign.h:6
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    char text[MAX_SIGN_LENGTH]
    Definition: sign.h:11
    +
    int y
    Definition: sign.h:8
    +
    Definition: main.c:63
    +
    float rx
    Definition: main.c:67
    +
    float y
    Definition: main.c:65
    +
    float ry
    Definition: main.c:68
    +
    float x
    Definition: main.c:64
    +
    float t
    Definition: main.c:69
    +
    float z
    Definition: main.c:66
    +
    GLfloat * malloc_faces(int components, int faces)
    Definition: util.c:53
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    GLuint load_program(const char *path1, const char *path2)
    Definition: util.c:110
    +
    int char_width(char input)
    Definition: util.c:163
    +
    int wrap(const char *input, int max_width, char *output, int max_length)
    Definition: util.c:186
    +
    void del_buffer(GLuint buffer)
    Definition: util.c:49
    +
    void load_png_texture(const char *file_name)
    Definition: util.c:131
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    GLuint gen_faces(int components, int faces, GLfloat *data)
    Definition: util.c:57
    +
    void update_fps(FPS *fps)
    Definition: util.c:18
    + +
    #define MIN(a, b)
    Definition: util.h:12
    +
    #define RADIANS(degrees)
    Definition: util.h:10
    +
    #define PI
    Definition: util.h:8
    +
    #define DEGREES(radians)
    Definition: util.h:9
    +
    #define SIGN(x)
    Definition: util.h:14
    +
    #define ABS(x)
    Definition: util.h:11
    +
    #define MAX(a, b)
    Definition: util.h:13
    + +
    void create_world(int p, int q, world_func func, void *arg)
    Definition: world.c:5
    +
    + + + + diff --git a/documentation/html/map_8c.html b/documentation/html/map_8c.html new file mode 100644 index 000000000..5e07d5669 --- /dev/null +++ b/documentation/html/map_8c.html @@ -0,0 +1,404 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    map.c File Reference
    +
    +
    +
    #include <stdlib.h>
    +#include "map.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Functions

    int hash_int (int key)
     
    int hash (int x, int y, int z)
     
    void map_alloc (Map *map)
     
    void map_free (Map *map)
     
    int map_set (Map *map, int x, int y, int z, int w)
     
    int map_get (Map *map, int x, int y, int z)
     
    void map_grow (Map *map)
     
    +

    Function Documentation

    + +

    ◆ hash()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int hash (int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 14 of file map.c.

    +
    14  {
    +
    15  x = hash_int(x);
    +
    16  y = hash_int(y);
    +
    17  z = hash_int(z);
    +
    18  return x ^ y ^ z;
    +
    19 }
    +
    int hash_int(int key)
    Definition: map.c:4
    +
    +
    +
    + +

    ◆ hash_int()

    + +
    +
    + + + + + + + + +
    int hash_int (int key)
    +
    + +

    Definition at line 4 of file map.c.

    +
    4  {
    +
    5  key = ~key + (key << 15);
    +
    6  key = key ^ (key >> 12);
    +
    7  key = key + (key << 2);
    +
    8  key = key ^ (key >> 4);
    +
    9  key = key * 2057;
    +
    10  key = key ^ (key >> 16);
    +
    11  return key;
    +
    12 }
    +
    +
    +
    + +

    ◆ map_alloc()

    + +
    +
    + + + + + + + + +
    void map_alloc (Mapmap)
    +
    + +

    Definition at line 21 of file map.c.

    +
    21  {
    +
    22  map->mask = 0xfff;
    +
    23  map->size = 0;
    +
    24  map->data = (MapEntry *)calloc(map->mask + 1, sizeof(MapEntry));
    +
    25 }
    +
    Definition: map.h:15
    +
    unsigned int mask
    Definition: map.h:23
    +
    unsigned int size
    Definition: map.h:24
    +
    MapEntry * data
    Definition: map.h:25
    +
    +
    +
    + +

    ◆ map_free()

    + +
    +
    + + + + + + + + +
    void map_free (Mapmap)
    +
    + +

    Definition at line 27 of file map.c.

    +
    27  {
    +
    28  free(map->data);
    +
    29 }
    +
    +
    +
    + +

    ◆ map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int map_get (Mapmap,
    int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 63 of file map.c.

    +
    63  {
    +
    64  unsigned int index = hash(x, y, z) & map->mask;
    +
    65  MapEntry *entry = map->data + index;
    +
    66  while (!EMPTY_ENTRY(entry)) {
    +
    67  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    68  return entry->w;
    +
    69  }
    +
    70  index = (index + 1) & map->mask;
    +
    71  entry = map->data + index;
    +
    72  }
    +
    73  return 0;
    +
    74 }
    +
    int hash(int x, int y, int z)
    Definition: map.c:14
    +
    #define EMPTY_ENTRY(e)
    Definition: map.h:4
    +
    int z
    Definition: map.h:18
    +
    int x
    Definition: map.h:16
    +
    int y
    Definition: map.h:17
    +
    int w
    Definition: map.h:19
    +
    +
    +
    + +

    ◆ map_grow()

    + +
    +
    + + + + + + + + +
    void map_grow (Mapmap)
    +
    + +

    Definition at line 76 of file map.c.

    +
    76  {
    +
    77  Map new_map;
    +
    78  new_map.mask = (map->mask << 1) | 1;
    +
    79  new_map.size = 0;
    +
    80  new_map.data = (MapEntry *)calloc(new_map.mask + 1, sizeof(MapEntry));
    +
    81  MAP_FOR_EACH(map, entry) {
    +
    82  map_set(&new_map, entry->x, entry->y, entry->z, entry->w);
    + +
    84  free(map->data);
    +
    85  map->mask = new_map.mask;
    +
    86  map->size = new_map.size;
    +
    87  map->data = new_map.data;
    +
    88 }
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    #define END_MAP_FOR_EACH
    Definition: map.h:13
    +
    #define MAP_FOR_EACH(map, entry)
    Definition: map.h:6
    +
    Definition: map.h:22
    +
    +
    +
    + +

    ◆ map_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int map_set (Mapmap,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 31 of file map.c.

    +
    31  {
    +
    32  unsigned int index = hash(x, y, z) & map->mask;
    +
    33  MapEntry *entry = map->data + index;
    +
    34  int overwrite = 0;
    +
    35  while (!EMPTY_ENTRY(entry)) {
    +
    36  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    37  overwrite = 1;
    +
    38  break;
    +
    39  }
    +
    40  index = (index + 1) & map->mask;
    +
    41  entry = map->data + index;
    +
    42  }
    +
    43  if (overwrite) {
    +
    44  if (entry->w != w) {
    +
    45  entry->w = w;
    +
    46  return 1;
    +
    47  }
    +
    48  }
    +
    49  else if (w) {
    +
    50  entry->x = x;
    +
    51  entry->y = y;
    +
    52  entry->z = z;
    +
    53  entry->w = w;
    +
    54  map->size++;
    +
    55  if (map->size * 2 > map->mask) {
    +
    56  map_grow(map);
    +
    57  }
    +
    58  return 1;
    +
    59  }
    +
    60  return 0;
    +
    61 }
    +
    void map_grow(Map *map)
    Definition: map.c:76
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/map_8c_source.html b/documentation/html/map_8c_source.html new file mode 100644 index 000000000..1edb5accc --- /dev/null +++ b/documentation/html/map_8c_source.html @@ -0,0 +1,186 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    map.c
    +
    +
    +Go to the documentation of this file.
    1 #include <stdlib.h>
    +
    2 #include "map.h"
    +
    3 
    +
    4 int hash_int(int key) {
    +
    5  key = ~key + (key << 15);
    +
    6  key = key ^ (key >> 12);
    +
    7  key = key + (key << 2);
    +
    8  key = key ^ (key >> 4);
    +
    9  key = key * 2057;
    +
    10  key = key ^ (key >> 16);
    +
    11  return key;
    +
    12 }
    +
    13 
    +
    14 int hash(int x, int y, int z) {
    +
    15  x = hash_int(x);
    +
    16  y = hash_int(y);
    +
    17  z = hash_int(z);
    +
    18  return x ^ y ^ z;
    +
    19 }
    +
    20 
    +
    21 void map_alloc(Map *map) {
    +
    22  map->mask = 0xfff;
    +
    23  map->size = 0;
    +
    24  map->data = (MapEntry *)calloc(map->mask + 1, sizeof(MapEntry));
    +
    25 }
    +
    26 
    +
    27 void map_free(Map *map) {
    +
    28  free(map->data);
    +
    29 }
    +
    30 
    +
    31 int map_set(Map *map, int x, int y, int z, int w) {
    +
    32  unsigned int index = hash(x, y, z) & map->mask;
    +
    33  MapEntry *entry = map->data + index;
    +
    34  int overwrite = 0;
    +
    35  while (!EMPTY_ENTRY(entry)) {
    +
    36  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    37  overwrite = 1;
    +
    38  break;
    +
    39  }
    +
    40  index = (index + 1) & map->mask;
    +
    41  entry = map->data + index;
    +
    42  }
    +
    43  if (overwrite) {
    +
    44  if (entry->w != w) {
    +
    45  entry->w = w;
    +
    46  return 1;
    +
    47  }
    +
    48  }
    +
    49  else if (w) {
    +
    50  entry->x = x;
    +
    51  entry->y = y;
    +
    52  entry->z = z;
    +
    53  entry->w = w;
    +
    54  map->size++;
    +
    55  if (map->size * 2 > map->mask) {
    +
    56  map_grow(map);
    +
    57  }
    +
    58  return 1;
    +
    59  }
    +
    60  return 0;
    +
    61 }
    +
    62 
    +
    63 int map_get(Map *map, int x, int y, int z) {
    +
    64  unsigned int index = hash(x, y, z) & map->mask;
    +
    65  MapEntry *entry = map->data + index;
    +
    66  while (!EMPTY_ENTRY(entry)) {
    +
    67  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    68  return entry->w;
    +
    69  }
    +
    70  index = (index + 1) & map->mask;
    +
    71  entry = map->data + index;
    +
    72  }
    +
    73  return 0;
    +
    74 }
    +
    75 
    +
    76 void map_grow(Map *map) {
    +
    77  Map new_map;
    +
    78  new_map.mask = (map->mask << 1) | 1;
    +
    79  new_map.size = 0;
    +
    80  new_map.data = (MapEntry *)calloc(new_map.mask + 1, sizeof(MapEntry));
    +
    81  MAP_FOR_EACH(map, entry) {
    +
    82  map_set(&new_map, entry->x, entry->y, entry->z, entry->w);
    + +
    84  free(map->data);
    +
    85  map->mask = new_map.mask;
    +
    86  map->size = new_map.size;
    +
    87  map->data = new_map.data;
    +
    88 }
    +
    void map_free(Map *map)
    Definition: map.c:27
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    int hash_int(int key)
    Definition: map.c:4
    +
    void map_alloc(Map *map)
    Definition: map.c:21
    +
    int map_get(Map *map, int x, int y, int z)
    Definition: map.c:63
    +
    int hash(int x, int y, int z)
    Definition: map.c:14
    +
    void map_grow(Map *map)
    Definition: map.c:76
    + +
    #define END_MAP_FOR_EACH
    Definition: map.h:13
    +
    #define MAP_FOR_EACH(map, entry)
    Definition: map.h:6
    +
    #define EMPTY_ENTRY(e)
    Definition: map.h:4
    +
    Definition: map.h:15
    +
    int z
    Definition: map.h:18
    +
    int x
    Definition: map.h:16
    +
    int y
    Definition: map.h:17
    +
    int w
    Definition: map.h:19
    +
    Definition: map.h:22
    +
    unsigned int mask
    Definition: map.h:23
    +
    unsigned int size
    Definition: map.h:24
    +
    MapEntry * data
    Definition: map.h:25
    +
    + + + + diff --git a/documentation/html/map_8h.html b/documentation/html/map_8h.html new file mode 100644 index 000000000..ba5710b82 --- /dev/null +++ b/documentation/html/map_8h.html @@ -0,0 +1,416 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    map.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + +

    +Classes

    struct  MapEntry
     
    struct  Map
     
    + + + + + + + +

    +Macros

    #define EMPTY_ENTRY(e)   (!(e)->x && !(e)->y && !(e)->z && !(e)->w)
     
    #define MAP_FOR_EACH(map, entry)
     
    #define END_MAP_FOR_EACH   }
     
    + + + + + + + + + + + +

    +Functions

    void map_alloc (Map *map)
     
    void map_free (Map *map)
     
    void map_grow (Map *map)
     
    int map_set (Map *map, int x, int y, int z, int w)
     
    int map_get (Map *map, int x, int y, int z)
     
    +

    Macro Definition Documentation

    + +

    ◆ EMPTY_ENTRY

    + +
    +
    + + + + + + + + +
    #define EMPTY_ENTRY( e)   (!(e)->x && !(e)->y && !(e)->z && !(e)->w)
    +
    + +

    Definition at line 4 of file map.h.

    + +
    +
    + +

    ◆ END_MAP_FOR_EACH

    + +
    +
    + + + + +
    #define END_MAP_FOR_EACH   }
    +
    + +

    Definition at line 13 of file map.h.

    + +
    +
    + +

    ◆ MAP_FOR_EACH

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define MAP_FOR_EACH( map,
     entry 
    )
    +
    +Value:
    for (unsigned int i = 0; i <= map->mask; i++) { \
    +
    MapEntry *entry = map->data + i; \
    +
    if (EMPTY_ENTRY(entry)) { \
    +
    continue; \
    +
    }
    +
    #define EMPTY_ENTRY(e)
    Definition: map.h:4
    +
    +

    Definition at line 6 of file map.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ map_alloc()

    + +
    +
    + + + + + + + + +
    void map_alloc (Mapmap)
    +
    + +

    Definition at line 21 of file map.c.

    +
    21  {
    +
    22  map->mask = 0xfff;
    +
    23  map->size = 0;
    +
    24  map->data = (MapEntry *)calloc(map->mask + 1, sizeof(MapEntry));
    +
    25 }
    +
    Definition: map.h:15
    +
    unsigned int mask
    Definition: map.h:23
    +
    unsigned int size
    Definition: map.h:24
    +
    MapEntry * data
    Definition: map.h:25
    +
    +
    +
    + +

    ◆ map_free()

    + +
    +
    + + + + + + + + +
    void map_free (Mapmap)
    +
    + +

    Definition at line 27 of file map.c.

    +
    27  {
    +
    28  free(map->data);
    +
    29 }
    +
    +
    +
    + +

    ◆ map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int map_get (Mapmap,
    int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 63 of file map.c.

    +
    63  {
    +
    64  unsigned int index = hash(x, y, z) & map->mask;
    +
    65  MapEntry *entry = map->data + index;
    +
    66  while (!EMPTY_ENTRY(entry)) {
    +
    67  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    68  return entry->w;
    +
    69  }
    +
    70  index = (index + 1) & map->mask;
    +
    71  entry = map->data + index;
    +
    72  }
    +
    73  return 0;
    +
    74 }
    +
    int hash(int x, int y, int z)
    Definition: map.c:14
    +
    int z
    Definition: map.h:18
    +
    int x
    Definition: map.h:16
    +
    int y
    Definition: map.h:17
    +
    int w
    Definition: map.h:19
    +
    +
    +
    + +

    ◆ map_grow()

    + +
    +
    + + + + + + + + +
    void map_grow (Mapmap)
    +
    + +

    Definition at line 76 of file map.c.

    +
    76  {
    +
    77  Map new_map;
    +
    78  new_map.mask = (map->mask << 1) | 1;
    +
    79  new_map.size = 0;
    +
    80  new_map.data = (MapEntry *)calloc(new_map.mask + 1, sizeof(MapEntry));
    +
    81  MAP_FOR_EACH(map, entry) {
    +
    82  map_set(&new_map, entry->x, entry->y, entry->z, entry->w);
    + +
    84  free(map->data);
    +
    85  map->mask = new_map.mask;
    +
    86  map->size = new_map.size;
    +
    87  map->data = new_map.data;
    +
    88 }
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    #define END_MAP_FOR_EACH
    Definition: map.h:13
    +
    #define MAP_FOR_EACH(map, entry)
    Definition: map.h:6
    +
    Definition: map.h:22
    +
    +
    +
    + +

    ◆ map_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int map_set (Mapmap,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 31 of file map.c.

    +
    31  {
    +
    32  unsigned int index = hash(x, y, z) & map->mask;
    +
    33  MapEntry *entry = map->data + index;
    +
    34  int overwrite = 0;
    +
    35  while (!EMPTY_ENTRY(entry)) {
    +
    36  if (entry->x == x && entry->y == y && entry->z == z) {
    +
    37  overwrite = 1;
    +
    38  break;
    +
    39  }
    +
    40  index = (index + 1) & map->mask;
    +
    41  entry = map->data + index;
    +
    42  }
    +
    43  if (overwrite) {
    +
    44  if (entry->w != w) {
    +
    45  entry->w = w;
    +
    46  return 1;
    +
    47  }
    +
    48  }
    +
    49  else if (w) {
    +
    50  entry->x = x;
    +
    51  entry->y = y;
    +
    52  entry->z = z;
    +
    53  entry->w = w;
    +
    54  map->size++;
    +
    55  if (map->size * 2 > map->mask) {
    +
    56  map_grow(map);
    +
    57  }
    +
    58  return 1;
    +
    59  }
    +
    60  return 0;
    +
    61 }
    +
    void map_grow(Map *map)
    Definition: map.c:76
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/map_8h_source.html b/documentation/html/map_8h_source.html new file mode 100644 index 000000000..cd5b13243 --- /dev/null +++ b/documentation/html/map_8h_source.html @@ -0,0 +1,126 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    map.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _map_h_
    +
    2 #define _map_h_
    +
    3 
    +
    4 #define EMPTY_ENTRY(e) (!(e)->x && !(e)->y && !(e)->z && !(e)->w)
    +
    5 
    +
    6 #define MAP_FOR_EACH(map, entry) \
    +
    7  for (unsigned int i = 0; i <= map->mask; i++) { \
    +
    8  MapEntry *entry = map->data + i; \
    +
    9  if (EMPTY_ENTRY(entry)) { \
    +
    10  continue; \
    +
    11  }
    +
    12 
    +
    13 #define END_MAP_FOR_EACH }
    +
    14 
    +
    15 typedef struct {
    +
    16  int x;
    +
    17  int y;
    +
    18  int z;
    +
    19  int w;
    +
    20 } MapEntry;
    +
    21 
    +
    22 typedef struct {
    +
    23  unsigned int mask;
    +
    24  unsigned int size;
    + +
    26 } Map;
    +
    27 
    +
    28 void map_alloc(Map *map);
    +
    29 void map_free(Map *map);
    +
    30 void map_grow(Map *map);
    +
    31 int map_set(Map *map, int x, int y, int z, int w);
    +
    32 int map_get(Map *map, int x, int y, int z);
    +
    33 
    +
    34 #endif
    +
    void map_free(Map *map)
    Definition: map.c:27
    +
    int map_set(Map *map, int x, int y, int z, int w)
    Definition: map.c:31
    +
    void map_alloc(Map *map)
    Definition: map.c:21
    +
    int map_get(Map *map, int x, int y, int z)
    Definition: map.c:63
    +
    void map_grow(Map *map)
    Definition: map.c:76
    +
    Definition: map.h:15
    +
    int z
    Definition: map.h:18
    +
    int x
    Definition: map.h:16
    +
    int y
    Definition: map.h:17
    +
    int w
    Definition: map.h:19
    +
    Definition: map.h:22
    +
    unsigned int mask
    Definition: map.h:23
    +
    unsigned int size
    Definition: map.h:24
    +
    MapEntry * data
    Definition: map.h:25
    +
    + + + + diff --git a/documentation/html/matrix_8c.html b/documentation/html/matrix_8c.html new file mode 100644 index 000000000..527a113c6 --- /dev/null +++ b/documentation/html/matrix_8c.html @@ -0,0 +1,989 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/matrix.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    matrix.c File Reference
    +
    +
    +
    #include <math.h>
    +#include "config.h"
    +#include "matrix.h"
    +#include "util.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void normalize (float *x, float *y, float *z)
     
    void mat_identity (float *matrix)
     
    void mat_translate (float *matrix, float dx, float dy, float dz)
     
    void mat_rotate (float *matrix, float x, float y, float z, float angle)
     
    void mat_vec_multiply (float *vector, float *a, float *b)
     
    void mat_multiply (float *matrix, float *a, float *b)
     
    void mat_apply (float *data, float *matrix, int count, int offset, int stride)
     
    void frustum_planes (float planes[6][4], int radius, float *matrix)
     
    void mat_frustum (float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
     
    void mat_perspective (float *matrix, float fov, float aspect, float znear, float zfar)
     
    void mat_ortho (float *matrix, float left, float right, float bottom, float top, float near, float far)
     
    void set_matrix_2d (float *matrix, int width, int height)
     
    void set_matrix_3d (float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
     
    void set_matrix_item (float *matrix, int width, int height, int scale)
     
    +

    Function Documentation

    + +

    ◆ frustum_planes()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void frustum_planes (float planes[6][4],
    int radius,
    float * matrix 
    )
    +
    + +

    Definition at line 118 of file matrix.c.

    +
    118  {
    +
    119  float znear = 0.125;
    +
    120  float zfar = radius * 32 + 64;
    +
    121  float *m = matrix;
    +
    122  planes[0][0] = m[3] + m[0];
    +
    123  planes[0][1] = m[7] + m[4];
    +
    124  planes[0][2] = m[11] + m[8];
    +
    125  planes[0][3] = m[15] + m[12];
    +
    126  planes[1][0] = m[3] - m[0];
    +
    127  planes[1][1] = m[7] - m[4];
    +
    128  planes[1][2] = m[11] - m[8];
    +
    129  planes[1][3] = m[15] - m[12];
    +
    130  planes[2][0] = m[3] + m[1];
    +
    131  planes[2][1] = m[7] + m[5];
    +
    132  planes[2][2] = m[11] + m[9];
    +
    133  planes[2][3] = m[15] + m[13];
    +
    134  planes[3][0] = m[3] - m[1];
    +
    135  planes[3][1] = m[7] - m[5];
    +
    136  planes[3][2] = m[11] - m[9];
    +
    137  planes[3][3] = m[15] - m[13];
    +
    138  planes[4][0] = znear * m[3] + m[2];
    +
    139  planes[4][1] = znear * m[7] + m[6];
    +
    140  planes[4][2] = znear * m[11] + m[10];
    +
    141  planes[4][3] = znear * m[15] + m[14];
    +
    142  planes[5][0] = zfar * m[3] - m[2];
    +
    143  planes[5][1] = zfar * m[7] - m[6];
    +
    144  planes[5][2] = zfar * m[11] - m[10];
    +
    145  planes[5][3] = zfar * m[15] - m[14];
    +
    146 }
    +
    +
    +
    + +

    ◆ mat_apply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_apply (float * data,
    float * matrix,
    int count,
    int offset,
    int stride 
    )
    +
    + +

    Definition at line 107 of file matrix.c.

    +
    107  {
    +
    108  float vec[4] = {0, 0, 0, 1};
    +
    109  for (int i = 0; i < count; i++) {
    +
    110  float *d = data + offset + stride * i;
    +
    111  vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++);
    +
    112  mat_vec_multiply(vec, matrix, vec);
    +
    113  d = data + offset + stride * i;
    +
    114  *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2];
    +
    115  }
    +
    116 }
    +
    void mat_vec_multiply(float *vector, float *a, float *b)
    Definition: matrix.c:72
    +
    +
    +
    + +

    ◆ mat_frustum()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_frustum (float * matrix,
    float left,
    float right,
    float bottom,
    float top,
    float znear,
    float zfar 
    )
    +
    + +

    Definition at line 148 of file matrix.c.

    +
    151 {
    +
    152  float temp, temp2, temp3, temp4;
    +
    153  temp = 2.0 * znear;
    +
    154  temp2 = right - left;
    +
    155  temp3 = top - bottom;
    +
    156  temp4 = zfar - znear;
    +
    157  matrix[0] = temp / temp2;
    +
    158  matrix[1] = 0.0;
    +
    159  matrix[2] = 0.0;
    +
    160  matrix[3] = 0.0;
    +
    161  matrix[4] = 0.0;
    +
    162  matrix[5] = temp / temp3;
    +
    163  matrix[6] = 0.0;
    +
    164  matrix[7] = 0.0;
    +
    165  matrix[8] = (right + left) / temp2;
    +
    166  matrix[9] = (top + bottom) / temp3;
    +
    167  matrix[10] = (-zfar - znear) / temp4;
    +
    168  matrix[11] = -1.0;
    +
    169  matrix[12] = 0.0;
    +
    170  matrix[13] = 0.0;
    +
    171  matrix[14] = (-temp * zfar) / temp4;
    +
    172  matrix[15] = 0.0;
    +
    173 }
    +
    +
    +
    + +

    ◆ mat_identity()

    + +
    +
    + + + + + + + + +
    void mat_identity (float * matrix)
    +
    + +

    Definition at line 11 of file matrix.c.

    +
    11  {
    +
    12  matrix[0] = 1;
    +
    13  matrix[1] = 0;
    +
    14  matrix[2] = 0;
    +
    15  matrix[3] = 0;
    +
    16  matrix[4] = 0;
    +
    17  matrix[5] = 1;
    +
    18  matrix[6] = 0;
    +
    19  matrix[7] = 0;
    +
    20  matrix[8] = 0;
    +
    21  matrix[9] = 0;
    +
    22  matrix[10] = 1;
    +
    23  matrix[11] = 0;
    +
    24  matrix[12] = 0;
    +
    25  matrix[13] = 0;
    +
    26  matrix[14] = 0;
    +
    27  matrix[15] = 1;
    +
    28 }
    +
    +
    +
    + +

    ◆ mat_multiply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_multiply (float * matrix,
    float * a,
    float * b 
    )
    +
    + +

    Definition at line 88 of file matrix.c.

    +
    88  {
    +
    89  float result[16];
    +
    90  for (int c = 0; c < 4; c++) {
    +
    91  for (int r = 0; r < 4; r++) {
    +
    92  int index = c * 4 + r;
    +
    93  float total = 0;
    +
    94  for (int i = 0; i < 4; i++) {
    +
    95  int p = i * 4 + r;
    +
    96  int q = c * 4 + i;
    +
    97  total += a[p] * b[q];
    +
    98  }
    +
    99  result[index] = total;
    +
    100  }
    +
    101  }
    +
    102  for (int i = 0; i < 16; i++) {
    +
    103  matrix[i] = result[i];
    +
    104  }
    +
    105 }
    +
    +
    +
    + +

    ◆ mat_ortho()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_ortho (float * matrix,
    float left,
    float right,
    float bottom,
    float top,
    float near,
    float far 
    )
    +
    + +

    Definition at line 185 of file matrix.c.

    +
    188 {
    +
    189  matrix[0] = 2 / (right - left);
    +
    190  matrix[1] = 0;
    +
    191  matrix[2] = 0;
    +
    192  matrix[3] = 0;
    +
    193  matrix[4] = 0;
    +
    194  matrix[5] = 2 / (top - bottom);
    +
    195  matrix[6] = 0;
    +
    196  matrix[7] = 0;
    +
    197  matrix[8] = 0;
    +
    198  matrix[9] = 0;
    +
    199  matrix[10] = -2 / (far - near);
    +
    200  matrix[11] = 0;
    +
    201  matrix[12] = -(right + left) / (right - left);
    +
    202  matrix[13] = -(top + bottom) / (top - bottom);
    +
    203  matrix[14] = -(far + near) / (far - near);
    +
    204  matrix[15] = 1;
    +
    205 }
    +
    +
    +
    + +

    ◆ mat_perspective()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_perspective (float * matrix,
    float fov,
    float aspect,
    float znear,
    float zfar 
    )
    +
    + +

    Definition at line 175 of file matrix.c.

    +
    178 {
    +
    179  float ymax, xmax;
    +
    180  ymax = znear * tanf(fov * PI / 360.0);
    +
    181  xmax = ymax * aspect;
    +
    182  mat_frustum(matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
    +
    183 }
    +
    void mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
    Definition: matrix.c:148
    +
    #define PI
    Definition: util.h:8
    +
    +
    +
    + +

    ◆ mat_rotate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_rotate (float * matrix,
    float x,
    float y,
    float z,
    float angle 
    )
    +
    + +

    Definition at line 49 of file matrix.c.

    +
    49  {
    +
    50  normalize(&x, &y, &z);
    +
    51  float s = sinf(angle);
    +
    52  float c = cosf(angle);
    +
    53  float m = 1 - c;
    +
    54  matrix[0] = m * x * x + c;
    +
    55  matrix[1] = m * x * y - z * s;
    +
    56  matrix[2] = m * z * x + y * s;
    +
    57  matrix[3] = 0;
    +
    58  matrix[4] = m * x * y + z * s;
    +
    59  matrix[5] = m * y * y + c;
    +
    60  matrix[6] = m * y * z - x * s;
    +
    61  matrix[7] = 0;
    +
    62  matrix[8] = m * z * x - y * s;
    +
    63  matrix[9] = m * y * z + x * s;
    +
    64  matrix[10] = m * z * z + c;
    +
    65  matrix[11] = 0;
    +
    66  matrix[12] = 0;
    +
    67  matrix[13] = 0;
    +
    68  matrix[14] = 0;
    +
    69  matrix[15] = 1;
    +
    70 }
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    +
    +
    + +

    ◆ mat_translate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_translate (float * matrix,
    float dx,
    float dy,
    float dz 
    )
    +
    + +

    Definition at line 30 of file matrix.c.

    +
    30  {
    +
    31  matrix[0] = 1;
    +
    32  matrix[1] = 0;
    +
    33  matrix[2] = 0;
    +
    34  matrix[3] = 0;
    +
    35  matrix[4] = 0;
    +
    36  matrix[5] = 1;
    +
    37  matrix[6] = 0;
    +
    38  matrix[7] = 0;
    +
    39  matrix[8] = 0;
    +
    40  matrix[9] = 0;
    +
    41  matrix[10] = 1;
    +
    42  matrix[11] = 0;
    +
    43  matrix[12] = dx;
    +
    44  matrix[13] = dy;
    +
    45  matrix[14] = dz;
    +
    46  matrix[15] = 1;
    +
    47 }
    +
    +
    +
    + +

    ◆ mat_vec_multiply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_vec_multiply (float * vector,
    float * a,
    float * b 
    )
    +
    + +

    Definition at line 72 of file matrix.c.

    +
    72  {
    +
    73  float result[4];
    +
    74  for (int i = 0; i < 4; i++) {
    +
    75  float total = 0;
    +
    76  for (int j = 0; j < 4; j++) {
    +
    77  int p = j * 4 + i;
    +
    78  int q = j;
    +
    79  total += a[p] * b[q];
    +
    80  }
    +
    81  result[i] = total;
    +
    82  }
    +
    83  for (int i = 0; i < 4; i++) {
    +
    84  vector[i] = result[i];
    +
    85  }
    +
    86 }
    +
    +
    +
    + +

    ◆ normalize()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void normalize (float * x,
    float * y,
    float * z 
    )
    +
    + +

    Definition at line 6 of file matrix.c.

    +
    6  {
    +
    7  float d = sqrtf((*x) * (*x) + (*y) * (*y) + (*z) * (*z));
    +
    8  *x /= d; *y /= d; *z /= d;
    +
    9 }
    +
    +
    +
    + +

    ◆ set_matrix_2d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_2d (float * matrix,
    int width,
    int height 
    )
    +
    + +

    Definition at line 207 of file matrix.c.

    +
    207  {
    +
    208  mat_ortho(matrix, 0, width, 0, height, -1, 1);
    +
    209 }
    +
    void mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far)
    Definition: matrix.c:185
    +
    +
    +
    + +

    ◆ set_matrix_3d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_3d (float * matrix,
    int width,
    int height,
    float x,
    float y,
    float z,
    float rx,
    float ry,
    float fov,
    int ortho,
    int radius 
    )
    +
    + +

    Definition at line 211 of file matrix.c.

    +
    215 {
    +
    216  float a[16];
    +
    217  float b[16];
    +
    218  float aspect = (float)width / height;
    +
    219  float znear = 0.125;
    +
    220  float zfar = radius * 32 + 64;
    +
    221  mat_identity(a);
    +
    222  mat_translate(b, -x, -y, -z);
    +
    223  mat_multiply(a, b, a);
    +
    224  mat_rotate(b, cosf(rx), 0, sinf(rx), ry);
    +
    225  mat_multiply(a, b, a);
    +
    226  mat_rotate(b, 0, 1, 0, -rx);
    +
    227  mat_multiply(a, b, a);
    +
    228  if (ortho) {
    +
    229  int size = ortho;
    +
    230  mat_ortho(b, -size * aspect, size * aspect, -size, size, -zfar, zfar);
    +
    231  }
    +
    232  else {
    +
    233  mat_perspective(b, fov, aspect, znear, zfar);
    +
    234  }
    +
    235  mat_multiply(a, b, a);
    +
    236  mat_identity(matrix);
    +
    237  mat_multiply(matrix, a, matrix);
    +
    238 }
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    void mat_perspective(float *matrix, float fov, float aspect, float znear, float zfar)
    Definition: matrix.c:175
    +
    +
    +
    + +

    ◆ set_matrix_item()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_item (float * matrix,
    int width,
    int height,
    int scale 
    )
    +
    + +

    Definition at line 240 of file matrix.c.

    +
    240  {
    +
    241  float a[16];
    +
    242  float b[16];
    +
    243  float aspect = (float)width / height;
    +
    244  float size = 64 * scale;
    +
    245  float box = height / size / 2;
    +
    246  float xoffset = 1 - size / width * 2;
    +
    247  float yoffset = 1 - size / height * 2;
    +
    248  mat_identity(a);
    +
    249  mat_rotate(b, 0, 1, 0, -PI / 4);
    +
    250  mat_multiply(a, b, a);
    +
    251  mat_rotate(b, 1, 0, 0, -PI / 10);
    +
    252  mat_multiply(a, b, a);
    +
    253  mat_ortho(b, -box * aspect, box * aspect, -box, box, -1, 1);
    +
    254  mat_multiply(a, b, a);
    +
    255  mat_translate(b, -xoffset, -yoffset, 0);
    +
    256  mat_multiply(a, b, a);
    +
    257  mat_identity(matrix);
    +
    258  mat_multiply(matrix, a, matrix);
    +
    259 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/matrix_8c_source.html b/documentation/html/matrix_8c_source.html new file mode 100644 index 000000000..da63bd781 --- /dev/null +++ b/documentation/html/matrix_8c_source.html @@ -0,0 +1,355 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/matrix.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    matrix.c
    +
    +
    +Go to the documentation of this file.
    1 #include <math.h>
    +
    2 #include "config.h"
    +
    3 #include "matrix.h"
    +
    4 #include "util.h"
    +
    5 
    +
    6 void normalize(float *x, float *y, float *z) {
    +
    7  float d = sqrtf((*x) * (*x) + (*y) * (*y) + (*z) * (*z));
    +
    8  *x /= d; *y /= d; *z /= d;
    +
    9 }
    +
    10 
    +
    11 void mat_identity(float *matrix) {
    +
    12  matrix[0] = 1;
    +
    13  matrix[1] = 0;
    +
    14  matrix[2] = 0;
    +
    15  matrix[3] = 0;
    +
    16  matrix[4] = 0;
    +
    17  matrix[5] = 1;
    +
    18  matrix[6] = 0;
    +
    19  matrix[7] = 0;
    +
    20  matrix[8] = 0;
    +
    21  matrix[9] = 0;
    +
    22  matrix[10] = 1;
    +
    23  matrix[11] = 0;
    +
    24  matrix[12] = 0;
    +
    25  matrix[13] = 0;
    +
    26  matrix[14] = 0;
    +
    27  matrix[15] = 1;
    +
    28 }
    +
    29 
    +
    30 void mat_translate(float *matrix, float dx, float dy, float dz) {
    +
    31  matrix[0] = 1;
    +
    32  matrix[1] = 0;
    +
    33  matrix[2] = 0;
    +
    34  matrix[3] = 0;
    +
    35  matrix[4] = 0;
    +
    36  matrix[5] = 1;
    +
    37  matrix[6] = 0;
    +
    38  matrix[7] = 0;
    +
    39  matrix[8] = 0;
    +
    40  matrix[9] = 0;
    +
    41  matrix[10] = 1;
    +
    42  matrix[11] = 0;
    +
    43  matrix[12] = dx;
    +
    44  matrix[13] = dy;
    +
    45  matrix[14] = dz;
    +
    46  matrix[15] = 1;
    +
    47 }
    +
    48 
    +
    49 void mat_rotate(float *matrix, float x, float y, float z, float angle) {
    +
    50  normalize(&x, &y, &z);
    +
    51  float s = sinf(angle);
    +
    52  float c = cosf(angle);
    +
    53  float m = 1 - c;
    +
    54  matrix[0] = m * x * x + c;
    +
    55  matrix[1] = m * x * y - z * s;
    +
    56  matrix[2] = m * z * x + y * s;
    +
    57  matrix[3] = 0;
    +
    58  matrix[4] = m * x * y + z * s;
    +
    59  matrix[5] = m * y * y + c;
    +
    60  matrix[6] = m * y * z - x * s;
    +
    61  matrix[7] = 0;
    +
    62  matrix[8] = m * z * x - y * s;
    +
    63  matrix[9] = m * y * z + x * s;
    +
    64  matrix[10] = m * z * z + c;
    +
    65  matrix[11] = 0;
    +
    66  matrix[12] = 0;
    +
    67  matrix[13] = 0;
    +
    68  matrix[14] = 0;
    +
    69  matrix[15] = 1;
    +
    70 }
    +
    71 
    +
    72 void mat_vec_multiply(float *vector, float *a, float *b) {
    +
    73  float result[4];
    +
    74  for (int i = 0; i < 4; i++) {
    +
    75  float total = 0;
    +
    76  for (int j = 0; j < 4; j++) {
    +
    77  int p = j * 4 + i;
    +
    78  int q = j;
    +
    79  total += a[p] * b[q];
    +
    80  }
    +
    81  result[i] = total;
    +
    82  }
    +
    83  for (int i = 0; i < 4; i++) {
    +
    84  vector[i] = result[i];
    +
    85  }
    +
    86 }
    +
    87 
    +
    88 void mat_multiply(float *matrix, float *a, float *b) {
    +
    89  float result[16];
    +
    90  for (int c = 0; c < 4; c++) {
    +
    91  for (int r = 0; r < 4; r++) {
    +
    92  int index = c * 4 + r;
    +
    93  float total = 0;
    +
    94  for (int i = 0; i < 4; i++) {
    +
    95  int p = i * 4 + r;
    +
    96  int q = c * 4 + i;
    +
    97  total += a[p] * b[q];
    +
    98  }
    +
    99  result[index] = total;
    +
    100  }
    +
    101  }
    +
    102  for (int i = 0; i < 16; i++) {
    +
    103  matrix[i] = result[i];
    +
    104  }
    +
    105 }
    +
    106 
    +
    107 void mat_apply(float *data, float *matrix, int count, int offset, int stride) {
    +
    108  float vec[4] = {0, 0, 0, 1};
    +
    109  for (int i = 0; i < count; i++) {
    +
    110  float *d = data + offset + stride * i;
    +
    111  vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++);
    +
    112  mat_vec_multiply(vec, matrix, vec);
    +
    113  d = data + offset + stride * i;
    +
    114  *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2];
    +
    115  }
    +
    116 }
    +
    117 
    +
    118 void frustum_planes(float planes[6][4], int radius, float *matrix) {
    +
    119  float znear = 0.125;
    +
    120  float zfar = radius * 32 + 64;
    +
    121  float *m = matrix;
    +
    122  planes[0][0] = m[3] + m[0];
    +
    123  planes[0][1] = m[7] + m[4];
    +
    124  planes[0][2] = m[11] + m[8];
    +
    125  planes[0][3] = m[15] + m[12];
    +
    126  planes[1][0] = m[3] - m[0];
    +
    127  planes[1][1] = m[7] - m[4];
    +
    128  planes[1][2] = m[11] - m[8];
    +
    129  planes[1][3] = m[15] - m[12];
    +
    130  planes[2][0] = m[3] + m[1];
    +
    131  planes[2][1] = m[7] + m[5];
    +
    132  planes[2][2] = m[11] + m[9];
    +
    133  planes[2][3] = m[15] + m[13];
    +
    134  planes[3][0] = m[3] - m[1];
    +
    135  planes[3][1] = m[7] - m[5];
    +
    136  planes[3][2] = m[11] - m[9];
    +
    137  planes[3][3] = m[15] - m[13];
    +
    138  planes[4][0] = znear * m[3] + m[2];
    +
    139  planes[4][1] = znear * m[7] + m[6];
    +
    140  planes[4][2] = znear * m[11] + m[10];
    +
    141  planes[4][3] = znear * m[15] + m[14];
    +
    142  planes[5][0] = zfar * m[3] - m[2];
    +
    143  planes[5][1] = zfar * m[7] - m[6];
    +
    144  planes[5][2] = zfar * m[11] - m[10];
    +
    145  planes[5][3] = zfar * m[15] - m[14];
    +
    146 }
    +
    147 
    + +
    149  float *matrix, float left, float right, float bottom,
    +
    150  float top, float znear, float zfar)
    +
    151 {
    +
    152  float temp, temp2, temp3, temp4;
    +
    153  temp = 2.0 * znear;
    +
    154  temp2 = right - left;
    +
    155  temp3 = top - bottom;
    +
    156  temp4 = zfar - znear;
    +
    157  matrix[0] = temp / temp2;
    +
    158  matrix[1] = 0.0;
    +
    159  matrix[2] = 0.0;
    +
    160  matrix[3] = 0.0;
    +
    161  matrix[4] = 0.0;
    +
    162  matrix[5] = temp / temp3;
    +
    163  matrix[6] = 0.0;
    +
    164  matrix[7] = 0.0;
    +
    165  matrix[8] = (right + left) / temp2;
    +
    166  matrix[9] = (top + bottom) / temp3;
    +
    167  matrix[10] = (-zfar - znear) / temp4;
    +
    168  matrix[11] = -1.0;
    +
    169  matrix[12] = 0.0;
    +
    170  matrix[13] = 0.0;
    +
    171  matrix[14] = (-temp * zfar) / temp4;
    +
    172  matrix[15] = 0.0;
    +
    173 }
    +
    174 
    + +
    176  float *matrix, float fov, float aspect,
    +
    177  float znear, float zfar)
    +
    178 {
    +
    179  float ymax, xmax;
    +
    180  ymax = znear * tanf(fov * PI / 360.0);
    +
    181  xmax = ymax * aspect;
    +
    182  mat_frustum(matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
    +
    183 }
    +
    184 
    + +
    186  float *matrix,
    +
    187  float left, float right, float bottom, float top, float near, float far)
    +
    188 {
    +
    189  matrix[0] = 2 / (right - left);
    +
    190  matrix[1] = 0;
    +
    191  matrix[2] = 0;
    +
    192  matrix[3] = 0;
    +
    193  matrix[4] = 0;
    +
    194  matrix[5] = 2 / (top - bottom);
    +
    195  matrix[6] = 0;
    +
    196  matrix[7] = 0;
    +
    197  matrix[8] = 0;
    +
    198  matrix[9] = 0;
    +
    199  matrix[10] = -2 / (far - near);
    +
    200  matrix[11] = 0;
    +
    201  matrix[12] = -(right + left) / (right - left);
    +
    202  matrix[13] = -(top + bottom) / (top - bottom);
    +
    203  matrix[14] = -(far + near) / (far - near);
    +
    204  matrix[15] = 1;
    +
    205 }
    +
    206 
    +
    207 void set_matrix_2d(float *matrix, int width, int height) {
    +
    208  mat_ortho(matrix, 0, width, 0, height, -1, 1);
    +
    209 }
    +
    210 
    + +
    212  float *matrix, int width, int height,
    +
    213  float x, float y, float z, float rx, float ry,
    +
    214  float fov, int ortho, int radius)
    +
    215 {
    +
    216  float a[16];
    +
    217  float b[16];
    +
    218  float aspect = (float)width / height;
    +
    219  float znear = 0.125;
    +
    220  float zfar = radius * 32 + 64;
    +
    221  mat_identity(a);
    +
    222  mat_translate(b, -x, -y, -z);
    +
    223  mat_multiply(a, b, a);
    +
    224  mat_rotate(b, cosf(rx), 0, sinf(rx), ry);
    +
    225  mat_multiply(a, b, a);
    +
    226  mat_rotate(b, 0, 1, 0, -rx);
    +
    227  mat_multiply(a, b, a);
    +
    228  if (ortho) {
    +
    229  int size = ortho;
    +
    230  mat_ortho(b, -size * aspect, size * aspect, -size, size, -zfar, zfar);
    +
    231  }
    +
    232  else {
    +
    233  mat_perspective(b, fov, aspect, znear, zfar);
    +
    234  }
    +
    235  mat_multiply(a, b, a);
    +
    236  mat_identity(matrix);
    +
    237  mat_multiply(matrix, a, matrix);
    +
    238 }
    +
    239 
    +
    240 void set_matrix_item(float *matrix, int width, int height, int scale) {
    +
    241  float a[16];
    +
    242  float b[16];
    +
    243  float aspect = (float)width / height;
    +
    244  float size = 64 * scale;
    +
    245  float box = height / size / 2;
    +
    246  float xoffset = 1 - size / width * 2;
    +
    247  float yoffset = 1 - size / height * 2;
    +
    248  mat_identity(a);
    +
    249  mat_rotate(b, 0, 1, 0, -PI / 4);
    +
    250  mat_multiply(a, b, a);
    +
    251  mat_rotate(b, 1, 0, 0, -PI / 10);
    +
    252  mat_multiply(a, b, a);
    +
    253  mat_ortho(b, -box * aspect, box * aspect, -box, box, -1, 1);
    +
    254  mat_multiply(a, b, a);
    +
    255  mat_translate(b, -xoffset, -yoffset, 0);
    +
    256  mat_multiply(a, b, a);
    +
    257  mat_identity(matrix);
    +
    258  mat_multiply(matrix, a, matrix);
    +
    259 }
    + +
    void mat_apply(float *data, float *matrix, int count, int offset, int stride)
    Definition: matrix.c:107
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    void mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far)
    Definition: matrix.c:185
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
    Definition: matrix.c:211
    +
    void frustum_planes(float planes[6][4], int radius, float *matrix)
    Definition: matrix.c:118
    +
    void set_matrix_2d(float *matrix, int width, int height)
    Definition: matrix.c:207
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void set_matrix_item(float *matrix, int width, int height, int scale)
    Definition: matrix.c:240
    +
    void mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
    Definition: matrix.c:148
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_vec_multiply(float *vector, float *a, float *b)
    Definition: matrix.c:72
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    void mat_perspective(float *matrix, float fov, float aspect, float znear, float zfar)
    Definition: matrix.c:175
    + + +
    #define PI
    Definition: util.h:8
    +
    + + + + diff --git a/documentation/html/matrix_8h.html b/documentation/html/matrix_8h.html new file mode 100644 index 000000000..fdc06dcbb --- /dev/null +++ b/documentation/html/matrix_8h.html @@ -0,0 +1,985 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/matrix.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    matrix.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void normalize (float *x, float *y, float *z)
     
    void mat_identity (float *matrix)
     
    void mat_translate (float *matrix, float dx, float dy, float dz)
     
    void mat_rotate (float *matrix, float x, float y, float z, float angle)
     
    void mat_vec_multiply (float *vector, float *a, float *b)
     
    void mat_multiply (float *matrix, float *a, float *b)
     
    void mat_apply (float *data, float *matrix, int count, int offset, int stride)
     
    void frustum_planes (float planes[6][4], int radius, float *matrix)
     
    void mat_frustum (float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
     
    void mat_perspective (float *matrix, float fov, float aspect, float near, float far)
     
    void mat_ortho (float *matrix, float left, float right, float bottom, float top, float near, float far)
     
    void set_matrix_2d (float *matrix, int width, int height)
     
    void set_matrix_3d (float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
     
    void set_matrix_item (float *matrix, int width, int height, int scale)
     
    +

    Function Documentation

    + +

    ◆ frustum_planes()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void frustum_planes (float planes[6][4],
    int radius,
    float * matrix 
    )
    +
    + +

    Definition at line 118 of file matrix.c.

    +
    118  {
    +
    119  float znear = 0.125;
    +
    120  float zfar = radius * 32 + 64;
    +
    121  float *m = matrix;
    +
    122  planes[0][0] = m[3] + m[0];
    +
    123  planes[0][1] = m[7] + m[4];
    +
    124  planes[0][2] = m[11] + m[8];
    +
    125  planes[0][3] = m[15] + m[12];
    +
    126  planes[1][0] = m[3] - m[0];
    +
    127  planes[1][1] = m[7] - m[4];
    +
    128  planes[1][2] = m[11] - m[8];
    +
    129  planes[1][3] = m[15] - m[12];
    +
    130  planes[2][0] = m[3] + m[1];
    +
    131  planes[2][1] = m[7] + m[5];
    +
    132  planes[2][2] = m[11] + m[9];
    +
    133  planes[2][3] = m[15] + m[13];
    +
    134  planes[3][0] = m[3] - m[1];
    +
    135  planes[3][1] = m[7] - m[5];
    +
    136  planes[3][2] = m[11] - m[9];
    +
    137  planes[3][3] = m[15] - m[13];
    +
    138  planes[4][0] = znear * m[3] + m[2];
    +
    139  planes[4][1] = znear * m[7] + m[6];
    +
    140  planes[4][2] = znear * m[11] + m[10];
    +
    141  planes[4][3] = znear * m[15] + m[14];
    +
    142  planes[5][0] = zfar * m[3] - m[2];
    +
    143  planes[5][1] = zfar * m[7] - m[6];
    +
    144  planes[5][2] = zfar * m[11] - m[10];
    +
    145  planes[5][3] = zfar * m[15] - m[14];
    +
    146 }
    +
    +
    +
    + +

    ◆ mat_apply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_apply (float * data,
    float * matrix,
    int count,
    int offset,
    int stride 
    )
    +
    + +

    Definition at line 107 of file matrix.c.

    +
    107  {
    +
    108  float vec[4] = {0, 0, 0, 1};
    +
    109  for (int i = 0; i < count; i++) {
    +
    110  float *d = data + offset + stride * i;
    +
    111  vec[0] = *(d++); vec[1] = *(d++); vec[2] = *(d++);
    +
    112  mat_vec_multiply(vec, matrix, vec);
    +
    113  d = data + offset + stride * i;
    +
    114  *(d++) = vec[0]; *(d++) = vec[1]; *(d++) = vec[2];
    +
    115  }
    +
    116 }
    +
    void mat_vec_multiply(float *vector, float *a, float *b)
    Definition: matrix.c:72
    +
    +
    +
    + +

    ◆ mat_frustum()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_frustum (float * matrix,
    float left,
    float right,
    float bottom,
    float top,
    float znear,
    float zfar 
    )
    +
    + +

    Definition at line 148 of file matrix.c.

    +
    151 {
    +
    152  float temp, temp2, temp3, temp4;
    +
    153  temp = 2.0 * znear;
    +
    154  temp2 = right - left;
    +
    155  temp3 = top - bottom;
    +
    156  temp4 = zfar - znear;
    +
    157  matrix[0] = temp / temp2;
    +
    158  matrix[1] = 0.0;
    +
    159  matrix[2] = 0.0;
    +
    160  matrix[3] = 0.0;
    +
    161  matrix[4] = 0.0;
    +
    162  matrix[5] = temp / temp3;
    +
    163  matrix[6] = 0.0;
    +
    164  matrix[7] = 0.0;
    +
    165  matrix[8] = (right + left) / temp2;
    +
    166  matrix[9] = (top + bottom) / temp3;
    +
    167  matrix[10] = (-zfar - znear) / temp4;
    +
    168  matrix[11] = -1.0;
    +
    169  matrix[12] = 0.0;
    +
    170  matrix[13] = 0.0;
    +
    171  matrix[14] = (-temp * zfar) / temp4;
    +
    172  matrix[15] = 0.0;
    +
    173 }
    +
    +
    +
    + +

    ◆ mat_identity()

    + +
    +
    + + + + + + + + +
    void mat_identity (float * matrix)
    +
    + +

    Definition at line 11 of file matrix.c.

    +
    11  {
    +
    12  matrix[0] = 1;
    +
    13  matrix[1] = 0;
    +
    14  matrix[2] = 0;
    +
    15  matrix[3] = 0;
    +
    16  matrix[4] = 0;
    +
    17  matrix[5] = 1;
    +
    18  matrix[6] = 0;
    +
    19  matrix[7] = 0;
    +
    20  matrix[8] = 0;
    +
    21  matrix[9] = 0;
    +
    22  matrix[10] = 1;
    +
    23  matrix[11] = 0;
    +
    24  matrix[12] = 0;
    +
    25  matrix[13] = 0;
    +
    26  matrix[14] = 0;
    +
    27  matrix[15] = 1;
    +
    28 }
    +
    +
    +
    + +

    ◆ mat_multiply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_multiply (float * matrix,
    float * a,
    float * b 
    )
    +
    + +

    Definition at line 88 of file matrix.c.

    +
    88  {
    +
    89  float result[16];
    +
    90  for (int c = 0; c < 4; c++) {
    +
    91  for (int r = 0; r < 4; r++) {
    +
    92  int index = c * 4 + r;
    +
    93  float total = 0;
    +
    94  for (int i = 0; i < 4; i++) {
    +
    95  int p = i * 4 + r;
    +
    96  int q = c * 4 + i;
    +
    97  total += a[p] * b[q];
    +
    98  }
    +
    99  result[index] = total;
    +
    100  }
    +
    101  }
    +
    102  for (int i = 0; i < 16; i++) {
    +
    103  matrix[i] = result[i];
    +
    104  }
    +
    105 }
    +
    +
    +
    + +

    ◆ mat_ortho()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_ortho (float * matrix,
    float left,
    float right,
    float bottom,
    float top,
    float near,
    float far 
    )
    +
    + +

    Definition at line 185 of file matrix.c.

    +
    188 {
    +
    189  matrix[0] = 2 / (right - left);
    +
    190  matrix[1] = 0;
    +
    191  matrix[2] = 0;
    +
    192  matrix[3] = 0;
    +
    193  matrix[4] = 0;
    +
    194  matrix[5] = 2 / (top - bottom);
    +
    195  matrix[6] = 0;
    +
    196  matrix[7] = 0;
    +
    197  matrix[8] = 0;
    +
    198  matrix[9] = 0;
    +
    199  matrix[10] = -2 / (far - near);
    +
    200  matrix[11] = 0;
    +
    201  matrix[12] = -(right + left) / (right - left);
    +
    202  matrix[13] = -(top + bottom) / (top - bottom);
    +
    203  matrix[14] = -(far + near) / (far - near);
    +
    204  matrix[15] = 1;
    +
    205 }
    +
    +
    +
    + +

    ◆ mat_perspective()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_perspective (float * matrix,
    float fov,
    float aspect,
    float near,
    float far 
    )
    +
    + +

    Definition at line 175 of file matrix.c.

    +
    178 {
    +
    179  float ymax, xmax;
    +
    180  ymax = znear * tanf(fov * PI / 360.0);
    +
    181  xmax = ymax * aspect;
    +
    182  mat_frustum(matrix, -xmax, xmax, -ymax, ymax, znear, zfar);
    +
    183 }
    +
    void mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
    Definition: matrix.c:148
    +
    #define PI
    Definition: util.h:8
    +
    +
    +
    + +

    ◆ mat_rotate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_rotate (float * matrix,
    float x,
    float y,
    float z,
    float angle 
    )
    +
    + +

    Definition at line 49 of file matrix.c.

    +
    49  {
    +
    50  normalize(&x, &y, &z);
    +
    51  float s = sinf(angle);
    +
    52  float c = cosf(angle);
    +
    53  float m = 1 - c;
    +
    54  matrix[0] = m * x * x + c;
    +
    55  matrix[1] = m * x * y - z * s;
    +
    56  matrix[2] = m * z * x + y * s;
    +
    57  matrix[3] = 0;
    +
    58  matrix[4] = m * x * y + z * s;
    +
    59  matrix[5] = m * y * y + c;
    +
    60  matrix[6] = m * y * z - x * s;
    +
    61  matrix[7] = 0;
    +
    62  matrix[8] = m * z * x - y * s;
    +
    63  matrix[9] = m * y * z + x * s;
    +
    64  matrix[10] = m * z * z + c;
    +
    65  matrix[11] = 0;
    +
    66  matrix[12] = 0;
    +
    67  matrix[13] = 0;
    +
    68  matrix[14] = 0;
    +
    69  matrix[15] = 1;
    +
    70 }
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    +
    +
    + +

    ◆ mat_translate()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_translate (float * matrix,
    float dx,
    float dy,
    float dz 
    )
    +
    + +

    Definition at line 30 of file matrix.c.

    +
    30  {
    +
    31  matrix[0] = 1;
    +
    32  matrix[1] = 0;
    +
    33  matrix[2] = 0;
    +
    34  matrix[3] = 0;
    +
    35  matrix[4] = 0;
    +
    36  matrix[5] = 1;
    +
    37  matrix[6] = 0;
    +
    38  matrix[7] = 0;
    +
    39  matrix[8] = 0;
    +
    40  matrix[9] = 0;
    +
    41  matrix[10] = 1;
    +
    42  matrix[11] = 0;
    +
    43  matrix[12] = dx;
    +
    44  matrix[13] = dy;
    +
    45  matrix[14] = dz;
    +
    46  matrix[15] = 1;
    +
    47 }
    +
    +
    +
    + +

    ◆ mat_vec_multiply()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void mat_vec_multiply (float * vector,
    float * a,
    float * b 
    )
    +
    + +

    Definition at line 72 of file matrix.c.

    +
    72  {
    +
    73  float result[4];
    +
    74  for (int i = 0; i < 4; i++) {
    +
    75  float total = 0;
    +
    76  for (int j = 0; j < 4; j++) {
    +
    77  int p = j * 4 + i;
    +
    78  int q = j;
    +
    79  total += a[p] * b[q];
    +
    80  }
    +
    81  result[i] = total;
    +
    82  }
    +
    83  for (int i = 0; i < 4; i++) {
    +
    84  vector[i] = result[i];
    +
    85  }
    +
    86 }
    +
    +
    +
    + +

    ◆ normalize()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void normalize (float * x,
    float * y,
    float * z 
    )
    +
    + +

    Definition at line 6 of file matrix.c.

    +
    6  {
    +
    7  float d = sqrtf((*x) * (*x) + (*y) * (*y) + (*z) * (*z));
    +
    8  *x /= d; *y /= d; *z /= d;
    +
    9 }
    +
    +
    +
    + +

    ◆ set_matrix_2d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_2d (float * matrix,
    int width,
    int height 
    )
    +
    + +

    Definition at line 207 of file matrix.c.

    +
    207  {
    +
    208  mat_ortho(matrix, 0, width, 0, height, -1, 1);
    +
    209 }
    +
    void mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far)
    Definition: matrix.c:185
    +
    +
    +
    + +

    ◆ set_matrix_3d()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_3d (float * matrix,
    int width,
    int height,
    float x,
    float y,
    float z,
    float rx,
    float ry,
    float fov,
    int ortho,
    int radius 
    )
    +
    + +

    Definition at line 211 of file matrix.c.

    +
    215 {
    +
    216  float a[16];
    +
    217  float b[16];
    +
    218  float aspect = (float)width / height;
    +
    219  float znear = 0.125;
    +
    220  float zfar = radius * 32 + 64;
    +
    221  mat_identity(a);
    +
    222  mat_translate(b, -x, -y, -z);
    +
    223  mat_multiply(a, b, a);
    +
    224  mat_rotate(b, cosf(rx), 0, sinf(rx), ry);
    +
    225  mat_multiply(a, b, a);
    +
    226  mat_rotate(b, 0, 1, 0, -rx);
    +
    227  mat_multiply(a, b, a);
    +
    228  if (ortho) {
    +
    229  int size = ortho;
    +
    230  mat_ortho(b, -size * aspect, size * aspect, -size, size, -zfar, zfar);
    +
    231  }
    +
    232  else {
    +
    233  mat_perspective(b, fov, aspect, znear, zfar);
    +
    234  }
    +
    235  mat_multiply(a, b, a);
    +
    236  mat_identity(matrix);
    +
    237  mat_multiply(matrix, a, matrix);
    +
    238 }
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    void mat_perspective(float *matrix, float fov, float aspect, float znear, float zfar)
    Definition: matrix.c:175
    +
    +
    +
    + +

    ◆ set_matrix_item()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void set_matrix_item (float * matrix,
    int width,
    int height,
    int scale 
    )
    +
    + +

    Definition at line 240 of file matrix.c.

    +
    240  {
    +
    241  float a[16];
    +
    242  float b[16];
    +
    243  float aspect = (float)width / height;
    +
    244  float size = 64 * scale;
    +
    245  float box = height / size / 2;
    +
    246  float xoffset = 1 - size / width * 2;
    +
    247  float yoffset = 1 - size / height * 2;
    +
    248  mat_identity(a);
    +
    249  mat_rotate(b, 0, 1, 0, -PI / 4);
    +
    250  mat_multiply(a, b, a);
    +
    251  mat_rotate(b, 1, 0, 0, -PI / 10);
    +
    252  mat_multiply(a, b, a);
    +
    253  mat_ortho(b, -box * aspect, box * aspect, -box, box, -1, 1);
    +
    254  mat_multiply(a, b, a);
    +
    255  mat_translate(b, -xoffset, -yoffset, 0);
    +
    256  mat_multiply(a, b, a);
    +
    257  mat_identity(matrix);
    +
    258  mat_multiply(matrix, a, matrix);
    +
    259 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/matrix_8h_source.html b/documentation/html/matrix_8h_source.html new file mode 100644 index 000000000..9341d930f --- /dev/null +++ b/documentation/html/matrix_8h_source.html @@ -0,0 +1,120 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/matrix.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    matrix.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _matrix_h_
    +
    2 #define _matrix_h_
    +
    3 
    +
    4 void normalize(float *x, float *y, float *z);
    +
    5 void mat_identity(float *matrix);
    +
    6 void mat_translate(float *matrix, float dx, float dy, float dz);
    +
    7 void mat_rotate(float *matrix, float x, float y, float z, float angle);
    +
    8 void mat_vec_multiply(float *vector, float *a, float *b);
    +
    9 void mat_multiply(float *matrix, float *a, float *b);
    +
    10 void mat_apply(float *data, float *matrix, int count, int offset, int stride);
    +
    11 void frustum_planes(float planes[6][4], int radius, float *matrix);
    +
    12 void mat_frustum(
    +
    13  float *matrix, float left, float right, float bottom,
    +
    14  float top, float znear, float zfar);
    +
    15 void mat_perspective(
    +
    16  float *matrix, float fov, float aspect,
    +
    17  float near, float far);
    +
    18 void mat_ortho(
    +
    19  float *matrix,
    +
    20  float left, float right, float bottom, float top, float near, float far);
    +
    21 void set_matrix_2d(float *matrix, int width, int height);
    +
    22 void set_matrix_3d(
    +
    23  float *matrix, int width, int height,
    +
    24  float x, float y, float z, float rx, float ry,
    +
    25  float fov, int ortho, int radius);
    +
    26 void set_matrix_item(float *matrix, int width, int height, int scale);
    +
    27 
    +
    28 #endif
    +
    void mat_apply(float *data, float *matrix, int count, int offset, int stride)
    Definition: matrix.c:107
    +
    void normalize(float *x, float *y, float *z)
    Definition: matrix.c:6
    +
    void mat_perspective(float *matrix, float fov, float aspect, float near, float far)
    Definition: matrix.c:175
    +
    void mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far)
    Definition: matrix.c:185
    +
    void mat_rotate(float *matrix, float x, float y, float z, float angle)
    Definition: matrix.c:49
    +
    void set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius)
    Definition: matrix.c:211
    +
    void frustum_planes(float planes[6][4], int radius, float *matrix)
    Definition: matrix.c:118
    +
    void set_matrix_2d(float *matrix, int width, int height)
    Definition: matrix.c:207
    +
    void mat_translate(float *matrix, float dx, float dy, float dz)
    Definition: matrix.c:30
    +
    void set_matrix_item(float *matrix, int width, int height, int scale)
    Definition: matrix.c:240
    +
    void mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar)
    Definition: matrix.c:148
    +
    void mat_multiply(float *matrix, float *a, float *b)
    Definition: matrix.c:88
    +
    void mat_vec_multiply(float *vector, float *a, float *b)
    Definition: matrix.c:72
    +
    void mat_identity(float *matrix)
    Definition: matrix.c:11
    +
    + + + + diff --git a/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html b/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html new file mode 100644 index 000000000..e9f219a9e --- /dev/null +++ b/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html @@ -0,0 +1,79 @@ + + + + + + + +Craft: LICENSE + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    LICENSE
    +
    +
    +

    Copyright (C) 2013 Michael Fogleman

    +

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    +

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    +

    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    +
    +
    + + + + diff --git a/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html b/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html new file mode 100644 index 000000000..169b4640e --- /dev/null +++ b/documentation/html/md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html @@ -0,0 +1,206 @@ + + + + + + + +Craft: Craft + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Craft
    +
    +
    +

    Minecraft clone for Windows, Mac OS X and Linux. Just a few thousand lines of C using modern OpenGL (shaders). Online multiplayer support is included using a Python-based server.

    +

    http://www.michaelfogleman.com/craft/

    +

    +

    +Features

    +
      +
    • Simple but nice looking terrain generation using perlin / simplex noise.
    • +
    • More than 10 types of blocks and more can be added easily.
    • +
    • Supports plants (grass, flowers, trees, etc.) and transparency (glass).
    • +
    • Simple clouds in the sky (they don't move).
    • +
    • Day / night cycles and a textured sky dome.
    • +
    • World changes persisted in a sqlite3 database.
    • +
    • Multiplayer support!
    • +
    +

    +Download

    +

    Mac and Windows binaries are available on the website.

    +

    http://www.michaelfogleman.com/craft/

    +

    See below to run from source.

    +

    +Install Dependencies

    +

    +Mac OS X

    +

    Download and install CMake if you don't already have it. You may use Homebrew to simplify the installation:

    brew install cmake
    +

    +Linux (Ubuntu)

    +
    sudo apt-get install cmake libglew-dev xorg-dev
    +sudo apt-get build-dep glfw
    +

    +Windows

    +

    Download and install CMake and MinGW. Add C:\MinGW\bin to your PATH.

    +

    Download and install cURL so that CURL/lib and CURL/include are in your Program Files directory.

    +

    Use the following commands in place of the ones described in the next section.

    cmake -G "MinGW Makefiles"
    +mingw32-make
    +

    +Compile and Run

    +

    Once you have the dependencies (see above), run the following commands in your terminal.

    git clone https://github.com/fogleman/Craft.git
    +cd Craft
    +cmake .
    +make
    +./craft
    +

    +Multiplayer

    +

    Register for an account!

    +

    https://craft.michaelfogleman.com/

    +

    +Client

    +

    You can connect to a server with command line arguments...

    ./craft michaelfogleman.com
    +

    Or, with the "/online" command in the game itself.

    /online michaelfogleman.com
    +

    +Server

    +

    You can run your own server or connect to mine. The server is written in Python but requires a compiled DLL so it can perform the terrain generation just like the client.

    gcc -std=c99 -O3 -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
    +python server.py [HOST [PORT]]
    +

    +Controls

    +
      +
    • WASD to move forward, left, backward, right.
    • +
    • Space to jump.
    • +
    • Left Click to destroy a block.
    • +
    • Right Click or Cmd + Left Click to create a block.
    • +
    • 1-9 to select the block type to create.
    • +
    • E to cycle through the block types.
    • +
    • Tab to toggle between walking and flying.
    • +
    • ZXCVBN to move in exact directions along the XYZ axes.
    • +
    • Left shift to zoom.
    • +
    • F to show the scene in orthographic mode.
    • +
    • O to observe players in the main view.
    • +
    • P to observe players in the picture-in-picture view.
    • +
    • Arrow keys emulate mouse movement.
    • +
    • Enter emulates mouse click.
    • +
    +

    +Chat Commands

    +
    /goto [NAME]
    +

    Teleport to another user. If NAME is unspecified, a random user is chosen.

    /list
    +

    Display a list of connected users.

    /login NAME
    +

    Switch to another registered username. The login server will be re-contacted. The username is case-sensitive.

    /logout
    +

    Unauthenticate and become a guest user. Automatic logins will not occur again until the /login command is re-issued.

    /offline [FILE]
    +

    Switch to offline mode. FILE specifies the save file to use and defaults to "craft".

    /online HOST [PORT]
    +

    Connect to the specified server.

    /pq P Q
    +

    Teleport to the specified chunk.

    /spawn
    +

    Teleport back to the spawn point.

    +

    +Screenshot

    +

    +

    +Implementation Details

    +

    +Terrain Generation

    +

    The terrain is generated using Simplex noise - a deterministic noise function seeded based on position. So the world will always be generated the same way in a given location.

    +

    The world is split up into 32x32 block chunks in the XZ plane (Y is up). This allows the world to be “infinite” (floating point precision is currently a problem at large X or Z values) and also makes it easier to manage the data. Only visible chunks need to be queried from the database.

    +

    +Rendering

    +

    Only exposed faces are rendered. This is an important optimization as the vast majority of blocks are either completely hidden or are only exposing one or two faces. Each chunk records a one-block width overlap for each neighboring chunk so it knows which blocks along its perimeter are exposed.

    +

    Only visible chunks are rendered. A naive frustum-culling approach is used to test if a chunk is in the camera’s view. If it is not, it is not rendered. This results in a pretty decent performance improvement as well.

    +

    Chunk buffers are completely regenerated when a block is changed in that chunk, instead of trying to update the VBO.

    +

    Text is rendered using a bitmap atlas. Each character is rendered onto two triangles forming a 2D rectangle.

    +

    “Modern” OpenGL is used - no deprecated, fixed-function pipeline functions are used. Vertex buffer objects are used for position, normal and texture coordinates. Vertex and fragment shaders are used for rendering. Matrix manipulation functions are in matrix.c for translation, rotation, perspective, orthographic, etc. matrices. The 3D models are made up of very simple primitives - mostly cubes and rectangles. These models are generated in code in cube.c.

    +

    Transparency in glass blocks and plants (plants don’t take up the full rectangular shape of their triangle primitives) is implemented by discarding magenta-colored pixels in the fragment shader.

    +

    +Database

    +

    User changes to the world are stored in a sqlite database. Only the delta is stored, so the default world is generated and then the user changes are applied on top when loading.

    +

    The main database table is named “block” and has columns p, q, x, y, z, w. (p, q) identifies the chunk, (x, y, z) identifies the block position and (w) identifies the block type. 0 represents an empty block (air).

    +

    In game, the chunks store their blocks in a hash map. An (x, y, z) key maps to a (w) value.

    +

    The y-position of blocks are limited to 0 <= y < 256. The upper limit is mainly an artificial limitation to prevent users from building unnecessarily tall structures. Users are not allowed to destroy blocks at y = 0 to avoid falling underneath the world.

    +

    +Multiplayer

    +

    Multiplayer mode is implemented using plain-old sockets. A simple, ASCII, line-based protocol is used. Each line is made up of a command code and zero or more comma-separated arguments. The client requests chunks from the server with a simple command: C,p,q,key. “C” means “Chunk” and (p, q) identifies the chunk. The key is used for caching - the server will only send block updates that have been performed since the client last asked for that chunk. Block updates (in realtime or as part of a chunk request) are sent to the client in the format: B,p,q,x,y,z,w. After sending all of the blocks for a requested chunk, the server will send an updated cache key in the format: K,p,q,key. The client will store this key and use it the next time it needs to ask for that chunk. Player positions are sent in the format: P,pid,x,y,z,rx,ry. The pid is the player ID and the rx and ry values indicate the player’s rotation in two different axes. The client interpolates player positions from the past two position updates for smoother animation. The client sends its position to the server at most every 0.1 seconds (less if not moving).

    +

    Client-side caching to the sqlite database can be performance intensive when connecting to a server for the first time. For this reason, sqlite writes are performed on a background thread. All writes occur in a transaction for performance. The transaction is committed every 5 seconds as opposed to some logical amount of work completed. A ring / circular buffer is used as a queue for what data is to be written to the database.

    +

    In multiplayer mode, players can observe one another in the main view or in a picture-in-picture view. Implementation of the PnP was surprisingly simple - just change the viewport and render the scene again from the other player’s point of view.

    +

    +Collision Testing

    +

    Hit testing (what block the user is pointing at) is implemented by scanning a ray from the player’s position outward, following their sight vector. This is not a precise method, so the step rate can be made smaller to be more accurate.

    +

    Collision testing simply adjusts the player’s position to remain a certain distance away from any adjacent blocks that are obstacles. (Clouds and plants are not marked as obstacles, so you pass right through them.)

    +

    +Sky Dome

    +

    A textured sky dome is used for the sky. The X-coordinate of the texture represents time of day. The Y-values map from the bottom of the sky sphere to the top of the sky sphere. The player is always in the center of the sphere. The fragment shaders for the blocks also sample the sky texture to determine the appropriate fog color to blend with based on the block’s position relative to the backing sky.

    +

    +Ambient Occlusion

    +

    Ambient occlusion is implemented as described on this page:

    +

    http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/

    +

    +Dependencies

    +
      +
    • GLEW is used for managing OpenGL extensions across platforms.
    • +
    • GLFW is used for cross-platform window management.
    • +
    • CURL is used for HTTPS / SSL POST for the authentication process.
    • +
    • lodepng is used for loading PNG textures.
    • +
    • sqlite3 is used for saving the blocks added / removed by the user.
    • +
    • tinycthread is used for cross-platform threading.
    • +
    +
    +
    + + + + diff --git a/documentation/html/menu.js b/documentation/html/menu.js new file mode 100644 index 000000000..2fe2214f2 --- /dev/null +++ b/documentation/html/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/documentation/html/menudata.js b/documentation/html/menudata.js new file mode 100644 index 000000000..131405084 --- /dev/null +++ b/documentation/html/menudata.js @@ -0,0 +1,227 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Namespaces",url:"namespaces.html",children:[ +{text:"Namespace List",url:"namespaces.html"}, +{text:"Namespace Members",url:"namespacemembers.html",children:[ +{text:"All",url:"namespacemembers.html",children:[ +{text:"a",url:"namespacemembers.html#index_a"}, +{text:"b",url:"namespacemembers.html#index_b"}, +{text:"c",url:"namespacemembers.html#index_c"}, +{text:"d",url:"namespacemembers.html#index_d"}, +{text:"e",url:"namespacemembers.html#index_e"}, +{text:"g",url:"namespacemembers.html#index_g"}, +{text:"i",url:"namespacemembers.html#index_i"}, +{text:"k",url:"namespacemembers.html#index_k"}, +{text:"l",url:"namespacemembers.html#index_l"}, +{text:"m",url:"namespacemembers.html#index_m"}, +{text:"n",url:"namespacemembers.html#index_n"}, +{text:"o",url:"namespacemembers.html#index_o"}, +{text:"p",url:"namespacemembers.html#index_p"}, +{text:"r",url:"namespacemembers.html#index_r"}, +{text:"s",url:"namespacemembers.html#index_s"}, +{text:"t",url:"namespacemembers.html#index_t"}, +{text:"v",url:"namespacemembers.html#index_v"}, +{text:"w",url:"namespacemembers.html#index_w"}, +{text:"y",url:"namespacemembers.html#index_y"}]}, +{text:"Functions",url:"namespacemembers_func.html"}, +{text:"Variables",url:"namespacemembers_vars.html",children:[ +{text:"a",url:"namespacemembers_vars.html#index_a"}, +{text:"b",url:"namespacemembers_vars.html#index_b"}, +{text:"c",url:"namespacemembers_vars.html#index_c"}, +{text:"d",url:"namespacemembers_vars.html#index_d"}, +{text:"e",url:"namespacemembers_vars.html#index_e"}, +{text:"g",url:"namespacemembers_vars.html#index_g"}, +{text:"i",url:"namespacemembers_vars.html#index_i"}, +{text:"k",url:"namespacemembers_vars.html#index_k"}, +{text:"l",url:"namespacemembers_vars.html#index_l"}, +{text:"n",url:"namespacemembers_vars.html#index_n"}, +{text:"o",url:"namespacemembers_vars.html#index_o"}, +{text:"p",url:"namespacemembers_vars.html#index_p"}, +{text:"r",url:"namespacemembers_vars.html#index_r"}, +{text:"s",url:"namespacemembers_vars.html#index_s"}, +{text:"t",url:"namespacemembers_vars.html#index_t"}, +{text:"v",url:"namespacemembers_vars.html#index_v"}, +{text:"w",url:"namespacemembers_vars.html#index_w"}, +{text:"y",url:"namespacemembers_vars.html#index_y"}]}]}]}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"_",url:"functions.html#index__5F"}, +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"k",url:"functions.html#index_k"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"q",url:"functions.html#index_q"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}, +{text:"x",url:"functions.html#index_x"}, +{text:"y",url:"functions.html#index_y"}, +{text:"z",url:"functions.html#index_z"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"_",url:"functions_func.html#index__5F"}, +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"e",url:"functions_func.html#index_e"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"h",url:"functions_func.html#index_h"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"t",url:"functions_func.html#index_t"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"k",url:"functions_vars.html#index_k"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"q",url:"functions_vars.html#index_q"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}, +{text:"w",url:"functions_vars.html#index_w"}, +{text:"x",url:"functions_vars.html#index_x"}, +{text:"y",url:"functions_vars.html#index_y"}, +{text:"z",url:"functions_vars.html#index_z"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"File Members",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"_",url:"globals.html#index__5F"}, +{text:"a",url:"globals_a.html#index_a"}, +{text:"b",url:"globals_b.html#index_b"}, +{text:"c",url:"globals_c.html#index_c"}, +{text:"d",url:"globals_d.html#index_d"}, +{text:"e",url:"globals_e.html#index_e"}, +{text:"f",url:"globals_f.html#index_f"}, +{text:"g",url:"globals_g.html#index_g"}, +{text:"h",url:"globals_h.html#index_h"}, +{text:"i",url:"globals_i.html#index_i"}, +{text:"k",url:"globals_k.html#index_k"}, +{text:"l",url:"globals_l.html#index_l"}, +{text:"m",url:"globals_m.html#index_m"}, +{text:"n",url:"globals_n.html#index_n"}, +{text:"o",url:"globals_o.html#index_o"}, +{text:"p",url:"globals_p.html#index_p"}, +{text:"q",url:"globals_q.html#index_q"}, +{text:"r",url:"globals_r.html#index_r"}, +{text:"s",url:"globals_s.html#index_s"}, +{text:"t",url:"globals_t.html#index_t"}, +{text:"u",url:"globals_u.html#index_u"}, +{text:"v",url:"globals_v.html#index_v"}, +{text:"w",url:"globals_w.html#index_w"}, +{text:"y",url:"globals_y.html#index_y"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"_",url:"globals_func.html#index__5F"}, +{text:"a",url:"globals_func_a.html#index_a"}, +{text:"b",url:"globals_func_b.html#index_b"}, +{text:"c",url:"globals_func_c.html#index_c"}, +{text:"d",url:"globals_func_d.html#index_d"}, +{text:"e",url:"globals_func_e.html#index_e"}, +{text:"f",url:"globals_func_f.html#index_f"}, +{text:"g",url:"globals_func_g.html#index_g"}, +{text:"h",url:"globals_func_h.html#index_h"}, +{text:"i",url:"globals_func_i.html#index_i"}, +{text:"l",url:"globals_func_l.html#index_l"}, +{text:"m",url:"globals_func_m.html#index_m"}, +{text:"n",url:"globals_func_n.html#index_n"}, +{text:"o",url:"globals_func_o.html#index_o"}, +{text:"p",url:"globals_func_p.html#index_p"}, +{text:"r",url:"globals_func_r.html#index_r"}, +{text:"s",url:"globals_func_s.html#index_s"}, +{text:"t",url:"globals_func_t.html#index_t"}, +{text:"u",url:"globals_func_u.html#index_u"}, +{text:"w",url:"globals_func_w.html#index_w"}]}, +{text:"Variables",url:"globals_vars.html",children:[ +{text:"b",url:"globals_vars.html#index_b"}, +{text:"c",url:"globals_vars.html#index_c"}, +{text:"d",url:"globals_vars.html#index_d"}, +{text:"g",url:"globals_vars.html#index_g"}, +{text:"i",url:"globals_vars.html#index_i"}, +{text:"l",url:"globals_vars.html#index_l"}, +{text:"m",url:"globals_vars.html#index_m"}, +{text:"p",url:"globals_vars.html#index_p"}, +{text:"q",url:"globals_vars.html#index_q"}, +{text:"r",url:"globals_vars.html#index_r"}, +{text:"s",url:"globals_vars.html#index_s"}, +{text:"t",url:"globals_vars.html#index_t"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html",children:[ +{text:"a",url:"globals_defs.html#index_a"}, +{text:"b",url:"globals_defs.html#index_b"}, +{text:"c",url:"globals_defs.html#index_c"}, +{text:"d",url:"globals_defs.html#index_d"}, +{text:"e",url:"globals_defs.html#index_e"}, +{text:"f",url:"globals_defs.html#index_f"}, +{text:"g",url:"globals_defs.html#index_g"}, +{text:"i",url:"globals_defs.html#index_i"}, +{text:"l",url:"globals_defs.html#index_l"}, +{text:"m",url:"globals_defs.html#index_m"}, +{text:"p",url:"globals_defs.html#index_p"}, +{text:"q",url:"globals_defs.html#index_q"}, +{text:"r",url:"globals_defs.html#index_r"}, +{text:"s",url:"globals_defs.html#index_s"}, +{text:"t",url:"globals_defs.html#index_t"}, +{text:"u",url:"globals_defs.html#index_u"}, +{text:"v",url:"globals_defs.html#index_v"}, +{text:"w",url:"globals_defs.html#index_w"}, +{text:"y",url:"globals_defs.html#index_y"}]}]}]}]} diff --git a/documentation/html/namespacebuilder.html b/documentation/html/namespacebuilder.html new file mode 100644 index 000000000..f4941e8fe --- /dev/null +++ b/documentation/html/namespacebuilder.html @@ -0,0 +1,1327 @@ + + + + + + + +Craft: builder Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    builder Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  Client
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    def sphere (cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False)
     
    def circle_x (x, y, z, r, fill=False)
     
    def circle_y (x, y, z, r, fill=False)
     
    def circle_z (x, y, z, r, fill=False)
     
    def cylinder_x (x1, x2, y, z, r, fill=False)
     
    def cylinder_y (x, y1, y2, z, r, fill=False)
     
    def cylinder_z (x, y, z1, z2, r, fill=False)
     
    def cuboid (x1, x2, y1, y2, z1, z2, fill=True)
     
    def pyramid (x1, x2, y, z1, z2, fill=False)
     
    def get_identity ()
     
    def get_client ()
     
    def main ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    string DEFAULT_HOST = '127.0.0.1'
     
    int DEFAULT_PORT = 4080
     
    int EMPTY = 0
     
    int GRASS = 1
     
    int SAND = 2
     
    int STONE = 3
     
    int BRICK = 4
     
    int WOOD = 5
     
    int CEMENT = 6
     
    int DIRT = 7
     
    int PLANK = 8
     
    int SNOW = 9
     
    int GLASS = 10
     
    int COBBLE = 11
     
    int LIGHT_STONE = 12
     
    int DARK_STONE = 13
     
    int CHEST = 14
     
    int LEAVES = 15
     
    int CLOUD = 16
     
    int TALL_GRASS = 17
     
    int YELLOW_FLOWER = 18
     
    int RED_FLOWER = 19
     
    int PURPLE_FLOWER = 20
     
    int SUN_FLOWER = 21
     
    int WHITE_FLOWER = 22
     
    int BLUE_FLOWER = 23
     
    list OFFSETS
     
    +

    Function Documentation

    + +

    ◆ circle_x()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.circle_x ( x,
     y,
     z,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 75 of file builder.py.

    +
    75 def circle_x(x, y, z, r, fill=False):
    +
    76  return sphere(x, y, z, r, fill, fx=True)
    +
    77 
    +
    void sphere(Block *center, int radius, int fill, int fx, int fy, int fz)
    Definition: main.c:1516
    +
    def circle_x(x, y, z, r, fill=False)
    Definition: builder.py:75
    +
    +
    +
    + +

    ◆ circle_y()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.circle_y ( x,
     y,
     z,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 78 of file builder.py.

    +
    78 def circle_y(x, y, z, r, fill=False):
    +
    79  return sphere(x, y, z, r, fill, fy=True)
    +
    80 
    +
    def circle_y(x, y, z, r, fill=False)
    Definition: builder.py:78
    +
    +
    +
    + +

    ◆ circle_z()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.circle_z ( x,
     y,
     z,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 81 of file builder.py.

    +
    81 def circle_z(x, y, z, r, fill=False):
    +
    82  return sphere(x, y, z, r, fill, fz=True)
    +
    83 
    +
    def circle_z(x, y, z, r, fill=False)
    Definition: builder.py:81
    +
    +
    +
    + +

    ◆ cuboid()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.cuboid ( x1,
     x2,
     y1,
     y2,
     z1,
     z2,
     fill = True 
    )
    +
    + +

    Definition at line 105 of file builder.py.

    +
    105 def cuboid(x1, x2, y1, y2, z1, z2, fill=True):
    +
    106  x1, x2 = sorted((x1, x2))
    +
    107  y1, y2 = sorted((y1, y2))
    +
    108  z1, z2 = sorted((z1, z2))
    +
    109  result = set()
    +
    110  a = (x1 == x2) + (y1 == y2) + (z1 == z2)
    +
    111  for x in range(x1, x2 + 1):
    +
    112  for y in range(y1, y2 + 1):
    +
    113  for z in range(z1, z2 + 1):
    +
    114  n = 0
    +
    115  n += x in (x1, x2)
    +
    116  n += y in (y1, y2)
    +
    117  n += z in (z1, z2)
    +
    118  if not fill and n <= a:
    +
    119  continue
    +
    120  result.add((x, y, z))
    +
    121  return result
    +
    122 
    +
    def cuboid(x1, x2, y1, y2, z1, z2, fill=True)
    Definition: builder.py:105
    +
    +
    +
    + +

    ◆ cylinder_x()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.cylinder_x ( x1,
     x2,
     y,
     z,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 84 of file builder.py.

    +
    84 def cylinder_x(x1, x2, y, z, r, fill=False):
    +
    85  x1, x2 = sorted((x1, x2))
    +
    86  result = set()
    +
    87  for x in range(x1, x2 + 1):
    +
    88  result |= circle_x(x, y, z, r, fill)
    +
    89  return result
    +
    90 
    +
    def cylinder_x(x1, x2, y, z, r, fill=False)
    Definition: builder.py:84
    +
    +
    +
    + +

    ◆ cylinder_y()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.cylinder_y ( x,
     y1,
     y2,
     z,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 91 of file builder.py.

    +
    91 def cylinder_y(x, y1, y2, z, r, fill=False):
    +
    92  y1, y2 = sorted((y1, y2))
    +
    93  result = set()
    +
    94  for y in range(y1, y2 + 1):
    +
    95  result |= circle_y(x, y, z, r, fill)
    +
    96  return result
    +
    97 
    +
    def cylinder_y(x, y1, y2, z, r, fill=False)
    Definition: builder.py:91
    +
    +
    +
    + +

    ◆ cylinder_z()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.cylinder_z ( x,
     y,
     z1,
     z2,
     r,
     fill = False 
    )
    +
    + +

    Definition at line 98 of file builder.py.

    +
    98 def cylinder_z(x, y, z1, z2, r, fill=False):
    +
    99  z1, z2 = sorted((z1, z2))
    +
    100  result = set()
    +
    101  for z in range(z1, z2 + 1):
    +
    102  result |= circle_z(x, y, z, r, fill)
    +
    103  return result
    +
    104 
    +
    def cylinder_z(x, y, z1, z2, r, fill=False)
    Definition: builder.py:98
    +
    +
    +
    + +

    ◆ get_client()

    + +
    +
    + + + + + + + +
    def builder.get_client ()
    +
    + +

    Definition at line 181 of file builder.py.

    +
    181 def get_client():
    +
    182  default_args = [DEFAULT_HOST, DEFAULT_PORT]
    +
    183  args = sys.argv[1:] + [None] * len(default_args)
    +
    184  host, port = [a or b for a, b in zip(args, default_args)]
    +
    185  client = Client(host, int(port))
    +
    186  return client
    +
    187 
    +
    def get_client()
    Definition: builder.py:181
    +
    +
    +
    + +

    ◆ get_identity()

    + +
    +
    + + + + + + + +
    def builder.get_identity ()
    +
    + +

    Definition at line 132 of file builder.py.

    +
    132 def get_identity():
    +
    133  query = (
    +
    134  'select username, token from identity_token where selected = 1;'
    +
    135  )
    +
    136  conn = sqlite3.connect('auth.db')
    +
    137  rows = conn.execute(query)
    +
    138  for row in rows:
    +
    139  return row
    +
    140  raise Exception('No identities found.')
    +
    141 
    +
    def get_identity()
    Definition: builder.py:132
    +
    +
    +
    + +

    ◆ main()

    + +
    +
    + + + + + + + +
    def builder.main ()
    +
    + +

    Definition at line 188 of file builder.py.

    +
    188 def main():
    +
    189  client = get_client()
    +
    190  set_block = client.set_block
    +
    191  set_blocks = client.set_blocks
    +
    192  # set_blocks(circle_y(0, 32, 0, 16, True), STONE)
    +
    193  # set_blocks(circle_y(0, 33, 0, 16), BRICK)
    +
    194  # set_blocks(cuboid(-1, 1, 1, 31, -1, 1), CEMENT)
    +
    195  # set_blocks(cuboid(-1024, 1024, 32, 32, -3, 3), STONE)
    +
    196  # set_blocks(cuboid(-3, 3, 32, 32, -1024, 1024), STONE)
    +
    197  # set_blocks(cuboid(-1024, 1024, 33, 33, -3, -3), BRICK)
    +
    198  # set_blocks(cuboid(-1024, 1024, 33, 33, 3, 3), BRICK)
    +
    199  # set_blocks(cuboid(-3, -3, 33, 33, -1024, 1024), BRICK)
    +
    200  # set_blocks(cuboid(3, 3, 33, 33, -1024, 1024), BRICK)
    +
    201  # set_blocks(sphere(0, 32, 0, 16), GLASS)
    +
    202  # for y in range(1, 32):
    +
    203  # set_blocks(circle_y(0, y, 0, 4, True), CEMENT)
    +
    204  # set_blocks(circle_x(16, 33, 0, 3), BRICK)
    +
    205  # set_blocks(circle_x(-16, 33, 0, 3), BRICK)
    +
    206  # set_blocks(circle_z(0, 33, 16, 3), BRICK)
    +
    207  # set_blocks(circle_z(0, 33, -16, 3), BRICK)
    +
    208  # for x in range(0, 1024, 32):
    +
    209  # set_blocks(cuboid(x - 1, x + 1, 31, 32, -1, 1), CEMENT)
    +
    210  # set_blocks(cuboid(-x - 1, -x + 1, 31, 32, -1, 1), CEMENT)
    +
    211  # set_blocks(cuboid(x, x, 1, 32, -1, 1), CEMENT)
    +
    212  # set_blocks(cuboid(-x, -x, 1, 32, -1, 1), CEMENT)
    +
    213  # for z in range(0, 1024, 32):
    +
    214  # set_blocks(cuboid(-1, 1, 31, 32, z - 1, z + 1), CEMENT)
    +
    215  # set_blocks(cuboid(-1, 1, 31, 32, -z - 1, -z + 1), CEMENT)
    +
    216  # set_blocks(cuboid(-1, 1, 1, 32, z, z), CEMENT)
    +
    217  # set_blocks(cuboid(-1, 1, 1, 32, -z, -z), CEMENT)
    +
    218  # for x in range(0, 1024, 8):
    +
    219  # set_block(x, 32, 0, CEMENT)
    +
    220  # set_block(-x, 32, 0, CEMENT)
    +
    221  # for z in range(0, 1024, 8):
    +
    222  # set_block(0, 32, z, CEMENT)
    +
    223  # set_block(0, 32, -z, CEMENT)
    +
    224  # set_blocks(pyramid(32, 32+64-1, 12, 32, 32+64-1), COBBLE)
    +
    225  # outer = circle_y(0, 11, 0, 176 + 3, True)
    +
    226  # inner = circle_y(0, 11, 0, 176 - 3, True)
    +
    227  # set_blocks(outer - inner, STONE)
    +
    228  # a = sphere(-32, 48, -32, 24, True)
    +
    229  # b = sphere(-24, 40, -24, 24, True)
    +
    230  # set_blocks(a - b, PLANK)
    +
    231  # set_blocks(cylinder_x(-64, 64, 32, 0, 8), STONE)
    +
    232  # data = [
    +
    233  # '...............................',
    +
    234  # '..xxx..xxxx...xxx..xxxxx.xxxxx.',
    +
    235  # '.x...x.x...x.x...x.x.......x...',
    +
    236  # '.x.....xxxx..xxxxx.xxx.....x...',
    +
    237  # '.x...x.x..x..x...x.x.......x...',
    +
    238  # '..xxx..x...x.x...x.x.......x...',
    +
    239  # '...............................',
    +
    240  # ]
    +
    241  # lookup = {
    +
    242  # 'x': STONE,
    +
    243  # '.': PLANK,
    +
    244  # }
    +
    245  # client.bitmap(0, 32, 32, (1, 0, 0), (0, -1, 0), data, lookup)
    +
    246 
    +
    int main(int argc, char **argv)
    Definition: main.c:2267
    +
    +
    +
    + +

    ◆ pyramid()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.pyramid ( x1,
     x2,
     y,
     z1,
     z2,
     fill = False 
    )
    +
    + +

    Definition at line 123 of file builder.py.

    +
    123 def pyramid(x1, x2, y, z1, z2, fill=False):
    +
    124  x1, x2 = sorted((x1, x2))
    +
    125  z1, z2 = sorted((z1, z2))
    +
    126  result = set()
    +
    127  while x2 >= x1 and z2 >= z2:
    +
    128  result |= cuboid(x1, x2, y, y, z1, z2, fill)
    +
    129  y, x1, x2, z1, z2 = y + 1, x1 + 1, x2 - 1, z1 + 1, z2 - 1
    +
    130  return result
    +
    131 
    +
    def pyramid(x1, x2, y, z1, z2, fill=False)
    Definition: builder.py:123
    +
    +
    +
    + +

    ◆ sphere()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def builder.sphere ( cx,
     cy,
     cz,
     r,
     fill = False,
     fx = False,
     fy = False,
     fz = False 
    )
    +
    + +

    Definition at line 48 of file builder.py.

    +
    48 def sphere(cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False):
    +
    49  result = set()
    +
    50  for x in range(cx - r, cx + r + 1):
    +
    51  if fx and x != cx:
    +
    52  continue
    +
    53  for y in range(cy - r, cy + r + 1):
    +
    54  # if y < cy:
    +
    55  # continue # top hemisphere only
    +
    56  if fy and y != cy:
    +
    57  continue
    +
    58  for z in range(cz - r, cz + r + 1):
    +
    59  if fz and z != cz:
    +
    60  continue
    +
    61  inside = False
    +
    62  outside = fill
    +
    63  for dx, dy, dz in OFFSETS:
    +
    64  ox, oy, oz = x + dx, y + dy, z + dz
    +
    65  d2 = (ox - cx) ** 2 + (oy - cy) ** 2 + (oz - cz) ** 2
    +
    66  d = d2 ** 0.5
    +
    67  if d < r:
    +
    68  inside = True
    +
    69  else:
    +
    70  outside = True
    +
    71  if inside and outside:
    +
    72  result.add((x, y, z))
    +
    73  return result
    +
    74 
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ BLUE_FLOWER

    + +
    +
    + + + + +
    int builder.BLUE_FLOWER = 23
    +
    + +

    Definition at line 35 of file builder.py.

    + +
    +
    + +

    ◆ BRICK

    + +
    +
    + + + + +
    int builder.BRICK = 4
    +
    + +

    Definition at line 16 of file builder.py.

    + +
    +
    + +

    ◆ CEMENT

    + +
    +
    + + + + +
    int builder.CEMENT = 6
    +
    + +

    Definition at line 18 of file builder.py.

    + +
    +
    + +

    ◆ CHEST

    + +
    +
    + + + + +
    int builder.CHEST = 14
    +
    + +

    Definition at line 26 of file builder.py.

    + +
    +
    + +

    ◆ CLOUD

    + +
    +
    + + + + +
    int builder.CLOUD = 16
    +
    + +

    Definition at line 28 of file builder.py.

    + +
    +
    + +

    ◆ COBBLE

    + +
    +
    + + + + +
    int builder.COBBLE = 11
    +
    + +

    Definition at line 23 of file builder.py.

    + +
    +
    + +

    ◆ DARK_STONE

    + +
    +
    + + + + +
    int builder.DARK_STONE = 13
    +
    + +

    Definition at line 25 of file builder.py.

    + +
    +
    + +

    ◆ DEFAULT_HOST

    + +
    +
    + + + + +
    string builder.DEFAULT_HOST = '127.0.0.1'
    +
    + +

    Definition at line 9 of file builder.py.

    + +
    +
    + +

    ◆ DEFAULT_PORT

    + +
    +
    + + + + +
    int builder.DEFAULT_PORT = 4080
    +
    + +

    Definition at line 10 of file builder.py.

    + +
    +
    + +

    ◆ DIRT

    + +
    +
    + + + + +
    int builder.DIRT = 7
    +
    + +

    Definition at line 19 of file builder.py.

    + +
    +
    + +

    ◆ EMPTY

    + +
    +
    + + + + +
    int builder.EMPTY = 0
    +
    + +

    Definition at line 12 of file builder.py.

    + +
    +
    + +

    ◆ GLASS

    + +
    +
    + + + + +
    int builder.GLASS = 10
    +
    + +

    Definition at line 22 of file builder.py.

    + +
    +
    + +

    ◆ GRASS

    + +
    +
    + + + + +
    int builder.GRASS = 1
    +
    + +

    Definition at line 13 of file builder.py.

    + +
    +
    + +

    ◆ LEAVES

    + +
    +
    + + + + +
    int builder.LEAVES = 15
    +
    + +

    Definition at line 27 of file builder.py.

    + +
    +
    + +

    ◆ LIGHT_STONE

    + +
    +
    + + + + +
    int builder.LIGHT_STONE = 12
    +
    + +

    Definition at line 24 of file builder.py.

    + +
    +
    + +

    ◆ OFFSETS

    + +
    +
    + + + + +
    list builder.OFFSETS
    +
    +Initial value:
    1 = [
    +
    2  (-0.5, -0.5, -0.5),
    +
    3  (-0.5, -0.5, 0.5),
    +
    4  (-0.5, 0.5, -0.5),
    +
    5  (-0.5, 0.5, 0.5),
    +
    6  (0.5, -0.5, -0.5),
    +
    7  (0.5, -0.5, 0.5),
    +
    8  (0.5, 0.5, -0.5),
    +
    9  (0.5, 0.5, 0.5),
    +
    10 ]
    +
    +

    Definition at line 37 of file builder.py.

    + +
    +
    + +

    ◆ PLANK

    + +
    +
    + + + + +
    int builder.PLANK = 8
    +
    + +

    Definition at line 20 of file builder.py.

    + +
    +
    + +

    ◆ PURPLE_FLOWER

    + +
    +
    + + + + +
    int builder.PURPLE_FLOWER = 20
    +
    + +

    Definition at line 32 of file builder.py.

    + +
    +
    + +

    ◆ RED_FLOWER

    + +
    +
    + + + + +
    int builder.RED_FLOWER = 19
    +
    + +

    Definition at line 31 of file builder.py.

    + +
    +
    + +

    ◆ SAND

    + +
    +
    + + + + +
    int builder.SAND = 2
    +
    + +

    Definition at line 14 of file builder.py.

    + +
    +
    + +

    ◆ SNOW

    + +
    +
    + + + + +
    int builder.SNOW = 9
    +
    + +

    Definition at line 21 of file builder.py.

    + +
    +
    + +

    ◆ STONE

    + +
    +
    + + + + +
    int builder.STONE = 3
    +
    + +

    Definition at line 15 of file builder.py.

    + +
    +
    + +

    ◆ SUN_FLOWER

    + +
    +
    + + + + +
    int builder.SUN_FLOWER = 21
    +
    + +

    Definition at line 33 of file builder.py.

    + +
    +
    + +

    ◆ TALL_GRASS

    + +
    +
    + + + + +
    int builder.TALL_GRASS = 17
    +
    + +

    Definition at line 29 of file builder.py.

    + +
    +
    + +

    ◆ WHITE_FLOWER

    + +
    +
    + + + + +
    int builder.WHITE_FLOWER = 22
    +
    + +

    Definition at line 34 of file builder.py.

    + +
    +
    + +

    ◆ WOOD

    + +
    +
    + + + + +
    int builder.WOOD = 5
    +
    + +

    Definition at line 17 of file builder.py.

    + +
    +
    + +

    ◆ YELLOW_FLOWER

    + +
    +
    + + + + +
    int builder.YELLOW_FLOWER = 18
    +
    + +

    Definition at line 30 of file builder.py.

    + +
    +
    +
    + + + + diff --git a/documentation/html/namespacemembers.html b/documentation/html/namespacemembers.html new file mode 100644 index 000000000..113af56f7 --- /dev/null +++ b/documentation/html/namespacemembers.html @@ -0,0 +1,362 @@ + + + + + + + +Craft: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    Here is a list of all namespace members with links to the namespace documentation for each member:
    + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - g -

    + + +

    - i -

      +
    • INDESTRUCTIBLE_ITEMS +: server +
    • +
    + + +

    - k -

    + + +

    - l -

    + + +

    - m -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    + + +

    - y -

    +
    + + + + diff --git a/documentation/html/namespacemembers_func.html b/documentation/html/namespacemembers_func.html new file mode 100644 index 000000000..e17e7322f --- /dev/null +++ b/documentation/html/namespacemembers_func.html @@ -0,0 +1,133 @@ + + + + + + + +Craft: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    + + + + diff --git a/documentation/html/namespacemembers_vars.html b/documentation/html/namespacemembers_vars.html new file mode 100644 index 000000000..c8bd74e57 --- /dev/null +++ b/documentation/html/namespacemembers_vars.html @@ -0,0 +1,297 @@ + + + + + + + +Craft: Namespace Members + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +  + +

    - a -

    + + +

    - b -

    + + +

    - c -

    + + +

    - d -

    + + +

    - e -

    + + +

    - g -

    + + +

    - i -

      +
    • INDESTRUCTIBLE_ITEMS +: server +
    • +
    + + +

    - k -

    + + +

    - l -

    + + +

    - n -

    + + +

    - o -

    + + +

    - p -

    + + +

    - r -

    + + +

    - s -

    + + +

    - t -

    + + +

    - v -

    + + +

    - w -

    + + +

    - y -

    +
    + + + + diff --git a/documentation/html/namespaces.html b/documentation/html/namespaces.html new file mode 100644 index 000000000..fda4a619c --- /dev/null +++ b/documentation/html/namespaces.html @@ -0,0 +1,87 @@ + + + + + + + +Craft: Namespace List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Namespace List
    +
    +
    +
    Here is a list of all namespaces with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + + +
     Nbuilder
     CClient
     Nserver
     CRateLimiter
     CServer
     CHandler
     CModel
     Nworld
     CWorld
    +
    +
    + + + + diff --git a/documentation/html/namespaceserver.html b/documentation/html/namespaceserver.html new file mode 100644 index 000000000..f86a04595 --- /dev/null +++ b/documentation/html/namespaceserver.html @@ -0,0 +1,707 @@ + + + + + + + +Craft: server Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    server Namespace Reference
    +
    +
    + + + + + + + + + + +

    +Classes

    class  RateLimiter
     
    class  Server
     
    class  Handler
     
    class  Model
     
    + + + + + + + + + + + +

    +Functions

    def log (*args)
     
    def chunked (x)
     
    def packet (*args)
     
    def cleanup ()
     
    def main ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    string DEFAULT_HOST = '0.0.0.0'
     
    int DEFAULT_PORT = 4080
     
    string DB_PATH = 'craft.db'
     
    string LOG_PATH = 'log.txt'
     
    int CHUNK_SIZE = 32
     
    int BUFFER_SIZE = 4096
     
    int COMMIT_INTERVAL = 5
     
    tuple SPAWN_POINT = (0, 0, 0, 0, 0)
     
    bool RATE_LIMIT = False
     
    bool RECORD_HISTORY = False
     
     INDESTRUCTIBLE_ITEMS = set([16])
     
     ALLOWED_ITEMS
     
    string AUTHENTICATE = 'A'
     
    string BLOCK = 'B'
     
    string CHUNK = 'C'
     
    string DISCONNECT = 'D'
     
    string KEY = 'K'
     
    string NICK = 'N'
     
    string POSITION = 'P'
     
    string REDRAW = 'R'
     
    string SIGN = 'S'
     
    string TALK = 'T'
     
    string VERSION = 'V'
     
    string YOU = 'U'
     
    +

    Function Documentation

    + +

    ◆ chunked()

    + +
    +
    + + + + + + + + +
    def server.chunked ( x)
    +
    + +

    Definition at line 60 of file server.py.

    +
    60 def chunked(x):
    +
    61  return int(floor(round(x) / CHUNK_SIZE))
    +
    62 
    +
    int chunked(float x)
    Definition: main.c:137
    +
    +
    +
    + +

    ◆ cleanup()

    + +
    +
    + + + + + + + +
    def server.cleanup ()
    +
    + +

    Definition at line 556 of file server.py.

    +
    556 def cleanup():
    +
    557  world = World(None)
    +
    558  conn = sqlite3.connect(DB_PATH)
    +
    559  query = 'select x, y, z from block order by rowid desc limit 1;'
    +
    560  last = list(conn.execute(query))[0]
    +
    561  query = 'select distinct p, q from block;'
    +
    562  chunks = list(conn.execute(query))
    +
    563  count = 0
    +
    564  total = 0
    +
    565  delete_query = 'delete from block where x = %d and y = %d and z = %d;'
    +
    566  print 'begin;'
    +
    567  for p, q in chunks:
    +
    568  chunk = world.create_chunk(p, q)
    +
    569  query = 'select x, y, z, w from block where p = :p and q = :q;'
    +
    570  rows = conn.execute(query, {'p': p, 'q': q})
    +
    571  for x, y, z, w in rows:
    +
    572  if chunked(x) != p or chunked(z) != q:
    +
    573  continue
    +
    574  total += 1
    +
    575  if (x, y, z) == last:
    +
    576  continue
    +
    577  original = chunk.get((x, y, z), 0)
    +
    578  if w == original or original in INDESTRUCTIBLE_ITEMS:
    +
    579  count += 1
    +
    580  print delete_query % (x, y, z)
    +
    581  conn.close()
    +
    582  print 'commit;'
    +
    583  print >> sys.stderr, '%d of %d blocks will be cleaned up' % (count, total)
    +
    584 
    +
    def cleanup()
    Definition: server.py:556
    +
    +
    +
    + +

    ◆ log()

    + +
    +
    + + + + + + + + +
    def server.log (args)
    +
    + +

    Definition at line 53 of file server.py.

    +
    53 def log(*args):
    +
    54  now = datetime.datetime.utcnow()
    +
    55  line = ' '.join(map(str, (now,) + args))
    +
    56  print line
    +
    57  with open(LOG_PATH, 'a') as fp:
    +
    58  fp.write('%s\n' % line)
    +
    59 
    +
    def log(*args)
    Definition: server.py:53
    +
    +
    +
    + +

    ◆ main()

    + +
    +
    + + + + + + + +
    def server.main ()
    +
    + +

    Definition at line 585 of file server.py.

    +
    585 def main():
    +
    586  if len(sys.argv) == 2 and sys.argv[1] == 'cleanup':
    +
    587  cleanup()
    +
    588  return
    +
    589  host, port = DEFAULT_HOST, DEFAULT_PORT
    +
    590  if len(sys.argv) > 1:
    +
    591  host = sys.argv[1]
    +
    592  if len(sys.argv) > 2:
    +
    593  port = int(sys.argv[2])
    +
    594  log('SERV', host, port)
    +
    595  model = Model(None)
    +
    596  model.start()
    +
    597  server = Server((host, port), Handler)
    +
    598  server.model = model
    +
    599  server.serve_forever()
    +
    600 
    +
    int main(int argc, char **argv)
    Definition: main.c:2267
    +
    Definition: main.c:97
    +
    +
    +
    + +

    ◆ packet()

    + +
    +
    + + + + + + + + +
    def server.packet (args)
    +
    + +

    Definition at line 63 of file server.py.

    +
    63 def packet(*args):
    +
    64  return '%s\n' % ','.join(map(str, args))
    +
    65 
    +
    def packet(*args)
    Definition: server.py:63
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ ALLOWED_ITEMS

    + +
    +
    + + + + +
    server.ALLOWED_ITEMS
    +
    +Initial value:
    1 = set([
    +
    2  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
    +
    3  17, 18, 19, 20, 21, 22, 23,
    +
    4  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    +
    5  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63])
    +
    +

    Definition at line 29 of file server.py.

    + +
    +
    + +

    ◆ AUTHENTICATE

    + +
    +
    + + + + +
    string server.AUTHENTICATE = 'A'
    +
    + +

    Definition at line 35 of file server.py.

    + +
    +
    + +

    ◆ BLOCK

    + +
    +
    + + + + +
    string server.BLOCK = 'B'
    +
    + +

    Definition at line 36 of file server.py.

    + +
    +
    + +

    ◆ BUFFER_SIZE

    + +
    +
    + + + + +
    int server.BUFFER_SIZE = 4096
    +
    + +

    Definition at line 22 of file server.py.

    + +
    +
    + +

    ◆ CHUNK

    + +
    +
    + + + + +
    string server.CHUNK = 'C'
    +
    + +

    Definition at line 37 of file server.py.

    + +
    +
    + +

    ◆ CHUNK_SIZE

    + +
    +
    + + + + +
    int server.CHUNK_SIZE = 32
    +
    + +

    Definition at line 21 of file server.py.

    + +
    +
    + +

    ◆ COMMIT_INTERVAL

    + +
    +
    + + + + +
    int server.COMMIT_INTERVAL = 5
    +
    + +

    Definition at line 23 of file server.py.

    + +
    +
    + +

    ◆ DB_PATH

    + +
    +
    + + + + +
    string server.DB_PATH = 'craft.db'
    +
    + +

    Definition at line 18 of file server.py.

    + +
    +
    + +

    ◆ DEFAULT_HOST

    + +
    +
    + + + + +
    string server.DEFAULT_HOST = '0.0.0.0'
    +
    + +

    Definition at line 15 of file server.py.

    + +
    +
    + +

    ◆ DEFAULT_PORT

    + +
    +
    + + + + +
    int server.DEFAULT_PORT = 4080
    +
    + +

    Definition at line 16 of file server.py.

    + +
    +
    + +

    ◆ DISCONNECT

    + +
    +
    + + + + +
    string server.DISCONNECT = 'D'
    +
    + +

    Definition at line 38 of file server.py.

    + +
    +
    + +

    ◆ INDESTRUCTIBLE_ITEMS

    + +
    +
    + + + + +
    server.INDESTRUCTIBLE_ITEMS = set([16])
    +
    + +

    Definition at line 28 of file server.py.

    + +
    +
    + +

    ◆ KEY

    + +
    +
    + + + + +
    string server.KEY = 'K'
    +
    + +

    Definition at line 39 of file server.py.

    + +
    +
    + +

    ◆ LOG_PATH

    + +
    +
    + + + + +
    string server.LOG_PATH = 'log.txt'
    +
    + +

    Definition at line 19 of file server.py.

    + +
    +
    + +

    ◆ NICK

    + +
    +
    + + + + +
    string server.NICK = 'N'
    +
    + +

    Definition at line 40 of file server.py.

    + +
    +
    + +

    ◆ POSITION

    + +
    +
    + + + + +
    string server.POSITION = 'P'
    +
    + +

    Definition at line 41 of file server.py.

    + +
    +
    + +

    ◆ RATE_LIMIT

    + +
    +
    + + + + +
    bool server.RATE_LIMIT = False
    +
    + +

    Definition at line 26 of file server.py.

    + +
    +
    + +

    ◆ RECORD_HISTORY

    + +
    +
    + + + + +
    bool server.RECORD_HISTORY = False
    +
    + +

    Definition at line 27 of file server.py.

    + +
    +
    + +

    ◆ REDRAW

    + +
    +
    + + + + +
    string server.REDRAW = 'R'
    +
    + +

    Definition at line 42 of file server.py.

    + +
    +
    + +

    ◆ SIGN

    + +
    +
    + + + + +
    string server.SIGN = 'S'
    +
    + +

    Definition at line 43 of file server.py.

    + +
    +
    + +

    ◆ SPAWN_POINT

    + +
    +
    + + + + +
    tuple server.SPAWN_POINT = (0, 0, 0, 0, 0)
    +
    + +

    Definition at line 25 of file server.py.

    + +
    +
    + +

    ◆ TALK

    + +
    +
    + + + + +
    string server.TALK = 'T'
    +
    + +

    Definition at line 44 of file server.py.

    + +
    +
    + +

    ◆ VERSION

    + +
    +
    + + + + +
    string server.VERSION = 'V'
    +
    + +

    Definition at line 45 of file server.py.

    + +
    +
    + +

    ◆ YOU

    + +
    +
    + + + + +
    string server.YOU = 'U'
    +
    + +

    Definition at line 46 of file server.py.

    + +
    +
    +
    + + + + diff --git a/documentation/html/namespaceworld.html b/documentation/html/namespaceworld.html new file mode 100644 index 000000000..ed1659e68 --- /dev/null +++ b/documentation/html/namespaceworld.html @@ -0,0 +1,314 @@ + + + + + + + +Craft: world Namespace Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    world Namespace Reference
    +
    +
    + + + + +

    +Classes

    class  World
     
    + + + + + + + + + +

    +Functions

    def dll_seed (x)
     
    def dll_create_world (p, q)
     
    def dll_simplex2 (x, y, octaves=1, persistence=0.5, lacunarity=2.0)
     
    def dll_simplex3 (x, y, z, octaves=1, persistence=0.5, lacunarity=2.0)
     
    + + + + + +

    +Variables

     dll = CDLL('./world')
     
     WORLD_FUNC = CFUNCTYPE(None, c_int, c_int, c_int, c_int, c_void_p)
     
    +

    Function Documentation

    + +

    ◆ dll_create_world()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    def world.dll_create_world ( p,
     q 
    )
    +
    + +

    Definition at line 14 of file world.py.

    +
    14 def dll_create_world(p, q):
    +
    15  result = {}
    +
    16  def world_func(x, y, z, w, arg):
    +
    17  result[(x, y, z)] = w
    +
    18  dll.create_world(p, q, WORLD_FUNC(world_func), None)
    +
    19  return result
    +
    20 
    +
    21 dll.simplex2.restype = c_float
    +
    22 dll.simplex2.argtypes = [c_float, c_float, c_int, c_float, c_float]
    +
    WORLD_FUNC
    Definition: world.py:9
    +
    def dll_create_world(p, q)
    Definition: world.py:14
    +
    void(* world_func)(int, int, int, int, void *)
    Definition: world.h:4
    +
    +
    +
    + +

    ◆ dll_seed()

    + +
    +
    + + + + + + + + +
    def world.dll_seed ( x)
    +
    + +

    Definition at line 11 of file world.py.

    +
    11 def dll_seed(x):
    +
    12  dll.seed(x)
    +
    13 
    +
    def dll_seed(x)
    Definition: world.py:11
    +
    +
    +
    + +

    ◆ dll_simplex2()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def world.dll_simplex2 ( x,
     y,
     octaves = 1,
     persistence = 0.5,
     lacunarity = 2.0 
    )
    +
    + +

    Definition at line 23 of file world.py.

    +
    23 def dll_simplex2(x, y, octaves=1, persistence=0.5, lacunarity=2.0):
    +
    24  return dll.simplex2(x, y, octaves, persistence, lacunarity)
    +
    25 
    +
    26 dll.simplex3.restype = c_float
    +
    27 dll.simplex3.argtypes = [c_float, c_float, c_float, c_int, c_float, c_float]
    +
    def dll_simplex2(x, y, octaves=1, persistence=0.5, lacunarity=2.0)
    Definition: world.py:23
    +
    +
    +
    + +

    ◆ dll_simplex3()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    def world.dll_simplex3 ( x,
     y,
     z,
     octaves = 1,
     persistence = 0.5,
     lacunarity = 2.0 
    )
    +
    + +

    Definition at line 28 of file world.py.

    +
    28 def dll_simplex3(x, y, z, octaves=1, persistence=0.5, lacunarity=2.0):
    +
    29  return dll.simplex3(x, y, z, octaves, persistence, lacunarity)
    +
    30 
    +
    def dll_simplex3(x, y, z, octaves=1, persistence=0.5, lacunarity=2.0)
    Definition: world.py:28
    +
    +
    +
    +

    Variable Documentation

    + +

    ◆ dll

    + +
    +
    + + + + +
    world.dll = CDLL('./world')
    +
    + +

    Definition at line 7 of file world.py.

    + +
    +
    + +

    ◆ WORLD_FUNC

    + +
    +
    + + + + +
    world.WORLD_FUNC = CFUNCTYPE(None, c_int, c_int, c_int, c_int, c_void_p)
    +
    + +

    Definition at line 9 of file world.py.

    + +
    +
    +
    + + + + diff --git a/documentation/html/nav_f.png b/documentation/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/documentation/html/nav_g.png b/documentation/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +Craft: Related Pages + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    + + + +
     Craft
     LICENSE
    +
    +
    + + + + diff --git a/documentation/html/ring_8c.html b/documentation/html/ring_8c.html new file mode 100644 index 000000000..dad1c686c --- /dev/null +++ b/documentation/html/ring_8c.html @@ -0,0 +1,553 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    ring.c File Reference
    +
    +
    +
    #include <stdlib.h>
    +#include <string.h>
    +#include "ring.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void ring_alloc (Ring *ring, int capacity)
     
    void ring_free (Ring *ring)
     
    int ring_empty (Ring *ring)
     
    int ring_full (Ring *ring)
     
    int ring_size (Ring *ring)
     
    void ring_grow (Ring *ring)
     
    void ring_put (Ring *ring, RingEntry *entry)
     
    void ring_put_block (Ring *ring, int p, int q, int x, int y, int z, int w)
     
    void ring_put_key (Ring *ring, int p, int q, int key)
     
    void ring_put_commit (Ring *ring)
     
    void ring_put_exit (Ring *ring)
     
    int ring_get (Ring *ring, RingEntry *entry)
     
    +

    Function Documentation

    + +

    ◆ ring_alloc()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void ring_alloc (Ringring,
    int capacity 
    )
    +
    + +

    Definition at line 5 of file ring.c.

    +
    5  {
    +
    6  ring->capacity = capacity;
    +
    7  ring->start = 0;
    +
    8  ring->end = 0;
    +
    9  ring->data = (RingEntry *)calloc(capacity, sizeof(RingEntry));
    +
    10 }
    +
    static Ring ring
    Definition: db.c:19
    +
    Definition: ring.h:11
    +
    unsigned int start
    Definition: ring.h:24
    +
    unsigned int capacity
    Definition: ring.h:23
    +
    RingEntry * data
    Definition: ring.h:26
    +
    unsigned int end
    Definition: ring.h:25
    +
    +
    +
    + +

    ◆ ring_empty()

    + +
    +
    + + + + + + + + +
    int ring_empty (Ringring)
    +
    + +

    Definition at line 16 of file ring.c.

    +
    16  {
    +
    17  return ring->start == ring->end;
    +
    18 }
    +
    +
    +
    + +

    ◆ ring_free()

    + +
    +
    + + + + + + + + +
    void ring_free (Ringring)
    +
    + +

    Definition at line 12 of file ring.c.

    +
    12  {
    +
    13  free(ring->data);
    +
    14 }
    +
    +
    +
    + +

    ◆ ring_full()

    + +
    +
    + + + + + + + + +
    int ring_full (Ringring)
    +
    + +

    Definition at line 20 of file ring.c.

    +
    20  {
    +
    21  return ring->start == (ring->end + 1) % ring->capacity;
    +
    22 }
    +
    +
    +
    + +

    ◆ ring_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int ring_get (Ringring,
    RingEntryentry 
    )
    +
    + +

    Definition at line 89 of file ring.c.

    +
    89  {
    +
    90  if (ring_empty(ring)) {
    +
    91  return 0;
    +
    92  }
    +
    93  RingEntry *e = ring->data + ring->start;
    +
    94  memcpy(entry, e, sizeof(RingEntry));
    +
    95  ring->start = (ring->start + 1) % ring->capacity;
    +
    96  return 1;
    +
    97 }
    +
    int ring_empty(Ring *ring)
    Definition: ring.c:16
    +
    +
    +
    + +

    ◆ ring_grow()

    + +
    +
    + + + + + + + + +
    void ring_grow (Ringring)
    +
    + +

    Definition at line 33 of file ring.c.

    +
    33  {
    +
    34  Ring new_ring;
    +
    35  RingEntry entry;
    +
    36  ring_alloc(&new_ring, ring->capacity * 2);
    +
    37  while (ring_get(ring, &entry)) {
    +
    38  ring_put(&new_ring, &entry);
    +
    39  }
    +
    40  free(ring->data);
    +
    41  ring->capacity = new_ring.capacity;
    +
    42  ring->start = new_ring.start;
    +
    43  ring->end = new_ring.end;
    +
    44  ring->data = new_ring.data;
    +
    45 }
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    void ring_put(Ring *ring, RingEntry *entry)
    Definition: ring.c:47
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    +
    Definition: ring.h:22
    +
    +
    +
    + +

    ◆ ring_put()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void ring_put (Ringring,
    RingEntryentry 
    )
    +
    + +

    Definition at line 47 of file ring.c.

    +
    47  {
    +
    48  if (ring_full(ring)) {
    +
    49  ring_grow(ring);
    +
    50  }
    +
    51  RingEntry *e = ring->data + ring->end;
    +
    52  memcpy(e, entry, sizeof(RingEntry));
    +
    53  ring->end = (ring->end + 1) % ring->capacity;
    +
    54 }
    +
    int ring_full(Ring *ring)
    Definition: ring.c:20
    +
    void ring_grow(Ring *ring)
    Definition: ring.c:33
    +
    +
    +
    + +

    ◆ ring_put_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void ring_put_block (Ringring,
    int p,
    int q,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 56 of file ring.c.

    +
    56  {
    +
    57  RingEntry entry;
    +
    58  entry.type = BLOCK;
    +
    59  entry.p = p;
    +
    60  entry.q = q;
    +
    61  entry.x = x;
    +
    62  entry.y = y;
    +
    63  entry.z = z;
    +
    64  entry.w = w;
    +
    65  ring_put(ring, &entry);
    +
    66 }
    +
    @ BLOCK
    Definition: ring.h:5
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    +
    +
    + +

    ◆ ring_put_commit()

    + +
    +
    + + + + + + + + +
    void ring_put_commit (Ringring)
    +
    + +

    Definition at line 77 of file ring.c.

    +
    77  {
    +
    78  RingEntry entry;
    +
    79  entry.type = COMMIT;
    +
    80  ring_put(ring, &entry);
    +
    81 }
    +
    @ COMMIT
    Definition: ring.h:7
    +
    +
    +
    + +

    ◆ ring_put_exit()

    + +
    +
    + + + + + + + + +
    void ring_put_exit (Ringring)
    +
    + +

    Definition at line 83 of file ring.c.

    +
    83  {
    +
    84  RingEntry entry;
    +
    85  entry.type = EXIT;
    +
    86  ring_put(ring, &entry);
    +
    87 }
    +
    @ EXIT
    Definition: ring.h:8
    +
    +
    +
    + +

    ◆ ring_put_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void ring_put_key (Ringring,
    int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 68 of file ring.c.

    +
    68  {
    +
    69  RingEntry entry;
    +
    70  entry.type = KEY;
    +
    71  entry.p = p;
    +
    72  entry.q = q;
    +
    73  entry.key = key;
    +
    74  ring_put(ring, &entry);
    +
    75 }
    +
    @ KEY
    Definition: ring.h:6
    +
    int key
    Definition: ring.h:19
    +
    +
    +
    + +

    ◆ ring_size()

    + +
    +
    + + + + + + + + +
    int ring_size (Ringring)
    +
    + +

    Definition at line 24 of file ring.c.

    +
    24  {
    +
    25  if (ring->end >= ring->start) {
    +
    26  return ring->end - ring->start;
    +
    27  }
    +
    28  else {
    +
    29  return ring->capacity - (ring->start - ring->end);
    +
    30  }
    +
    31 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/ring_8c_source.html b/documentation/html/ring_8c_source.html new file mode 100644 index 000000000..58a1c6b81 --- /dev/null +++ b/documentation/html/ring_8c_source.html @@ -0,0 +1,207 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ring.c
    +
    +
    +Go to the documentation of this file.
    1 #include <stdlib.h>
    +
    2 #include <string.h>
    +
    3 #include "ring.h"
    +
    4 
    +
    5 void ring_alloc(Ring *ring, int capacity) {
    +
    6  ring->capacity = capacity;
    +
    7  ring->start = 0;
    +
    8  ring->end = 0;
    +
    9  ring->data = (RingEntry *)calloc(capacity, sizeof(RingEntry));
    +
    10 }
    +
    11 
    + +
    13  free(ring->data);
    +
    14 }
    +
    15 
    + +
    17  return ring->start == ring->end;
    +
    18 }
    +
    19 
    + +
    21  return ring->start == (ring->end + 1) % ring->capacity;
    +
    22 }
    +
    23 
    + +
    25  if (ring->end >= ring->start) {
    +
    26  return ring->end - ring->start;
    +
    27  }
    +
    28  else {
    +
    29  return ring->capacity - (ring->start - ring->end);
    +
    30  }
    +
    31 }
    +
    32 
    + +
    34  Ring new_ring;
    +
    35  RingEntry entry;
    +
    36  ring_alloc(&new_ring, ring->capacity * 2);
    +
    37  while (ring_get(ring, &entry)) {
    +
    38  ring_put(&new_ring, &entry);
    +
    39  }
    +
    40  free(ring->data);
    +
    41  ring->capacity = new_ring.capacity;
    +
    42  ring->start = new_ring.start;
    +
    43  ring->end = new_ring.end;
    +
    44  ring->data = new_ring.data;
    +
    45 }
    +
    46 
    +
    47 void ring_put(Ring *ring, RingEntry *entry) {
    +
    48  if (ring_full(ring)) {
    +
    49  ring_grow(ring);
    +
    50  }
    +
    51  RingEntry *e = ring->data + ring->end;
    +
    52  memcpy(e, entry, sizeof(RingEntry));
    +
    53  ring->end = (ring->end + 1) % ring->capacity;
    +
    54 }
    +
    55 
    +
    56 void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w) {
    +
    57  RingEntry entry;
    +
    58  entry.type = BLOCK;
    +
    59  entry.p = p;
    +
    60  entry.q = q;
    +
    61  entry.x = x;
    +
    62  entry.y = y;
    +
    63  entry.z = z;
    +
    64  entry.w = w;
    +
    65  ring_put(ring, &entry);
    +
    66 }
    +
    67 
    +
    68 void ring_put_key(Ring *ring, int p, int q, int key) {
    +
    69  RingEntry entry;
    +
    70  entry.type = KEY;
    +
    71  entry.p = p;
    +
    72  entry.q = q;
    +
    73  entry.key = key;
    +
    74  ring_put(ring, &entry);
    +
    75 }
    +
    76 
    + +
    78  RingEntry entry;
    +
    79  entry.type = COMMIT;
    +
    80  ring_put(ring, &entry);
    +
    81 }
    +
    82 
    + +
    84  RingEntry entry;
    +
    85  entry.type = EXIT;
    +
    86  ring_put(ring, &entry);
    +
    87 }
    +
    88 
    +
    89 int ring_get(Ring *ring, RingEntry *entry) {
    +
    90  if (ring_empty(ring)) {
    +
    91  return 0;
    +
    92  }
    +
    93  RingEntry *e = ring->data + ring->start;
    +
    94  memcpy(entry, e, sizeof(RingEntry));
    +
    95  ring->start = (ring->start + 1) % ring->capacity;
    +
    96  return 1;
    +
    97 }
    +
    static Ring ring
    Definition: db.c:19
    +
    void ring_put_exit(Ring *ring)
    Definition: ring.c:83
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    void ring_put(Ring *ring, RingEntry *entry)
    Definition: ring.c:47
    +
    void ring_put_key(Ring *ring, int p, int q, int key)
    Definition: ring.c:68
    +
    int ring_size(Ring *ring)
    Definition: ring.c:24
    +
    int ring_empty(Ring *ring)
    Definition: ring.c:16
    +
    void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w)
    Definition: ring.c:56
    +
    void ring_put_commit(Ring *ring)
    Definition: ring.c:77
    +
    void ring_free(Ring *ring)
    Definition: ring.c:12
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    +
    int ring_full(Ring *ring)
    Definition: ring.c:20
    +
    void ring_grow(Ring *ring)
    Definition: ring.c:33
    + +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    Definition: ring.h:11
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int key
    Definition: ring.h:19
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    Definition: ring.h:22
    +
    unsigned int start
    Definition: ring.h:24
    +
    unsigned int capacity
    Definition: ring.h:23
    +
    RingEntry * data
    Definition: ring.h:26
    +
    unsigned int end
    Definition: ring.h:25
    +
    + + + + diff --git a/documentation/html/ring_8h.html b/documentation/html/ring_8h.html new file mode 100644 index 000000000..4941db743 --- /dev/null +++ b/documentation/html/ring_8h.html @@ -0,0 +1,598 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    ring.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + +

    +Classes

    struct  RingEntry
     
    struct  Ring
     
    + + + +

    +Enumerations

    enum  RingEntryType { BLOCK +, KEY +, COMMIT +, EXIT + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    void ring_alloc (Ring *ring, int capacity)
     
    void ring_free (Ring *ring)
     
    int ring_empty (Ring *ring)
     
    int ring_full (Ring *ring)
     
    int ring_size (Ring *ring)
     
    void ring_grow (Ring *ring)
     
    void ring_put (Ring *ring, RingEntry *entry)
     
    void ring_put_block (Ring *ring, int p, int q, int x, int y, int z, int w)
     
    void ring_put_key (Ring *ring, int p, int q, int key)
     
    void ring_put_commit (Ring *ring)
     
    void ring_put_exit (Ring *ring)
     
    int ring_get (Ring *ring, RingEntry *entry)
     
    +

    Enumeration Type Documentation

    + +

    ◆ RingEntryType

    + +
    +
    + + + + +
    enum RingEntryType
    +
    + + + + + +
    Enumerator
    BLOCK 
    KEY 
    COMMIT 
    EXIT 
    + +

    Definition at line 4 of file ring.h.

    +
    4  {
    +
    5  BLOCK,
    +
    6  KEY,
    +
    7  COMMIT,
    +
    8  EXIT
    + +
    RingEntryType
    Definition: ring.h:4
    +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    +
    +
    +

    Function Documentation

    + +

    ◆ ring_alloc()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void ring_alloc (Ringring,
    int capacity 
    )
    +
    + +

    Definition at line 5 of file ring.c.

    +
    5  {
    +
    6  ring->capacity = capacity;
    +
    7  ring->start = 0;
    +
    8  ring->end = 0;
    +
    9  ring->data = (RingEntry *)calloc(capacity, sizeof(RingEntry));
    +
    10 }
    +
    static Ring ring
    Definition: db.c:19
    +
    Definition: ring.h:11
    +
    unsigned int start
    Definition: ring.h:24
    +
    unsigned int capacity
    Definition: ring.h:23
    +
    RingEntry * data
    Definition: ring.h:26
    +
    unsigned int end
    Definition: ring.h:25
    +
    +
    +
    + +

    ◆ ring_empty()

    + +
    +
    + + + + + + + + +
    int ring_empty (Ringring)
    +
    + +

    Definition at line 16 of file ring.c.

    +
    16  {
    +
    17  return ring->start == ring->end;
    +
    18 }
    +
    +
    +
    + +

    ◆ ring_free()

    + +
    +
    + + + + + + + + +
    void ring_free (Ringring)
    +
    + +

    Definition at line 12 of file ring.c.

    +
    12  {
    +
    13  free(ring->data);
    +
    14 }
    +
    +
    +
    + +

    ◆ ring_full()

    + +
    +
    + + + + + + + + +
    int ring_full (Ringring)
    +
    + +

    Definition at line 20 of file ring.c.

    +
    20  {
    +
    21  return ring->start == (ring->end + 1) % ring->capacity;
    +
    22 }
    +
    +
    +
    + +

    ◆ ring_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int ring_get (Ringring,
    RingEntryentry 
    )
    +
    + +

    Definition at line 89 of file ring.c.

    +
    89  {
    +
    90  if (ring_empty(ring)) {
    +
    91  return 0;
    +
    92  }
    +
    93  RingEntry *e = ring->data + ring->start;
    +
    94  memcpy(entry, e, sizeof(RingEntry));
    +
    95  ring->start = (ring->start + 1) % ring->capacity;
    +
    96  return 1;
    +
    97 }
    +
    int ring_empty(Ring *ring)
    Definition: ring.c:16
    +
    +
    +
    + +

    ◆ ring_grow()

    + +
    +
    + + + + + + + + +
    void ring_grow (Ringring)
    +
    + +

    Definition at line 33 of file ring.c.

    +
    33  {
    +
    34  Ring new_ring;
    +
    35  RingEntry entry;
    +
    36  ring_alloc(&new_ring, ring->capacity * 2);
    +
    37  while (ring_get(ring, &entry)) {
    +
    38  ring_put(&new_ring, &entry);
    +
    39  }
    +
    40  free(ring->data);
    +
    41  ring->capacity = new_ring.capacity;
    +
    42  ring->start = new_ring.start;
    +
    43  ring->end = new_ring.end;
    +
    44  ring->data = new_ring.data;
    +
    45 }
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    void ring_put(Ring *ring, RingEntry *entry)
    Definition: ring.c:47
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    +
    Definition: ring.h:22
    +
    +
    +
    + +

    ◆ ring_put()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void ring_put (Ringring,
    RingEntryentry 
    )
    +
    + +

    Definition at line 47 of file ring.c.

    +
    47  {
    +
    48  if (ring_full(ring)) {
    +
    49  ring_grow(ring);
    +
    50  }
    +
    51  RingEntry *e = ring->data + ring->end;
    +
    52  memcpy(e, entry, sizeof(RingEntry));
    +
    53  ring->end = (ring->end + 1) % ring->capacity;
    +
    54 }
    +
    int ring_full(Ring *ring)
    Definition: ring.c:20
    +
    void ring_grow(Ring *ring)
    Definition: ring.c:33
    +
    +
    +
    + +

    ◆ ring_put_block()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void ring_put_block (Ringring,
    int p,
    int q,
    int x,
    int y,
    int z,
    int w 
    )
    +
    + +

    Definition at line 56 of file ring.c.

    +
    56  {
    +
    57  RingEntry entry;
    +
    58  entry.type = BLOCK;
    +
    59  entry.p = p;
    +
    60  entry.q = q;
    +
    61  entry.x = x;
    +
    62  entry.y = y;
    +
    63  entry.z = z;
    +
    64  entry.w = w;
    +
    65  ring_put(ring, &entry);
    +
    66 }
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    +
    +
    + +

    ◆ ring_put_commit()

    + +
    +
    + + + + + + + + +
    void ring_put_commit (Ringring)
    +
    + +

    Definition at line 77 of file ring.c.

    +
    77  {
    +
    78  RingEntry entry;
    +
    79  entry.type = COMMIT;
    +
    80  ring_put(ring, &entry);
    +
    81 }
    +
    +
    +
    + +

    ◆ ring_put_exit()

    + +
    +
    + + + + + + + + +
    void ring_put_exit (Ringring)
    +
    + +

    Definition at line 83 of file ring.c.

    +
    83  {
    +
    84  RingEntry entry;
    +
    85  entry.type = EXIT;
    +
    86  ring_put(ring, &entry);
    +
    87 }
    +
    +
    +
    + +

    ◆ ring_put_key()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void ring_put_key (Ringring,
    int p,
    int q,
    int key 
    )
    +
    + +

    Definition at line 68 of file ring.c.

    +
    68  {
    +
    69  RingEntry entry;
    +
    70  entry.type = KEY;
    +
    71  entry.p = p;
    +
    72  entry.q = q;
    +
    73  entry.key = key;
    +
    74  ring_put(ring, &entry);
    +
    75 }
    +
    int key
    Definition: ring.h:19
    +
    +
    +
    + +

    ◆ ring_size()

    + +
    +
    + + + + + + + + +
    int ring_size (Ringring)
    +
    + +

    Definition at line 24 of file ring.c.

    +
    24  {
    +
    25  if (ring->end >= ring->start) {
    +
    26  return ring->end - ring->start;
    +
    27  }
    +
    28  else {
    +
    29  return ring->capacity - (ring->start - ring->end);
    +
    30  }
    +
    31 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/ring_8h_source.html b/documentation/html/ring_8h_source.html new file mode 100644 index 000000000..6191589e2 --- /dev/null +++ b/documentation/html/ring_8h_source.html @@ -0,0 +1,152 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    ring.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _ring_h_
    +
    2 #define _ring_h_
    +
    3 
    +
    4 typedef enum {
    + +
    6  KEY,
    + +
    8  EXIT
    + +
    10 
    +
    11 typedef struct {
    + +
    13  int p;
    +
    14  int q;
    +
    15  int x;
    +
    16  int y;
    +
    17  int z;
    +
    18  int w;
    +
    19  int key;
    +
    20 } RingEntry;
    +
    21 
    +
    22 typedef struct {
    +
    23  unsigned int capacity;
    +
    24  unsigned int start;
    +
    25  unsigned int end;
    + +
    27 } Ring;
    +
    28 
    +
    29 void ring_alloc(Ring *ring, int capacity);
    +
    30 void ring_free(Ring *ring);
    +
    31 int ring_empty(Ring *ring);
    +
    32 int ring_full(Ring *ring);
    +
    33 int ring_size(Ring *ring);
    +
    34 void ring_grow(Ring *ring);
    +
    35 void ring_put(Ring *ring, RingEntry *entry);
    +
    36 void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w);
    +
    37 void ring_put_key(Ring *ring, int p, int q, int key);
    + +
    39 void ring_put_exit(Ring *ring);
    +
    40 int ring_get(Ring *ring, RingEntry *entry);
    +
    41 
    +
    42 #endif
    +
    static Ring ring
    Definition: db.c:19
    +
    RingEntryType
    Definition: ring.h:4
    +
    @ BLOCK
    Definition: ring.h:5
    +
    @ KEY
    Definition: ring.h:6
    +
    @ COMMIT
    Definition: ring.h:7
    +
    @ EXIT
    Definition: ring.h:8
    +
    void ring_put_exit(Ring *ring)
    Definition: ring.c:83
    +
    int ring_get(Ring *ring, RingEntry *entry)
    Definition: ring.c:89
    +
    void ring_put(Ring *ring, RingEntry *entry)
    Definition: ring.c:47
    +
    void ring_put_key(Ring *ring, int p, int q, int key)
    Definition: ring.c:68
    +
    int ring_size(Ring *ring)
    Definition: ring.c:24
    +
    int ring_empty(Ring *ring)
    Definition: ring.c:16
    +
    void ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w)
    Definition: ring.c:56
    +
    void ring_put_commit(Ring *ring)
    Definition: ring.c:77
    +
    void ring_free(Ring *ring)
    Definition: ring.c:12
    +
    void ring_alloc(Ring *ring, int capacity)
    Definition: ring.c:5
    +
    int ring_full(Ring *ring)
    Definition: ring.c:20
    +
    void ring_grow(Ring *ring)
    Definition: ring.c:33
    +
    Definition: ring.h:11
    +
    int x
    Definition: ring.h:15
    +
    int w
    Definition: ring.h:18
    +
    int y
    Definition: ring.h:16
    +
    int p
    Definition: ring.h:13
    +
    int z
    Definition: ring.h:17
    +
    int key
    Definition: ring.h:19
    +
    int q
    Definition: ring.h:14
    +
    RingEntryType type
    Definition: ring.h:12
    +
    Definition: ring.h:22
    +
    unsigned int start
    Definition: ring.h:24
    +
    unsigned int capacity
    Definition: ring.h:23
    +
    RingEntry * data
    Definition: ring.h:26
    +
    unsigned int end
    Definition: ring.h:25
    +
    + + + + diff --git a/documentation/html/search/all_0.html b/documentation/html/search/all_0.html new file mode 100644 index 000000000..5775aa178 --- /dev/null +++ b/documentation/html/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_0.js b/documentation/html/search/all_0.js new file mode 100644 index 000000000..62e0b6bfb --- /dev/null +++ b/documentation/html/search/all_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_0',['__init__',['../classserver_1_1RateLimiter.html#a79f09a0b070dcbb8776671778ca2bb5d',1,'server.RateLimiter.__init__()'],['../classserver_1_1Model.html#a9a37ce5d48d65d1f73e3310dd540b5cd',1,'server.Model.__init__()'],['../classworld_1_1World.html#aa14e7c2893fec3ed9c695cf5ba95f214',1,'world.World.__init__()'],['../classbuilder_1_1Client.html#a02588c7babef701a3609e44f7ba83977',1,'builder.Client.__init__()']]], + ['_5fdb_5fcommit_1',['_db_commit',['../db_8c.html#a1aed58f7bcbe915810c97ae380182cd2',1,'db.c']]], + ['_5fdb_5finsert_5fblock_2',['_db_insert_block',['../db_8c.html#a27c690d52535957e0940b8f88f304055',1,'db.c']]], + ['_5fdb_5fset_5fkey_3',['_db_set_key',['../db_8c.html#a340f403eae6b8143d02523926bc5dacb',1,'db.c']]], + ['_5fgen_5fsign_5fbuffer_4',['_gen_sign_buffer',['../main_8c.html#ab1bd1e0b06d38e77710db3329d7f546e',1,'main.c']]], + ['_5fhit_5ftest_5',['_hit_test',['../main_8c.html#a23a93a17fa9eedfcbb6e7c8f482c7c4f',1,'main.c']]], + ['_5fmake_5fsphere_6',['_make_sphere',['../cube_8c.html#aacdaa9ca00caef345c32d9aae4ae54d3',1,'cube.c']]], + ['_5fset_5fblock_7',['_set_block',['../main_8c.html#a8847f3ae63584033b0761bb027a0df63',1,'main.c']]], + ['_5fset_5fsign_8',['_set_sign',['../main_8c.html#ab77a91105f29ae5a826f88a859fbb522',1,'main.c']]], + ['_5fsign_5flist_5fadd_9',['_sign_list_add',['../sign_8c.html#a0c57342de844454de7f77b1981b55227',1,'sign.c']]] +]; diff --git a/documentation/html/search/all_1.html b/documentation/html/search/all_1.html new file mode 100644 index 000000000..6cbe23813 --- /dev/null +++ b/documentation/html/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_1.js b/documentation/html/search/all_1.js new file mode 100644 index 000000000..cd10ffa82 --- /dev/null +++ b/documentation/html/search/all_1.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['abs_10',['ABS',['../util_8h.html#a996f7be338ccb40d1a2a5abc1ad61759',1,'util.h']]], + ['add_5fmessage_11',['add_message',['../main_8c.html#af2984ac5e1b64e1c902ee5cec60c4a85',1,'main.c']]], + ['align_5fcenter_12',['ALIGN_CENTER',['../main_8c.html#a20f6c07b59d81220069af96131a9982f',1,'main.c']]], + ['align_5fleft_13',['ALIGN_LEFT',['../main_8c.html#a666975a1345df39683a0a65b81466b20',1,'main.c']]], + ['align_5fright_14',['ALIGN_RIGHT',['../main_8c.html#a9a7eca07c41cee4267778375e95c8c89',1,'main.c']]], + ['allow_5freuse_5faddress_15',['allow_reuse_address',['../classserver_1_1Server.html#a7c1648959a23d4d8809c3998bd332d05',1,'server::Server']]], + ['allowance_16',['allowance',['../classserver_1_1RateLimiter.html#a38671d921e0ab4188215da3b931681c6',1,'server::RateLimiter']]], + ['allowed_5fitems_17',['ALLOWED_ITEMS',['../namespaceserver.html#a8c7e21677cb482c3179cb33989c34e40',1,'server']]], + ['alpha_5fbuffer_18',['alpha_buffer',['../structChunk.html#a83a9bda3ad0b6a842297d3c7a7391494',1,'Chunk']]], + ['alpha_5ffaces_19',['alpha_faces',['../structChunk.html#a3b448dbc9b483e6a486d143d681fce32',1,'Chunk']]], + ['attrib_20',['Attrib',['../structAttrib.html',1,'']]], + ['auth_2ec_21',['auth.c',['../auth_8c.html',1,'']]], + ['auth_2eh_22',['auth.h',['../auth_8h.html',1,'']]], + ['authenticate_23',['authenticate',['../classbuilder_1_1Client.html#ae97da152d9317fa09c7557e7741a010a',1,'builder::Client']]], + ['authenticate_24',['AUTHENTICATE',['../namespaceserver.html#ab98a35ee77382d77ac58e454c03a0225',1,'server']]] +]; diff --git a/documentation/html/search/all_10.html b/documentation/html/search/all_10.html new file mode 100644 index 000000000..54aed4c1c --- /dev/null +++ b/documentation/html/search/all_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_10.js b/documentation/html/search/all_10.js new file mode 100644 index 000000000..f493e8cb2 --- /dev/null +++ b/documentation/html/search/all_10.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['q_455',['q',['../structChunk.html#a20fb30e8ac307726320ef6d3e4cd89a1',1,'Chunk::q()'],['../structRingEntry.html#ae944a4f58e8d867035a9d94366615ff2',1,'RingEntry::q()']]], + ['qsize_456',['qsize',['../client_8c.html#a3751980c94cdf8b2e167fa7d0c0ab24e',1,'client.c']]], + ['queue_457',['queue',['../classserver_1_1Handler.html#a437d5a22c96f1423facc1a87c546bfe9',1,'server.Handler.queue()'],['../classserver_1_1Model.html#a65c1208dbbe27fc4c2ebf9dbb465e8b2',1,'server.Model.queue()'],['../client_8c.html#abdac8928627c8ca88b5b325d9916d218',1,'queue(): client.c']]], + ['queue_5fsize_458',['QUEUE_SIZE',['../client_8c.html#a142810068f1b99cd93d3fc9f0e160e02',1,'client.c']]] +]; diff --git a/documentation/html/search/all_11.html b/documentation/html/search/all_11.html new file mode 100644 index 000000000..2cb14d058 --- /dev/null +++ b/documentation/html/search/all_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_11.js b/documentation/html/search/all_11.js new file mode 100644 index 000000000..0298cbda6 --- /dev/null +++ b/documentation/html/search/all_11.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['radians_459',['RADIANS',['../util_8h.html#a4dddbaece4412db60bf53ae8c509f8b8',1,'util.h']]], + ['rain_460',['RAIN',['../item_8h.html#a6a1f6ca4aa84c21d62a4c18bd9da4bea',1,'item.h']]], + ['rand_5fdouble_461',['rand_double',['../util_8h.html#a2e6a2be33dfea7b0858bfb3e278739d4',1,'rand_double(): util.c'],['../util_8c.html#a2e6a2be33dfea7b0858bfb3e278739d4',1,'rand_double(): util.c']]], + ['rand_5fint_462',['rand_int',['../util_8h.html#ab3aa48bb968d9217f198e8453134682b',1,'rand_int(int n): util.c'],['../util_8c.html#ab3aa48bb968d9217f198e8453134682b',1,'rand_int(int n): util.c']]], + ['rate_463',['rate',['../classserver_1_1RateLimiter.html#aa1675e0ed19da619c2d1cc3db01190f8',1,'server::RateLimiter']]], + ['rate_5flimit_464',['RATE_LIMIT',['../namespaceserver.html#acee82c390c8493ae35b967f5480555e6',1,'server']]], + ['ratelimiter_465',['RateLimiter',['../classserver_1_1RateLimiter.html',1,'server']]], + ['readme_2emd_466',['README.md',['../README_8md.html',1,'']]], + ['record_5fblock_467',['record_block',['../main_8c.html#aacb965834490b4528ee30ecf2eb73083',1,'main.c']]], + ['record_5fhistory_468',['RECORD_HISTORY',['../namespaceserver.html#a7cb7ac5d339b3f66fe850384732d60bb',1,'server']]], + ['recv_5fsize_469',['RECV_SIZE',['../client_8c.html#ab05e00e8cea9db60202e746d95818997',1,'client.c']]], + ['recv_5fthread_470',['recv_thread',['../client_8c.html#aaaa4e25033f4df7812de0122aff7b40d',1,'client.c']]], + ['recv_5fworker_471',['recv_worker',['../client_8c.html#a922af254b68a706c1b204a97cba3ccbf',1,'client.c']]], + ['red_5fflower_472',['RED_FLOWER',['../namespacebuilder.html#a361f85656bf470c91b7e1b035df92caa',1,'builder.RED_FLOWER()'],['../item_8h.html#a4d1c84401038068e519348233056cfe6',1,'RED_FLOWER(): item.h']]], + ['redraw_473',['REDRAW',['../namespaceserver.html#afe06f029a20a3be127ac2048838c562a',1,'server']]], + ['render_5fchunk_5fradius_474',['RENDER_CHUNK_RADIUS',['../config_8h.html#a7c7fd1ef1a74541e26772d73992a8161',1,'config.h']]], + ['render_5fchunks_475',['render_chunks',['../main_8c.html#ae606a2951510e86ae17a7f69196f97db',1,'main.c']]], + ['render_5fcrosshairs_476',['render_crosshairs',['../main_8c.html#a34702deb10cdedcaa5554711717b923b',1,'main.c']]], + ['render_5fitem_477',['render_item',['../main_8c.html#af208128cbd68d5022f502e30a1ec6598',1,'main.c']]], + ['render_5fplayers_478',['render_players',['../main_8c.html#a57227f3434ef3ccae1522023f628d279',1,'main.c']]], + ['render_5fradius_479',['render_radius',['../structModel.html#a78738d6f90d8a11202fec26912dddcde',1,'Model']]], + ['render_5fsign_480',['render_sign',['../main_8c.html#ae8ac7b58095db14ca322b89901429b47',1,'main.c']]], + ['render_5fsign_5fradius_481',['RENDER_SIGN_RADIUS',['../config_8h.html#a1a202d5cc24295b4e65da951c50a5641',1,'config.h']]], + ['render_5fsigns_482',['render_signs',['../main_8c.html#a72d53759b1a64fedf6a18f2c92953525',1,'main.c']]], + ['render_5fsky_483',['render_sky',['../main_8c.html#a7800e3b4ad569ed438df3871cb6701c9',1,'main.c']]], + ['render_5ftext_484',['render_text',['../main_8c.html#ad7f1f9ef0a5f8b1449817d47d491d6da',1,'main.c']]], + ['render_5fwireframe_485',['render_wireframe',['../main_8c.html#ab192438da214c27fbdd0592718271760',1,'main.c']]], + ['reset_5fmodel_486',['reset_model',['../main_8c.html#a23db54f632c979fde371d228bfe0cae3',1,'main.c']]], + ['ring_487',['Ring',['../structRing.html',1,'']]], + ['ring_488',['ring',['../db_8c.html#afa742309dafdf7b11fa0328bce577488',1,'db.c']]], + ['ring_2ec_489',['ring.c',['../ring_8c.html',1,'']]], + ['ring_2eh_490',['ring.h',['../ring_8h.html',1,'']]], + ['ring_5falloc_491',['ring_alloc',['../ring_8c.html#ad4cc1655953e5d466e2af18d3964b47a',1,'ring_alloc(Ring *ring, int capacity): ring.c'],['../ring_8h.html#ad4cc1655953e5d466e2af18d3964b47a',1,'ring_alloc(Ring *ring, int capacity): ring.c']]], + ['ring_5fempty_492',['ring_empty',['../ring_8c.html#a83a32c4d16f4e3328527b0d29322ed9b',1,'ring_empty(Ring *ring): ring.c'],['../ring_8h.html#a83a32c4d16f4e3328527b0d29322ed9b',1,'ring_empty(Ring *ring): ring.c']]], + ['ring_5ffree_493',['ring_free',['../ring_8h.html#ac118febd8ec65f7585e894e5ca969937',1,'ring_free(Ring *ring): ring.c'],['../ring_8c.html#ac118febd8ec65f7585e894e5ca969937',1,'ring_free(Ring *ring): ring.c']]], + ['ring_5ffull_494',['ring_full',['../ring_8h.html#adac33570346369d728076bbe591691e8',1,'ring_full(Ring *ring): ring.c'],['../ring_8c.html#adac33570346369d728076bbe591691e8',1,'ring_full(Ring *ring): ring.c']]], + ['ring_5fget_495',['ring_get',['../ring_8h.html#a25d2d3f13927082392e31f9cce8458cc',1,'ring_get(Ring *ring, RingEntry *entry): ring.c'],['../ring_8c.html#a25d2d3f13927082392e31f9cce8458cc',1,'ring_get(Ring *ring, RingEntry *entry): ring.c']]], + ['ring_5fgrow_496',['ring_grow',['../ring_8c.html#af99075f7c12d105820d3c3f20eb3d5d4',1,'ring_grow(Ring *ring): ring.c'],['../ring_8h.html#af99075f7c12d105820d3c3f20eb3d5d4',1,'ring_grow(Ring *ring): ring.c']]], + ['ring_5fput_497',['ring_put',['../ring_8c.html#a379859f8ee53d4fb3c016de36dd14f22',1,'ring_put(Ring *ring, RingEntry *entry): ring.c'],['../ring_8h.html#a379859f8ee53d4fb3c016de36dd14f22',1,'ring_put(Ring *ring, RingEntry *entry): ring.c']]], + ['ring_5fput_5fblock_498',['ring_put_block',['../ring_8c.html#ab1fa391df9733df1b58827240e99954e',1,'ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w): ring.c'],['../ring_8h.html#ab1fa391df9733df1b58827240e99954e',1,'ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w): ring.c']]], + ['ring_5fput_5fcommit_499',['ring_put_commit',['../ring_8c.html#ab7a367af51dacbcd3c9ffb88fbd8c1a0',1,'ring_put_commit(Ring *ring): ring.c'],['../ring_8h.html#ab7a367af51dacbcd3c9ffb88fbd8c1a0',1,'ring_put_commit(Ring *ring): ring.c']]], + ['ring_5fput_5fexit_500',['ring_put_exit',['../ring_8c.html#a0a87dd1378715ffd2977242d69d42686',1,'ring_put_exit(Ring *ring): ring.c'],['../ring_8h.html#a0a87dd1378715ffd2977242d69d42686',1,'ring_put_exit(Ring *ring): ring.c']]], + ['ring_5fput_5fkey_501',['ring_put_key',['../ring_8c.html#a673500aea8aa32ee2a49e38cc1613ca6',1,'ring_put_key(Ring *ring, int p, int q, int key): ring.c'],['../ring_8h.html#a673500aea8aa32ee2a49e38cc1613ca6',1,'ring_put_key(Ring *ring, int p, int q, int key): ring.c']]], + ['ring_5fsize_502',['ring_size',['../ring_8c.html#a835e6cd0d6cb90357b672fab9f652fb3',1,'ring_size(Ring *ring): ring.c'],['../ring_8h.html#a835e6cd0d6cb90357b672fab9f652fb3',1,'ring_size(Ring *ring): ring.c']]], + ['ringentry_503',['RingEntry',['../structRingEntry.html',1,'']]], + ['ringentrytype_504',['RingEntryType',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420d',1,'ring.h']]], + ['run_505',['run',['../classserver_1_1Handler.html#a038cf34aa93784b15e966ea770ccbb51',1,'server.Handler.run()'],['../classserver_1_1Model.html#a6ea5ba19abb493d10867d27edba9bb82',1,'server.Model.run()']]], + ['running_506',['running',['../client_8c.html#a2f45113638a0b749a8a205d2cd7fb42b',1,'running(): client.c'],['../classserver_1_1Handler.html#a06c044d851fc4b905d6dde0f005c3860',1,'server.Handler.running()']]], + ['rx_507',['rx',['../structState.html#a44129661bc65bbbb6147793fd196c89f',1,'State']]], + ['ry_508',['ry',['../structState.html#a9644786d1cc6a604052cc8eac719b888',1,'State']]] +]; diff --git a/documentation/html/search/all_12.html b/documentation/html/search/all_12.html new file mode 100644 index 000000000..62953a199 --- /dev/null +++ b/documentation/html/search/all_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_12.js b/documentation/html/search/all_12.js new file mode 100644 index 000000000..77d28629b --- /dev/null +++ b/documentation/html/search/all_12.js @@ -0,0 +1,73 @@ +var searchData= +[ + ['sampler_509',['sampler',['../structAttrib.html#ab176427e061e47c040d0a8d25488fd6d',1,'Attrib']]], + ['sand_510',['SAND',['../namespacebuilder.html#ad876414bda38386184fee1ddf6cb334f',1,'builder.SAND()'],['../item_8h.html#ab83ae9a4c2ef10fadfc4e9ea51b67822',1,'SAND(): item.h']]], + ['scale_511',['scale',['../structModel.html#a2e5100141918bee00883703185ed79cd',1,'Model']]], + ['scroll_5fthreshold_512',['SCROLL_THRESHOLD',['../config_8h.html#ac692301c711d104351c4044814129879',1,'config.h']]], + ['sd_513',['sd',['../client_8c.html#a06b0afe769d54ae94259d8532bc878b0',1,'client.c']]], + ['seed_514',['seed',['../classworld_1_1World.html#a4574f62bbf51758fe54381eb4b655505',1,'world::World']]], + ['send_515',['send',['../classserver_1_1Handler.html#adb6dffc7bc471dbecdd82d239062dc02',1,'server::Handler']]], + ['send_5fblock_516',['send_block',['../classserver_1_1Model.html#a24dcce0e4633051852b7bff4901ef13d',1,'server::Model']]], + ['send_5fdisconnect_517',['send_disconnect',['../classserver_1_1Model.html#a1fb58f37e3b98007a6e220a18d0abb4d',1,'server::Model']]], + ['send_5fnick_518',['send_nick',['../classserver_1_1Model.html#a9acbf2a15a0a96e0232b9ac22173496d',1,'server::Model']]], + ['send_5fnicks_519',['send_nicks',['../classserver_1_1Model.html#ab39036fff36add7d7dced2892d4f7749',1,'server::Model']]], + ['send_5fposition_520',['send_position',['../classserver_1_1Model.html#af0f14f4dd4c97c00023ba014ae6974b0',1,'server::Model']]], + ['send_5fpositions_521',['send_positions',['../classserver_1_1Model.html#aa37bc39f34c8cb3a0f72c47c6cb44f6e',1,'server::Model']]], + ['send_5fraw_522',['send_raw',['../classserver_1_1Handler.html#af411766d0b950162a257d9af739e7351',1,'server::Handler']]], + ['send_5fsign_523',['send_sign',['../classserver_1_1Model.html#ad9bb38de307f92f2e34059e8c21217b8',1,'server::Model']]], + ['send_5ftalk_524',['send_talk',['../classserver_1_1Model.html#ac72b296e1388a69afa59ccb6a1412770',1,'server::Model']]], + ['sensitivity_525',['sensitivity',['../structModel.html#a4ba66e0c4dd5a20eace9081426f82c47',1,'Model']]], + ['server_526',['server',['../namespaceserver.html',1,'']]], + ['server_527',['Server',['../classserver_1_1Server.html',1,'server']]], + ['server_2epy_528',['server.py',['../server_8py.html',1,'']]], + ['server_5faddr_529',['server_addr',['../structModel.html#a945af3964810abe23abf7324a3da1b35',1,'Model']]], + ['server_5fport_530',['server_port',['../structModel.html#ac47fe750112140fe346c32524bf1121b',1,'Model']]], + ['set_5fblock_531',['set_block',['../classbuilder_1_1Client.html#acafa155f4906f3a23059e1cd30118172',1,'builder.Client.set_block()'],['../main_8c.html#aa0109282762c178948a57c6baee6ee32',1,'set_block(): main.c']]], + ['set_5fblocks_532',['set_blocks',['../classbuilder_1_1Client.html#a884f5ca5df910e82ed1fee3f6aae5140',1,'builder::Client']]], + ['set_5fkey_5fstmt_533',['set_key_stmt',['../db_8c.html#afe814e94032ba31c149d04cfab27e69a',1,'db.c']]], + ['set_5fmatrix_5f2d_534',['set_matrix_2d',['../matrix_8h.html#a5e1425d81e31dc21b5015b1cfbe2c1e2',1,'set_matrix_2d(float *matrix, int width, int height): matrix.c'],['../matrix_8c.html#a5e1425d81e31dc21b5015b1cfbe2c1e2',1,'set_matrix_2d(float *matrix, int width, int height): matrix.c']]], + ['set_5fmatrix_5f3d_535',['set_matrix_3d',['../matrix_8h.html#a4b924b6286bd77a90a0f4b685421ba8c',1,'set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius): matrix.c'],['../matrix_8c.html#a4b924b6286bd77a90a0f4b685421ba8c',1,'set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius): matrix.c']]], + ['set_5fmatrix_5fitem_536',['set_matrix_item',['../matrix_8c.html#a8fd3bdaeea6a8bc0bf64a09b689d7662',1,'set_matrix_item(float *matrix, int width, int height, int scale): matrix.c'],['../matrix_8h.html#a8fd3bdaeea6a8bc0bf64a09b689d7662',1,'set_matrix_item(float *matrix, int width, int height, int scale): matrix.c']]], + ['set_5fsign_537',['set_sign',['../main_8c.html#a2eaac3f4ff872ace636b77f370d7df2a',1,'main.c']]], + ['setup_538',['setup',['../classserver_1_1Handler.html#aaa1010b08d4c9870e25c57ea41f48d27',1,'server::Handler']]], + ['show_5fchat_5ftext_539',['SHOW_CHAT_TEXT',['../config_8h.html#acc34b46ff6ecc6f7c5224ef6193a607e',1,'config.h']]], + ['show_5fclouds_540',['SHOW_CLOUDS',['../config_8h.html#a6346b7ca36e603d858ef9d2ea8c2be52',1,'config.h']]], + ['show_5fcrosshairs_541',['SHOW_CROSSHAIRS',['../config_8h.html#a31b9bc0941bf92088e09b11b5b3166f7',1,'config.h']]], + ['show_5finfo_5ftext_542',['SHOW_INFO_TEXT',['../config_8h.html#a128cde77348b6316727e18f27040cece',1,'config.h']]], + ['show_5fitem_543',['SHOW_ITEM',['../config_8h.html#af6692069acd5df58af89424cbfb98f3b',1,'config.h']]], + ['show_5fplants_544',['SHOW_PLANTS',['../config_8h.html#a43009e966526eca8039a5938b0235141',1,'config.h']]], + ['show_5fplayer_5fnames_545',['SHOW_PLAYER_NAMES',['../config_8h.html#a6f50abc8e94d0fc59e334503629f2ff0',1,'config.h']]], + ['show_5ftrees_546',['SHOW_TREES',['../config_8h.html#a747af1c781a2b192ea14e7605a087e89',1,'config.h']]], + ['show_5fwireframe_547',['SHOW_WIREFRAME',['../config_8h.html#a3487c25b932bb91402702c90fa28d0df',1,'config.h']]], + ['sign_548',['SIGN',['../util_8h.html#a8c5ff70b6b28cd0157c50a22406f92c4',1,'SIGN(): util.h'],['../namespaceserver.html#a5fd416c9b80e5cb2b3860a1d5486c01b',1,'server.SIGN()']]], + ['sign_549',['Sign',['../structSign.html',1,'']]], + ['sign_2ec_550',['sign.c',['../sign_8c.html',1,'']]], + ['sign_2eh_551',['sign.h',['../sign_8h.html',1,'']]], + ['sign_5fbuffer_552',['sign_buffer',['../structChunk.html#a7c89d7fc29dbdd94c50280e92def013c',1,'Chunk']]], + ['sign_5ffaces_553',['sign_faces',['../structChunk.html#a6ffdf89c012dfaefe531aa0eb93fe69a',1,'Chunk']]], + ['sign_5flist_5fadd_554',['sign_list_add',['../sign_8h.html#aae114a42cacb505071f226ec3a4c39c7',1,'sign_list_add(SignList *list, int x, int y, int z, int face, const char *text): sign.c'],['../sign_8c.html#aae114a42cacb505071f226ec3a4c39c7',1,'sign_list_add(SignList *list, int x, int y, int z, int face, const char *text): sign.c']]], + ['sign_5flist_5falloc_555',['sign_list_alloc',['../sign_8h.html#a6ec34964157462244e401d16e07ddc4e',1,'sign_list_alloc(SignList *list, int capacity): sign.c'],['../sign_8c.html#a6ec34964157462244e401d16e07ddc4e',1,'sign_list_alloc(SignList *list, int capacity): sign.c']]], + ['sign_5flist_5ffree_556',['sign_list_free',['../sign_8h.html#a73e97d25bafe85b24aa63050cd4763c7',1,'sign_list_free(SignList *list): sign.c'],['../sign_8c.html#a73e97d25bafe85b24aa63050cd4763c7',1,'sign_list_free(SignList *list): sign.c']]], + ['sign_5flist_5fgrow_557',['sign_list_grow',['../sign_8h.html#a637236c63ead3d87890a7caf28c956c0',1,'sign_list_grow(SignList *list): sign.c'],['../sign_8c.html#a637236c63ead3d87890a7caf28c956c0',1,'sign_list_grow(SignList *list): sign.c']]], + ['sign_5flist_5fremove_558',['sign_list_remove',['../sign_8c.html#a27610f7da6a948fcc73b3dd424dbf3d6',1,'sign_list_remove(SignList *list, int x, int y, int z, int face): sign.c'],['../sign_8h.html#a27610f7da6a948fcc73b3dd424dbf3d6',1,'sign_list_remove(SignList *list, int x, int y, int z, int face): sign.c']]], + ['sign_5flist_5fremove_5fall_559',['sign_list_remove_all',['../sign_8c.html#a78eb1832d934d3bd41dad63fd17de6f3',1,'sign_list_remove_all(SignList *list, int x, int y, int z): sign.c'],['../sign_8h.html#a78eb1832d934d3bd41dad63fd17de6f3',1,'sign_list_remove_all(SignList *list, int x, int y, int z): sign.c']]], + ['sign_5fradius_560',['sign_radius',['../structModel.html#a27a1d8e175370c2b238acb4e6f68e9b7',1,'Model']]], + ['signlist_561',['SignList',['../structSignList.html',1,'']]], + ['signs_562',['signs',['../structChunk.html#acd18dcf6bf17f499e36b5806519d8800',1,'Chunk']]], + ['since_563',['since',['../structFPS.html#a00ae9e9c14b85585e20122a32e35000d',1,'FPS']]], + ['size_564',['size',['../structMap.html#a73754296f937e5d5fbf40b4be90c8e8c',1,'Map::size()'],['../structSignList.html#a1a62d68f9161254e618060ab4ffe2d89',1,'SignList::size()']]], + ['slowed_565',['slowed',['../structModel.html#ab133783da63ae092914af414a2ea7da4',1,'Model']]], + ['snow_566',['SNOW',['../item_8h.html#aa333391aab78ded801da8425068ce564',1,'SNOW(): item.h'],['../namespacebuilder.html#a5ae2e76a2f38da3947d65272682d36bb',1,'builder.SNOW()']]], + ['spawn_5fpoint_567',['SPAWN_POINT',['../namespaceserver.html#a0ecaf08992cd9836ad247f6dc33ba933',1,'server']]], + ['sphere_568',['sphere',['../namespacebuilder.html#a8e9ab9906fbfd581f328d952dbb7cbef',1,'builder.sphere()'],['../main_8c.html#ab2c75ed50f10bc153a35a86603c691d6',1,'sphere(): main.c']]], + ['start_569',['start',['../structRing.html#a05ded3e84726b36d0b2266e733ddc61e',1,'Ring::start()'],['../classserver_1_1Handler.html#a9559ddb3e1f06933cb4fbbc9513fced8',1,'server.Handler.start()'],['../classserver_1_1Model.html#a24d947d23fffd4f1fa2adffdffa7ad46',1,'server.Model.start()']]], + ['state_570',['State',['../structState.html',1,'']]], + ['state_571',['state',['../structPlayer.html#ac4a623bf6650a719187c50bb0413b9a0',1,'Player']]], + ['state1_572',['state1',['../structPlayer.html#a7712ad6df23e875de18fb38537620909',1,'Player']]], + ['state2_573',['state2',['../structPlayer.html#a7b894c51bb7a740af4a2ffef56a4e788',1,'Player']]], + ['stone_574',['STONE',['../item_8h.html#a3a50d6c3dd0fbb5b801d6efe0279d267',1,'STONE(): item.h'],['../namespacebuilder.html#a1432b48ab2f4be80e2398b0ace4be53b',1,'builder.STONE()']]], + ['stop_575',['stop',['../classserver_1_1Handler.html#aa48211356bb980e565bfb750c670f958',1,'server::Handler']]], + ['string_5fwidth_576',['string_width',['../util_8c.html#a728bd548775520de6222770522208b4e',1,'string_width(const char *input): util.c'],['../util_8h.html#a728bd548775520de6222770522208b4e',1,'string_width(const char *input): util.c']]], + ['sun_5fflower_577',['SUN_FLOWER',['../item_8h.html#a63c6efb1d85af83ec0f6d7259a2902c7',1,'SUN_FLOWER(): item.h'],['../namespacebuilder.html#a7bf0fa135b8132a37cd64f58f8517fa4',1,'builder.SUN_FLOWER()']]], + ['suppress_5fchar_578',['suppress_char',['../structModel.html#a71a28fca3a64903ea725641e4f63030b',1,'Model']]] +]; diff --git a/documentation/html/search/all_13.html b/documentation/html/search/all_13.html new file mode 100644 index 000000000..f79da6b21 --- /dev/null +++ b/documentation/html/search/all_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_13.js b/documentation/html/search/all_13.js new file mode 100644 index 000000000..550f1537d --- /dev/null +++ b/documentation/html/search/all_13.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['t_579',['t',['../structState.html#ab1a06cd5c56832f61483d897879e2b35',1,'State']]], + ['talk_580',['TALK',['../namespaceserver.html#a138ab9e0bff57cc5f21bfef69bd95757',1,'server']]], + ['tall_5fgrass_581',['TALL_GRASS',['../item_8h.html#aa5a963e1f0a969b7735cb7ff14024104',1,'TALL_GRASS(): item.h'],['../namespacebuilder.html#a2257d9d17c745213021539e95cea6ed7',1,'builder.TALL_GRASS()']]], + ['text_582',['text',['../structSign.html#aa3053ca28e2fecc26cfbef7797da4646',1,'Sign']]], + ['thrd_583',['thrd',['../db_8c.html#a5afe4fcdfbd486e2e63008a59ea6242f',1,'db.c']]], + ['tick_584',['tick',['../classserver_1_1RateLimiter.html#ade1ad2750a0031068879aae684adb78c',1,'server::RateLimiter']]], + ['time_5fof_5fday_585',['time_of_day',['../main_8c.html#ae0e8aeb03f12e7b13f5c13d145ae022c',1,'main.c']]], + ['timer_586',['timer',['../structAttrib.html#aa27da229009adea9e3729e80f7b200b5',1,'Attrib']]], + ['tokenize_587',['tokenize',['../util_8c.html#a30683869eded6403175a3eb66e005151',1,'tokenize(char *str, const char *delim, char **key): util.c'],['../util_8h.html#a30683869eded6403175a3eb66e005151',1,'tokenize(char *str, const char *delim, char **key): util.c']]], + ['tree_588',['tree',['../main_8c.html#aafcc3a35543a6ccedfaa0b09729b027b',1,'main.c']]], + ['type_589',['type',['../structRingEntry.html#afc77cc123c354240feba6e92dd4ee882',1,'RingEntry']]], + ['typing_590',['typing',['../structModel.html#a2fcef6db45ecfe5abca7e531c3edd58d',1,'Model']]], + ['typing_5fbuffer_591',['typing_buffer',['../structModel.html#a69f3bc4862cb7190f7d28013da4fe629',1,'Model']]] +]; diff --git a/documentation/html/search/all_14.html b/documentation/html/search/all_14.html new file mode 100644 index 000000000..9be989321 --- /dev/null +++ b/documentation/html/search/all_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_14.js b/documentation/html/search/all_14.js new file mode 100644 index 000000000..35d153f65 --- /dev/null +++ b/documentation/html/search/all_14.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['unset_5fsign_592',['unset_sign',['../main_8c.html#acfcd284d81a6f4a27b2850ea0e952456',1,'main.c']]], + ['unset_5fsign_5fface_593',['unset_sign_face',['../main_8c.html#a8c8596c8de141b83dbb8cba29f90f36d',1,'main.c']]], + ['update_5ffps_594',['update_fps',['../util_8c.html#af7a80b947fb2bfff0485a23a3389af76',1,'update_fps(FPS *fps): util.c'],['../util_8h.html#af7a80b947fb2bfff0485a23a3389af76',1,'update_fps(FPS *fps): util.c']]], + ['update_5fplayer_595',['update_player',['../main_8c.html#aae6fa4026cff542c294864f1e561fce9',1,'main.c']]], + ['use_5fcache_596',['USE_CACHE',['../config_8h.html#a2565afea33c9e3255c67f748f425543a',1,'config.h']]], + ['user_5fid_597',['user_id',['../classserver_1_1Handler.html#a368e5ec92d1541bb7ee848835e2cdc1f',1,'server::Handler']]], + ['util_2ec_598',['util.c',['../util_8c.html',1,'']]], + ['util_2eh_599',['util.h',['../util_8h.html',1,'']]], + ['uv_600',['uv',['../structAttrib.html#a91a6c5203f836990dfd2529a4dd128ce',1,'Attrib']]] +]; diff --git a/documentation/html/search/all_15.html b/documentation/html/search/all_15.html new file mode 100644 index 000000000..c31349869 --- /dev/null +++ b/documentation/html/search/all_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_15.js b/documentation/html/search/all_15.js new file mode 100644 index 000000000..53673a7fc --- /dev/null +++ b/documentation/html/search/all_15.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['version_601',['version',['../classserver_1_1Handler.html#a515ccd70de8f9d2a4cbbb1c1c314837e',1,'server::Handler']]], + ['version_602',['VERSION',['../namespaceserver.html#a63a0d74b795fcfd6bfc49c1f6deeb69d',1,'server']]], + ['vsync_603',['VSYNC',['../config_8h.html#a01f87c3323a461cee54d6092b5d7fb34',1,'config.h']]] +]; diff --git a/documentation/html/search/all_16.html b/documentation/html/search/all_16.html new file mode 100644 index 000000000..5c2e4c0dc --- /dev/null +++ b/documentation/html/search/all_16.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_16.js b/documentation/html/search/all_16.js new file mode 100644 index 000000000..2caf46098 --- /dev/null +++ b/documentation/html/search/all_16.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['w_604',['w',['../structBlock.html#aea0530a4c08ea5892151575b5301940e',1,'Block::w()'],['../structMapEntry.html#a969cff77cf8a833cdf44d55da4428618',1,'MapEntry::w()'],['../structRingEntry.html#a5c4cd66b932f7f6c430b12b9b6dc4007',1,'RingEntry::w()']]], + ['water_605',['WATER',['../item_8h.html#a5c3fbf45abc4ee50d118d87aecfee212',1,'item.h']]], + ['white_5fflower_606',['WHITE_FLOWER',['../namespacebuilder.html#a28480e397c9c49cc05809b655153e304',1,'builder.WHITE_FLOWER()'],['../item_8h.html#a7ab3bf862a292fa7aa7d3c73e3c1d251',1,'WHITE_FLOWER(): item.h']]], + ['width_607',['width',['../structModel.html#a95fedd30937f05f07f81b7fa3aa29add',1,'Model']]], + ['window_608',['window',['../structModel.html#af15f84653ef65888f996e6b78c1d6ff7',1,'Model']]], + ['window_5fheight_609',['WINDOW_HEIGHT',['../config_8h.html#a5473cf64fa979b48335079c99532e243',1,'config.h']]], + ['window_5fwidth_610',['WINDOW_WIDTH',['../config_8h.html#a498d9f026138406895e9a34b504ac6a6',1,'config.h']]], + ['wood_611',['WOOD',['../namespacebuilder.html#a1dc2ae6aeebd5316454edef5c31c7185',1,'builder.WOOD()'],['../item_8h.html#a7860700630bf29714303de1213ece9d2',1,'WOOD(): item.h']]], + ['world_612',['world',['../namespaceworld.html',1,'world'],['../classserver_1_1Model.html#a6107594ebcdc6ff20794651a2f12e5b7',1,'server.Model.world()']]], + ['world_613',['World',['../classworld_1_1World.html',1,'world']]], + ['world_2ec_614',['world.c',['../world_8c.html',1,'']]], + ['world_2eh_615',['world.h',['../world_8h.html',1,'']]], + ['world_2epy_616',['world.py',['../world_8py.html',1,'']]], + ['world_5ffunc_617',['WORLD_FUNC',['../namespaceworld.html#a2babf84acf1429abd767fd6e9e7311a9',1,'world']]], + ['world_5ffunc_618',['world_func',['../world_8h.html#af39b6218b1ef794648fd33f67791fdfd',1,'world.h']]], + ['wrap_619',['wrap',['../util_8c.html#ac8c3171cba45384557e11e37193387f4',1,'wrap(const char *input, int max_width, char *output, int max_length): util.c'],['../util_8h.html#ac8c3171cba45384557e11e37193387f4',1,'wrap(const char *input, int max_width, char *output, int max_length): util.c']]], + ['write_5ffunction_620',['write_function',['../auth_8c.html#a0100ee31782b24826f9799c16987d01d',1,'auth.c']]] +]; diff --git a/documentation/html/search/all_17.html b/documentation/html/search/all_17.html new file mode 100644 index 000000000..961ea4061 --- /dev/null +++ b/documentation/html/search/all_17.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_17.js b/documentation/html/search/all_17.js new file mode 100644 index 000000000..b389f77aa --- /dev/null +++ b/documentation/html/search/all_17.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_621',['x',['../structBlock.html#a13d0a6d225233353862fa5adcbadf661',1,'Block::x()'],['../structState.html#a9948cc668f49246582cfd131b7928f7e',1,'State::x()'],['../structMapEntry.html#a6da0d8c945c9cc674b888c899ca86ea0',1,'MapEntry::x()'],['../structRingEntry.html#a1d73e65971815248e917087ca69afd63',1,'RingEntry::x()'],['../structSign.html#a9672fe58fa3a1d75c9511fe8259eb4e6',1,'Sign::x()']]] +]; diff --git a/documentation/html/search/all_18.html b/documentation/html/search/all_18.html new file mode 100644 index 000000000..c81b0f578 --- /dev/null +++ b/documentation/html/search/all_18.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_18.js b/documentation/html/search/all_18.js new file mode 100644 index 000000000..edbb15c31 --- /dev/null +++ b/documentation/html/search/all_18.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['y_622',['y',['../structBlock.html#a9328d6b6fcc9f9c019d091d87ceda41c',1,'Block::y()'],['../structState.html#a89572abb38dea3b1a780ede589a2d59b',1,'State::y()'],['../structMapEntry.html#a8584df6a55b3d64744583fb532b8ee92',1,'MapEntry::y()'],['../structRingEntry.html#a7f50629b87d74360c6726903cf1452d2',1,'RingEntry::y()'],['../structSign.html#afdd7a7b76acc62dfd45965caed37c3f3',1,'Sign::y()']]], + ['yellow_5fflower_623',['YELLOW_FLOWER',['../item_8h.html#a04e01e6b4bdfaadd31982070a3f173ad',1,'YELLOW_FLOWER(): item.h'],['../namespacebuilder.html#a120b3c6f77479b02f91df2bfe9183c16',1,'builder.YELLOW_FLOWER()']]], + ['you_624',['YOU',['../namespaceserver.html#a5c20fc4310a3196a277de462c63ac23b',1,'server']]] +]; diff --git a/documentation/html/search/all_19.html b/documentation/html/search/all_19.html new file mode 100644 index 000000000..0964e799d --- /dev/null +++ b/documentation/html/search/all_19.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_19.js b/documentation/html/search/all_19.js new file mode 100644 index 000000000..c0fbe69b2 --- /dev/null +++ b/documentation/html/search/all_19.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['z_625',['z',['../structBlock.html#aeb6a2ee081d32a7c2e8f3ddcca235fc9',1,'Block::z()'],['../structState.html#aed6ded85740f752ec9c5c2ca499da5a9',1,'State::z()'],['../structMapEntry.html#a36ada5da307698020f02485d6866d57f',1,'MapEntry::z()'],['../structRingEntry.html#a8b88d0f404a59333eae214698675c712',1,'RingEntry::z()'],['../structSign.html#a5eb6412ecae2da81951ffdf073a994ed',1,'Sign::z()']]] +]; diff --git a/documentation/html/search/all_2.html b/documentation/html/search/all_2.html new file mode 100644 index 000000000..0a5f832e0 --- /dev/null +++ b/documentation/html/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_2.js b/documentation/html/search/all_2.js new file mode 100644 index 000000000..188e77cd4 --- /dev/null +++ b/documentation/html/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['bitmap_25',['bitmap',['../classbuilder_1_1Client.html#ac972baa59254fcd4d84a8aa678abbf75',1,'builder::Client']]], + ['block_26',['Block',['../structBlock.html',1,'']]], + ['block_27',['BLOCK',['../namespaceserver.html#a4d57d6c1f97136d70385c04f24c647f2',1,'server.BLOCK()'],['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da02fc27068fe9a3c151ffcc08ec5bb65d',1,'BLOCK(): ring.h']]], + ['block0_28',['block0',['../structModel.html#afddf699a972eb1144e4e2b6165e6c825',1,'Model']]], + ['block1_29',['block1',['../structModel.html#a375b22a0a3043bc685947b33d83bcc17',1,'Model']]], + ['blocks_30',['blocks',['../item_8c.html#a579875f477e41abd0db90afe1b658d2c',1,'blocks(): item.c'],['../item_8h.html#a579875f477e41abd0db90afe1b658d2c',1,'blocks(): item.c']]], + ['blue_5fflower_31',['BLUE_FLOWER',['../item_8h.html#abc68fb22f744ffee0ab972d7b163677d',1,'BLUE_FLOWER(): item.h'],['../namespacebuilder.html#a59ac7ae8459200530cb037840d17a7c6',1,'builder.BLUE_FLOWER()']]], + ['brick_32',['BRICK',['../item_8h.html#ac4da397dc617c6f9de08af1b87ee0d92',1,'BRICK(): item.h'],['../namespacebuilder.html#a1c6b2ee83b7d646338dd21461d16eda6',1,'builder.BRICK()']]], + ['buffer_33',['buffer',['../structChunk.html#a37268084ae967da79d9e47033fcfd259',1,'Chunk::buffer()'],['../structPlayer.html#a6be397c2a7cb79256e85dc6a96055f45',1,'Player::buffer()']]], + ['buffer_5fsize_34',['BUFFER_SIZE',['../namespaceserver.html#a993857ed7244a3cc5392879347db0066',1,'server']]], + ['builder_35',['builder',['../namespacebuilder.html',1,'']]], + ['builder_2epy_36',['builder.py',['../builder_8py.html',1,'']]], + ['builder_5fblock_37',['builder_block',['../main_8c.html#a9ee831992fb4faa91f583aafd77c8d8f',1,'main.c']]], + ['bytes_5freceived_38',['bytes_received',['../client_8c.html#a0f4ebdb196909cdad25bee632106b522',1,'client.c']]], + ['bytes_5fsent_39',['bytes_sent',['../client_8c.html#ab9e07f56cbc46818dce94414d79bff18',1,'client.c']]] +]; diff --git a/documentation/html/search/all_3.html b/documentation/html/search/all_3.html new file mode 100644 index 000000000..93567f1e0 --- /dev/null +++ b/documentation/html/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_3.js b/documentation/html/search/all_3.js new file mode 100644 index 000000000..31ce43794 --- /dev/null +++ b/documentation/html/search/all_3.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['cache_40',['cache',['../classworld_1_1World.html#ac976ce86e41ea59f72ed21dac773419d',1,'world::World']]], + ['cache_5fsize_41',['cache_size',['../classworld_1_1World.html#aba042cdb1aa2f95a6eef806fc26b28ef',1,'world::World']]], + ['camera_42',['camera',['../structAttrib.html#a8f4457820b9ba58eeb332bac333c5e55',1,'Attrib']]], + ['capacity_43',['capacity',['../structSignList.html#a56d04de93571aa77cff50c4ee30f8682',1,'SignList::capacity()'],['../structRing.html#a49514c27dd8d8c6f850ac6cf86c3f8fc',1,'Ring::capacity()']]], + ['cement_44',['CEMENT',['../item_8h.html#ad49a389690030a6a6717f8f1e866b673',1,'CEMENT(): item.h'],['../namespacebuilder.html#af41023da11380a6475b71a42c778a7ef',1,'builder.CEMENT()']]], + ['char_5fwidth_45',['char_width',['../util_8h.html#ab42aaa94b0a4f7758ef238745490c596',1,'char_width(char input): util.c'],['../util_8c.html#ab42aaa94b0a4f7758ef238745490c596',1,'char_width(char input): util.c']]], + ['chest_46',['CHEST',['../item_8h.html#a73dd2837cf2e59f3269d8bda9d18022b',1,'CHEST(): item.h'],['../namespacebuilder.html#a8a577b7b77c8b77831c2bf834a30c71d',1,'builder.CHEST()']]], + ['chunk_47',['Chunk',['../structChunk.html',1,'']]], + ['chunk_48',['CHUNK',['../namespaceserver.html#a04b18b4fe2fbaa80531cd880fece4155',1,'server']]], + ['chunk_5fcount_49',['chunk_count',['../structModel.html#ac890daa53d9fca686f850c61707534d3',1,'Model']]], + ['chunk_5fdistance_50',['chunk_distance',['../main_8c.html#a0d32a42d3557884c194312202227f151',1,'main.c']]], + ['chunk_5fsize_51',['CHUNK_SIZE',['../namespaceserver.html#ac544eeef1bf6560531b7ddbc2b134453',1,'server.CHUNK_SIZE()'],['../config_8h.html#aea3cfda4f3a9f978ec759f206cf186fe',1,'CHUNK_SIZE(): config.h']]], + ['chunk_5fvisible_52',['chunk_visible',['../main_8c.html#a58e319a9c57e4f43bf49c3948ab86355',1,'main.c']]], + ['chunked_53',['chunked',['../main_8c.html#ac7ceb3c3abf861fa6b1ea532cd674941',1,'chunked(): main.c'],['../namespaceserver.html#a1bddf2212e5e236558e01a2add6821cd',1,'server.chunked()']]], + ['chunks_54',['chunks',['../structModel.html#a454955bd2cbb283c269a5189d29b6362',1,'Model']]], + ['circle_5fx_55',['circle_x',['../namespacebuilder.html#a21b00d370c14814ab204c09b06e69f64',1,'builder']]], + ['circle_5fy_56',['circle_y',['../namespacebuilder.html#a74a501ba71bf9870233067f25a437c93',1,'builder']]], + ['circle_5fz_57',['circle_z',['../namespacebuilder.html#a7210e54b35764e02ea0be4da83d78cf1',1,'builder']]], + ['cleanup_58',['cleanup',['../namespaceserver.html#a223dfaf8900fb131c5f19f7eb46c033b',1,'server']]], + ['client_59',['Client',['../classbuilder_1_1Client.html',1,'builder']]], + ['client_2ec_60',['client.c',['../client_8c.html',1,'']]], + ['client_2eh_61',['client.h',['../client_8h.html',1,'']]], + ['client_5fblock_62',['client_block',['../client_8h.html#a12b5eb5754c1bb50bbde65c6bccce16f',1,'client_block(int x, int y, int z, int w): client.c'],['../client_8c.html#a12b5eb5754c1bb50bbde65c6bccce16f',1,'client_block(int x, int y, int z, int w): client.c']]], + ['client_5fchunk_63',['client_chunk',['../client_8h.html#a53b8540e54c542d09e2d947c419fe2e6',1,'client_chunk(int p, int q, int key): client.c'],['../client_8c.html#a53b8540e54c542d09e2d947c419fe2e6',1,'client_chunk(int p, int q, int key): client.c']]], + ['client_5fconnect_64',['client_connect',['../client_8c.html#a7c0bfea8388d9417f7b9fec38c055c53',1,'client_connect(char *hostname, int port): client.c'],['../client_8h.html#a7c0bfea8388d9417f7b9fec38c055c53',1,'client_connect(char *hostname, int port): client.c']]], + ['client_5fdisable_65',['client_disable',['../client_8h.html#a7e909ae4682502875e13408e525d425c',1,'client_disable(): client.c'],['../client_8c.html#a7e909ae4682502875e13408e525d425c',1,'client_disable(): client.c']]], + ['client_5fenable_66',['client_enable',['../client_8h.html#aa325e8dc525dfd4f2b61084fde488886',1,'client_enable(): client.c'],['../client_8c.html#aa325e8dc525dfd4f2b61084fde488886',1,'client_enable(): client.c']]], + ['client_5fenabled_67',['client_enabled',['../client_8c.html#ad12248ebff2b138681d413fdc115d5d5',1,'client.c']]], + ['client_5fid_68',['client_id',['../classserver_1_1Handler.html#a82fae77f6e18ca613f936302923e3910',1,'server::Handler']]], + ['client_5flogin_69',['client_login',['../client_8c.html#a3e600b608f3d4bb8019e5c41b1249370',1,'client_login(const char *username, const char *identity_token): client.c'],['../client_8h.html#a3e600b608f3d4bb8019e5c41b1249370',1,'client_login(const char *username, const char *identity_token): client.c']]], + ['client_5fposition_70',['client_position',['../client_8c.html#a8958c169ddf770c54dde942c986199f1',1,'client_position(float x, float y, float z, float rx, float ry): client.c'],['../client_8h.html#a8958c169ddf770c54dde942c986199f1',1,'client_position(float x, float y, float z, float rx, float ry): client.c']]], + ['client_5frecv_71',['client_recv',['../client_8h.html#a03e3943e47927507f114fe750177139f',1,'client_recv(): client.c'],['../client_8c.html#a03e3943e47927507f114fe750177139f',1,'client_recv(): client.c']]], + ['client_5fsend_72',['client_send',['../client_8h.html#a64ee564bcdb00afd6ac5451c9384f5f4',1,'client_send(char *data): client.c'],['../client_8c.html#a64ee564bcdb00afd6ac5451c9384f5f4',1,'client_send(char *data): client.c']]], + ['client_5fsendall_73',['client_sendall',['../client_8c.html#aecb289e6b8d0147fa44ddf7d1e5db7ce',1,'client.c']]], + ['client_5fsign_74',['client_sign',['../client_8h.html#a7688d439c90eb01a3480db0f89d2cc01',1,'client_sign(int x, int y, int z, int face, const char *text): client.c'],['../client_8c.html#a7688d439c90eb01a3480db0f89d2cc01',1,'client_sign(int x, int y, int z, int face, const char *text): client.c']]], + ['client_5fstart_75',['client_start',['../client_8h.html#aa0b8370ec510034dd30751a7de33edca',1,'client_start(): client.c'],['../client_8c.html#aa0b8370ec510034dd30751a7de33edca',1,'client_start(): client.c']]], + ['client_5fstop_76',['client_stop',['../client_8h.html#ab1ad08ffad20c886c71a0f57cb4e56bf',1,'client_stop(): client.c'],['../client_8c.html#ab1ad08ffad20c886c71a0f57cb4e56bf',1,'client_stop(): client.c']]], + ['client_5ftalk_77',['client_talk',['../client_8h.html#aead7e376b121af80bc94eca71d1ca4ec',1,'client_talk(const char *text): client.c'],['../client_8c.html#aead7e376b121af80bc94eca71d1ca4ec',1,'client_talk(const char *text): client.c']]], + ['client_5fversion_78',['client_version',['../client_8h.html#a588876f19dc7a8519f4693a8458d94d1',1,'client_version(int version): client.c'],['../client_8c.html#a588876f19dc7a8519f4693a8458d94d1',1,'client_version(int version): client.c']]], + ['clients_79',['clients',['../classserver_1_1Model.html#ae8aefbf418082334aba83df648f7597e',1,'server::Model']]], + ['cloud_80',['CLOUD',['../item_8h.html#a3ad8406dabd3873689181ce17236586b',1,'CLOUD(): item.h'],['../namespacebuilder.html#a2337ef428f849500c9c6c6bd6ef067a8',1,'builder.CLOUD()']]], + ['cnd_81',['cnd',['../db_8c.html#a87771e27109c0c73156a4efeb6c4480b',1,'db.c']]], + ['cobble_82',['COBBLE',['../namespacebuilder.html#af32d0c69982332d80c24089e4c39de06',1,'builder.COBBLE()'],['../item_8h.html#a9ef31cb00c95b394edbc6ef393edfbd3',1,'COBBLE(): item.h']]], + ['collide_83',['collide',['../main_8c.html#a7523bf0b87d2058d0f770c8ef5ec4de6',1,'main.c']]], + ['color_5f00_84',['COLOR_00',['../item_8h.html#acfa97001b83057a512f26141bc3bb7a1',1,'item.h']]], + ['color_5f01_85',['COLOR_01',['../item_8h.html#ae7f2cfb125863a3cbc7b028e2817e054',1,'item.h']]], + ['color_5f02_86',['COLOR_02',['../item_8h.html#aeb006d5fc1a1804f4a3aadf6ef2f116f',1,'item.h']]], + ['color_5f03_87',['COLOR_03',['../item_8h.html#ae49f217d43d4f11bba09ba8521482561',1,'item.h']]], + ['color_5f04_88',['COLOR_04',['../item_8h.html#a34c245b9eb70f3284dabf6cc3de52536',1,'item.h']]], + ['color_5f05_89',['COLOR_05',['../item_8h.html#a57bcb5844131c0754f1fba525a214620',1,'item.h']]], + ['color_5f06_90',['COLOR_06',['../item_8h.html#a4edec5610cc050b60af747fdba12af06',1,'item.h']]], + ['color_5f07_91',['COLOR_07',['../item_8h.html#ab1d32d05dadf3492f65b5f800fa5618e',1,'item.h']]], + ['color_5f08_92',['COLOR_08',['../item_8h.html#ac821d84bcaba41c7c5976b5ddbebf368',1,'item.h']]], + ['color_5f09_93',['COLOR_09',['../item_8h.html#a6ceedf860d65f57f689fd6f601e21518',1,'item.h']]], + ['color_5f10_94',['COLOR_10',['../item_8h.html#a75c80f3f02b9b0927a8d015aebb7af10',1,'item.h']]], + ['color_5f11_95',['COLOR_11',['../item_8h.html#a8179e22a6ba92f6e6cee1222086acc54',1,'item.h']]], + ['color_5f12_96',['COLOR_12',['../item_8h.html#a4016de27f40304f4af1c5e86f2a9b136',1,'item.h']]], + ['color_5f13_97',['COLOR_13',['../item_8h.html#a3d6766737abff34d1ce3f5e1938608c2',1,'item.h']]], + ['color_5f14_98',['COLOR_14',['../item_8h.html#af7923506ad9c83a1d6ff2239fc1d6991',1,'item.h']]], + ['color_5f15_99',['COLOR_15',['../item_8h.html#a90b084cd9c53134e51cf8e33f76120b3',1,'item.h']]], + ['color_5f16_100',['COLOR_16',['../item_8h.html#adf95cdce14a99b34e5c87507dd021ad7',1,'item.h']]], + ['color_5f17_101',['COLOR_17',['../item_8h.html#af49d0a71b4016529a8eef20beb48fd06',1,'item.h']]], + ['color_5f18_102',['COLOR_18',['../item_8h.html#ac7af49f986bd34355491f2ea9a59d000',1,'item.h']]], + ['color_5f19_103',['COLOR_19',['../item_8h.html#ab7cf5c8e4a9bdcc46fc244ff03b7ad93',1,'item.h']]], + ['color_5f20_104',['COLOR_20',['../item_8h.html#a28961e93b11ef033930a31eccdf834e5',1,'item.h']]], + ['color_5f21_105',['COLOR_21',['../item_8h.html#ad7e482a10fffa467e29aa108129b15da',1,'item.h']]], + ['color_5f22_106',['COLOR_22',['../item_8h.html#a356d0ef73a52a4679b8ea22b0cb6717d',1,'item.h']]], + ['color_5f23_107',['COLOR_23',['../item_8h.html#a3a50914b335a065c5f8036d8011c1dff',1,'item.h']]], + ['color_5f24_108',['COLOR_24',['../item_8h.html#ae0cd44393eb310ca8ad62ead71fae7b8',1,'item.h']]], + ['color_5f25_109',['COLOR_25',['../item_8h.html#a75dfadac4ea31ee703e31de16d0adac6',1,'item.h']]], + ['color_5f26_110',['COLOR_26',['../item_8h.html#a3455ae45dd9ddab618876313df11cb83',1,'item.h']]], + ['color_5f27_111',['COLOR_27',['../item_8h.html#adb768bc855e6350938b45324d0391c23',1,'item.h']]], + ['color_5f28_112',['COLOR_28',['../item_8h.html#a13019111244d91d964a0e02d9966d794',1,'item.h']]], + ['color_5f29_113',['COLOR_29',['../item_8h.html#a3980884a859d03c1a1331d52a2553162',1,'item.h']]], + ['color_5f30_114',['COLOR_30',['../item_8h.html#a48cb16ceff4b96c448219b91e129959c',1,'item.h']]], + ['color_5f31_115',['COLOR_31',['../item_8h.html#a273aeb8efa01c2517be4e8e7569f12a2',1,'item.h']]], + ['commands_116',['commands',['../classserver_1_1Model.html#a9cc9e8300304ed383f576d97b357b074',1,'server::Model']]], + ['commit_117',['COMMIT',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da1ae3399502bd66af21b15736d4fae1a1',1,'ring.h']]], + ['commit_118',['commit',['../classserver_1_1Model.html#ab427a4018c7e7144f0d7dedfe7e87957',1,'server::Model']]], + ['commit_5finterval_119',['COMMIT_INTERVAL',['../config_8h.html#a1525dfe45316383a3abc953052846d0f',1,'COMMIT_INTERVAL(): config.h'],['../namespaceserver.html#aaf5b63efe6cc95b48018d86a5c13ed1d',1,'server.COMMIT_INTERVAL()']]], + ['config_2eh_120',['config.h',['../config_8h.html',1,'']]], + ['conn_121',['conn',['../classbuilder_1_1Client.html#a96c2c0e990bc9cad36881d2506e29fb9',1,'builder::Client']]], + ['connection_122',['connection',['../classserver_1_1Model.html#afb3cee7bcfdd6157b3607d823ab5145e',1,'server::Model']]], + ['copy_123',['copy',['../main_8c.html#aaa6c087511a52e64fc9ad92820c7c0a8',1,'main.c']]], + ['copy0_124',['copy0',['../structModel.html#a3ddb16326999cefcf195fdd796d411a4',1,'Model']]], + ['copy1_125',['copy1',['../structModel.html#a80358faa79d27e0e905f6542044458c5',1,'Model']]], + ['craft_126',['Craft',['../md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html',1,'']]], + ['craft_5fkey_5fbackward_127',['CRAFT_KEY_BACKWARD',['../config_8h.html#ab3dcee468e37484e417b20dee70db354',1,'config.h']]], + ['craft_5fkey_5fchat_128',['CRAFT_KEY_CHAT',['../config_8h.html#a462961f197fa21b1375568a08a43e226',1,'config.h']]], + ['craft_5fkey_5fcommand_129',['CRAFT_KEY_COMMAND',['../config_8h.html#ab08d6fa93b563085f55a35fcaa80487b',1,'config.h']]], + ['craft_5fkey_5ffly_130',['CRAFT_KEY_FLY',['../config_8h.html#ad927d0e8985d23c80e2d3722bcfaca94',1,'config.h']]], + ['craft_5fkey_5fforward_131',['CRAFT_KEY_FORWARD',['../config_8h.html#a402308affdf8c4cd11e6a27b02962fb2',1,'config.h']]], + ['craft_5fkey_5fitem_5fnext_132',['CRAFT_KEY_ITEM_NEXT',['../config_8h.html#a4e4d2790600868c1cd4d6c36ee19b957',1,'config.h']]], + ['craft_5fkey_5fitem_5fprev_133',['CRAFT_KEY_ITEM_PREV',['../config_8h.html#ac762add810a3299020afc380b279ad83',1,'config.h']]], + ['craft_5fkey_5fjump_134',['CRAFT_KEY_JUMP',['../config_8h.html#a8f6ed5189769ea5501a4261530c588ee',1,'config.h']]], + ['craft_5fkey_5fleft_135',['CRAFT_KEY_LEFT',['../config_8h.html#aada9bbb498a2453d3d817602e32d8cb5',1,'config.h']]], + ['craft_5fkey_5fobserve_136',['CRAFT_KEY_OBSERVE',['../config_8h.html#aa2557c1ce884d99b3e783f21539bfbf4',1,'config.h']]], + ['craft_5fkey_5fobserve_5finset_137',['CRAFT_KEY_OBSERVE_INSET',['../config_8h.html#ad0cc18105e4975291a0f2370ed2c9945',1,'config.h']]], + ['craft_5fkey_5fortho_138',['CRAFT_KEY_ORTHO',['../config_8h.html#a3ee175c2546c83759a0d2e65bd7690dd',1,'config.h']]], + ['craft_5fkey_5fquit_139',['CRAFT_KEY_QUIT',['../config_8h.html#a8b390793193f51c28fe1fabb02a08a2e',1,'config.h']]], + ['craft_5fkey_5fright_140',['CRAFT_KEY_RIGHT',['../config_8h.html#a6ca915150a2291d644d3541ec714c0e1',1,'config.h']]], + ['craft_5fkey_5fsign_141',['CRAFT_KEY_SIGN',['../config_8h.html#ab9fad85d79aa1e89af57a62cf43ffae6',1,'config.h']]], + ['craft_5fkey_5fzoom_142',['CRAFT_KEY_ZOOM',['../config_8h.html#a4a717e8c4d85254e41e114dba6be65f6',1,'config.h']]], + ['create_5fchunk_143',['create_chunk',['../main_8c.html#accc8a3a62cf6a6c3efe48a55a5c56808',1,'create_chunk(): main.c'],['../classworld_1_1World.html#a35a2813203e7b5a462d59c82a4f24e35',1,'world.World.create_chunk()']]], + ['create_5fchunk_5fradius_144',['CREATE_CHUNK_RADIUS',['../config_8h.html#aaea687f884668d91b69025943976bc87',1,'config.h']]], + ['create_5fradius_145',['create_radius',['../structModel.html#ab285f5b424f0989de991724b7842f7ee',1,'Model']]], + ['create_5ftables_146',['create_tables',['../classserver_1_1Model.html#a010bcdc35e6520fc20eaad27781960d6',1,'server::Model']]], + ['create_5fwindow_147',['create_window',['../main_8c.html#adbf4a23b001075b18efb14b900bce769',1,'main.c']]], + ['create_5fworld_148',['create_world',['../world_8h.html#aad54886b643411fddbc383d8dc213cf9',1,'create_world(int p, int q, world_func func, void *arg): world.c'],['../world_8c.html#aad54886b643411fddbc383d8dc213cf9',1,'create_world(int p, int q, world_func func, void *arg): world.c']]], + ['cube_149',['cube',['../main_8c.html#a1144571bf370a14d0bda195c9bfe6c13',1,'main.c']]], + ['cube_2ec_150',['cube.c',['../cube_8c.html',1,'']]], + ['cube_2eh_151',['cube.h',['../cube_8h.html',1,'']]], + ['cuboid_152',['cuboid',['../namespacebuilder.html#ac544f232d76427b0eb9e0a179fd1560b',1,'builder']]], + ['cylinder_153',['cylinder',['../main_8c.html#ab2a6e7138d5daebc40411d901e3753ce',1,'main.c']]], + ['cylinder_5fx_154',['cylinder_x',['../namespacebuilder.html#af7f88bc3a6c9c922b07b2b710cb524fe',1,'builder']]], + ['cylinder_5fy_155',['cylinder_y',['../namespacebuilder.html#a3499ea6e0b9937f0966be464efe67b37',1,'builder']]], + ['cylinder_5fz_156',['cylinder_z',['../namespacebuilder.html#aac04499058ccc9e0497dd44d287dd5dc',1,'builder']]] +]; diff --git a/documentation/html/search/all_4.html b/documentation/html/search/all_4.html new file mode 100644 index 000000000..9fab82fad --- /dev/null +++ b/documentation/html/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_4.js b/documentation/html/search/all_4.js new file mode 100644 index 000000000..3a37162d6 --- /dev/null +++ b/documentation/html/search/all_4.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['daemon_5fthreads_157',['daemon_threads',['../classserver_1_1Server.html#abb009ef7bca9b51abe556105d2c3f18d',1,'server::Server']]], + ['dark_5fstone_158',['DARK_STONE',['../namespacebuilder.html#a2389d5ffd9b0c947bb627cb7a7c16aa4',1,'builder.DARK_STONE()'],['../item_8h.html#af0b180b659591aa278fd49e233036117',1,'DARK_STONE(): item.h']]], + ['data_159',['data',['../structMap.html#a8ef299519738b44dc1ae95c6410f0b56',1,'Map::data()'],['../structRing.html#a610017b8cf1bff81f61e32bbf3cdf972',1,'Ring::data()'],['../structSignList.html#aee3357bed55f987188d91160a631ae64',1,'SignList::data()']]], + ['day_5flength_160',['DAY_LENGTH',['../config_8h.html#a1d8b694476f8af0355ae619ec5a5d8b1',1,'config.h']]], + ['db_161',['db',['../db_8c.html#ad6e663497d2c934364b3bcf07496b30b',1,'db.c']]], + ['db_2ec_162',['db.c',['../db_8c.html',1,'']]], + ['db_2eh_163',['db.h',['../db_8h.html',1,'']]], + ['db_5fauth_5fget_164',['db_auth_get',['../db_8c.html#abbac4341c5808b44c243a6cbb5418d74',1,'db_auth_get(char *username, char *identity_token, int identity_token_length): db.c'],['../db_8h.html#abbac4341c5808b44c243a6cbb5418d74',1,'db_auth_get(char *username, char *identity_token, int identity_token_length): db.c']]], + ['db_5fauth_5fget_5fselected_165',['db_auth_get_selected',['../db_8c.html#aef707b2d7b4abef81057da5c86d9db4e',1,'db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length): db.c'],['../db_8h.html#aef707b2d7b4abef81057da5c86d9db4e',1,'db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length): db.c']]], + ['db_5fauth_5fselect_166',['db_auth_select',['../db_8c.html#a81930af9569e37f569a84275c6d9244a',1,'db_auth_select(char *username): db.c'],['../db_8h.html#a81930af9569e37f569a84275c6d9244a',1,'db_auth_select(char *username): db.c']]], + ['db_5fauth_5fselect_5fnone_167',['db_auth_select_none',['../db_8c.html#a58bb21e13e96dc00011987ed6f49e0a5',1,'db_auth_select_none(): db.c'],['../db_8h.html#a58bb21e13e96dc00011987ed6f49e0a5',1,'db_auth_select_none(): db.c']]], + ['db_5fauth_5fset_168',['db_auth_set',['../db_8c.html#adf4bd2d9215d193b077efd037db0bcf9',1,'db_auth_set(char *username, char *identity_token): db.c'],['../db_8h.html#adf4bd2d9215d193b077efd037db0bcf9',1,'db_auth_set(char *username, char *identity_token): db.c']]], + ['db_5fclose_169',['db_close',['../db_8h.html#a9130d3b5560da57a53135491d888c7b7',1,'db_close(): db.c'],['../db_8c.html#a9130d3b5560da57a53135491d888c7b7',1,'db_close(): db.c']]], + ['db_5fcommit_170',['db_commit',['../db_8c.html#a22d7bda7323b424f23ab0dc5e5d14ea3',1,'db_commit(): db.c'],['../db_8h.html#a22d7bda7323b424f23ab0dc5e5d14ea3',1,'db_commit(): db.c']]], + ['db_5fdelete_5fall_5fsigns_171',['db_delete_all_signs',['../db_8c.html#abbd06257e797d6e870f0e4fccdae1afc',1,'db_delete_all_signs(): db.c'],['../db_8h.html#abbd06257e797d6e870f0e4fccdae1afc',1,'db_delete_all_signs(): db.c']]], + ['db_5fdelete_5fsign_172',['db_delete_sign',['../db_8c.html#a961761292a4eabf7324f789cdf60a15d',1,'db_delete_sign(int x, int y, int z, int face): db.c'],['../db_8h.html#a961761292a4eabf7324f789cdf60a15d',1,'db_delete_sign(int x, int y, int z, int face): db.c']]], + ['db_5fdelete_5fsigns_173',['db_delete_signs',['../db_8c.html#ae77ed88e2b08a11cf0b6ef7e4a3b4f1e',1,'db_delete_signs(int x, int y, int z): db.c'],['../db_8h.html#ae77ed88e2b08a11cf0b6ef7e4a3b4f1e',1,'db_delete_signs(int x, int y, int z): db.c']]], + ['db_5fdisable_174',['db_disable',['../db_8c.html#a1775d31648e3cb1a17ba5cc7169838c0',1,'db_disable(): db.c'],['../db_8h.html#a1775d31648e3cb1a17ba5cc7169838c0',1,'db_disable(): db.c']]], + ['db_5fenable_175',['db_enable',['../db_8h.html#aff0694dd14f530f817eccbccf15f9cd7',1,'db_enable(): db.c'],['../db_8c.html#aff0694dd14f530f817eccbccf15f9cd7',1,'db_enable(): db.c']]], + ['db_5fenabled_176',['db_enabled',['../db_8c.html#a542e31ff8709700973744252b3e7373f',1,'db.c']]], + ['db_5fget_5fkey_177',['db_get_key',['../db_8h.html#a604e47a1c34b1bf206ba95f3040ca063',1,'db_get_key(int p, int q): db.c'],['../db_8c.html#a604e47a1c34b1bf206ba95f3040ca063',1,'db_get_key(int p, int q): db.c']]], + ['db_5finit_178',['db_init',['../db_8c.html#aed0889a43f2f658210c3e9330c36a868',1,'db_init(char *path): db.c'],['../db_8h.html#aed0889a43f2f658210c3e9330c36a868',1,'db_init(char *path): db.c']]], + ['db_5finsert_5fblock_179',['db_insert_block',['../db_8c.html#acf3af80dd94b97b88c7eda24a7acbf57',1,'db_insert_block(int p, int q, int x, int y, int z, int w): db.c'],['../db_8h.html#acf3af80dd94b97b88c7eda24a7acbf57',1,'db_insert_block(int p, int q, int x, int y, int z, int w): db.c']]], + ['db_5finsert_5fsign_180',['db_insert_sign',['../db_8c.html#a4fc9d5ce54175ee393cdd80c161d27ea',1,'db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text): db.c'],['../db_8h.html#a4fc9d5ce54175ee393cdd80c161d27ea',1,'db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text): db.c']]], + ['db_5fload_5fmap_181',['db_load_map',['../db_8c.html#a8bac0c9b2dd14f69506bea5114dc53ba',1,'db_load_map(Map *map, int p, int q): db.c'],['../db_8h.html#a8bac0c9b2dd14f69506bea5114dc53ba',1,'db_load_map(Map *map, int p, int q): db.c']]], + ['db_5fload_5fsigns_182',['db_load_signs',['../db_8h.html#a8b49d7b0d7cd429a24413a9c7a20d5d9',1,'db_load_signs(SignList *list, int p, int q): db.c'],['../db_8c.html#a8b49d7b0d7cd429a24413a9c7a20d5d9',1,'db_load_signs(SignList *list, int p, int q): db.c']]], + ['db_5fload_5fstate_183',['db_load_state',['../db_8h.html#ac97e8c6c5b3544a26bd7dfb022e8b7c9',1,'db_load_state(float *x, float *y, float *z, float *rx, float *ry): db.c'],['../db_8c.html#ac97e8c6c5b3544a26bd7dfb022e8b7c9',1,'db_load_state(float *x, float *y, float *z, float *rx, float *ry): db.c']]], + ['db_5fpath_184',['db_path',['../structModel.html#af802d2f02b947ba1772707eb247f8dac',1,'Model']]], + ['db_5fpath_185',['DB_PATH',['../config_8h.html#a0670e0e3546fcd815d007fe1aeff321e',1,'DB_PATH(): config.h'],['../namespaceserver.html#a77772ee066c2a1006356b8ff8c587115',1,'server.DB_PATH()']]], + ['db_5fsave_5fstate_186',['db_save_state',['../db_8c.html#a65e339f6a3136c81f486020f8753cae5',1,'db_save_state(float x, float y, float z, float rx, float ry): db.c'],['../db_8h.html#a65e339f6a3136c81f486020f8753cae5',1,'db_save_state(float x, float y, float z, float rx, float ry): db.c']]], + ['db_5fset_5fkey_187',['db_set_key',['../db_8c.html#a75318be7de55b28fa4da16f24371d3e3',1,'db_set_key(int p, int q, int key): db.c'],['../db_8h.html#a75318be7de55b28fa4da16f24371d3e3',1,'db_set_key(int p, int q, int key): db.c']]], + ['db_5fworker_5frun_188',['db_worker_run',['../db_8c.html#adda9dfe40560f6daba762434232ddd77',1,'db_worker_run(void *arg): db.c'],['../db_8h.html#adda9dfe40560f6daba762434232ddd77',1,'db_worker_run(void *arg): db.c']]], + ['db_5fworker_5fstart_189',['db_worker_start',['../db_8c.html#af2f7627dd0f5447f6f6dada93db4f9d9',1,'db_worker_start(char *path): db.c'],['../db_8h.html#af6fa9b274ab9218dd4ad11eb1648cb73',1,'db_worker_start(): db.h']]], + ['db_5fworker_5fstop_190',['db_worker_stop',['../db_8h.html#a7a0d2c946591d7ba9e855767dd5f398e',1,'db_worker_stop(): db.c'],['../db_8c.html#a7a0d2c946591d7ba9e855767dd5f398e',1,'db_worker_stop(): db.c']]], + ['debug_191',['DEBUG',['../config_8h.html#ad72dbcf6d0153db1b8d8a58001feed83',1,'config.h']]], + ['default_5fhost_192',['DEFAULT_HOST',['../namespaceserver.html#ace3bdae79fa444c2cae4afb907008bed',1,'server.DEFAULT_HOST()'],['../namespacebuilder.html#a8be95e915db46c21c05559536976e368',1,'builder.DEFAULT_HOST()']]], + ['default_5fport_193',['DEFAULT_PORT',['../client_8h.html#a16b710f592bf8f7900666392adc444dc',1,'DEFAULT_PORT(): client.h'],['../namespaceserver.html#a799b32fdd2321df0f6d93809c1aca14a',1,'server.DEFAULT_PORT()'],['../namespacebuilder.html#a206e8bd8dca4763bb665ab17fd4dd2e2',1,'builder.DEFAULT_PORT()']]], + ['degrees_194',['DEGREES',['../util_8h.html#a6ddad223fc11aed387553f0bb86a867f',1,'util.h']]], + ['del_5fbuffer_195',['del_buffer',['../util_8c.html#ad6b45259c4a7e05f3b2d1f426d9bb6d0',1,'del_buffer(GLuint buffer): util.c'],['../util_8h.html#ad6b45259c4a7e05f3b2d1f426d9bb6d0',1,'del_buffer(GLuint buffer): util.c']]], + ['delete_5fall_5fchunks_196',['delete_all_chunks',['../main_8c.html#a5cd367a007c11738b7e4dcc8ae0bb16c',1,'main.c']]], + ['delete_5fall_5fplayers_197',['delete_all_players',['../main_8c.html#a00cc40d4c1bd974f5b2d293797f21379',1,'main.c']]], + ['delete_5fchunk_5fradius_198',['DELETE_CHUNK_RADIUS',['../config_8h.html#ac028e03821cb1a5ac870385149ae5c18',1,'config.h']]], + ['delete_5fchunks_199',['delete_chunks',['../main_8c.html#a8395a15e4e81c8f33192d4f46834a082',1,'main.c']]], + ['delete_5fplayer_200',['delete_player',['../main_8c.html#ac17ee9205ad1703ed735fe3225b1b82a',1,'main.c']]], + ['delete_5fradius_201',['delete_radius',['../structModel.html#a424db0f8c4b9225fc177664d0564b9f6',1,'Model']]], + ['delete_5fsign_5fstmt_202',['delete_sign_stmt',['../db_8c.html#a9162cf0c9f4f7b1e7c0f959f2aa0392a',1,'db.c']]], + ['delete_5fsigns_5fstmt_203',['delete_signs_stmt',['../db_8c.html#a343c224c7346bf296e9b9da7d46c365b',1,'db.c']]], + ['dequeue_204',['dequeue',['../classserver_1_1Model.html#ad0103204c6bad7d0409368d426e971fb',1,'server::Model']]], + ['dirt_205',['DIRT',['../item_8h.html#a7c912c163a0ed562956a9b42195766d3',1,'DIRT(): item.h'],['../namespacebuilder.html#a7058e289380a1bc274fb9a650068c662',1,'builder.DIRT()']]], + ['dirty_206',['dirty',['../structChunk.html#a67d8b303bbdb6b9928fec2783d08f59f',1,'Chunk']]], + ['disconnect_207',['DISCONNECT',['../namespaceserver.html#a1f49fe4c59f9b957b023529ecc4fd70a',1,'server']]], + ['dll_208',['dll',['../namespaceworld.html#a8a3c5f1f0950c07a36741873e8b2b9f0',1,'world']]], + ['dll_5fcreate_5fworld_209',['dll_create_world',['../namespaceworld.html#a3b0d0f6e215f8f4f110d9e31f885841e',1,'world']]], + ['dll_5fseed_210',['dll_seed',['../namespaceworld.html#a81ec5830e426ca9bdcc1c7c160bb8337',1,'world']]], + ['dll_5fsimplex2_211',['dll_simplex2',['../namespaceworld.html#aa4e83b1edc82a7aaa3d23974f665681b',1,'world']]], + ['dll_5fsimplex3_212',['dll_simplex3',['../namespaceworld.html#ac2d7906e43481bf695a07bf7fe813114',1,'world']]], + ['draw_5fchunk_213',['draw_chunk',['../main_8c.html#a5ff750eb1f4602fd60a0a91fb3d27e32',1,'main.c']]], + ['draw_5fcube_214',['draw_cube',['../main_8c.html#a85de17c00c82b82bb20027022da73ca9',1,'main.c']]], + ['draw_5fitem_215',['draw_item',['../main_8c.html#a1ad9dc2b57fe13977efc4abeff4a6bb8',1,'main.c']]], + ['draw_5flines_216',['draw_lines',['../main_8c.html#a5ddd4087e9527b4b818fb7dc5ec08c19',1,'main.c']]], + ['draw_5fplant_217',['draw_plant',['../main_8c.html#aee744d99ca50914be688b5132513c8df',1,'main.c']]], + ['draw_5fplayer_218',['draw_player',['../main_8c.html#a601aa498b140930902174bed518be232',1,'main.c']]], + ['draw_5fsign_219',['draw_sign',['../main_8c.html#a7015c4254792ec4b0460669b49d11923',1,'main.c']]], + ['draw_5fsigns_220',['draw_signs',['../main_8c.html#ac8ca9b26a12d4361eb5a84d9dbe5c794',1,'main.c']]], + ['draw_5ftext_221',['draw_text',['../main_8c.html#a37a6d2e44e741e64e1113532467ad402',1,'main.c']]], + ['draw_5ftriangles_5f2d_222',['draw_triangles_2d',['../main_8c.html#ad27f877530bfd918c52999ed9c08d2db',1,'main.c']]], + ['draw_5ftriangles_5f3d_223',['draw_triangles_3d',['../main_8c.html#adf441c702858370419937561d5388470',1,'main.c']]], + ['draw_5ftriangles_5f3d_5fao_224',['draw_triangles_3d_ao',['../main_8c.html#aa2d18ed5666e6786b586b0c88f9ae038',1,'main.c']]], + ['draw_5ftriangles_5f3d_5ftext_225',['draw_triangles_3d_text',['../main_8c.html#a53b0ab72f5d717a2a1c452ece68534fb',1,'main.c']]] +]; diff --git a/documentation/html/search/all_5.html b/documentation/html/search/all_5.html new file mode 100644 index 000000000..ff4c7034b --- /dev/null +++ b/documentation/html/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_5.js b/documentation/html/search/all_5.js new file mode 100644 index 000000000..c70d96e76 --- /dev/null +++ b/documentation/html/search/all_5.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['empty_226',['EMPTY',['../item_8h.html#a2b7cf2a3641be7b89138615764d60ba3',1,'EMPTY(): item.h'],['../namespacebuilder.html#abaf694fbfa850f70778ebfb45d349e30',1,'builder.EMPTY()']]], + ['empty_5fentry_227',['EMPTY_ENTRY',['../map_8h.html#ae925b42947f9a7c554c79c170b07a90e',1,'map.h']]], + ['end_228',['end',['../structRing.html#a704c118e618f3fac90554954b90ff363',1,'Ring']]], + ['end_5fmap_5ffor_5feach_229',['END_MAP_FOR_EACH',['../map_8h.html#a6cf103060cd07f4e521714563dcb7d15',1,'map.h']]], + ['enqueue_230',['enqueue',['../classserver_1_1Model.html#a3c6c94870bd808a1a8868f6c68610828',1,'server::Model']]], + ['ensure_5fchunks_231',['ensure_chunks',['../main_8c.html#a303b9ec42543e75c3d4e69ffd81ecd8e',1,'main.c']]], + ['execute_232',['execute',['../classserver_1_1Model.html#a3666c45a716bd0b1ee7d58b16e695be4',1,'server::Model']]], + ['exit_233',['EXIT',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da7a10b5d68d31711288e1fe0fa17dbf4f',1,'ring.h']]], + ['extra1_234',['extra1',['../structAttrib.html#a128a2b0c82df58158709832564ad5ec2',1,'Attrib']]], + ['extra2_235',['extra2',['../structAttrib.html#a3aeae3bea2c6eda1a2fd8e2387f46dc5',1,'Attrib']]], + ['extra3_236',['extra3',['../structAttrib.html#a8695ec97ee35d7edda5578eb356ea89c',1,'Attrib']]], + ['extra4_237',['extra4',['../structAttrib.html#a3cfb70967ab07898959cb0dce7a72ce4',1,'Attrib']]] +]; diff --git a/documentation/html/search/all_6.html b/documentation/html/search/all_6.html new file mode 100644 index 000000000..671f73654 --- /dev/null +++ b/documentation/html/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_6.js b/documentation/html/search/all_6.js new file mode 100644 index 000000000..354789d0e --- /dev/null +++ b/documentation/html/search/all_6.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['face_238',['face',['../structSign.html#a5a5f53a409cd7ec36733fc80e6d25785',1,'Sign']]], + ['faces_239',['faces',['../structChunk.html#aed1e3841c79fac84de3514739ca0ff0e',1,'Chunk']]], + ['find_5fchunk_240',['find_chunk',['../main_8c.html#aedc46d4b4ae65461357e39751e866ca6',1,'main.c']]], + ['find_5fplayer_241',['find_player',['../main_8c.html#a81a00c2fd97b74133139a2da8c02428b',1,'main.c']]], + ['finish_242',['finish',['../classserver_1_1Handler.html#a972b1089c8876b45f67b26f7823eb711',1,'server::Handler']]], + ['flip_5fimage_5fvertical_243',['flip_image_vertical',['../util_8c.html#a4f43015327363104cbc74c3de18e2352',1,'util.c']]], + ['flying_244',['flying',['../structModel.html#a5c6ca81f5d80886495091479812321f0',1,'Model']]], + ['force_5fchunks_245',['force_chunks',['../main_8c.html#a39ed5c1e077adec1f35c335a6e8976b5',1,'main.c']]], + ['fov_246',['fov',['../structModel.html#ac42baa2c90d6e01bef3680719f59e905',1,'Model']]], + ['fps_247',['FPS',['../structFPS.html',1,'']]], + ['fps_248',['fps',['../structFPS.html#ac960f6d060a8c1b0aa94b51ac695a75d',1,'FPS']]], + ['frames_249',['frames',['../structFPS.html#acc427eae0a41ee5d36a4c9bdb5149393',1,'FPS']]], + ['frustum_5fplanes_250',['frustum_planes',['../matrix_8h.html#a5a468348d5e7d5c1577c0169a5caa729',1,'frustum_planes(float planes[6][4], int radius, float *matrix): matrix.c'],['../matrix_8c.html#a5a468348d5e7d5c1577c0169a5caa729',1,'frustum_planes(float planes[6][4], int radius, float *matrix): matrix.c']]], + ['fullscreen_251',['FULLSCREEN',['../config_8h.html#ab21210f7b05e8e5616b6155ebd777161',1,'config.h']]] +]; diff --git a/documentation/html/search/all_7.html b/documentation/html/search/all_7.html new file mode 100644 index 000000000..280e9b1c6 --- /dev/null +++ b/documentation/html/search/all_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_7.js b/documentation/html/search/all_7.js new file mode 100644 index 000000000..74487f134 --- /dev/null +++ b/documentation/html/search/all_7.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['g_252',['g',['../main_8c.html#aedf1ea1af759e007a23346431fb9a9f1',1,'main.c']]], + ['gen_5fbuffer_253',['gen_buffer',['../util_8c.html#ae0b687683a7ca3314bbfe52b0766e549',1,'gen_buffer(GLsizei size, GLfloat *data): util.c'],['../util_8h.html#ae0b687683a7ca3314bbfe52b0766e549',1,'gen_buffer(GLsizei size, GLfloat *data): util.c']]], + ['gen_5fchunk_5fbuffer_254',['gen_chunk_buffer',['../main_8c.html#ae73019e7308d7c00bd1bce2978976078',1,'main.c']]], + ['gen_5fcrosshair_5fbuffer_255',['gen_crosshair_buffer',['../main_8c.html#aa4297265ebe5f1482113b9c20a462b16',1,'main.c']]], + ['gen_5fcube_5fbuffer_256',['gen_cube_buffer',['../main_8c.html#ad14f4ddf35e293be32cfe91a63ee7aa0',1,'main.c']]], + ['gen_5ffaces_257',['gen_faces',['../util_8c.html#ae55e18c1e17eef3e6156a885c760b6de',1,'gen_faces(int components, int faces, GLfloat *data): util.c'],['../util_8h.html#ae55e18c1e17eef3e6156a885c760b6de',1,'gen_faces(int components, int faces, GLfloat *data): util.c']]], + ['gen_5fplant_5fbuffer_258',['gen_plant_buffer',['../main_8c.html#ad2ded81e5a71ce7803068e52e3cba9c0',1,'main.c']]], + ['gen_5fplayer_5fbuffer_259',['gen_player_buffer',['../main_8c.html#aa787497324ff5d73b6c4c24348ab3ab4',1,'main.c']]], + ['gen_5fsign_5fbuffer_260',['gen_sign_buffer',['../main_8c.html#a41a50341b3d95428bd5d60bb4b0c86f0',1,'main.c']]], + ['gen_5fsky_5fbuffer_261',['gen_sky_buffer',['../main_8c.html#ad5df1b0a4b98711e2b17a3a6052bdf9c',1,'main.c']]], + ['gen_5ftext_5fbuffer_262',['gen_text_buffer',['../main_8c.html#a637d7ff3716d139d1bf68f39568715ac',1,'main.c']]], + ['gen_5fwireframe_5fbuffer_263',['gen_wireframe_buffer',['../main_8c.html#ab7ff6a413ccb86d2fd290f956771b6ef',1,'main.c']]], + ['get_5faccess_5ftoken_264',['get_access_token',['../auth_8h.html#a5906ca1274eeaec74f635677baebe2cc',1,'get_access_token(char *result, int length, char *username, char *identity_token): auth.c'],['../auth_8c.html#a5906ca1274eeaec74f635677baebe2cc',1,'get_access_token(char *result, int length, char *username, char *identity_token): auth.c']]], + ['get_5fblock_265',['get_block',['../main_8c.html#a5f801f00f227dd89588ab0fbb3f85b6d',1,'get_block(): main.c'],['../classserver_1_1Model.html#a3acb5e5f1b3c11a61caf47887414d0e1',1,'server.Model.get_block()']]], + ['get_5fchunk_266',['get_chunk',['../classworld_1_1World.html#ae097762534f93095dcd5b420aec65525',1,'world::World']]], + ['get_5fclient_267',['get_client',['../namespacebuilder.html#a30c63e33227991cdeba59d697dd6fcd9',1,'builder']]], + ['get_5fclient_5fenabled_268',['get_client_enabled',['../client_8c.html#abb798e3677ffc402f49ab6c4138378d8',1,'get_client_enabled(): client.c'],['../client_8h.html#abb798e3677ffc402f49ab6c4138378d8',1,'get_client_enabled(): client.c']]], + ['get_5fdaylight_269',['get_daylight',['../main_8c.html#a99b773831b01a51f13a676ef5d59193a',1,'main.c']]], + ['get_5fdb_5fenabled_270',['get_db_enabled',['../db_8c.html#aba51030d9d082884d6e4cc6474c4d3e3',1,'get_db_enabled(): db.c'],['../db_8h.html#aba51030d9d082884d6e4cc6474c4d3e3',1,'get_db_enabled(): db.c']]], + ['get_5fdefault_5fblock_271',['get_default_block',['../classserver_1_1Model.html#abeaec0fd82dbf66b7ca21bb464517c20',1,'server::Model']]], + ['get_5fidentity_272',['get_identity',['../namespacebuilder.html#ae73624e735de89a1d374a78a553ff3eb',1,'builder']]], + ['get_5fkey_5fstmt_273',['get_key_stmt',['../db_8c.html#a565b419f1b417bb59328a6d4fc706eb1',1,'db.c']]], + ['get_5fmotion_5fvector_274',['get_motion_vector',['../main_8c.html#a5a10c8499083603fdb2a9b7d72ad9531',1,'main.c']]], + ['get_5fscale_5ffactor_275',['get_scale_factor',['../main_8c.html#a552f6dea3b849bff25fa69e1c8c3759a',1,'main.c']]], + ['get_5fsight_5fvector_276',['get_sight_vector',['../main_8c.html#a350b22fed1a285f9f91a660a714f2fd4',1,'main.c']]], + ['glass_277',['GLASS',['../item_8h.html#ac070bc05447c6faa5ec491a62b615e9f',1,'GLASS(): item.h'],['../namespacebuilder.html#ad2d0f19a02aff335dfac1bba794a48af',1,'builder.GLASS()']]], + ['grass_278',['GRASS',['../item_8h.html#a0f6b2c5e6a922165582784ca418d0d17',1,'GRASS(): item.h'],['../namespacebuilder.html#a9a2226229cb0234dec43f2bad262032a',1,'builder.GRASS()']]] +]; diff --git a/documentation/html/search/all_8.html b/documentation/html/search/all_8.html new file mode 100644 index 000000000..ed820aceb --- /dev/null +++ b/documentation/html/search/all_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_8.js b/documentation/html/search/all_8.js new file mode 100644 index 000000000..6d7fffe2f --- /dev/null +++ b/documentation/html/search/all_8.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['handle_279',['handle',['../classserver_1_1Handler.html#a3b48cb51b48a14ce8bf445f87b4b2765',1,'server::Handler']]], + ['handle_5ffall_5fdamage_280',['handle_fall_damage',['../main_8c.html#a5e37bf0145a3a02a92782d377955cf78',1,'main.c']]], + ['handle_5flava_5fdamage_281',['handle_lava_damage',['../main_8c.html#a0bf39c1104df8c3fda11e5815b5933d7',1,'main.c']]], + ['handle_5fmouse_5finput_282',['handle_mouse_input',['../main_8c.html#af6206d1b5587c5ab78eb99bcef601093',1,'main.c']]], + ['handle_5fmovement_283',['handle_movement',['../main_8c.html#afeed84b00d2c96058cb3d89fec4ed8c4',1,'main.c']]], + ['handle_5fplayer_5fhealth_284',['handle_player_health',['../main_8c.html#aa7aa9b8c8475ae6ec39d0e8e8be89321',1,'main.c']]], + ['handle_5fplayer_5fspeed_285',['handle_player_speed',['../main_8c.html#ad8f05af41744221a334f3ccdce43347f',1,'main.c']]], + ['handler_286',['Handler',['../classserver_1_1Handler.html',1,'server']]], + ['hash_287',['hash',['../map_8c.html#ab73d21e6c6de7a0ff906537edb3c4714',1,'map.c']]], + ['hash_5fint_288',['hash_int',['../map_8c.html#a595810cd3c73bbf446a3cc8c713f310b',1,'map.c']]], + ['heal_5fdamage_289',['heal_damage',['../main_8c.html#a037af278f24c2ee8d94af554e9886ce6',1,'main.c']]], + ['health_290',['health',['../structPlayer.html#adc89cdfcf04e9e8aa8a45090fc52dc96',1,'Player']]], + ['height_291',['height',['../structModel.html#a710c2d2f710d349e4a76c7d78570e70f',1,'Model']]], + ['highest_5fblock_292',['highest_block',['../main_8c.html#a0b86ebc00049edc5f180ec81f419425c',1,'main.c']]], + ['hit_5ftest_293',['hit_test',['../main_8c.html#a8bbe38f2fa041861a8f5a8f2f485cbf3',1,'main.c']]], + ['hit_5ftest_5fface_294',['hit_test_face',['../main_8c.html#aaf8657c7799d262dcf1b7a535e7e8131',1,'main.c']]] +]; diff --git a/documentation/html/search/all_9.html b/documentation/html/search/all_9.html new file mode 100644 index 000000000..892a37946 --- /dev/null +++ b/documentation/html/search/all_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_9.js b/documentation/html/search/all_9.js new file mode 100644 index 000000000..0b3e7cf22 --- /dev/null +++ b/documentation/html/search/all_9.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['id_295',['id',['../structPlayer.html#a05e05f3a23de78da7ec032ec2bcf8c6c',1,'Player']]], + ['indestructible_5fitems_296',['INDESTRUCTIBLE_ITEMS',['../namespaceserver.html#a1317b0769798b52724af1102849c6624',1,'server']]], + ['inflict_5fdamage_297',['inflict_damage',['../main_8c.html#a7f1196c97b37a546110a403581aecbf1',1,'main.c']]], + ['insert_5fblock_5fstmt_298',['insert_block_stmt',['../db_8c.html#a50c07d0fbc47084f4bfb52db36809e8d',1,'db.c']]], + ['insert_5fsign_5fstmt_299',['insert_sign_stmt',['../db_8c.html#a3972ea62cfd5d919a98adae509c2de7f',1,'db.c']]], + ['interpolate_5fplayer_300',['interpolate_player',['../main_8c.html#a8f29343daa0ed2f1673cd1f261c9ad36',1,'main.c']]], + ['invert_5fmouse_301',['INVERT_MOUSE',['../config_8h.html#a905ae3578a441bedd55827ed2b610f65',1,'config.h']]], + ['is_5falpha_302',['is_alpha',['../item_8c.html#acca78c677d4f416357b11c4b660530ce',1,'is_alpha(int w): item.c'],['../item_8h.html#acca78c677d4f416357b11c4b660530ce',1,'is_alpha(int w): item.c']]], + ['is_5fdestructable_303',['is_destructable',['../item_8c.html#aa526e008fbbc76b363bb5f234f526602',1,'is_destructable(int w): item.c'],['../item_8h.html#aa526e008fbbc76b363bb5f234f526602',1,'is_destructable(int w): item.c']]], + ['is_5fmovement_5fslowed_304',['is_movement_slowed',['../main_8c.html#a934ab7a342b323f8f1c11a054f8398ca',1,'main.c']]], + ['is_5fobstacle_305',['is_obstacle',['../item_8h.html#a2999490972ce5a49ee473823b9c8eeb9',1,'is_obstacle(int w): item.c'],['../item_8c.html#a2999490972ce5a49ee473823b9c8eeb9',1,'is_obstacle(int w): item.c']]], + ['is_5fplant_306',['is_plant',['../item_8h.html#a2095e37d68507dd4d9955cf8452688a0',1,'is_plant(int w): item.c'],['../item_8c.html#a2095e37d68507dd4d9955cf8452688a0',1,'is_plant(int w): item.c']]], + ['is_5fslowing_307',['is_slowing',['../item_8c.html#aaaedddd540156a6b156948ab7445fccc',1,'is_slowing(int w): item.c'],['../item_8h.html#aaaedddd540156a6b156948ab7445fccc',1,'is_slowing(int w): item.c']]], + ['is_5ftransparent_308',['is_transparent',['../item_8c.html#a6d7b27352d73f9a7afef70dbc7ef2723',1,'is_transparent(int w): item.c'],['../item_8h.html#a6d7b27352d73f9a7afef70dbc7ef2723',1,'is_transparent(int w): item.c']]], + ['item_2ec_309',['item.c',['../item_8c.html',1,'']]], + ['item_2eh_310',['item.h',['../item_8h.html',1,'']]], + ['item_5fcount_311',['item_count',['../item_8c.html#affa2d8934bd67035bb75e42da40ea75e',1,'item_count(): item.c'],['../item_8h.html#affa2d8934bd67035bb75e42da40ea75e',1,'item_count(): item.c']]], + ['item_5findex_312',['item_index',['../structModel.html#a4ae976c019c23dff2d52f7fc89c6c0d0',1,'Model']]], + ['items_313',['items',['../item_8c.html#a1364db8b1ef3aedea7542f732e23c391',1,'items(): item.c'],['../item_8h.html#a1364db8b1ef3aedea7542f732e23c391',1,'items(): item.c']]] +]; diff --git a/documentation/html/search/all_a.html b/documentation/html/search/all_a.html new file mode 100644 index 000000000..5aeaf81dd --- /dev/null +++ b/documentation/html/search/all_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_a.js b/documentation/html/search/all_a.js new file mode 100644 index 000000000..f7ebbe8c7 --- /dev/null +++ b/documentation/html/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_314',['key',['../structRingEntry.html#a94645a5a7b12ad82ed76dce5fd5e1f2c',1,'RingEntry']]], + ['key_315',['KEY',['../namespaceserver.html#a7eb07aebb7fe3321300aa2fb1e5e2a59',1,'server.KEY()'],['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da147e71049e3285d642d0d5268dba260f',1,'KEY(): ring.h']]] +]; diff --git a/documentation/html/search/all_b.html b/documentation/html/search/all_b.html new file mode 100644 index 000000000..9253f5e4b --- /dev/null +++ b/documentation/html/search/all_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_b.js b/documentation/html/search/all_b.js new file mode 100644 index 000000000..575b33740 --- /dev/null +++ b/documentation/html/search/all_b.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['last_5fcheck_316',['last_check',['../classserver_1_1RateLimiter.html#a940bc36975e7961d394c089beb7abeb1',1,'server::RateLimiter']]], + ['last_5fcommit_317',['last_commit',['../classserver_1_1Model.html#af17091b5639b2ea262bf50746c532dd6',1,'server::Model']]], + ['lava_318',['LAVA',['../item_8h.html#a28064dfebfae6ae7d376a7461e7a2e1d',1,'item.h']]], + ['leaves_319',['LEAVES',['../namespacebuilder.html#ad207992aaec3e5845320b5419f47c382',1,'builder.LEAVES()'],['../item_8h.html#ab22f256be049241041a77ec883d7e2cd',1,'LEAVES(): item.h']]], + ['license_320',['LICENSE',['../md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html',1,'']]], + ['license_2emd_321',['LICENSE.md',['../LICENSE_8md.html',1,'']]], + ['light_5fstone_322',['LIGHT_STONE',['../item_8h.html#abd6bff7aad8471be39ed9c88f5be49f5',1,'LIGHT_STONE(): item.h'],['../namespacebuilder.html#a11f22dec1143fc1c9250f670597d9203',1,'builder.LIGHT_STONE()']]], + ['limiter_323',['limiter',['../classserver_1_1Handler.html#ad9acac2a0d248d87d74c2be5d2c9732e',1,'server::Handler']]], + ['load_5ffile_324',['load_file',['../util_8c.html#ae0b180d11be93e6d01ecc2ca88228686',1,'util.c']]], + ['load_5fmap_5fstmt_325',['load_map_stmt',['../db_8c.html#a12c9cd7ae89b493615854f4712bc0d27',1,'db.c']]], + ['load_5fpng_5ftexture_326',['load_png_texture',['../util_8c.html#adb2350a6a08ae78288fdf36cdf96dd91',1,'load_png_texture(const char *file_name): util.c'],['../util_8h.html#adb2350a6a08ae78288fdf36cdf96dd91',1,'load_png_texture(const char *file_name): util.c']]], + ['load_5fprogram_327',['load_program',['../util_8c.html#a8cb10ae4302d6611ee8d746e21b7ea5d',1,'load_program(const char *path1, const char *path2): util.c'],['../util_8h.html#a8cb10ae4302d6611ee8d746e21b7ea5d',1,'load_program(const char *path1, const char *path2): util.c']]], + ['load_5fshader_328',['load_shader',['../util_8c.html#a4f4d4c55d4ec575d951341a16d1a38d5',1,'load_shader(GLenum type, const char *path): util.c'],['../util_8h.html#a4f4d4c55d4ec575d951341a16d1a38d5',1,'load_shader(GLenum type, const char *path): util.c']]], + ['load_5fsigns_5fstmt_329',['load_signs_stmt',['../db_8c.html#accd0132b87685f6cfe76a6b58cfcc273',1,'db.c']]], + ['log_330',['LOG',['../util_8h.html#a3577749fb48d57a158b8ac1a0b3ab57e',1,'util.h']]], + ['log_331',['log',['../namespaceserver.html#ad98bc61ab29d77b8003fbb0e01453f90',1,'server']]], + ['log_5fpath_332',['LOG_PATH',['../namespaceserver.html#aa41c5c8a03a61efd55fd4071f0186c9d',1,'server']]], + ['login_333',['login',['../main_8c.html#af76b7b46958dabf5e4ee9a492f0ec3fa',1,'main.c']]] +]; diff --git a/documentation/html/search/all_c.html b/documentation/html/search/all_c.html new file mode 100644 index 000000000..72d8d3759 --- /dev/null +++ b/documentation/html/search/all_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_c.js b/documentation/html/search/all_c.js new file mode 100644 index 000000000..9daa2df95 --- /dev/null +++ b/documentation/html/search/all_c.js @@ -0,0 +1,68 @@ +var searchData= +[ + ['main_334',['main',['../main_8c.html#a3c04138a5bfe5d72780bb7e82a18e627',1,'main(): main.c'],['../namespacebuilder.html#ac8f6bd1d8c6b4ff15b83c857a94ae8eb',1,'builder.main()'],['../namespaceserver.html#a6d1c10ed8aa5d27e61ed9db6b4274261',1,'server.main()']]], + ['main_2ec_335',['main.c',['../main_8c.html',1,'']]], + ['make_5fcharacter_336',['make_character',['../cube_8h.html#a4465c655d071dea4dfef566da5dd2580',1,'make_character(float *data, float x, float y, float n, float m, char c): cube.c'],['../cube_8c.html#a4465c655d071dea4dfef566da5dd2580',1,'make_character(float *data, float x, float y, float n, float m, char c): cube.c']]], + ['make_5fcharacter_5f3d_337',['make_character_3d',['../cube_8h.html#a154123d3582f4195726dcb13afd87413',1,'make_character_3d(float *data, float x, float y, float z, float n, int face, char c): cube.c'],['../cube_8c.html#a154123d3582f4195726dcb13afd87413',1,'make_character_3d(float *data, float x, float y, float z, float n, int face, char c): cube.c']]], + ['make_5fcube_338',['make_cube',['../cube_8c.html#a38a9f9dac05b11556005a7dfb46440ac',1,'make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w): cube.c'],['../cube_8h.html#a38a9f9dac05b11556005a7dfb46440ac',1,'make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w): cube.c']]], + ['make_5fcube_5ffaces_339',['make_cube_faces',['../cube_8c.html#a0f14c76c131de891984f5c1ffcdcb684',1,'make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n): cube.c'],['../cube_8h.html#a0f14c76c131de891984f5c1ffcdcb684',1,'make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n): cube.c']]], + ['make_5fcube_5fwireframe_340',['make_cube_wireframe',['../cube_8h.html#a32e82b3b328050ce0ce96b08a904f2d4',1,'make_cube_wireframe(float *data, float x, float y, float z, float n): cube.c'],['../cube_8c.html#a32e82b3b328050ce0ce96b08a904f2d4',1,'make_cube_wireframe(float *data, float x, float y, float z, float n): cube.c']]], + ['make_5fplant_341',['make_plant',['../cube_8c.html#aa9a7364ff61189d1f3f1ec3d720eeade',1,'make_plant(float *data, float px, float py, float pz, float n, int w, float rotation): cube.c'],['../cube_8h.html#aa9a7364ff61189d1f3f1ec3d720eeade',1,'make_plant(float *data, float px, float py, float pz, float n, int w, float rotation): cube.c']]], + ['make_5fplayer_342',['make_player',['../cube_8c.html#a400de8b69f894ce09dd82b3500cc8983',1,'make_player(float *data, float x, float y, float z, float rx, float ry): cube.c'],['../cube_8h.html#a400de8b69f894ce09dd82b3500cc8983',1,'make_player(float *data, float x, float y, float z, float rx, float ry): cube.c']]], + ['make_5fprogram_343',['make_program',['../util_8c.html#a56aee3984a58258449008c111e291898',1,'make_program(GLuint shader1, GLuint shader2): util.c'],['../util_8h.html#a56aee3984a58258449008c111e291898',1,'make_program(GLuint shader1, GLuint shader2): util.c']]], + ['make_5fshader_344',['make_shader',['../util_8c.html#ac92820af286b3381706fa0f5bc9f7bf1',1,'make_shader(GLenum type, const char *source): util.c'],['../util_8h.html#ac92820af286b3381706fa0f5bc9f7bf1',1,'make_shader(GLenum type, const char *source): util.c']]], + ['make_5fsphere_345',['make_sphere',['../cube_8c.html#aa889b707a68dd55beaf18f20578891ec',1,'make_sphere(float *data, float r, int detail): cube.c'],['../cube_8h.html#aa889b707a68dd55beaf18f20578891ec',1,'make_sphere(float *data, float r, int detail): cube.c']]], + ['malloc_5ffaces_346',['malloc_faces',['../util_8h.html#a0eb4317caeaaf0c23c1de121f1adf58a',1,'malloc_faces(int components, int faces): util.c'],['../util_8c.html#a0eb4317caeaaf0c23c1de121f1adf58a',1,'malloc_faces(int components, int faces): util.c']]], + ['map_347',['Map',['../structMap.html',1,'']]], + ['map_348',['map',['../structChunk.html#ac925ff5f92406dea6f56044d7e1e2089',1,'Chunk']]], + ['map_2ec_349',['map.c',['../map_8c.html',1,'']]], + ['map_2eh_350',['map.h',['../map_8h.html',1,'']]], + ['map_5falloc_351',['map_alloc',['../map_8c.html#a68edde7d398e5cb4dd8a4e8bd1511776',1,'map_alloc(Map *map): map.c'],['../map_8h.html#a68edde7d398e5cb4dd8a4e8bd1511776',1,'map_alloc(Map *map): map.c']]], + ['map_5ffor_5feach_352',['MAP_FOR_EACH',['../map_8h.html#a8017e14817cccade85ab9976ec7c08e4',1,'map.h']]], + ['map_5ffree_353',['map_free',['../map_8c.html#a3254b8c32bf974ff49d5ffd77fba54f9',1,'map_free(Map *map): map.c'],['../map_8h.html#a3254b8c32bf974ff49d5ffd77fba54f9',1,'map_free(Map *map): map.c']]], + ['map_5fget_354',['map_get',['../map_8h.html#a874495bba0719e565fbdf4b3169bd478',1,'map_get(Map *map, int x, int y, int z): map.c'],['../map_8c.html#a874495bba0719e565fbdf4b3169bd478',1,'map_get(Map *map, int x, int y, int z): map.c']]], + ['map_5fgrow_355',['map_grow',['../map_8h.html#ac3d7d219d9c538932026a8b48dac1f69',1,'map_grow(Map *map): map.c'],['../map_8c.html#ac3d7d219d9c538932026a8b48dac1f69',1,'map_grow(Map *map): map.c']]], + ['map_5fset_356',['map_set',['../map_8h.html#a4c2477840f637dc2ee2573ce45d0c328',1,'map_set(Map *map, int x, int y, int z, int w): map.c'],['../map_8c.html#a4c2477840f637dc2ee2573ce45d0c328',1,'map_set(Map *map, int x, int y, int z, int w): map.c']]], + ['map_5fset_5ffunc_357',['map_set_func',['../main_8c.html#a12898b54482ea7e87bbb6b3d5f0f8786',1,'main.c']]], + ['mapentry_358',['MapEntry',['../structMapEntry.html',1,'']]], + ['mask_359',['mask',['../structMap.html#a2211aadc9745a27b0e07a3af85989bd5',1,'Map']]], + ['mat_5fapply_360',['mat_apply',['../matrix_8c.html#a08ac4391a0f909be8ff3be24add36de9',1,'mat_apply(float *data, float *matrix, int count, int offset, int stride): matrix.c'],['../matrix_8h.html#a08ac4391a0f909be8ff3be24add36de9',1,'mat_apply(float *data, float *matrix, int count, int offset, int stride): matrix.c']]], + ['mat_5ffrustum_361',['mat_frustum',['../matrix_8c.html#aacfdedd36f30b553d089fb864c513c3c',1,'mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar): matrix.c'],['../matrix_8h.html#aacfdedd36f30b553d089fb864c513c3c',1,'mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar): matrix.c']]], + ['mat_5fidentity_362',['mat_identity',['../matrix_8c.html#afb84227ef7869d383478b67e26db2462',1,'mat_identity(float *matrix): matrix.c'],['../matrix_8h.html#afb84227ef7869d383478b67e26db2462',1,'mat_identity(float *matrix): matrix.c']]], + ['mat_5fmultiply_363',['mat_multiply',['../matrix_8c.html#aecbb7f0ede52ab3c4b3d96856ca03729',1,'mat_multiply(float *matrix, float *a, float *b): matrix.c'],['../matrix_8h.html#aecbb7f0ede52ab3c4b3d96856ca03729',1,'mat_multiply(float *matrix, float *a, float *b): matrix.c']]], + ['mat_5fortho_364',['mat_ortho',['../matrix_8c.html#a1d5890d70fd9c40ed53aa27a9811572a',1,'mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far): matrix.c'],['../matrix_8h.html#a1d5890d70fd9c40ed53aa27a9811572a',1,'mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far): matrix.c']]], + ['mat_5fperspective_365',['mat_perspective',['../matrix_8c.html#afcbfefff8b7de2ee193a5e8565b367e1',1,'mat_perspective(float *matrix, float fov, float aspect, float znear, float zfar): matrix.c'],['../matrix_8h.html#a1d45c0c3cb0801bfea49181aaf070af4',1,'mat_perspective(float *matrix, float fov, float aspect, float near, float far): matrix.c']]], + ['mat_5frotate_366',['mat_rotate',['../matrix_8h.html#a35bd6ed2032c06130e4bacee7fd61065',1,'mat_rotate(float *matrix, float x, float y, float z, float angle): matrix.c'],['../matrix_8c.html#a35bd6ed2032c06130e4bacee7fd61065',1,'mat_rotate(float *matrix, float x, float y, float z, float angle): matrix.c']]], + ['mat_5ftranslate_367',['mat_translate',['../matrix_8h.html#a60d161b7a566b80038381c756373bd86',1,'mat_translate(float *matrix, float dx, float dy, float dz): matrix.c'],['../matrix_8c.html#a60d161b7a566b80038381c756373bd86',1,'mat_translate(float *matrix, float dx, float dy, float dz): matrix.c']]], + ['mat_5fvec_5fmultiply_368',['mat_vec_multiply',['../matrix_8h.html#af9cba09c0e2411573567b0cd009a6497',1,'mat_vec_multiply(float *vector, float *a, float *b): matrix.c'],['../matrix_8c.html#af9cba09c0e2411573567b0cd009a6497',1,'mat_vec_multiply(float *vector, float *a, float *b): matrix.c']]], + ['matrix_369',['matrix',['../structAttrib.html#abf01f51d610dd0ddf14ef44565505dd0',1,'Attrib']]], + ['matrix_2ec_370',['matrix.c',['../matrix_8c.html',1,'']]], + ['matrix_2eh_371',['matrix.h',['../matrix_8h.html',1,'']]], + ['max_372',['MAX',['../util_8h.html#afa99ec4acc4ecb2dc3c2d05da15d0e3f',1,'util.h']]], + ['max_5faddr_5flength_373',['MAX_ADDR_LENGTH',['../main_8c.html#af5116a516a99d43d46a02f4b59763da7',1,'main.c']]], + ['max_5fchunks_374',['MAX_CHUNKS',['../main_8c.html#a9e879c11aa15653382faa681060e6179',1,'main.c']]], + ['max_5fmessages_375',['MAX_MESSAGES',['../config_8h.html#a1f02f60afb419aa25921dcd8ae49f807',1,'config.h']]], + ['max_5fname_5flength_376',['MAX_NAME_LENGTH',['../main_8c.html#a0c397a708cec89c74029582574516b30',1,'main.c']]], + ['max_5fpath_5flength_377',['MAX_PATH_LENGTH',['../main_8c.html#a9eb6992d76f02128388ae95c0415604a',1,'main.c']]], + ['max_5fplayer_5fhealth_378',['MAX_PLAYER_HEALTH',['../main_8c.html#a6d2c30f3edc291856e5af4a456ba3435',1,'main.c']]], + ['max_5fplayers_379',['MAX_PLAYERS',['../main_8c.html#a1c346c944e8204fd06dc057393c7c96d',1,'main.c']]], + ['max_5fpost_5flength_380',['MAX_POST_LENGTH',['../auth_8c.html#a8ed8ab8bedf1e734d73d9411ff6137eb',1,'auth.c']]], + ['max_5fresponse_5flength_381',['MAX_RESPONSE_LENGTH',['../auth_8c.html#ac0d0e3d7f96a047b0a530d0f5b4b36fb',1,'auth.c']]], + ['max_5fsign_5flength_382',['MAX_SIGN_LENGTH',['../sign_8h.html#a710dbda73a9300c41fa70abbc375b912',1,'sign.h']]], + ['max_5ftext_5flength_383',['MAX_TEXT_LENGTH',['../main_8c.html#a9a90baeac9b3273d185357200b599b39',1,'main.c']]], + ['maxy_384',['maxy',['../structChunk.html#a3745b0b938e79f1ee64eff354994994e',1,'Chunk']]], + ['message_5findex_385',['message_index',['../structModel.html#a5026500a00cac3bb98dd3a2085802fa8',1,'Model']]], + ['messages_386',['messages',['../structModel.html#aa623ba15ac148da584c8cc1b7a76b7e9',1,'Model']]], + ['min_387',['MIN',['../util_8h.html#a3acffbd305ee72dcd4593c0d8af64a4f',1,'util.h']]], + ['miny_388',['miny',['../structChunk.html#a528c51d2899b3f2d2c1fa8d7ef90621a',1,'Chunk']]], + ['mode_389',['mode',['../structModel.html#add046a4b0c100fba89780214f96c02ba',1,'Model']]], + ['mode_5fchanged_390',['mode_changed',['../structModel.html#a6540d35023bbfc1bae76c2932a9efe2b',1,'Model']]], + ['mode_5foffline_391',['MODE_OFFLINE',['../main_8c.html#a1479d1a15cc2e8243c4d068a5c7a0954',1,'main.c']]], + ['mode_5fonline_392',['MODE_ONLINE',['../main_8c.html#ac5515a403da07a28313289aede022bf8',1,'main.c']]], + ['model_393',['Model',['../structModel.html',1,'']]], + ['model_394',['model',['../main_8c.html#aa7373a131d63421e546eaa40689df69d',1,'main.c']]], + ['model_395',['Model',['../classserver_1_1Model.html',1,'server']]], + ['mouse_5fsensitivity_396',['MOUSE_SENSITIVITY',['../main_8c.html#aedeb5d36b16f15c289185782926cc288',1,'main.c']]], + ['mtx_397',['mtx',['../db_8c.html#aece695d920e8a0ef6f4e63898bae7d0b',1,'db.c']]], + ['mutex_398',['mutex',['../client_8c.html#a14994af3b2159c2738cdf6a0513d32ae',1,'client.c']]] +]; diff --git a/documentation/html/search/all_d.html b/documentation/html/search/all_d.html new file mode 100644 index 000000000..3fb5ce30d --- /dev/null +++ b/documentation/html/search/all_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_d.js b/documentation/html/search/all_d.js new file mode 100644 index 000000000..c82ebc400 --- /dev/null +++ b/documentation/html/search/all_d.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['name_399',['name',['../structPlayer.html#a000f74f4241ebc344866c82bec4ed5ef',1,'Player']]], + ['next_5fclient_5fid_400',['next_client_id',['../classserver_1_1Model.html#a3e13a7313fc94f05ecf271dd4a9664d1',1,'server::Model']]], + ['nick_401',['nick',['../classserver_1_1Handler.html#afe540a1acc789d4fa3bbb84f4e3c66ca',1,'server::Handler']]], + ['nick_402',['NICK',['../namespaceserver.html#a84ed5c5365c3740ff5effc30f171d83b',1,'server']]], + ['normal_403',['normal',['../structAttrib.html#a1747ed761cce42decf0b1f48e2d424aa',1,'Attrib']]], + ['normalize_404',['normalize',['../matrix_8h.html#a096915415d411e8c596255885fe89be1',1,'normalize(float *x, float *y, float *z): matrix.c'],['../matrix_8c.html#a096915415d411e8c596255885fe89be1',1,'normalize(float *x, float *y, float *z): matrix.c']]] +]; diff --git a/documentation/html/search/all_e.html b/documentation/html/search/all_e.html new file mode 100644 index 000000000..6de7dfc45 --- /dev/null +++ b/documentation/html/search/all_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_e.js b/documentation/html/search/all_e.js new file mode 100644 index 000000000..4184cfb14 --- /dev/null +++ b/documentation/html/search/all_e.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['observe1_405',['observe1',['../structModel.html#a3890d0a201c0de9b06065e1166c392bb',1,'Model']]], + ['observe2_406',['observe2',['../structModel.html#a988b3760efa4ed902d218637fb19152e',1,'Model']]], + ['occlusion_407',['occlusion',['../main_8c.html#a0f4db496b1326afcb417ea30037e611e',1,'main.c']]], + ['offsets_408',['OFFSETS',['../namespacebuilder.html#a16c3dd69f9a9c90a3bedcdf4f830613c',1,'builder']]], + ['on_5fauthenticate_409',['on_authenticate',['../classserver_1_1Model.html#a2e228fba3228beb3da42cd5506cd5606',1,'server::Model']]], + ['on_5fblock_410',['on_block',['../classserver_1_1Model.html#a8d5d9e3cda0e8aa384b5f5f2f45cd4bd',1,'server::Model']]], + ['on_5fchar_411',['on_char',['../main_8c.html#aa73bbee67ce499a488e96f9cfc23ca1a',1,'main.c']]], + ['on_5fchunk_412',['on_chunk',['../classserver_1_1Model.html#a210e38620f762c3ae492b8f6e4d78a3a',1,'server::Model']]], + ['on_5fconnect_413',['on_connect',['../classserver_1_1Model.html#a5ab44bf7f5122e3b5572079e02ff0b92',1,'server::Model']]], + ['on_5fdata_414',['on_data',['../classserver_1_1Model.html#a2307c8a450ed2e43325c7d182fcf9b69',1,'server::Model']]], + ['on_5fdisconnect_415',['on_disconnect',['../classserver_1_1Model.html#ab461be206915068246242c80eb7d75bb',1,'server::Model']]], + ['on_5fgoto_416',['on_goto',['../classserver_1_1Model.html#aca0fbfd43f14f14ce061e0c01b81d00d',1,'server::Model']]], + ['on_5fhelp_417',['on_help',['../classserver_1_1Model.html#af8707fd1875a0d52f50c829e143eaa9f',1,'server::Model']]], + ['on_5fkey_418',['on_key',['../main_8c.html#a85adb342a29f89079e4be8dda2786a31',1,'main.c']]], + ['on_5fleft_5fclick_419',['on_left_click',['../main_8c.html#a1b4c89a3770980bcee7870a38ade9801',1,'main.c']]], + ['on_5flist_420',['on_list',['../classserver_1_1Model.html#ae6b5f5c24fa673873cf459d12996e635',1,'server::Model']]], + ['on_5fmiddle_5fclick_421',['on_middle_click',['../main_8c.html#a60558971178a076262dd33624e45f579',1,'main.c']]], + ['on_5fmouse_5fbutton_422',['on_mouse_button',['../main_8c.html#a617140f22cbca769f78c6f5ed1d4f930',1,'main.c']]], + ['on_5fposition_423',['on_position',['../classserver_1_1Model.html#ad1f30bfa4395afc29844822700c296db',1,'server::Model']]], + ['on_5fpq_424',['on_pq',['../classserver_1_1Model.html#a2eca244ca01a155ce894d286f22cb1a0',1,'server::Model']]], + ['on_5fright_5fclick_425',['on_right_click',['../main_8c.html#a473fa47f6ab1a428059a75288d859779',1,'main.c']]], + ['on_5fscroll_426',['on_scroll',['../main_8c.html#aca87493073d8fc698af6b41a32554ebb',1,'main.c']]], + ['on_5fsign_427',['on_sign',['../classserver_1_1Model.html#a5b0e4c36467deb17ff65f6559d15e139',1,'server::Model']]], + ['on_5fspawn_428',['on_spawn',['../classserver_1_1Model.html#a73a69870e10b530cf11b257b14b7d24a',1,'server::Model']]], + ['on_5ftalk_429',['on_talk',['../classserver_1_1Model.html#a56115cc5a89c16019a31deb7b4165c8d',1,'server::Model']]], + ['on_5fversion_430',['on_version',['../classserver_1_1Model.html#a7a130d4cef3951790bf3f27b9a2114c6',1,'server::Model']]], + ['ortho_431',['ortho',['../structModel.html#a9ce317de5c55c344b1ce279b0223941f',1,'Model']]] +]; diff --git a/documentation/html/search/all_f.html b/documentation/html/search/all_f.html new file mode 100644 index 000000000..c22b9404d --- /dev/null +++ b/documentation/html/search/all_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/all_f.js b/documentation/html/search/all_f.js new file mode 100644 index 000000000..2072919b4 --- /dev/null +++ b/documentation/html/search/all_f.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['p_432',['p',['../structChunk.html#a016383084b50c856a1fb63f97ca63dc6',1,'Chunk::p()'],['../structRingEntry.html#a8b01eb77bb24ee7243b3c4966475f5d1',1,'RingEntry::p()']]], + ['packet_433',['packet',['../namespaceserver.html#ae3c43aa702be522e7cb1907b41c168e7',1,'server']]], + ['parse_5fbuffer_434',['parse_buffer',['../main_8c.html#ae1d980f0e6a30791baa8ea225f89986a',1,'main.c']]], + ['parse_5fcommand_435',['parse_command',['../main_8c.html#ab95b19e249d0226c6678f18a815004f9',1,'main.c']]], + ['paste_436',['paste',['../main_8c.html#ad7f58047731e9a1b735aa142811c70e8',1,'main.c']]], + ['patterns_437',['patterns',['../classserver_1_1Model.html#a44f6ce8a304b6e72d5bbe4bcbd6795db',1,'server::Model']]], + ['per_438',['per',['../classserver_1_1RateLimiter.html#aba1799f8a14f8e5d9a1a404ac8935d1d',1,'server::RateLimiter']]], + ['pi_439',['PI',['../util_8h.html#a598a3330b3c21701223ee0ca14316eca',1,'util.h']]], + ['plank_440',['PLANK',['../item_8h.html#ab6f918b8028f65da43a46da84cbf08db',1,'PLANK(): item.h'],['../namespacebuilder.html#a0a8394a9dfc35c02362f9bf8d644fcf1',1,'builder.PLANK()']]], + ['plants_441',['plants',['../item_8c.html#a44faad87c9595984a1c69e9d4fc505d4',1,'plants(): item.c'],['../item_8h.html#a44faad87c9595984a1c69e9d4fc505d4',1,'plants(): item.c']]], + ['player_442',['Player',['../structPlayer.html',1,'']]], + ['player_5fcount_443',['player_count',['../structModel.html#aaf87a246b0eaba7090708cbf06265948',1,'Model']]], + ['player_5fcrosshair_444',['player_crosshair',['../main_8c.html#a624fb7f93a4c50cb882382592aefadc0',1,'main.c']]], + ['player_5fcrosshair_5fdistance_445',['player_crosshair_distance',['../main_8c.html#a0e085c078cb3ec69d96348ef74387cfb',1,'main.c']]], + ['player_5fintersects_5fblock_446',['player_intersects_block',['../main_8c.html#aac46af8ceaf0c97c260e64c7ea9637ca',1,'main.c']]], + ['player_5fplayer_5fdistance_447',['player_player_distance',['../main_8c.html#ade74ca214156f02e72ce62a05c3f7b23',1,'main.c']]], + ['players_448',['players',['../structModel.html#a35889c6e0321e390c7cc35678b561f0c',1,'Model']]], + ['position_449',['position',['../structAttrib.html#a2e8900e46275e6dba5de47a6cb3fb014',1,'Attrib']]], + ['position_450',['POSITION',['../namespaceserver.html#a80527517653f6fc9a6c11307515157d0',1,'server']]], + ['position_5flimiter_451',['position_limiter',['../classserver_1_1Handler.html#a6fa3e8df9f40dccd1de4522096781985',1,'server::Handler']]], + ['program_452',['program',['../structAttrib.html#accbe71d8cd2e04669694902abddf88fd',1,'Attrib']]], + ['purple_5fflower_453',['PURPLE_FLOWER',['../item_8h.html#ac9adae9a9c8461879e8a55cfd3f36398',1,'PURPLE_FLOWER(): item.h'],['../namespacebuilder.html#aea173fe52e425426d43b7b9ea68416d8',1,'builder.PURPLE_FLOWER()']]], + ['pyramid_454',['pyramid',['../namespacebuilder.html#a0754660093957edd82d7d4ed978fc898',1,'builder']]] +]; diff --git a/documentation/html/search/classes_0.html b/documentation/html/search/classes_0.html new file mode 100644 index 000000000..63d78fe69 --- /dev/null +++ b/documentation/html/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_0.js b/documentation/html/search/classes_0.js new file mode 100644 index 000000000..70cc4a659 --- /dev/null +++ b/documentation/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['attrib_626',['Attrib',['../structAttrib.html',1,'']]] +]; diff --git a/documentation/html/search/classes_1.html b/documentation/html/search/classes_1.html new file mode 100644 index 000000000..1a5618cfc --- /dev/null +++ b/documentation/html/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_1.js b/documentation/html/search/classes_1.js new file mode 100644 index 000000000..34595221c --- /dev/null +++ b/documentation/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['block_627',['Block',['../structBlock.html',1,'']]] +]; diff --git a/documentation/html/search/classes_2.html b/documentation/html/search/classes_2.html new file mode 100644 index 000000000..455fc5fed --- /dev/null +++ b/documentation/html/search/classes_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_2.js b/documentation/html/search/classes_2.js new file mode 100644 index 000000000..3e921410d --- /dev/null +++ b/documentation/html/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['chunk_628',['Chunk',['../structChunk.html',1,'']]], + ['client_629',['Client',['../classbuilder_1_1Client.html',1,'builder']]] +]; diff --git a/documentation/html/search/classes_3.html b/documentation/html/search/classes_3.html new file mode 100644 index 000000000..a7139980b --- /dev/null +++ b/documentation/html/search/classes_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_3.js b/documentation/html/search/classes_3.js new file mode 100644 index 000000000..547bd7ab8 --- /dev/null +++ b/documentation/html/search/classes_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fps_630',['FPS',['../structFPS.html',1,'']]] +]; diff --git a/documentation/html/search/classes_4.html b/documentation/html/search/classes_4.html new file mode 100644 index 000000000..cb0026fdf --- /dev/null +++ b/documentation/html/search/classes_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_4.js b/documentation/html/search/classes_4.js new file mode 100644 index 000000000..b0ee44f56 --- /dev/null +++ b/documentation/html/search/classes_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handler_631',['Handler',['../classserver_1_1Handler.html',1,'server']]] +]; diff --git a/documentation/html/search/classes_5.html b/documentation/html/search/classes_5.html new file mode 100644 index 000000000..b77826f89 --- /dev/null +++ b/documentation/html/search/classes_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_5.js b/documentation/html/search/classes_5.js new file mode 100644 index 000000000..0fe4f28f4 --- /dev/null +++ b/documentation/html/search/classes_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['map_632',['Map',['../structMap.html',1,'']]], + ['mapentry_633',['MapEntry',['../structMapEntry.html',1,'']]], + ['model_634',['Model',['../structModel.html',1,'Model'],['../classserver_1_1Model.html',1,'server.Model']]] +]; diff --git a/documentation/html/search/classes_6.html b/documentation/html/search/classes_6.html new file mode 100644 index 000000000..99e860317 --- /dev/null +++ b/documentation/html/search/classes_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_6.js b/documentation/html/search/classes_6.js new file mode 100644 index 000000000..cdf711462 --- /dev/null +++ b/documentation/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['player_635',['Player',['../structPlayer.html',1,'']]] +]; diff --git a/documentation/html/search/classes_7.html b/documentation/html/search/classes_7.html new file mode 100644 index 000000000..7d1ae6d84 --- /dev/null +++ b/documentation/html/search/classes_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_7.js b/documentation/html/search/classes_7.js new file mode 100644 index 000000000..e23af9f33 --- /dev/null +++ b/documentation/html/search/classes_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['ratelimiter_636',['RateLimiter',['../classserver_1_1RateLimiter.html',1,'server']]], + ['ring_637',['Ring',['../structRing.html',1,'']]], + ['ringentry_638',['RingEntry',['../structRingEntry.html',1,'']]] +]; diff --git a/documentation/html/search/classes_8.html b/documentation/html/search/classes_8.html new file mode 100644 index 000000000..13aea8536 --- /dev/null +++ b/documentation/html/search/classes_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_8.js b/documentation/html/search/classes_8.js new file mode 100644 index 000000000..8a5a08d88 --- /dev/null +++ b/documentation/html/search/classes_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['server_639',['Server',['../classserver_1_1Server.html',1,'server']]], + ['sign_640',['Sign',['../structSign.html',1,'']]], + ['signlist_641',['SignList',['../structSignList.html',1,'']]], + ['state_642',['State',['../structState.html',1,'']]] +]; diff --git a/documentation/html/search/classes_9.html b/documentation/html/search/classes_9.html new file mode 100644 index 000000000..da92743b2 --- /dev/null +++ b/documentation/html/search/classes_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/classes_9.js b/documentation/html/search/classes_9.js new file mode 100644 index 000000000..eaa2686cc --- /dev/null +++ b/documentation/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_643',['World',['../classworld_1_1World.html',1,'world']]] +]; diff --git a/documentation/html/search/close.svg b/documentation/html/search/close.svg new file mode 100644 index 000000000..a933eea1a --- /dev/null +++ b/documentation/html/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/documentation/html/search/defines_0.html b/documentation/html/search/defines_0.html new file mode 100644 index 000000000..75e810d41 --- /dev/null +++ b/documentation/html/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_0.js b/documentation/html/search/defines_0.js new file mode 100644 index 000000000..f1a87f5c1 --- /dev/null +++ b/documentation/html/search/defines_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['abs_1151',['ABS',['../util_8h.html#a996f7be338ccb40d1a2a5abc1ad61759',1,'util.h']]], + ['align_5fcenter_1152',['ALIGN_CENTER',['../main_8c.html#a20f6c07b59d81220069af96131a9982f',1,'main.c']]], + ['align_5fleft_1153',['ALIGN_LEFT',['../main_8c.html#a666975a1345df39683a0a65b81466b20',1,'main.c']]], + ['align_5fright_1154',['ALIGN_RIGHT',['../main_8c.html#a9a7eca07c41cee4267778375e95c8c89',1,'main.c']]] +]; diff --git a/documentation/html/search/defines_1.html b/documentation/html/search/defines_1.html new file mode 100644 index 000000000..ef85498af --- /dev/null +++ b/documentation/html/search/defines_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_1.js b/documentation/html/search/defines_1.js new file mode 100644 index 000000000..b8ae58f47 --- /dev/null +++ b/documentation/html/search/defines_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['blue_5fflower_1155',['BLUE_FLOWER',['../item_8h.html#abc68fb22f744ffee0ab972d7b163677d',1,'item.h']]], + ['brick_1156',['BRICK',['../item_8h.html#ac4da397dc617c6f9de08af1b87ee0d92',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_10.html b/documentation/html/search/defines_10.html new file mode 100644 index 000000000..03f8d21c5 --- /dev/null +++ b/documentation/html/search/defines_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_10.js b/documentation/html/search/defines_10.js new file mode 100644 index 000000000..adf118729 --- /dev/null +++ b/documentation/html/search/defines_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['vsync_1275',['VSYNC',['../config_8h.html#a01f87c3323a461cee54d6092b5d7fb34',1,'config.h']]] +]; diff --git a/documentation/html/search/defines_11.html b/documentation/html/search/defines_11.html new file mode 100644 index 000000000..34bb73629 --- /dev/null +++ b/documentation/html/search/defines_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_11.js b/documentation/html/search/defines_11.js new file mode 100644 index 000000000..34733cd89 --- /dev/null +++ b/documentation/html/search/defines_11.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['water_1276',['WATER',['../item_8h.html#a5c3fbf45abc4ee50d118d87aecfee212',1,'item.h']]], + ['white_5fflower_1277',['WHITE_FLOWER',['../item_8h.html#a7ab3bf862a292fa7aa7d3c73e3c1d251',1,'item.h']]], + ['window_5fheight_1278',['WINDOW_HEIGHT',['../config_8h.html#a5473cf64fa979b48335079c99532e243',1,'config.h']]], + ['window_5fwidth_1279',['WINDOW_WIDTH',['../config_8h.html#a498d9f026138406895e9a34b504ac6a6',1,'config.h']]], + ['wood_1280',['WOOD',['../item_8h.html#a7860700630bf29714303de1213ece9d2',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_12.html b/documentation/html/search/defines_12.html new file mode 100644 index 000000000..3636ee2d6 --- /dev/null +++ b/documentation/html/search/defines_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_12.js b/documentation/html/search/defines_12.js new file mode 100644 index 000000000..0ad41eec7 --- /dev/null +++ b/documentation/html/search/defines_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['yellow_5fflower_1281',['YELLOW_FLOWER',['../item_8h.html#a04e01e6b4bdfaadd31982070a3f173ad',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_2.html b/documentation/html/search/defines_2.html new file mode 100644 index 000000000..63da7d9fd --- /dev/null +++ b/documentation/html/search/defines_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_2.js b/documentation/html/search/defines_2.js new file mode 100644 index 000000000..07361fc74 --- /dev/null +++ b/documentation/html/search/defines_2.js @@ -0,0 +1,58 @@ +var searchData= +[ + ['cement_1157',['CEMENT',['../item_8h.html#ad49a389690030a6a6717f8f1e866b673',1,'item.h']]], + ['chest_1158',['CHEST',['../item_8h.html#a73dd2837cf2e59f3269d8bda9d18022b',1,'item.h']]], + ['chunk_5fsize_1159',['CHUNK_SIZE',['../config_8h.html#aea3cfda4f3a9f978ec759f206cf186fe',1,'config.h']]], + ['cloud_1160',['CLOUD',['../item_8h.html#a3ad8406dabd3873689181ce17236586b',1,'item.h']]], + ['cobble_1161',['COBBLE',['../item_8h.html#a9ef31cb00c95b394edbc6ef393edfbd3',1,'item.h']]], + ['color_5f00_1162',['COLOR_00',['../item_8h.html#acfa97001b83057a512f26141bc3bb7a1',1,'item.h']]], + ['color_5f01_1163',['COLOR_01',['../item_8h.html#ae7f2cfb125863a3cbc7b028e2817e054',1,'item.h']]], + ['color_5f02_1164',['COLOR_02',['../item_8h.html#aeb006d5fc1a1804f4a3aadf6ef2f116f',1,'item.h']]], + ['color_5f03_1165',['COLOR_03',['../item_8h.html#ae49f217d43d4f11bba09ba8521482561',1,'item.h']]], + ['color_5f04_1166',['COLOR_04',['../item_8h.html#a34c245b9eb70f3284dabf6cc3de52536',1,'item.h']]], + ['color_5f05_1167',['COLOR_05',['../item_8h.html#a57bcb5844131c0754f1fba525a214620',1,'item.h']]], + ['color_5f06_1168',['COLOR_06',['../item_8h.html#a4edec5610cc050b60af747fdba12af06',1,'item.h']]], + ['color_5f07_1169',['COLOR_07',['../item_8h.html#ab1d32d05dadf3492f65b5f800fa5618e',1,'item.h']]], + ['color_5f08_1170',['COLOR_08',['../item_8h.html#ac821d84bcaba41c7c5976b5ddbebf368',1,'item.h']]], + ['color_5f09_1171',['COLOR_09',['../item_8h.html#a6ceedf860d65f57f689fd6f601e21518',1,'item.h']]], + ['color_5f10_1172',['COLOR_10',['../item_8h.html#a75c80f3f02b9b0927a8d015aebb7af10',1,'item.h']]], + ['color_5f11_1173',['COLOR_11',['../item_8h.html#a8179e22a6ba92f6e6cee1222086acc54',1,'item.h']]], + ['color_5f12_1174',['COLOR_12',['../item_8h.html#a4016de27f40304f4af1c5e86f2a9b136',1,'item.h']]], + ['color_5f13_1175',['COLOR_13',['../item_8h.html#a3d6766737abff34d1ce3f5e1938608c2',1,'item.h']]], + ['color_5f14_1176',['COLOR_14',['../item_8h.html#af7923506ad9c83a1d6ff2239fc1d6991',1,'item.h']]], + ['color_5f15_1177',['COLOR_15',['../item_8h.html#a90b084cd9c53134e51cf8e33f76120b3',1,'item.h']]], + ['color_5f16_1178',['COLOR_16',['../item_8h.html#adf95cdce14a99b34e5c87507dd021ad7',1,'item.h']]], + ['color_5f17_1179',['COLOR_17',['../item_8h.html#af49d0a71b4016529a8eef20beb48fd06',1,'item.h']]], + ['color_5f18_1180',['COLOR_18',['../item_8h.html#ac7af49f986bd34355491f2ea9a59d000',1,'item.h']]], + ['color_5f19_1181',['COLOR_19',['../item_8h.html#ab7cf5c8e4a9bdcc46fc244ff03b7ad93',1,'item.h']]], + ['color_5f20_1182',['COLOR_20',['../item_8h.html#a28961e93b11ef033930a31eccdf834e5',1,'item.h']]], + ['color_5f21_1183',['COLOR_21',['../item_8h.html#ad7e482a10fffa467e29aa108129b15da',1,'item.h']]], + ['color_5f22_1184',['COLOR_22',['../item_8h.html#a356d0ef73a52a4679b8ea22b0cb6717d',1,'item.h']]], + ['color_5f23_1185',['COLOR_23',['../item_8h.html#a3a50914b335a065c5f8036d8011c1dff',1,'item.h']]], + ['color_5f24_1186',['COLOR_24',['../item_8h.html#ae0cd44393eb310ca8ad62ead71fae7b8',1,'item.h']]], + ['color_5f25_1187',['COLOR_25',['../item_8h.html#a75dfadac4ea31ee703e31de16d0adac6',1,'item.h']]], + ['color_5f26_1188',['COLOR_26',['../item_8h.html#a3455ae45dd9ddab618876313df11cb83',1,'item.h']]], + ['color_5f27_1189',['COLOR_27',['../item_8h.html#adb768bc855e6350938b45324d0391c23',1,'item.h']]], + ['color_5f28_1190',['COLOR_28',['../item_8h.html#a13019111244d91d964a0e02d9966d794',1,'item.h']]], + ['color_5f29_1191',['COLOR_29',['../item_8h.html#a3980884a859d03c1a1331d52a2553162',1,'item.h']]], + ['color_5f30_1192',['COLOR_30',['../item_8h.html#a48cb16ceff4b96c448219b91e129959c',1,'item.h']]], + ['color_5f31_1193',['COLOR_31',['../item_8h.html#a273aeb8efa01c2517be4e8e7569f12a2',1,'item.h']]], + ['commit_5finterval_1194',['COMMIT_INTERVAL',['../config_8h.html#a1525dfe45316383a3abc953052846d0f',1,'config.h']]], + ['craft_5fkey_5fbackward_1195',['CRAFT_KEY_BACKWARD',['../config_8h.html#ab3dcee468e37484e417b20dee70db354',1,'config.h']]], + ['craft_5fkey_5fchat_1196',['CRAFT_KEY_CHAT',['../config_8h.html#a462961f197fa21b1375568a08a43e226',1,'config.h']]], + ['craft_5fkey_5fcommand_1197',['CRAFT_KEY_COMMAND',['../config_8h.html#ab08d6fa93b563085f55a35fcaa80487b',1,'config.h']]], + ['craft_5fkey_5ffly_1198',['CRAFT_KEY_FLY',['../config_8h.html#ad927d0e8985d23c80e2d3722bcfaca94',1,'config.h']]], + ['craft_5fkey_5fforward_1199',['CRAFT_KEY_FORWARD',['../config_8h.html#a402308affdf8c4cd11e6a27b02962fb2',1,'config.h']]], + ['craft_5fkey_5fitem_5fnext_1200',['CRAFT_KEY_ITEM_NEXT',['../config_8h.html#a4e4d2790600868c1cd4d6c36ee19b957',1,'config.h']]], + ['craft_5fkey_5fitem_5fprev_1201',['CRAFT_KEY_ITEM_PREV',['../config_8h.html#ac762add810a3299020afc380b279ad83',1,'config.h']]], + ['craft_5fkey_5fjump_1202',['CRAFT_KEY_JUMP',['../config_8h.html#a8f6ed5189769ea5501a4261530c588ee',1,'config.h']]], + ['craft_5fkey_5fleft_1203',['CRAFT_KEY_LEFT',['../config_8h.html#aada9bbb498a2453d3d817602e32d8cb5',1,'config.h']]], + ['craft_5fkey_5fobserve_1204',['CRAFT_KEY_OBSERVE',['../config_8h.html#aa2557c1ce884d99b3e783f21539bfbf4',1,'config.h']]], + ['craft_5fkey_5fobserve_5finset_1205',['CRAFT_KEY_OBSERVE_INSET',['../config_8h.html#ad0cc18105e4975291a0f2370ed2c9945',1,'config.h']]], + ['craft_5fkey_5fortho_1206',['CRAFT_KEY_ORTHO',['../config_8h.html#a3ee175c2546c83759a0d2e65bd7690dd',1,'config.h']]], + ['craft_5fkey_5fquit_1207',['CRAFT_KEY_QUIT',['../config_8h.html#a8b390793193f51c28fe1fabb02a08a2e',1,'config.h']]], + ['craft_5fkey_5fright_1208',['CRAFT_KEY_RIGHT',['../config_8h.html#a6ca915150a2291d644d3541ec714c0e1',1,'config.h']]], + ['craft_5fkey_5fsign_1209',['CRAFT_KEY_SIGN',['../config_8h.html#ab9fad85d79aa1e89af57a62cf43ffae6',1,'config.h']]], + ['craft_5fkey_5fzoom_1210',['CRAFT_KEY_ZOOM',['../config_8h.html#a4a717e8c4d85254e41e114dba6be65f6',1,'config.h']]], + ['create_5fchunk_5fradius_1211',['CREATE_CHUNK_RADIUS',['../config_8h.html#aaea687f884668d91b69025943976bc87',1,'config.h']]] +]; diff --git a/documentation/html/search/defines_3.html b/documentation/html/search/defines_3.html new file mode 100644 index 000000000..4d739dd8f --- /dev/null +++ b/documentation/html/search/defines_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_3.js b/documentation/html/search/defines_3.js new file mode 100644 index 000000000..d2cf43ed5 --- /dev/null +++ b/documentation/html/search/defines_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['dark_5fstone_1212',['DARK_STONE',['../item_8h.html#af0b180b659591aa278fd49e233036117',1,'item.h']]], + ['day_5flength_1213',['DAY_LENGTH',['../config_8h.html#a1d8b694476f8af0355ae619ec5a5d8b1',1,'config.h']]], + ['db_5fpath_1214',['DB_PATH',['../config_8h.html#a0670e0e3546fcd815d007fe1aeff321e',1,'config.h']]], + ['debug_1215',['DEBUG',['../config_8h.html#ad72dbcf6d0153db1b8d8a58001feed83',1,'config.h']]], + ['default_5fport_1216',['DEFAULT_PORT',['../client_8h.html#a16b710f592bf8f7900666392adc444dc',1,'client.h']]], + ['degrees_1217',['DEGREES',['../util_8h.html#a6ddad223fc11aed387553f0bb86a867f',1,'util.h']]], + ['delete_5fchunk_5fradius_1218',['DELETE_CHUNK_RADIUS',['../config_8h.html#ac028e03821cb1a5ac870385149ae5c18',1,'config.h']]], + ['dirt_1219',['DIRT',['../item_8h.html#a7c912c163a0ed562956a9b42195766d3',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_4.html b/documentation/html/search/defines_4.html new file mode 100644 index 000000000..2370a3b63 --- /dev/null +++ b/documentation/html/search/defines_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_4.js b/documentation/html/search/defines_4.js new file mode 100644 index 000000000..4ac447142 --- /dev/null +++ b/documentation/html/search/defines_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['empty_1220',['EMPTY',['../item_8h.html#a2b7cf2a3641be7b89138615764d60ba3',1,'item.h']]], + ['empty_5fentry_1221',['EMPTY_ENTRY',['../map_8h.html#ae925b42947f9a7c554c79c170b07a90e',1,'map.h']]], + ['end_5fmap_5ffor_5feach_1222',['END_MAP_FOR_EACH',['../map_8h.html#a6cf103060cd07f4e521714563dcb7d15',1,'map.h']]] +]; diff --git a/documentation/html/search/defines_5.html b/documentation/html/search/defines_5.html new file mode 100644 index 000000000..c149d6692 --- /dev/null +++ b/documentation/html/search/defines_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_5.js b/documentation/html/search/defines_5.js new file mode 100644 index 000000000..bcf143426 --- /dev/null +++ b/documentation/html/search/defines_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['fullscreen_1223',['FULLSCREEN',['../config_8h.html#ab21210f7b05e8e5616b6155ebd777161',1,'config.h']]] +]; diff --git a/documentation/html/search/defines_6.html b/documentation/html/search/defines_6.html new file mode 100644 index 000000000..f8ce107fd --- /dev/null +++ b/documentation/html/search/defines_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_6.js b/documentation/html/search/defines_6.js new file mode 100644 index 000000000..d7f229d37 --- /dev/null +++ b/documentation/html/search/defines_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['glass_1224',['GLASS',['../item_8h.html#ac070bc05447c6faa5ec491a62b615e9f',1,'item.h']]], + ['grass_1225',['GRASS',['../item_8h.html#a0f6b2c5e6a922165582784ca418d0d17',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_7.html b/documentation/html/search/defines_7.html new file mode 100644 index 000000000..2d8306588 --- /dev/null +++ b/documentation/html/search/defines_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_7.js b/documentation/html/search/defines_7.js new file mode 100644 index 000000000..e8fdeb747 --- /dev/null +++ b/documentation/html/search/defines_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['invert_5fmouse_1226',['INVERT_MOUSE',['../config_8h.html#a905ae3578a441bedd55827ed2b610f65',1,'config.h']]] +]; diff --git a/documentation/html/search/defines_8.html b/documentation/html/search/defines_8.html new file mode 100644 index 000000000..7bf163f6c --- /dev/null +++ b/documentation/html/search/defines_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_8.js b/documentation/html/search/defines_8.js new file mode 100644 index 000000000..71049d953 --- /dev/null +++ b/documentation/html/search/defines_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['lava_1227',['LAVA',['../item_8h.html#a28064dfebfae6ae7d376a7461e7a2e1d',1,'item.h']]], + ['leaves_1228',['LEAVES',['../item_8h.html#ab22f256be049241041a77ec883d7e2cd',1,'item.h']]], + ['light_5fstone_1229',['LIGHT_STONE',['../item_8h.html#abd6bff7aad8471be39ed9c88f5be49f5',1,'item.h']]], + ['log_1230',['LOG',['../util_8h.html#a3577749fb48d57a158b8ac1a0b3ab57e',1,'util.h']]] +]; diff --git a/documentation/html/search/defines_9.html b/documentation/html/search/defines_9.html new file mode 100644 index 000000000..5ce71d7be --- /dev/null +++ b/documentation/html/search/defines_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_9.js b/documentation/html/search/defines_9.js new file mode 100644 index 000000000..21b175a93 --- /dev/null +++ b/documentation/html/search/defines_9.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['map_5ffor_5feach_1231',['MAP_FOR_EACH',['../map_8h.html#a8017e14817cccade85ab9976ec7c08e4',1,'map.h']]], + ['max_1232',['MAX',['../util_8h.html#afa99ec4acc4ecb2dc3c2d05da15d0e3f',1,'util.h']]], + ['max_5faddr_5flength_1233',['MAX_ADDR_LENGTH',['../main_8c.html#af5116a516a99d43d46a02f4b59763da7',1,'main.c']]], + ['max_5fchunks_1234',['MAX_CHUNKS',['../main_8c.html#a9e879c11aa15653382faa681060e6179',1,'main.c']]], + ['max_5fmessages_1235',['MAX_MESSAGES',['../config_8h.html#a1f02f60afb419aa25921dcd8ae49f807',1,'config.h']]], + ['max_5fname_5flength_1236',['MAX_NAME_LENGTH',['../main_8c.html#a0c397a708cec89c74029582574516b30',1,'main.c']]], + ['max_5fpath_5flength_1237',['MAX_PATH_LENGTH',['../main_8c.html#a9eb6992d76f02128388ae95c0415604a',1,'main.c']]], + ['max_5fplayer_5fhealth_1238',['MAX_PLAYER_HEALTH',['../main_8c.html#a6d2c30f3edc291856e5af4a456ba3435',1,'main.c']]], + ['max_5fplayers_1239',['MAX_PLAYERS',['../main_8c.html#a1c346c944e8204fd06dc057393c7c96d',1,'main.c']]], + ['max_5fpost_5flength_1240',['MAX_POST_LENGTH',['../auth_8c.html#a8ed8ab8bedf1e734d73d9411ff6137eb',1,'auth.c']]], + ['max_5fresponse_5flength_1241',['MAX_RESPONSE_LENGTH',['../auth_8c.html#ac0d0e3d7f96a047b0a530d0f5b4b36fb',1,'auth.c']]], + ['max_5fsign_5flength_1242',['MAX_SIGN_LENGTH',['../sign_8h.html#a710dbda73a9300c41fa70abbc375b912',1,'sign.h']]], + ['max_5ftext_5flength_1243',['MAX_TEXT_LENGTH',['../main_8c.html#a9a90baeac9b3273d185357200b599b39',1,'main.c']]], + ['min_1244',['MIN',['../util_8h.html#a3acffbd305ee72dcd4593c0d8af64a4f',1,'util.h']]], + ['mode_5foffline_1245',['MODE_OFFLINE',['../main_8c.html#a1479d1a15cc2e8243c4d068a5c7a0954',1,'main.c']]], + ['mode_5fonline_1246',['MODE_ONLINE',['../main_8c.html#ac5515a403da07a28313289aede022bf8',1,'main.c']]], + ['mouse_5fsensitivity_1247',['MOUSE_SENSITIVITY',['../main_8c.html#aedeb5d36b16f15c289185782926cc288',1,'main.c']]] +]; diff --git a/documentation/html/search/defines_a.html b/documentation/html/search/defines_a.html new file mode 100644 index 000000000..03017a4a8 --- /dev/null +++ b/documentation/html/search/defines_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_a.js b/documentation/html/search/defines_a.js new file mode 100644 index 000000000..ac7ca091e --- /dev/null +++ b/documentation/html/search/defines_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['pi_1248',['PI',['../util_8h.html#a598a3330b3c21701223ee0ca14316eca',1,'util.h']]], + ['plank_1249',['PLANK',['../item_8h.html#ab6f918b8028f65da43a46da84cbf08db',1,'item.h']]], + ['purple_5fflower_1250',['PURPLE_FLOWER',['../item_8h.html#ac9adae9a9c8461879e8a55cfd3f36398',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_b.html b/documentation/html/search/defines_b.html new file mode 100644 index 000000000..aeb222eba --- /dev/null +++ b/documentation/html/search/defines_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_b.js b/documentation/html/search/defines_b.js new file mode 100644 index 000000000..4dd3fd91b --- /dev/null +++ b/documentation/html/search/defines_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['queue_5fsize_1251',['QUEUE_SIZE',['../client_8c.html#a142810068f1b99cd93d3fc9f0e160e02',1,'client.c']]] +]; diff --git a/documentation/html/search/defines_c.html b/documentation/html/search/defines_c.html new file mode 100644 index 000000000..e8d0cb490 --- /dev/null +++ b/documentation/html/search/defines_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_c.js b/documentation/html/search/defines_c.js new file mode 100644 index 000000000..d29fc96e8 --- /dev/null +++ b/documentation/html/search/defines_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['radians_1252',['RADIANS',['../util_8h.html#a4dddbaece4412db60bf53ae8c509f8b8',1,'util.h']]], + ['rain_1253',['RAIN',['../item_8h.html#a6a1f6ca4aa84c21d62a4c18bd9da4bea',1,'item.h']]], + ['recv_5fsize_1254',['RECV_SIZE',['../client_8c.html#ab05e00e8cea9db60202e746d95818997',1,'client.c']]], + ['red_5fflower_1255',['RED_FLOWER',['../item_8h.html#a4d1c84401038068e519348233056cfe6',1,'item.h']]], + ['render_5fchunk_5fradius_1256',['RENDER_CHUNK_RADIUS',['../config_8h.html#a7c7fd1ef1a74541e26772d73992a8161',1,'config.h']]], + ['render_5fsign_5fradius_1257',['RENDER_SIGN_RADIUS',['../config_8h.html#a1a202d5cc24295b4e65da951c50a5641',1,'config.h']]] +]; diff --git a/documentation/html/search/defines_d.html b/documentation/html/search/defines_d.html new file mode 100644 index 000000000..5ec34d26b --- /dev/null +++ b/documentation/html/search/defines_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_d.js b/documentation/html/search/defines_d.js new file mode 100644 index 000000000..d65d16e1d --- /dev/null +++ b/documentation/html/search/defines_d.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['sand_1258',['SAND',['../item_8h.html#ab83ae9a4c2ef10fadfc4e9ea51b67822',1,'item.h']]], + ['scroll_5fthreshold_1259',['SCROLL_THRESHOLD',['../config_8h.html#ac692301c711d104351c4044814129879',1,'config.h']]], + ['show_5fchat_5ftext_1260',['SHOW_CHAT_TEXT',['../config_8h.html#acc34b46ff6ecc6f7c5224ef6193a607e',1,'config.h']]], + ['show_5fclouds_1261',['SHOW_CLOUDS',['../config_8h.html#a6346b7ca36e603d858ef9d2ea8c2be52',1,'config.h']]], + ['show_5fcrosshairs_1262',['SHOW_CROSSHAIRS',['../config_8h.html#a31b9bc0941bf92088e09b11b5b3166f7',1,'config.h']]], + ['show_5finfo_5ftext_1263',['SHOW_INFO_TEXT',['../config_8h.html#a128cde77348b6316727e18f27040cece',1,'config.h']]], + ['show_5fitem_1264',['SHOW_ITEM',['../config_8h.html#af6692069acd5df58af89424cbfb98f3b',1,'config.h']]], + ['show_5fplants_1265',['SHOW_PLANTS',['../config_8h.html#a43009e966526eca8039a5938b0235141',1,'config.h']]], + ['show_5fplayer_5fnames_1266',['SHOW_PLAYER_NAMES',['../config_8h.html#a6f50abc8e94d0fc59e334503629f2ff0',1,'config.h']]], + ['show_5ftrees_1267',['SHOW_TREES',['../config_8h.html#a747af1c781a2b192ea14e7605a087e89',1,'config.h']]], + ['show_5fwireframe_1268',['SHOW_WIREFRAME',['../config_8h.html#a3487c25b932bb91402702c90fa28d0df',1,'config.h']]], + ['sign_1269',['SIGN',['../util_8h.html#a8c5ff70b6b28cd0157c50a22406f92c4',1,'util.h']]], + ['snow_1270',['SNOW',['../item_8h.html#aa333391aab78ded801da8425068ce564',1,'item.h']]], + ['stone_1271',['STONE',['../item_8h.html#a3a50d6c3dd0fbb5b801d6efe0279d267',1,'item.h']]], + ['sun_5fflower_1272',['SUN_FLOWER',['../item_8h.html#a63c6efb1d85af83ec0f6d7259a2902c7',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_e.html b/documentation/html/search/defines_e.html new file mode 100644 index 000000000..189cee784 --- /dev/null +++ b/documentation/html/search/defines_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_e.js b/documentation/html/search/defines_e.js new file mode 100644 index 000000000..c16d3ec1e --- /dev/null +++ b/documentation/html/search/defines_e.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tall_5fgrass_1273',['TALL_GRASS',['../item_8h.html#aa5a963e1f0a969b7735cb7ff14024104',1,'item.h']]] +]; diff --git a/documentation/html/search/defines_f.html b/documentation/html/search/defines_f.html new file mode 100644 index 000000000..eeb6b2f58 --- /dev/null +++ b/documentation/html/search/defines_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/defines_f.js b/documentation/html/search/defines_f.js new file mode 100644 index 000000000..99e8eaa52 --- /dev/null +++ b/documentation/html/search/defines_f.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['use_5fcache_1274',['USE_CACHE',['../config_8h.html#a2565afea33c9e3255c67f748f425543a',1,'config.h']]] +]; diff --git a/documentation/html/search/enums_0.html b/documentation/html/search/enums_0.html new file mode 100644 index 000000000..f2b0f7532 --- /dev/null +++ b/documentation/html/search/enums_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/enums_0.js b/documentation/html/search/enums_0.js new file mode 100644 index 000000000..d86def64f --- /dev/null +++ b/documentation/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ringentrytype_1146',['RingEntryType',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420d',1,'ring.h']]] +]; diff --git a/documentation/html/search/enumvalues_0.html b/documentation/html/search/enumvalues_0.html new file mode 100644 index 000000000..01f10803f --- /dev/null +++ b/documentation/html/search/enumvalues_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/enumvalues_0.js b/documentation/html/search/enumvalues_0.js new file mode 100644 index 000000000..795c530ef --- /dev/null +++ b/documentation/html/search/enumvalues_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['block_1147',['BLOCK',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da02fc27068fe9a3c151ffcc08ec5bb65d',1,'ring.h']]] +]; diff --git a/documentation/html/search/enumvalues_1.html b/documentation/html/search/enumvalues_1.html new file mode 100644 index 000000000..5a0ca7a55 --- /dev/null +++ b/documentation/html/search/enumvalues_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/enumvalues_1.js b/documentation/html/search/enumvalues_1.js new file mode 100644 index 000000000..badd6322f --- /dev/null +++ b/documentation/html/search/enumvalues_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['commit_1148',['COMMIT',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da1ae3399502bd66af21b15736d4fae1a1',1,'ring.h']]] +]; diff --git a/documentation/html/search/enumvalues_2.html b/documentation/html/search/enumvalues_2.html new file mode 100644 index 000000000..324a403fc --- /dev/null +++ b/documentation/html/search/enumvalues_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/enumvalues_2.js b/documentation/html/search/enumvalues_2.js new file mode 100644 index 000000000..0efd05960 --- /dev/null +++ b/documentation/html/search/enumvalues_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['exit_1149',['EXIT',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da7a10b5d68d31711288e1fe0fa17dbf4f',1,'ring.h']]] +]; diff --git a/documentation/html/search/enumvalues_3.html b/documentation/html/search/enumvalues_3.html new file mode 100644 index 000000000..64f035144 --- /dev/null +++ b/documentation/html/search/enumvalues_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/enumvalues_3.js b/documentation/html/search/enumvalues_3.js new file mode 100644 index 000000000..de732be55 --- /dev/null +++ b/documentation/html/search/enumvalues_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_1150',['KEY',['../ring_8h.html#a0020edd7e28d219c1fcaa2fce15d420da147e71049e3285d642d0d5268dba260f',1,'ring.h']]] +]; diff --git a/documentation/html/search/files_0.html b/documentation/html/search/files_0.html new file mode 100644 index 000000000..844f0d648 --- /dev/null +++ b/documentation/html/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_0.js b/documentation/html/search/files_0.js new file mode 100644 index 000000000..f2805a89c --- /dev/null +++ b/documentation/html/search/files_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['auth_2ec_647',['auth.c',['../auth_8c.html',1,'']]], + ['auth_2eh_648',['auth.h',['../auth_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_1.html b/documentation/html/search/files_1.html new file mode 100644 index 000000000..92739573b --- /dev/null +++ b/documentation/html/search/files_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_1.js b/documentation/html/search/files_1.js new file mode 100644 index 000000000..92ee8c302 --- /dev/null +++ b/documentation/html/search/files_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['builder_2epy_649',['builder.py',['../builder_8py.html',1,'']]] +]; diff --git a/documentation/html/search/files_2.html b/documentation/html/search/files_2.html new file mode 100644 index 000000000..185170ad0 --- /dev/null +++ b/documentation/html/search/files_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_2.js b/documentation/html/search/files_2.js new file mode 100644 index 000000000..c8bb3715f --- /dev/null +++ b/documentation/html/search/files_2.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['client_2ec_650',['client.c',['../client_8c.html',1,'']]], + ['client_2eh_651',['client.h',['../client_8h.html',1,'']]], + ['config_2eh_652',['config.h',['../config_8h.html',1,'']]], + ['cube_2ec_653',['cube.c',['../cube_8c.html',1,'']]], + ['cube_2eh_654',['cube.h',['../cube_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_3.html b/documentation/html/search/files_3.html new file mode 100644 index 000000000..982b95229 --- /dev/null +++ b/documentation/html/search/files_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_3.js b/documentation/html/search/files_3.js new file mode 100644 index 000000000..be268bef8 --- /dev/null +++ b/documentation/html/search/files_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['db_2ec_655',['db.c',['../db_8c.html',1,'']]], + ['db_2eh_656',['db.h',['../db_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_4.html b/documentation/html/search/files_4.html new file mode 100644 index 000000000..bcac70223 --- /dev/null +++ b/documentation/html/search/files_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_4.js b/documentation/html/search/files_4.js new file mode 100644 index 000000000..4e0534eff --- /dev/null +++ b/documentation/html/search/files_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['item_2ec_657',['item.c',['../item_8c.html',1,'']]], + ['item_2eh_658',['item.h',['../item_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_5.html b/documentation/html/search/files_5.html new file mode 100644 index 000000000..9b2d69718 --- /dev/null +++ b/documentation/html/search/files_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_5.js b/documentation/html/search/files_5.js new file mode 100644 index 000000000..b17c85182 --- /dev/null +++ b/documentation/html/search/files_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_2emd_659',['LICENSE.md',['../LICENSE_8md.html',1,'']]] +]; diff --git a/documentation/html/search/files_6.html b/documentation/html/search/files_6.html new file mode 100644 index 000000000..087793155 --- /dev/null +++ b/documentation/html/search/files_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_6.js b/documentation/html/search/files_6.js new file mode 100644 index 000000000..8d174c361 --- /dev/null +++ b/documentation/html/search/files_6.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['main_2ec_660',['main.c',['../main_8c.html',1,'']]], + ['map_2ec_661',['map.c',['../map_8c.html',1,'']]], + ['map_2eh_662',['map.h',['../map_8h.html',1,'']]], + ['matrix_2ec_663',['matrix.c',['../matrix_8c.html',1,'']]], + ['matrix_2eh_664',['matrix.h',['../matrix_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_7.html b/documentation/html/search/files_7.html new file mode 100644 index 000000000..c02d5f4d2 --- /dev/null +++ b/documentation/html/search/files_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_7.js b/documentation/html/search/files_7.js new file mode 100644 index 000000000..822abfd11 --- /dev/null +++ b/documentation/html/search/files_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['readme_2emd_665',['README.md',['../README_8md.html',1,'']]], + ['ring_2ec_666',['ring.c',['../ring_8c.html',1,'']]], + ['ring_2eh_667',['ring.h',['../ring_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_8.html b/documentation/html/search/files_8.html new file mode 100644 index 000000000..03ad9ee60 --- /dev/null +++ b/documentation/html/search/files_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_8.js b/documentation/html/search/files_8.js new file mode 100644 index 000000000..93ab426c8 --- /dev/null +++ b/documentation/html/search/files_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['server_2epy_668',['server.py',['../server_8py.html',1,'']]], + ['sign_2ec_669',['sign.c',['../sign_8c.html',1,'']]], + ['sign_2eh_670',['sign.h',['../sign_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_9.html b/documentation/html/search/files_9.html new file mode 100644 index 000000000..0e459a2cd --- /dev/null +++ b/documentation/html/search/files_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_9.js b/documentation/html/search/files_9.js new file mode 100644 index 000000000..3a665ae12 --- /dev/null +++ b/documentation/html/search/files_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['util_2ec_671',['util.c',['../util_8c.html',1,'']]], + ['util_2eh_672',['util.h',['../util_8h.html',1,'']]] +]; diff --git a/documentation/html/search/files_a.html b/documentation/html/search/files_a.html new file mode 100644 index 000000000..53adebcf8 --- /dev/null +++ b/documentation/html/search/files_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/files_a.js b/documentation/html/search/files_a.js new file mode 100644 index 000000000..23b57e442 --- /dev/null +++ b/documentation/html/search/files_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['world_2ec_673',['world.c',['../world_8c.html',1,'']]], + ['world_2eh_674',['world.h',['../world_8h.html',1,'']]], + ['world_2epy_675',['world.py',['../world_8py.html',1,'']]] +]; diff --git a/documentation/html/search/functions_0.html b/documentation/html/search/functions_0.html new file mode 100644 index 000000000..04d772fad --- /dev/null +++ b/documentation/html/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_0.js b/documentation/html/search/functions_0.js new file mode 100644 index 000000000..de3a05609 --- /dev/null +++ b/documentation/html/search/functions_0.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['_5f_5finit_5f_5f_676',['__init__',['../classserver_1_1RateLimiter.html#a79f09a0b070dcbb8776671778ca2bb5d',1,'server.RateLimiter.__init__()'],['../classserver_1_1Model.html#a9a37ce5d48d65d1f73e3310dd540b5cd',1,'server.Model.__init__()'],['../classworld_1_1World.html#aa14e7c2893fec3ed9c695cf5ba95f214',1,'world.World.__init__()'],['../classbuilder_1_1Client.html#a02588c7babef701a3609e44f7ba83977',1,'builder.Client.__init__()']]], + ['_5fdb_5fcommit_677',['_db_commit',['../db_8c.html#a1aed58f7bcbe915810c97ae380182cd2',1,'db.c']]], + ['_5fdb_5finsert_5fblock_678',['_db_insert_block',['../db_8c.html#a27c690d52535957e0940b8f88f304055',1,'db.c']]], + ['_5fdb_5fset_5fkey_679',['_db_set_key',['../db_8c.html#a340f403eae6b8143d02523926bc5dacb',1,'db.c']]], + ['_5fgen_5fsign_5fbuffer_680',['_gen_sign_buffer',['../main_8c.html#ab1bd1e0b06d38e77710db3329d7f546e',1,'main.c']]], + ['_5fhit_5ftest_681',['_hit_test',['../main_8c.html#a23a93a17fa9eedfcbb6e7c8f482c7c4f',1,'main.c']]], + ['_5fmake_5fsphere_682',['_make_sphere',['../cube_8c.html#aacdaa9ca00caef345c32d9aae4ae54d3',1,'cube.c']]], + ['_5fset_5fblock_683',['_set_block',['../main_8c.html#a8847f3ae63584033b0761bb027a0df63',1,'main.c']]], + ['_5fset_5fsign_684',['_set_sign',['../main_8c.html#ab77a91105f29ae5a826f88a859fbb522',1,'main.c']]], + ['_5fsign_5flist_5fadd_685',['_sign_list_add',['../sign_8c.html#a0c57342de844454de7f77b1981b55227',1,'sign.c']]] +]; diff --git a/documentation/html/search/functions_1.html b/documentation/html/search/functions_1.html new file mode 100644 index 000000000..ca6e64fd3 --- /dev/null +++ b/documentation/html/search/functions_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_1.js b/documentation/html/search/functions_1.js new file mode 100644 index 000000000..b8f0b6fd2 --- /dev/null +++ b/documentation/html/search/functions_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['add_5fmessage_686',['add_message',['../main_8c.html#af2984ac5e1b64e1c902ee5cec60c4a85',1,'main.c']]], + ['authenticate_687',['authenticate',['../classbuilder_1_1Client.html#ae97da152d9317fa09c7557e7741a010a',1,'builder::Client']]] +]; diff --git a/documentation/html/search/functions_10.html b/documentation/html/search/functions_10.html new file mode 100644 index 000000000..3cf61c9dc --- /dev/null +++ b/documentation/html/search/functions_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_10.js b/documentation/html/search/functions_10.js new file mode 100644 index 000000000..489246e21 --- /dev/null +++ b/documentation/html/search/functions_10.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['send_921',['send',['../classserver_1_1Handler.html#adb6dffc7bc471dbecdd82d239062dc02',1,'server::Handler']]], + ['send_5fblock_922',['send_block',['../classserver_1_1Model.html#a24dcce0e4633051852b7bff4901ef13d',1,'server::Model']]], + ['send_5fdisconnect_923',['send_disconnect',['../classserver_1_1Model.html#a1fb58f37e3b98007a6e220a18d0abb4d',1,'server::Model']]], + ['send_5fnick_924',['send_nick',['../classserver_1_1Model.html#a9acbf2a15a0a96e0232b9ac22173496d',1,'server::Model']]], + ['send_5fnicks_925',['send_nicks',['../classserver_1_1Model.html#ab39036fff36add7d7dced2892d4f7749',1,'server::Model']]], + ['send_5fposition_926',['send_position',['../classserver_1_1Model.html#af0f14f4dd4c97c00023ba014ae6974b0',1,'server::Model']]], + ['send_5fpositions_927',['send_positions',['../classserver_1_1Model.html#aa37bc39f34c8cb3a0f72c47c6cb44f6e',1,'server::Model']]], + ['send_5fraw_928',['send_raw',['../classserver_1_1Handler.html#af411766d0b950162a257d9af739e7351',1,'server::Handler']]], + ['send_5fsign_929',['send_sign',['../classserver_1_1Model.html#ad9bb38de307f92f2e34059e8c21217b8',1,'server::Model']]], + ['send_5ftalk_930',['send_talk',['../classserver_1_1Model.html#ac72b296e1388a69afa59ccb6a1412770',1,'server::Model']]], + ['set_5fblock_931',['set_block',['../classbuilder_1_1Client.html#acafa155f4906f3a23059e1cd30118172',1,'builder.Client.set_block()'],['../main_8c.html#aa0109282762c178948a57c6baee6ee32',1,'set_block(): main.c']]], + ['set_5fblocks_932',['set_blocks',['../classbuilder_1_1Client.html#a884f5ca5df910e82ed1fee3f6aae5140',1,'builder::Client']]], + ['set_5fmatrix_5f2d_933',['set_matrix_2d',['../matrix_8c.html#a5e1425d81e31dc21b5015b1cfbe2c1e2',1,'set_matrix_2d(float *matrix, int width, int height): matrix.c'],['../matrix_8h.html#a5e1425d81e31dc21b5015b1cfbe2c1e2',1,'set_matrix_2d(float *matrix, int width, int height): matrix.c']]], + ['set_5fmatrix_5f3d_934',['set_matrix_3d',['../matrix_8c.html#a4b924b6286bd77a90a0f4b685421ba8c',1,'set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius): matrix.c'],['../matrix_8h.html#a4b924b6286bd77a90a0f4b685421ba8c',1,'set_matrix_3d(float *matrix, int width, int height, float x, float y, float z, float rx, float ry, float fov, int ortho, int radius): matrix.c']]], + ['set_5fmatrix_5fitem_935',['set_matrix_item',['../matrix_8h.html#a8fd3bdaeea6a8bc0bf64a09b689d7662',1,'set_matrix_item(float *matrix, int width, int height, int scale): matrix.c'],['../matrix_8c.html#a8fd3bdaeea6a8bc0bf64a09b689d7662',1,'set_matrix_item(float *matrix, int width, int height, int scale): matrix.c']]], + ['set_5fsign_936',['set_sign',['../main_8c.html#a2eaac3f4ff872ace636b77f370d7df2a',1,'main.c']]], + ['setup_937',['setup',['../classserver_1_1Handler.html#aaa1010b08d4c9870e25c57ea41f48d27',1,'server::Handler']]], + ['sign_5flist_5fadd_938',['sign_list_add',['../sign_8c.html#aae114a42cacb505071f226ec3a4c39c7',1,'sign_list_add(SignList *list, int x, int y, int z, int face, const char *text): sign.c'],['../sign_8h.html#aae114a42cacb505071f226ec3a4c39c7',1,'sign_list_add(SignList *list, int x, int y, int z, int face, const char *text): sign.c']]], + ['sign_5flist_5falloc_939',['sign_list_alloc',['../sign_8c.html#a6ec34964157462244e401d16e07ddc4e',1,'sign_list_alloc(SignList *list, int capacity): sign.c'],['../sign_8h.html#a6ec34964157462244e401d16e07ddc4e',1,'sign_list_alloc(SignList *list, int capacity): sign.c']]], + ['sign_5flist_5ffree_940',['sign_list_free',['../sign_8c.html#a73e97d25bafe85b24aa63050cd4763c7',1,'sign_list_free(SignList *list): sign.c'],['../sign_8h.html#a73e97d25bafe85b24aa63050cd4763c7',1,'sign_list_free(SignList *list): sign.c']]], + ['sign_5flist_5fgrow_941',['sign_list_grow',['../sign_8c.html#a637236c63ead3d87890a7caf28c956c0',1,'sign_list_grow(SignList *list): sign.c'],['../sign_8h.html#a637236c63ead3d87890a7caf28c956c0',1,'sign_list_grow(SignList *list): sign.c']]], + ['sign_5flist_5fremove_942',['sign_list_remove',['../sign_8h.html#a27610f7da6a948fcc73b3dd424dbf3d6',1,'sign_list_remove(SignList *list, int x, int y, int z, int face): sign.c'],['../sign_8c.html#a27610f7da6a948fcc73b3dd424dbf3d6',1,'sign_list_remove(SignList *list, int x, int y, int z, int face): sign.c']]], + ['sign_5flist_5fremove_5fall_943',['sign_list_remove_all',['../sign_8h.html#a78eb1832d934d3bd41dad63fd17de6f3',1,'sign_list_remove_all(SignList *list, int x, int y, int z): sign.c'],['../sign_8c.html#a78eb1832d934d3bd41dad63fd17de6f3',1,'sign_list_remove_all(SignList *list, int x, int y, int z): sign.c']]], + ['sphere_944',['sphere',['../namespacebuilder.html#a8e9ab9906fbfd581f328d952dbb7cbef',1,'builder.sphere()'],['../main_8c.html#ab2c75ed50f10bc153a35a86603c691d6',1,'sphere(): main.c']]], + ['start_945',['start',['../classserver_1_1Model.html#a24d947d23fffd4f1fa2adffdffa7ad46',1,'server.Model.start()'],['../classserver_1_1Handler.html#a9559ddb3e1f06933cb4fbbc9513fced8',1,'server.Handler.start(self)']]], + ['stop_946',['stop',['../classserver_1_1Handler.html#aa48211356bb980e565bfb750c670f958',1,'server::Handler']]], + ['string_5fwidth_947',['string_width',['../util_8c.html#a728bd548775520de6222770522208b4e',1,'string_width(const char *input): util.c'],['../util_8h.html#a728bd548775520de6222770522208b4e',1,'string_width(const char *input): util.c']]] +]; diff --git a/documentation/html/search/functions_11.html b/documentation/html/search/functions_11.html new file mode 100644 index 000000000..22dd78b23 --- /dev/null +++ b/documentation/html/search/functions_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_11.js b/documentation/html/search/functions_11.js new file mode 100644 index 000000000..5ddc31deb --- /dev/null +++ b/documentation/html/search/functions_11.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['tick_948',['tick',['../classserver_1_1RateLimiter.html#ade1ad2750a0031068879aae684adb78c',1,'server::RateLimiter']]], + ['time_5fof_5fday_949',['time_of_day',['../main_8c.html#ae0e8aeb03f12e7b13f5c13d145ae022c',1,'main.c']]], + ['tokenize_950',['tokenize',['../util_8c.html#a30683869eded6403175a3eb66e005151',1,'tokenize(char *str, const char *delim, char **key): util.c'],['../util_8h.html#a30683869eded6403175a3eb66e005151',1,'tokenize(char *str, const char *delim, char **key): util.c']]], + ['tree_951',['tree',['../main_8c.html#aafcc3a35543a6ccedfaa0b09729b027b',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_12.html b/documentation/html/search/functions_12.html new file mode 100644 index 000000000..cb20ca7b7 --- /dev/null +++ b/documentation/html/search/functions_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_12.js b/documentation/html/search/functions_12.js new file mode 100644 index 000000000..c7ab88c22 --- /dev/null +++ b/documentation/html/search/functions_12.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['unset_5fsign_952',['unset_sign',['../main_8c.html#acfcd284d81a6f4a27b2850ea0e952456',1,'main.c']]], + ['unset_5fsign_5fface_953',['unset_sign_face',['../main_8c.html#a8c8596c8de141b83dbb8cba29f90f36d',1,'main.c']]], + ['update_5ffps_954',['update_fps',['../util_8c.html#af7a80b947fb2bfff0485a23a3389af76',1,'update_fps(FPS *fps): util.c'],['../util_8h.html#af7a80b947fb2bfff0485a23a3389af76',1,'update_fps(FPS *fps): util.c']]], + ['update_5fplayer_955',['update_player',['../main_8c.html#aae6fa4026cff542c294864f1e561fce9',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_13.html b/documentation/html/search/functions_13.html new file mode 100644 index 000000000..123660c15 --- /dev/null +++ b/documentation/html/search/functions_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_13.js b/documentation/html/search/functions_13.js new file mode 100644 index 000000000..465605a4d --- /dev/null +++ b/documentation/html/search/functions_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['wrap_956',['wrap',['../util_8c.html#ac8c3171cba45384557e11e37193387f4',1,'wrap(const char *input, int max_width, char *output, int max_length): util.c'],['../util_8h.html#ac8c3171cba45384557e11e37193387f4',1,'wrap(const char *input, int max_width, char *output, int max_length): util.c']]], + ['write_5ffunction_957',['write_function',['../auth_8c.html#a0100ee31782b24826f9799c16987d01d',1,'auth.c']]] +]; diff --git a/documentation/html/search/functions_2.html b/documentation/html/search/functions_2.html new file mode 100644 index 000000000..6587a061f --- /dev/null +++ b/documentation/html/search/functions_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_2.js b/documentation/html/search/functions_2.js new file mode 100644 index 000000000..c730a8e58 --- /dev/null +++ b/documentation/html/search/functions_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['bitmap_688',['bitmap',['../classbuilder_1_1Client.html#ac972baa59254fcd4d84a8aa678abbf75',1,'builder::Client']]], + ['builder_5fblock_689',['builder_block',['../main_8c.html#a9ee831992fb4faa91f583aafd77c8d8f',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_3.html b/documentation/html/search/functions_3.html new file mode 100644 index 000000000..756ecfee2 --- /dev/null +++ b/documentation/html/search/functions_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_3.js b/documentation/html/search/functions_3.js new file mode 100644 index 000000000..584f940fa --- /dev/null +++ b/documentation/html/search/functions_3.js @@ -0,0 +1,39 @@ +var searchData= +[ + ['char_5fwidth_690',['char_width',['../util_8h.html#ab42aaa94b0a4f7758ef238745490c596',1,'char_width(char input): util.c'],['../util_8c.html#ab42aaa94b0a4f7758ef238745490c596',1,'char_width(char input): util.c']]], + ['chunk_5fdistance_691',['chunk_distance',['../main_8c.html#a0d32a42d3557884c194312202227f151',1,'main.c']]], + ['chunk_5fvisible_692',['chunk_visible',['../main_8c.html#a58e319a9c57e4f43bf49c3948ab86355',1,'main.c']]], + ['chunked_693',['chunked',['../main_8c.html#ac7ceb3c3abf861fa6b1ea532cd674941',1,'chunked(): main.c'],['../namespaceserver.html#a1bddf2212e5e236558e01a2add6821cd',1,'server.chunked()']]], + ['circle_5fx_694',['circle_x',['../namespacebuilder.html#a21b00d370c14814ab204c09b06e69f64',1,'builder']]], + ['circle_5fy_695',['circle_y',['../namespacebuilder.html#a74a501ba71bf9870233067f25a437c93',1,'builder']]], + ['circle_5fz_696',['circle_z',['../namespacebuilder.html#a7210e54b35764e02ea0be4da83d78cf1',1,'builder']]], + ['cleanup_697',['cleanup',['../namespaceserver.html#a223dfaf8900fb131c5f19f7eb46c033b',1,'server']]], + ['client_5fblock_698',['client_block',['../client_8c.html#a12b5eb5754c1bb50bbde65c6bccce16f',1,'client_block(int x, int y, int z, int w): client.c'],['../client_8h.html#a12b5eb5754c1bb50bbde65c6bccce16f',1,'client_block(int x, int y, int z, int w): client.c']]], + ['client_5fchunk_699',['client_chunk',['../client_8c.html#a53b8540e54c542d09e2d947c419fe2e6',1,'client_chunk(int p, int q, int key): client.c'],['../client_8h.html#a53b8540e54c542d09e2d947c419fe2e6',1,'client_chunk(int p, int q, int key): client.c']]], + ['client_5fconnect_700',['client_connect',['../client_8h.html#a7c0bfea8388d9417f7b9fec38c055c53',1,'client_connect(char *hostname, int port): client.c'],['../client_8c.html#a7c0bfea8388d9417f7b9fec38c055c53',1,'client_connect(char *hostname, int port): client.c']]], + ['client_5fdisable_701',['client_disable',['../client_8c.html#a7e909ae4682502875e13408e525d425c',1,'client_disable(): client.c'],['../client_8h.html#a7e909ae4682502875e13408e525d425c',1,'client_disable(): client.c']]], + ['client_5fenable_702',['client_enable',['../client_8c.html#aa325e8dc525dfd4f2b61084fde488886',1,'client_enable(): client.c'],['../client_8h.html#aa325e8dc525dfd4f2b61084fde488886',1,'client_enable(): client.c']]], + ['client_5flogin_703',['client_login',['../client_8c.html#a3e600b608f3d4bb8019e5c41b1249370',1,'client_login(const char *username, const char *identity_token): client.c'],['../client_8h.html#a3e600b608f3d4bb8019e5c41b1249370',1,'client_login(const char *username, const char *identity_token): client.c']]], + ['client_5fposition_704',['client_position',['../client_8c.html#a8958c169ddf770c54dde942c986199f1',1,'client_position(float x, float y, float z, float rx, float ry): client.c'],['../client_8h.html#a8958c169ddf770c54dde942c986199f1',1,'client_position(float x, float y, float z, float rx, float ry): client.c']]], + ['client_5frecv_705',['client_recv',['../client_8c.html#a03e3943e47927507f114fe750177139f',1,'client_recv(): client.c'],['../client_8h.html#a03e3943e47927507f114fe750177139f',1,'client_recv(): client.c']]], + ['client_5fsend_706',['client_send',['../client_8c.html#a64ee564bcdb00afd6ac5451c9384f5f4',1,'client_send(char *data): client.c'],['../client_8h.html#a64ee564bcdb00afd6ac5451c9384f5f4',1,'client_send(char *data): client.c']]], + ['client_5fsendall_707',['client_sendall',['../client_8c.html#aecb289e6b8d0147fa44ddf7d1e5db7ce',1,'client.c']]], + ['client_5fsign_708',['client_sign',['../client_8c.html#a7688d439c90eb01a3480db0f89d2cc01',1,'client_sign(int x, int y, int z, int face, const char *text): client.c'],['../client_8h.html#a7688d439c90eb01a3480db0f89d2cc01',1,'client_sign(int x, int y, int z, int face, const char *text): client.c']]], + ['client_5fstart_709',['client_start',['../client_8c.html#aa0b8370ec510034dd30751a7de33edca',1,'client_start(): client.c'],['../client_8h.html#aa0b8370ec510034dd30751a7de33edca',1,'client_start(): client.c']]], + ['client_5fstop_710',['client_stop',['../client_8c.html#ab1ad08ffad20c886c71a0f57cb4e56bf',1,'client_stop(): client.c'],['../client_8h.html#ab1ad08ffad20c886c71a0f57cb4e56bf',1,'client_stop(): client.c']]], + ['client_5ftalk_711',['client_talk',['../client_8c.html#aead7e376b121af80bc94eca71d1ca4ec',1,'client_talk(const char *text): client.c'],['../client_8h.html#aead7e376b121af80bc94eca71d1ca4ec',1,'client_talk(const char *text): client.c']]], + ['client_5fversion_712',['client_version',['../client_8c.html#a588876f19dc7a8519f4693a8458d94d1',1,'client_version(int version): client.c'],['../client_8h.html#a588876f19dc7a8519f4693a8458d94d1',1,'client_version(int version): client.c']]], + ['collide_713',['collide',['../main_8c.html#a7523bf0b87d2058d0f770c8ef5ec4de6',1,'main.c']]], + ['commit_714',['commit',['../classserver_1_1Model.html#ab427a4018c7e7144f0d7dedfe7e87957',1,'server::Model']]], + ['copy_715',['copy',['../main_8c.html#aaa6c087511a52e64fc9ad92820c7c0a8',1,'main.c']]], + ['create_5fchunk_716',['create_chunk',['../main_8c.html#accc8a3a62cf6a6c3efe48a55a5c56808',1,'create_chunk(): main.c'],['../classworld_1_1World.html#a35a2813203e7b5a462d59c82a4f24e35',1,'world.World.create_chunk()']]], + ['create_5ftables_717',['create_tables',['../classserver_1_1Model.html#a010bcdc35e6520fc20eaad27781960d6',1,'server::Model']]], + ['create_5fwindow_718',['create_window',['../main_8c.html#adbf4a23b001075b18efb14b900bce769',1,'main.c']]], + ['create_5fworld_719',['create_world',['../world_8h.html#aad54886b643411fddbc383d8dc213cf9',1,'create_world(int p, int q, world_func func, void *arg): world.c'],['../world_8c.html#aad54886b643411fddbc383d8dc213cf9',1,'create_world(int p, int q, world_func func, void *arg): world.c']]], + ['cube_720',['cube',['../main_8c.html#a1144571bf370a14d0bda195c9bfe6c13',1,'main.c']]], + ['cuboid_721',['cuboid',['../namespacebuilder.html#ac544f232d76427b0eb9e0a179fd1560b',1,'builder']]], + ['cylinder_722',['cylinder',['../main_8c.html#ab2a6e7138d5daebc40411d901e3753ce',1,'main.c']]], + ['cylinder_5fx_723',['cylinder_x',['../namespacebuilder.html#af7f88bc3a6c9c922b07b2b710cb524fe',1,'builder']]], + ['cylinder_5fy_724',['cylinder_y',['../namespacebuilder.html#a3499ea6e0b9937f0966be464efe67b37',1,'builder']]], + ['cylinder_5fz_725',['cylinder_z',['../namespacebuilder.html#aac04499058ccc9e0497dd44d287dd5dc',1,'builder']]] +]; diff --git a/documentation/html/search/functions_4.html b/documentation/html/search/functions_4.html new file mode 100644 index 000000000..52627379d --- /dev/null +++ b/documentation/html/search/functions_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_4.js b/documentation/html/search/functions_4.js new file mode 100644 index 000000000..74b1be0e7 --- /dev/null +++ b/documentation/html/search/functions_4.js @@ -0,0 +1,50 @@ +var searchData= +[ + ['db_5fauth_5fget_726',['db_auth_get',['../db_8c.html#abbac4341c5808b44c243a6cbb5418d74',1,'db_auth_get(char *username, char *identity_token, int identity_token_length): db.c'],['../db_8h.html#abbac4341c5808b44c243a6cbb5418d74',1,'db_auth_get(char *username, char *identity_token, int identity_token_length): db.c']]], + ['db_5fauth_5fget_5fselected_727',['db_auth_get_selected',['../db_8c.html#aef707b2d7b4abef81057da5c86d9db4e',1,'db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length): db.c'],['../db_8h.html#aef707b2d7b4abef81057da5c86d9db4e',1,'db_auth_get_selected(char *username, int username_length, char *identity_token, int identity_token_length): db.c']]], + ['db_5fauth_5fselect_728',['db_auth_select',['../db_8c.html#a81930af9569e37f569a84275c6d9244a',1,'db_auth_select(char *username): db.c'],['../db_8h.html#a81930af9569e37f569a84275c6d9244a',1,'db_auth_select(char *username): db.c']]], + ['db_5fauth_5fselect_5fnone_729',['db_auth_select_none',['../db_8c.html#a58bb21e13e96dc00011987ed6f49e0a5',1,'db_auth_select_none(): db.c'],['../db_8h.html#a58bb21e13e96dc00011987ed6f49e0a5',1,'db_auth_select_none(): db.c']]], + ['db_5fauth_5fset_730',['db_auth_set',['../db_8c.html#adf4bd2d9215d193b077efd037db0bcf9',1,'db_auth_set(char *username, char *identity_token): db.c'],['../db_8h.html#adf4bd2d9215d193b077efd037db0bcf9',1,'db_auth_set(char *username, char *identity_token): db.c']]], + ['db_5fclose_731',['db_close',['../db_8c.html#a9130d3b5560da57a53135491d888c7b7',1,'db_close(): db.c'],['../db_8h.html#a9130d3b5560da57a53135491d888c7b7',1,'db_close(): db.c']]], + ['db_5fcommit_732',['db_commit',['../db_8c.html#a22d7bda7323b424f23ab0dc5e5d14ea3',1,'db_commit(): db.c'],['../db_8h.html#a22d7bda7323b424f23ab0dc5e5d14ea3',1,'db_commit(): db.c']]], + ['db_5fdelete_5fall_5fsigns_733',['db_delete_all_signs',['../db_8c.html#abbd06257e797d6e870f0e4fccdae1afc',1,'db_delete_all_signs(): db.c'],['../db_8h.html#abbd06257e797d6e870f0e4fccdae1afc',1,'db_delete_all_signs(): db.c']]], + ['db_5fdelete_5fsign_734',['db_delete_sign',['../db_8c.html#a961761292a4eabf7324f789cdf60a15d',1,'db_delete_sign(int x, int y, int z, int face): db.c'],['../db_8h.html#a961761292a4eabf7324f789cdf60a15d',1,'db_delete_sign(int x, int y, int z, int face): db.c']]], + ['db_5fdelete_5fsigns_735',['db_delete_signs',['../db_8c.html#ae77ed88e2b08a11cf0b6ef7e4a3b4f1e',1,'db_delete_signs(int x, int y, int z): db.c'],['../db_8h.html#ae77ed88e2b08a11cf0b6ef7e4a3b4f1e',1,'db_delete_signs(int x, int y, int z): db.c']]], + ['db_5fdisable_736',['db_disable',['../db_8c.html#a1775d31648e3cb1a17ba5cc7169838c0',1,'db_disable(): db.c'],['../db_8h.html#a1775d31648e3cb1a17ba5cc7169838c0',1,'db_disable(): db.c']]], + ['db_5fenable_737',['db_enable',['../db_8c.html#aff0694dd14f530f817eccbccf15f9cd7',1,'db_enable(): db.c'],['../db_8h.html#aff0694dd14f530f817eccbccf15f9cd7',1,'db_enable(): db.c']]], + ['db_5fget_5fkey_738',['db_get_key',['../db_8h.html#a604e47a1c34b1bf206ba95f3040ca063',1,'db_get_key(int p, int q): db.c'],['../db_8c.html#a604e47a1c34b1bf206ba95f3040ca063',1,'db_get_key(int p, int q): db.c']]], + ['db_5finit_739',['db_init',['../db_8c.html#aed0889a43f2f658210c3e9330c36a868',1,'db_init(char *path): db.c'],['../db_8h.html#aed0889a43f2f658210c3e9330c36a868',1,'db_init(char *path): db.c']]], + ['db_5finsert_5fblock_740',['db_insert_block',['../db_8c.html#acf3af80dd94b97b88c7eda24a7acbf57',1,'db_insert_block(int p, int q, int x, int y, int z, int w): db.c'],['../db_8h.html#acf3af80dd94b97b88c7eda24a7acbf57',1,'db_insert_block(int p, int q, int x, int y, int z, int w): db.c']]], + ['db_5finsert_5fsign_741',['db_insert_sign',['../db_8c.html#a4fc9d5ce54175ee393cdd80c161d27ea',1,'db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text): db.c'],['../db_8h.html#a4fc9d5ce54175ee393cdd80c161d27ea',1,'db_insert_sign(int p, int q, int x, int y, int z, int face, const char *text): db.c']]], + ['db_5fload_5fmap_742',['db_load_map',['../db_8c.html#a8bac0c9b2dd14f69506bea5114dc53ba',1,'db_load_map(Map *map, int p, int q): db.c'],['../db_8h.html#a8bac0c9b2dd14f69506bea5114dc53ba',1,'db_load_map(Map *map, int p, int q): db.c']]], + ['db_5fload_5fsigns_743',['db_load_signs',['../db_8h.html#a8b49d7b0d7cd429a24413a9c7a20d5d9',1,'db_load_signs(SignList *list, int p, int q): db.c'],['../db_8c.html#a8b49d7b0d7cd429a24413a9c7a20d5d9',1,'db_load_signs(SignList *list, int p, int q): db.c']]], + ['db_5fload_5fstate_744',['db_load_state',['../db_8c.html#ac97e8c6c5b3544a26bd7dfb022e8b7c9',1,'db_load_state(float *x, float *y, float *z, float *rx, float *ry): db.c'],['../db_8h.html#ac97e8c6c5b3544a26bd7dfb022e8b7c9',1,'db_load_state(float *x, float *y, float *z, float *rx, float *ry): db.c']]], + ['db_5fsave_5fstate_745',['db_save_state',['../db_8c.html#a65e339f6a3136c81f486020f8753cae5',1,'db_save_state(float x, float y, float z, float rx, float ry): db.c'],['../db_8h.html#a65e339f6a3136c81f486020f8753cae5',1,'db_save_state(float x, float y, float z, float rx, float ry): db.c']]], + ['db_5fset_5fkey_746',['db_set_key',['../db_8c.html#a75318be7de55b28fa4da16f24371d3e3',1,'db_set_key(int p, int q, int key): db.c'],['../db_8h.html#a75318be7de55b28fa4da16f24371d3e3',1,'db_set_key(int p, int q, int key): db.c']]], + ['db_5fworker_5frun_747',['db_worker_run',['../db_8c.html#adda9dfe40560f6daba762434232ddd77',1,'db_worker_run(void *arg): db.c'],['../db_8h.html#adda9dfe40560f6daba762434232ddd77',1,'db_worker_run(void *arg): db.c']]], + ['db_5fworker_5fstart_748',['db_worker_start',['../db_8c.html#af2f7627dd0f5447f6f6dada93db4f9d9',1,'db_worker_start(char *path): db.c'],['../db_8h.html#af6fa9b274ab9218dd4ad11eb1648cb73',1,'db_worker_start(): db.h']]], + ['db_5fworker_5fstop_749',['db_worker_stop',['../db_8c.html#a7a0d2c946591d7ba9e855767dd5f398e',1,'db_worker_stop(): db.c'],['../db_8h.html#a7a0d2c946591d7ba9e855767dd5f398e',1,'db_worker_stop(): db.c']]], + ['del_5fbuffer_750',['del_buffer',['../util_8c.html#ad6b45259c4a7e05f3b2d1f426d9bb6d0',1,'del_buffer(GLuint buffer): util.c'],['../util_8h.html#ad6b45259c4a7e05f3b2d1f426d9bb6d0',1,'del_buffer(GLuint buffer): util.c']]], + ['delete_5fall_5fchunks_751',['delete_all_chunks',['../main_8c.html#a5cd367a007c11738b7e4dcc8ae0bb16c',1,'main.c']]], + ['delete_5fall_5fplayers_752',['delete_all_players',['../main_8c.html#a00cc40d4c1bd974f5b2d293797f21379',1,'main.c']]], + ['delete_5fchunks_753',['delete_chunks',['../main_8c.html#a8395a15e4e81c8f33192d4f46834a082',1,'main.c']]], + ['delete_5fplayer_754',['delete_player',['../main_8c.html#ac17ee9205ad1703ed735fe3225b1b82a',1,'main.c']]], + ['dequeue_755',['dequeue',['../classserver_1_1Model.html#ad0103204c6bad7d0409368d426e971fb',1,'server::Model']]], + ['dll_5fcreate_5fworld_756',['dll_create_world',['../namespaceworld.html#a3b0d0f6e215f8f4f110d9e31f885841e',1,'world']]], + ['dll_5fseed_757',['dll_seed',['../namespaceworld.html#a81ec5830e426ca9bdcc1c7c160bb8337',1,'world']]], + ['dll_5fsimplex2_758',['dll_simplex2',['../namespaceworld.html#aa4e83b1edc82a7aaa3d23974f665681b',1,'world']]], + ['dll_5fsimplex3_759',['dll_simplex3',['../namespaceworld.html#ac2d7906e43481bf695a07bf7fe813114',1,'world']]], + ['draw_5fchunk_760',['draw_chunk',['../main_8c.html#a5ff750eb1f4602fd60a0a91fb3d27e32',1,'main.c']]], + ['draw_5fcube_761',['draw_cube',['../main_8c.html#a85de17c00c82b82bb20027022da73ca9',1,'main.c']]], + ['draw_5fitem_762',['draw_item',['../main_8c.html#a1ad9dc2b57fe13977efc4abeff4a6bb8',1,'main.c']]], + ['draw_5flines_763',['draw_lines',['../main_8c.html#a5ddd4087e9527b4b818fb7dc5ec08c19',1,'main.c']]], + ['draw_5fplant_764',['draw_plant',['../main_8c.html#aee744d99ca50914be688b5132513c8df',1,'main.c']]], + ['draw_5fplayer_765',['draw_player',['../main_8c.html#a601aa498b140930902174bed518be232',1,'main.c']]], + ['draw_5fsign_766',['draw_sign',['../main_8c.html#a7015c4254792ec4b0460669b49d11923',1,'main.c']]], + ['draw_5fsigns_767',['draw_signs',['../main_8c.html#ac8ca9b26a12d4361eb5a84d9dbe5c794',1,'main.c']]], + ['draw_5ftext_768',['draw_text',['../main_8c.html#a37a6d2e44e741e64e1113532467ad402',1,'main.c']]], + ['draw_5ftriangles_5f2d_769',['draw_triangles_2d',['../main_8c.html#ad27f877530bfd918c52999ed9c08d2db',1,'main.c']]], + ['draw_5ftriangles_5f3d_770',['draw_triangles_3d',['../main_8c.html#adf441c702858370419937561d5388470',1,'main.c']]], + ['draw_5ftriangles_5f3d_5fao_771',['draw_triangles_3d_ao',['../main_8c.html#aa2d18ed5666e6786b586b0c88f9ae038',1,'main.c']]], + ['draw_5ftriangles_5f3d_5ftext_772',['draw_triangles_3d_text',['../main_8c.html#a53b0ab72f5d717a2a1c452ece68534fb',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_5.html b/documentation/html/search/functions_5.html new file mode 100644 index 000000000..85004f8b3 --- /dev/null +++ b/documentation/html/search/functions_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_5.js b/documentation/html/search/functions_5.js new file mode 100644 index 000000000..a66392818 --- /dev/null +++ b/documentation/html/search/functions_5.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['enqueue_773',['enqueue',['../classserver_1_1Model.html#a3c6c94870bd808a1a8868f6c68610828',1,'server::Model']]], + ['ensure_5fchunks_774',['ensure_chunks',['../main_8c.html#a303b9ec42543e75c3d4e69ffd81ecd8e',1,'main.c']]], + ['execute_775',['execute',['../classserver_1_1Model.html#a3666c45a716bd0b1ee7d58b16e695be4',1,'server::Model']]] +]; diff --git a/documentation/html/search/functions_6.html b/documentation/html/search/functions_6.html new file mode 100644 index 000000000..0c2200fe0 --- /dev/null +++ b/documentation/html/search/functions_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_6.js b/documentation/html/search/functions_6.js new file mode 100644 index 000000000..4bf52c078 --- /dev/null +++ b/documentation/html/search/functions_6.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['find_5fchunk_776',['find_chunk',['../main_8c.html#aedc46d4b4ae65461357e39751e866ca6',1,'main.c']]], + ['find_5fplayer_777',['find_player',['../main_8c.html#a81a00c2fd97b74133139a2da8c02428b',1,'main.c']]], + ['finish_778',['finish',['../classserver_1_1Handler.html#a972b1089c8876b45f67b26f7823eb711',1,'server::Handler']]], + ['flip_5fimage_5fvertical_779',['flip_image_vertical',['../util_8c.html#a4f43015327363104cbc74c3de18e2352',1,'util.c']]], + ['force_5fchunks_780',['force_chunks',['../main_8c.html#a39ed5c1e077adec1f35c335a6e8976b5',1,'main.c']]], + ['frustum_5fplanes_781',['frustum_planes',['../matrix_8h.html#a5a468348d5e7d5c1577c0169a5caa729',1,'frustum_planes(float planes[6][4], int radius, float *matrix): matrix.c'],['../matrix_8c.html#a5a468348d5e7d5c1577c0169a5caa729',1,'frustum_planes(float planes[6][4], int radius, float *matrix): matrix.c']]] +]; diff --git a/documentation/html/search/functions_7.html b/documentation/html/search/functions_7.html new file mode 100644 index 000000000..c85b18996 --- /dev/null +++ b/documentation/html/search/functions_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_7.js b/documentation/html/search/functions_7.js new file mode 100644 index 000000000..cc87bc192 --- /dev/null +++ b/documentation/html/search/functions_7.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['gen_5fbuffer_782',['gen_buffer',['../util_8c.html#ae0b687683a7ca3314bbfe52b0766e549',1,'gen_buffer(GLsizei size, GLfloat *data): util.c'],['../util_8h.html#ae0b687683a7ca3314bbfe52b0766e549',1,'gen_buffer(GLsizei size, GLfloat *data): util.c']]], + ['gen_5fchunk_5fbuffer_783',['gen_chunk_buffer',['../main_8c.html#ae73019e7308d7c00bd1bce2978976078',1,'main.c']]], + ['gen_5fcrosshair_5fbuffer_784',['gen_crosshair_buffer',['../main_8c.html#aa4297265ebe5f1482113b9c20a462b16',1,'main.c']]], + ['gen_5fcube_5fbuffer_785',['gen_cube_buffer',['../main_8c.html#ad14f4ddf35e293be32cfe91a63ee7aa0',1,'main.c']]], + ['gen_5ffaces_786',['gen_faces',['../util_8c.html#ae55e18c1e17eef3e6156a885c760b6de',1,'gen_faces(int components, int faces, GLfloat *data): util.c'],['../util_8h.html#ae55e18c1e17eef3e6156a885c760b6de',1,'gen_faces(int components, int faces, GLfloat *data): util.c']]], + ['gen_5fplant_5fbuffer_787',['gen_plant_buffer',['../main_8c.html#ad2ded81e5a71ce7803068e52e3cba9c0',1,'main.c']]], + ['gen_5fplayer_5fbuffer_788',['gen_player_buffer',['../main_8c.html#aa787497324ff5d73b6c4c24348ab3ab4',1,'main.c']]], + ['gen_5fsign_5fbuffer_789',['gen_sign_buffer',['../main_8c.html#a41a50341b3d95428bd5d60bb4b0c86f0',1,'main.c']]], + ['gen_5fsky_5fbuffer_790',['gen_sky_buffer',['../main_8c.html#ad5df1b0a4b98711e2b17a3a6052bdf9c',1,'main.c']]], + ['gen_5ftext_5fbuffer_791',['gen_text_buffer',['../main_8c.html#a637d7ff3716d139d1bf68f39568715ac',1,'main.c']]], + ['gen_5fwireframe_5fbuffer_792',['gen_wireframe_buffer',['../main_8c.html#ab7ff6a413ccb86d2fd290f956771b6ef',1,'main.c']]], + ['get_5faccess_5ftoken_793',['get_access_token',['../auth_8h.html#a5906ca1274eeaec74f635677baebe2cc',1,'get_access_token(char *result, int length, char *username, char *identity_token): auth.c'],['../auth_8c.html#a5906ca1274eeaec74f635677baebe2cc',1,'get_access_token(char *result, int length, char *username, char *identity_token): auth.c']]], + ['get_5fblock_794',['get_block',['../main_8c.html#a5f801f00f227dd89588ab0fbb3f85b6d',1,'get_block(): main.c'],['../classserver_1_1Model.html#a3acb5e5f1b3c11a61caf47887414d0e1',1,'server.Model.get_block()']]], + ['get_5fchunk_795',['get_chunk',['../classworld_1_1World.html#ae097762534f93095dcd5b420aec65525',1,'world::World']]], + ['get_5fclient_796',['get_client',['../namespacebuilder.html#a30c63e33227991cdeba59d697dd6fcd9',1,'builder']]], + ['get_5fclient_5fenabled_797',['get_client_enabled',['../client_8c.html#abb798e3677ffc402f49ab6c4138378d8',1,'get_client_enabled(): client.c'],['../client_8h.html#abb798e3677ffc402f49ab6c4138378d8',1,'get_client_enabled(): client.c']]], + ['get_5fdaylight_798',['get_daylight',['../main_8c.html#a99b773831b01a51f13a676ef5d59193a',1,'main.c']]], + ['get_5fdb_5fenabled_799',['get_db_enabled',['../db_8c.html#aba51030d9d082884d6e4cc6474c4d3e3',1,'get_db_enabled(): db.c'],['../db_8h.html#aba51030d9d082884d6e4cc6474c4d3e3',1,'get_db_enabled(): db.c']]], + ['get_5fdefault_5fblock_800',['get_default_block',['../classserver_1_1Model.html#abeaec0fd82dbf66b7ca21bb464517c20',1,'server::Model']]], + ['get_5fidentity_801',['get_identity',['../namespacebuilder.html#ae73624e735de89a1d374a78a553ff3eb',1,'builder']]], + ['get_5fmotion_5fvector_802',['get_motion_vector',['../main_8c.html#a5a10c8499083603fdb2a9b7d72ad9531',1,'main.c']]], + ['get_5fscale_5ffactor_803',['get_scale_factor',['../main_8c.html#a552f6dea3b849bff25fa69e1c8c3759a',1,'main.c']]], + ['get_5fsight_5fvector_804',['get_sight_vector',['../main_8c.html#a350b22fed1a285f9f91a660a714f2fd4',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_8.html b/documentation/html/search/functions_8.html new file mode 100644 index 000000000..aa875b665 --- /dev/null +++ b/documentation/html/search/functions_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_8.js b/documentation/html/search/functions_8.js new file mode 100644 index 000000000..cb75a1e4e --- /dev/null +++ b/documentation/html/search/functions_8.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['handle_805',['handle',['../classserver_1_1Handler.html#a3b48cb51b48a14ce8bf445f87b4b2765',1,'server::Handler']]], + ['handle_5ffall_5fdamage_806',['handle_fall_damage',['../main_8c.html#a5e37bf0145a3a02a92782d377955cf78',1,'main.c']]], + ['handle_5flava_5fdamage_807',['handle_lava_damage',['../main_8c.html#a0bf39c1104df8c3fda11e5815b5933d7',1,'main.c']]], + ['handle_5fmouse_5finput_808',['handle_mouse_input',['../main_8c.html#af6206d1b5587c5ab78eb99bcef601093',1,'main.c']]], + ['handle_5fmovement_809',['handle_movement',['../main_8c.html#afeed84b00d2c96058cb3d89fec4ed8c4',1,'main.c']]], + ['handle_5fplayer_5fhealth_810',['handle_player_health',['../main_8c.html#aa7aa9b8c8475ae6ec39d0e8e8be89321',1,'main.c']]], + ['handle_5fplayer_5fspeed_811',['handle_player_speed',['../main_8c.html#ad8f05af41744221a334f3ccdce43347f',1,'main.c']]], + ['hash_812',['hash',['../map_8c.html#ab73d21e6c6de7a0ff906537edb3c4714',1,'map.c']]], + ['hash_5fint_813',['hash_int',['../map_8c.html#a595810cd3c73bbf446a3cc8c713f310b',1,'map.c']]], + ['heal_5fdamage_814',['heal_damage',['../main_8c.html#a037af278f24c2ee8d94af554e9886ce6',1,'main.c']]], + ['highest_5fblock_815',['highest_block',['../main_8c.html#a0b86ebc00049edc5f180ec81f419425c',1,'main.c']]], + ['hit_5ftest_816',['hit_test',['../main_8c.html#a8bbe38f2fa041861a8f5a8f2f485cbf3',1,'main.c']]], + ['hit_5ftest_5fface_817',['hit_test_face',['../main_8c.html#aaf8657c7799d262dcf1b7a535e7e8131',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_9.html b/documentation/html/search/functions_9.html new file mode 100644 index 000000000..ccfeeecc6 --- /dev/null +++ b/documentation/html/search/functions_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_9.js b/documentation/html/search/functions_9.js new file mode 100644 index 000000000..2b576f671 --- /dev/null +++ b/documentation/html/search/functions_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['inflict_5fdamage_818',['inflict_damage',['../main_8c.html#a7f1196c97b37a546110a403581aecbf1',1,'main.c']]], + ['interpolate_5fplayer_819',['interpolate_player',['../main_8c.html#a8f29343daa0ed2f1673cd1f261c9ad36',1,'main.c']]], + ['is_5falpha_820',['is_alpha',['../item_8c.html#acca78c677d4f416357b11c4b660530ce',1,'is_alpha(int w): item.c'],['../item_8h.html#acca78c677d4f416357b11c4b660530ce',1,'is_alpha(int w): item.c']]], + ['is_5fdestructable_821',['is_destructable',['../item_8c.html#aa526e008fbbc76b363bb5f234f526602',1,'is_destructable(int w): item.c'],['../item_8h.html#aa526e008fbbc76b363bb5f234f526602',1,'is_destructable(int w): item.c']]], + ['is_5fmovement_5fslowed_822',['is_movement_slowed',['../main_8c.html#a934ab7a342b323f8f1c11a054f8398ca',1,'main.c']]], + ['is_5fobstacle_823',['is_obstacle',['../item_8c.html#a2999490972ce5a49ee473823b9c8eeb9',1,'is_obstacle(int w): item.c'],['../item_8h.html#a2999490972ce5a49ee473823b9c8eeb9',1,'is_obstacle(int w): item.c']]], + ['is_5fplant_824',['is_plant',['../item_8c.html#a2095e37d68507dd4d9955cf8452688a0',1,'is_plant(int w): item.c'],['../item_8h.html#a2095e37d68507dd4d9955cf8452688a0',1,'is_plant(int w): item.c']]], + ['is_5fslowing_825',['is_slowing',['../item_8c.html#aaaedddd540156a6b156948ab7445fccc',1,'is_slowing(int w): item.c'],['../item_8h.html#aaaedddd540156a6b156948ab7445fccc',1,'is_slowing(int w): item.c']]], + ['is_5ftransparent_826',['is_transparent',['../item_8c.html#a6d7b27352d73f9a7afef70dbc7ef2723',1,'is_transparent(int w): item.c'],['../item_8h.html#a6d7b27352d73f9a7afef70dbc7ef2723',1,'is_transparent(int w): item.c']]] +]; diff --git a/documentation/html/search/functions_a.html b/documentation/html/search/functions_a.html new file mode 100644 index 000000000..20591df34 --- /dev/null +++ b/documentation/html/search/functions_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_a.js b/documentation/html/search/functions_a.js new file mode 100644 index 000000000..7c0b6aeb0 --- /dev/null +++ b/documentation/html/search/functions_a.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['load_5ffile_827',['load_file',['../util_8c.html#ae0b180d11be93e6d01ecc2ca88228686',1,'util.c']]], + ['load_5fpng_5ftexture_828',['load_png_texture',['../util_8c.html#adb2350a6a08ae78288fdf36cdf96dd91',1,'load_png_texture(const char *file_name): util.c'],['../util_8h.html#adb2350a6a08ae78288fdf36cdf96dd91',1,'load_png_texture(const char *file_name): util.c']]], + ['load_5fprogram_829',['load_program',['../util_8c.html#a8cb10ae4302d6611ee8d746e21b7ea5d',1,'load_program(const char *path1, const char *path2): util.c'],['../util_8h.html#a8cb10ae4302d6611ee8d746e21b7ea5d',1,'load_program(const char *path1, const char *path2): util.c']]], + ['load_5fshader_830',['load_shader',['../util_8c.html#a4f4d4c55d4ec575d951341a16d1a38d5',1,'load_shader(GLenum type, const char *path): util.c'],['../util_8h.html#a4f4d4c55d4ec575d951341a16d1a38d5',1,'load_shader(GLenum type, const char *path): util.c']]], + ['log_831',['log',['../namespaceserver.html#ad98bc61ab29d77b8003fbb0e01453f90',1,'server']]], + ['login_832',['login',['../main_8c.html#af76b7b46958dabf5e4ee9a492f0ec3fa',1,'main.c']]] +]; diff --git a/documentation/html/search/functions_b.html b/documentation/html/search/functions_b.html new file mode 100644 index 000000000..e9d40f14a --- /dev/null +++ b/documentation/html/search/functions_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_b.js b/documentation/html/search/functions_b.js new file mode 100644 index 000000000..c02db4d34 --- /dev/null +++ b/documentation/html/search/functions_b.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['main_833',['main',['../namespacebuilder.html#ac8f6bd1d8c6b4ff15b83c857a94ae8eb',1,'builder.main()'],['../namespaceserver.html#a6d1c10ed8aa5d27e61ed9db6b4274261',1,'server.main()'],['../main_8c.html#a3c04138a5bfe5d72780bb7e82a18e627',1,'main(int argc, char **argv): main.c']]], + ['make_5fcharacter_834',['make_character',['../cube_8c.html#a4465c655d071dea4dfef566da5dd2580',1,'make_character(float *data, float x, float y, float n, float m, char c): cube.c'],['../cube_8h.html#a4465c655d071dea4dfef566da5dd2580',1,'make_character(float *data, float x, float y, float n, float m, char c): cube.c']]], + ['make_5fcharacter_5f3d_835',['make_character_3d',['../cube_8c.html#a154123d3582f4195726dcb13afd87413',1,'make_character_3d(float *data, float x, float y, float z, float n, int face, char c): cube.c'],['../cube_8h.html#a154123d3582f4195726dcb13afd87413',1,'make_character_3d(float *data, float x, float y, float z, float n, int face, char c): cube.c']]], + ['make_5fcube_836',['make_cube',['../cube_8c.html#a38a9f9dac05b11556005a7dfb46440ac',1,'make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w): cube.c'],['../cube_8h.html#a38a9f9dac05b11556005a7dfb46440ac',1,'make_cube(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, float x, float y, float z, float n, int w): cube.c']]], + ['make_5fcube_5ffaces_837',['make_cube_faces',['../cube_8c.html#a0f14c76c131de891984f5c1ffcdcb684',1,'make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n): cube.c'],['../cube_8h.html#a0f14c76c131de891984f5c1ffcdcb684',1,'make_cube_faces(float *data, float ao[6][4], int left, int right, int top, int bottom, int front, int back, int wleft, int wright, int wtop, int wbottom, int wfront, int wback, float x, float y, float z, float n): cube.c']]], + ['make_5fcube_5fwireframe_838',['make_cube_wireframe',['../cube_8c.html#a32e82b3b328050ce0ce96b08a904f2d4',1,'make_cube_wireframe(float *data, float x, float y, float z, float n): cube.c'],['../cube_8h.html#a32e82b3b328050ce0ce96b08a904f2d4',1,'make_cube_wireframe(float *data, float x, float y, float z, float n): cube.c']]], + ['make_5fplant_839',['make_plant',['../cube_8c.html#aa9a7364ff61189d1f3f1ec3d720eeade',1,'make_plant(float *data, float px, float py, float pz, float n, int w, float rotation): cube.c'],['../cube_8h.html#aa9a7364ff61189d1f3f1ec3d720eeade',1,'make_plant(float *data, float px, float py, float pz, float n, int w, float rotation): cube.c']]], + ['make_5fplayer_840',['make_player',['../cube_8c.html#a400de8b69f894ce09dd82b3500cc8983',1,'make_player(float *data, float x, float y, float z, float rx, float ry): cube.c'],['../cube_8h.html#a400de8b69f894ce09dd82b3500cc8983',1,'make_player(float *data, float x, float y, float z, float rx, float ry): cube.c']]], + ['make_5fprogram_841',['make_program',['../util_8c.html#a56aee3984a58258449008c111e291898',1,'make_program(GLuint shader1, GLuint shader2): util.c'],['../util_8h.html#a56aee3984a58258449008c111e291898',1,'make_program(GLuint shader1, GLuint shader2): util.c']]], + ['make_5fshader_842',['make_shader',['../util_8c.html#ac92820af286b3381706fa0f5bc9f7bf1',1,'make_shader(GLenum type, const char *source): util.c'],['../util_8h.html#ac92820af286b3381706fa0f5bc9f7bf1',1,'make_shader(GLenum type, const char *source): util.c']]], + ['make_5fsphere_843',['make_sphere',['../cube_8c.html#aa889b707a68dd55beaf18f20578891ec',1,'make_sphere(float *data, float r, int detail): cube.c'],['../cube_8h.html#aa889b707a68dd55beaf18f20578891ec',1,'make_sphere(float *data, float r, int detail): cube.c']]], + ['malloc_5ffaces_844',['malloc_faces',['../util_8c.html#a0eb4317caeaaf0c23c1de121f1adf58a',1,'malloc_faces(int components, int faces): util.c'],['../util_8h.html#a0eb4317caeaaf0c23c1de121f1adf58a',1,'malloc_faces(int components, int faces): util.c']]], + ['map_5falloc_845',['map_alloc',['../map_8h.html#a68edde7d398e5cb4dd8a4e8bd1511776',1,'map_alloc(Map *map): map.c'],['../map_8c.html#a68edde7d398e5cb4dd8a4e8bd1511776',1,'map_alloc(Map *map): map.c']]], + ['map_5ffree_846',['map_free',['../map_8h.html#a3254b8c32bf974ff49d5ffd77fba54f9',1,'map_free(Map *map): map.c'],['../map_8c.html#a3254b8c32bf974ff49d5ffd77fba54f9',1,'map_free(Map *map): map.c']]], + ['map_5fget_847',['map_get',['../map_8h.html#a874495bba0719e565fbdf4b3169bd478',1,'map_get(Map *map, int x, int y, int z): map.c'],['../map_8c.html#a874495bba0719e565fbdf4b3169bd478',1,'map_get(Map *map, int x, int y, int z): map.c']]], + ['map_5fgrow_848',['map_grow',['../map_8h.html#ac3d7d219d9c538932026a8b48dac1f69',1,'map_grow(Map *map): map.c'],['../map_8c.html#ac3d7d219d9c538932026a8b48dac1f69',1,'map_grow(Map *map): map.c']]], + ['map_5fset_849',['map_set',['../map_8h.html#a4c2477840f637dc2ee2573ce45d0c328',1,'map_set(Map *map, int x, int y, int z, int w): map.c'],['../map_8c.html#a4c2477840f637dc2ee2573ce45d0c328',1,'map_set(Map *map, int x, int y, int z, int w): map.c']]], + ['map_5fset_5ffunc_850',['map_set_func',['../main_8c.html#a12898b54482ea7e87bbb6b3d5f0f8786',1,'main.c']]], + ['mat_5fapply_851',['mat_apply',['../matrix_8h.html#a08ac4391a0f909be8ff3be24add36de9',1,'mat_apply(float *data, float *matrix, int count, int offset, int stride): matrix.c'],['../matrix_8c.html#a08ac4391a0f909be8ff3be24add36de9',1,'mat_apply(float *data, float *matrix, int count, int offset, int stride): matrix.c']]], + ['mat_5ffrustum_852',['mat_frustum',['../matrix_8h.html#aacfdedd36f30b553d089fb864c513c3c',1,'mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar): matrix.c'],['../matrix_8c.html#aacfdedd36f30b553d089fb864c513c3c',1,'mat_frustum(float *matrix, float left, float right, float bottom, float top, float znear, float zfar): matrix.c']]], + ['mat_5fidentity_853',['mat_identity',['../matrix_8c.html#afb84227ef7869d383478b67e26db2462',1,'mat_identity(float *matrix): matrix.c'],['../matrix_8h.html#afb84227ef7869d383478b67e26db2462',1,'mat_identity(float *matrix): matrix.c']]], + ['mat_5fmultiply_854',['mat_multiply',['../matrix_8h.html#aecbb7f0ede52ab3c4b3d96856ca03729',1,'mat_multiply(float *matrix, float *a, float *b): matrix.c'],['../matrix_8c.html#aecbb7f0ede52ab3c4b3d96856ca03729',1,'mat_multiply(float *matrix, float *a, float *b): matrix.c']]], + ['mat_5fortho_855',['mat_ortho',['../matrix_8h.html#a1d5890d70fd9c40ed53aa27a9811572a',1,'mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far): matrix.c'],['../matrix_8c.html#a1d5890d70fd9c40ed53aa27a9811572a',1,'mat_ortho(float *matrix, float left, float right, float bottom, float top, float near, float far): matrix.c']]], + ['mat_5fperspective_856',['mat_perspective',['../matrix_8h.html#a1d45c0c3cb0801bfea49181aaf070af4',1,'mat_perspective(float *matrix, float fov, float aspect, float near, float far): matrix.c'],['../matrix_8c.html#afcbfefff8b7de2ee193a5e8565b367e1',1,'mat_perspective(float *matrix, float fov, float aspect, float znear, float zfar): matrix.c']]], + ['mat_5frotate_857',['mat_rotate',['../matrix_8h.html#a35bd6ed2032c06130e4bacee7fd61065',1,'mat_rotate(float *matrix, float x, float y, float z, float angle): matrix.c'],['../matrix_8c.html#a35bd6ed2032c06130e4bacee7fd61065',1,'mat_rotate(float *matrix, float x, float y, float z, float angle): matrix.c']]], + ['mat_5ftranslate_858',['mat_translate',['../matrix_8h.html#a60d161b7a566b80038381c756373bd86',1,'mat_translate(float *matrix, float dx, float dy, float dz): matrix.c'],['../matrix_8c.html#a60d161b7a566b80038381c756373bd86',1,'mat_translate(float *matrix, float dx, float dy, float dz): matrix.c']]], + ['mat_5fvec_5fmultiply_859',['mat_vec_multiply',['../matrix_8h.html#af9cba09c0e2411573567b0cd009a6497',1,'mat_vec_multiply(float *vector, float *a, float *b): matrix.c'],['../matrix_8c.html#af9cba09c0e2411573567b0cd009a6497',1,'mat_vec_multiply(float *vector, float *a, float *b): matrix.c']]] +]; diff --git a/documentation/html/search/functions_c.html b/documentation/html/search/functions_c.html new file mode 100644 index 000000000..f9b23c34f --- /dev/null +++ b/documentation/html/search/functions_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_c.js b/documentation/html/search/functions_c.js new file mode 100644 index 000000000..61bf580d9 --- /dev/null +++ b/documentation/html/search/functions_c.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['next_5fclient_5fid_860',['next_client_id',['../classserver_1_1Model.html#a3e13a7313fc94f05ecf271dd4a9664d1',1,'server::Model']]], + ['normalize_861',['normalize',['../matrix_8h.html#a096915415d411e8c596255885fe89be1',1,'normalize(float *x, float *y, float *z): matrix.c'],['../matrix_8c.html#a096915415d411e8c596255885fe89be1',1,'normalize(float *x, float *y, float *z): matrix.c']]] +]; diff --git a/documentation/html/search/functions_d.html b/documentation/html/search/functions_d.html new file mode 100644 index 000000000..858039b83 --- /dev/null +++ b/documentation/html/search/functions_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_d.js b/documentation/html/search/functions_d.js new file mode 100644 index 000000000..75e219dc6 --- /dev/null +++ b/documentation/html/search/functions_d.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['occlusion_862',['occlusion',['../main_8c.html#a0f4db496b1326afcb417ea30037e611e',1,'main.c']]], + ['on_5fauthenticate_863',['on_authenticate',['../classserver_1_1Model.html#a2e228fba3228beb3da42cd5506cd5606',1,'server::Model']]], + ['on_5fblock_864',['on_block',['../classserver_1_1Model.html#a8d5d9e3cda0e8aa384b5f5f2f45cd4bd',1,'server::Model']]], + ['on_5fchar_865',['on_char',['../main_8c.html#aa73bbee67ce499a488e96f9cfc23ca1a',1,'main.c']]], + ['on_5fchunk_866',['on_chunk',['../classserver_1_1Model.html#a210e38620f762c3ae492b8f6e4d78a3a',1,'server::Model']]], + ['on_5fconnect_867',['on_connect',['../classserver_1_1Model.html#a5ab44bf7f5122e3b5572079e02ff0b92',1,'server::Model']]], + ['on_5fdata_868',['on_data',['../classserver_1_1Model.html#a2307c8a450ed2e43325c7d182fcf9b69',1,'server::Model']]], + ['on_5fdisconnect_869',['on_disconnect',['../classserver_1_1Model.html#ab461be206915068246242c80eb7d75bb',1,'server::Model']]], + ['on_5fgoto_870',['on_goto',['../classserver_1_1Model.html#aca0fbfd43f14f14ce061e0c01b81d00d',1,'server::Model']]], + ['on_5fhelp_871',['on_help',['../classserver_1_1Model.html#af8707fd1875a0d52f50c829e143eaa9f',1,'server::Model']]], + ['on_5fkey_872',['on_key',['../main_8c.html#a85adb342a29f89079e4be8dda2786a31',1,'main.c']]], + ['on_5fleft_5fclick_873',['on_left_click',['../main_8c.html#a1b4c89a3770980bcee7870a38ade9801',1,'main.c']]], + ['on_5flist_874',['on_list',['../classserver_1_1Model.html#ae6b5f5c24fa673873cf459d12996e635',1,'server::Model']]], + ['on_5fmiddle_5fclick_875',['on_middle_click',['../main_8c.html#a60558971178a076262dd33624e45f579',1,'main.c']]], + ['on_5fmouse_5fbutton_876',['on_mouse_button',['../main_8c.html#a617140f22cbca769f78c6f5ed1d4f930',1,'main.c']]], + ['on_5fposition_877',['on_position',['../classserver_1_1Model.html#ad1f30bfa4395afc29844822700c296db',1,'server::Model']]], + ['on_5fpq_878',['on_pq',['../classserver_1_1Model.html#a2eca244ca01a155ce894d286f22cb1a0',1,'server::Model']]], + ['on_5fright_5fclick_879',['on_right_click',['../main_8c.html#a473fa47f6ab1a428059a75288d859779',1,'main.c']]], + ['on_5fscroll_880',['on_scroll',['../main_8c.html#aca87493073d8fc698af6b41a32554ebb',1,'main.c']]], + ['on_5fsign_881',['on_sign',['../classserver_1_1Model.html#a5b0e4c36467deb17ff65f6559d15e139',1,'server::Model']]], + ['on_5fspawn_882',['on_spawn',['../classserver_1_1Model.html#a73a69870e10b530cf11b257b14b7d24a',1,'server::Model']]], + ['on_5ftalk_883',['on_talk',['../classserver_1_1Model.html#a56115cc5a89c16019a31deb7b4165c8d',1,'server::Model']]], + ['on_5fversion_884',['on_version',['../classserver_1_1Model.html#a7a130d4cef3951790bf3f27b9a2114c6',1,'server::Model']]] +]; diff --git a/documentation/html/search/functions_e.html b/documentation/html/search/functions_e.html new file mode 100644 index 000000000..edb386f60 --- /dev/null +++ b/documentation/html/search/functions_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_e.js b/documentation/html/search/functions_e.js new file mode 100644 index 000000000..367be3374 --- /dev/null +++ b/documentation/html/search/functions_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['packet_885',['packet',['../namespaceserver.html#ae3c43aa702be522e7cb1907b41c168e7',1,'server']]], + ['parse_5fbuffer_886',['parse_buffer',['../main_8c.html#ae1d980f0e6a30791baa8ea225f89986a',1,'main.c']]], + ['parse_5fcommand_887',['parse_command',['../main_8c.html#ab95b19e249d0226c6678f18a815004f9',1,'main.c']]], + ['paste_888',['paste',['../main_8c.html#ad7f58047731e9a1b735aa142811c70e8',1,'main.c']]], + ['player_5fcrosshair_889',['player_crosshair',['../main_8c.html#a624fb7f93a4c50cb882382592aefadc0',1,'main.c']]], + ['player_5fcrosshair_5fdistance_890',['player_crosshair_distance',['../main_8c.html#a0e085c078cb3ec69d96348ef74387cfb',1,'main.c']]], + ['player_5fintersects_5fblock_891',['player_intersects_block',['../main_8c.html#aac46af8ceaf0c97c260e64c7ea9637ca',1,'main.c']]], + ['player_5fplayer_5fdistance_892',['player_player_distance',['../main_8c.html#ade74ca214156f02e72ce62a05c3f7b23',1,'main.c']]], + ['pyramid_893',['pyramid',['../namespacebuilder.html#a0754660093957edd82d7d4ed978fc898',1,'builder']]] +]; diff --git a/documentation/html/search/functions_f.html b/documentation/html/search/functions_f.html new file mode 100644 index 000000000..d84063c14 --- /dev/null +++ b/documentation/html/search/functions_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/functions_f.js b/documentation/html/search/functions_f.js new file mode 100644 index 000000000..a3cadaede --- /dev/null +++ b/documentation/html/search/functions_f.js @@ -0,0 +1,30 @@ +var searchData= +[ + ['rand_5fdouble_894',['rand_double',['../util_8c.html#a2e6a2be33dfea7b0858bfb3e278739d4',1,'rand_double(): util.c'],['../util_8h.html#a2e6a2be33dfea7b0858bfb3e278739d4',1,'rand_double(): util.c']]], + ['rand_5fint_895',['rand_int',['../util_8c.html#ab3aa48bb968d9217f198e8453134682b',1,'rand_int(int n): util.c'],['../util_8h.html#ab3aa48bb968d9217f198e8453134682b',1,'rand_int(int n): util.c']]], + ['record_5fblock_896',['record_block',['../main_8c.html#aacb965834490b4528ee30ecf2eb73083',1,'main.c']]], + ['recv_5fworker_897',['recv_worker',['../client_8c.html#a922af254b68a706c1b204a97cba3ccbf',1,'client.c']]], + ['render_5fchunks_898',['render_chunks',['../main_8c.html#ae606a2951510e86ae17a7f69196f97db',1,'main.c']]], + ['render_5fcrosshairs_899',['render_crosshairs',['../main_8c.html#a34702deb10cdedcaa5554711717b923b',1,'main.c']]], + ['render_5fitem_900',['render_item',['../main_8c.html#af208128cbd68d5022f502e30a1ec6598',1,'main.c']]], + ['render_5fplayers_901',['render_players',['../main_8c.html#a57227f3434ef3ccae1522023f628d279',1,'main.c']]], + ['render_5fsign_902',['render_sign',['../main_8c.html#ae8ac7b58095db14ca322b89901429b47',1,'main.c']]], + ['render_5fsigns_903',['render_signs',['../main_8c.html#a72d53759b1a64fedf6a18f2c92953525',1,'main.c']]], + ['render_5fsky_904',['render_sky',['../main_8c.html#a7800e3b4ad569ed438df3871cb6701c9',1,'main.c']]], + ['render_5ftext_905',['render_text',['../main_8c.html#ad7f1f9ef0a5f8b1449817d47d491d6da',1,'main.c']]], + ['render_5fwireframe_906',['render_wireframe',['../main_8c.html#ab192438da214c27fbdd0592718271760',1,'main.c']]], + ['reset_5fmodel_907',['reset_model',['../main_8c.html#a23db54f632c979fde371d228bfe0cae3',1,'main.c']]], + ['ring_5falloc_908',['ring_alloc',['../ring_8c.html#ad4cc1655953e5d466e2af18d3964b47a',1,'ring_alloc(Ring *ring, int capacity): ring.c'],['../ring_8h.html#ad4cc1655953e5d466e2af18d3964b47a',1,'ring_alloc(Ring *ring, int capacity): ring.c']]], + ['ring_5fempty_909',['ring_empty',['../ring_8c.html#a83a32c4d16f4e3328527b0d29322ed9b',1,'ring_empty(Ring *ring): ring.c'],['../ring_8h.html#a83a32c4d16f4e3328527b0d29322ed9b',1,'ring_empty(Ring *ring): ring.c']]], + ['ring_5ffree_910',['ring_free',['../ring_8h.html#ac118febd8ec65f7585e894e5ca969937',1,'ring_free(Ring *ring): ring.c'],['../ring_8c.html#ac118febd8ec65f7585e894e5ca969937',1,'ring_free(Ring *ring): ring.c']]], + ['ring_5ffull_911',['ring_full',['../ring_8c.html#adac33570346369d728076bbe591691e8',1,'ring_full(Ring *ring): ring.c'],['../ring_8h.html#adac33570346369d728076bbe591691e8',1,'ring_full(Ring *ring): ring.c']]], + ['ring_5fget_912',['ring_get',['../ring_8c.html#a25d2d3f13927082392e31f9cce8458cc',1,'ring_get(Ring *ring, RingEntry *entry): ring.c'],['../ring_8h.html#a25d2d3f13927082392e31f9cce8458cc',1,'ring_get(Ring *ring, RingEntry *entry): ring.c']]], + ['ring_5fgrow_913',['ring_grow',['../ring_8c.html#af99075f7c12d105820d3c3f20eb3d5d4',1,'ring_grow(Ring *ring): ring.c'],['../ring_8h.html#af99075f7c12d105820d3c3f20eb3d5d4',1,'ring_grow(Ring *ring): ring.c']]], + ['ring_5fput_914',['ring_put',['../ring_8c.html#a379859f8ee53d4fb3c016de36dd14f22',1,'ring_put(Ring *ring, RingEntry *entry): ring.c'],['../ring_8h.html#a379859f8ee53d4fb3c016de36dd14f22',1,'ring_put(Ring *ring, RingEntry *entry): ring.c']]], + ['ring_5fput_5fblock_915',['ring_put_block',['../ring_8c.html#ab1fa391df9733df1b58827240e99954e',1,'ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w): ring.c'],['../ring_8h.html#ab1fa391df9733df1b58827240e99954e',1,'ring_put_block(Ring *ring, int p, int q, int x, int y, int z, int w): ring.c']]], + ['ring_5fput_5fcommit_916',['ring_put_commit',['../ring_8c.html#ab7a367af51dacbcd3c9ffb88fbd8c1a0',1,'ring_put_commit(Ring *ring): ring.c'],['../ring_8h.html#ab7a367af51dacbcd3c9ffb88fbd8c1a0',1,'ring_put_commit(Ring *ring): ring.c']]], + ['ring_5fput_5fexit_917',['ring_put_exit',['../ring_8c.html#a0a87dd1378715ffd2977242d69d42686',1,'ring_put_exit(Ring *ring): ring.c'],['../ring_8h.html#a0a87dd1378715ffd2977242d69d42686',1,'ring_put_exit(Ring *ring): ring.c']]], + ['ring_5fput_5fkey_918',['ring_put_key',['../ring_8c.html#a673500aea8aa32ee2a49e38cc1613ca6',1,'ring_put_key(Ring *ring, int p, int q, int key): ring.c'],['../ring_8h.html#a673500aea8aa32ee2a49e38cc1613ca6',1,'ring_put_key(Ring *ring, int p, int q, int key): ring.c']]], + ['ring_5fsize_919',['ring_size',['../ring_8c.html#a835e6cd0d6cb90357b672fab9f652fb3',1,'ring_size(Ring *ring): ring.c'],['../ring_8h.html#a835e6cd0d6cb90357b672fab9f652fb3',1,'ring_size(Ring *ring): ring.c']]], + ['run_920',['run',['../classserver_1_1Model.html#a6ea5ba19abb493d10867d27edba9bb82',1,'server.Model.run()'],['../classserver_1_1Handler.html#a038cf34aa93784b15e966ea770ccbb51',1,'server.Handler.run()']]] +]; diff --git a/documentation/html/search/mag_sel.svg b/documentation/html/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/documentation/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/documentation/html/search/namespaces_0.html b/documentation/html/search/namespaces_0.html new file mode 100644 index 000000000..5b42bb2aa --- /dev/null +++ b/documentation/html/search/namespaces_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/namespaces_0.js b/documentation/html/search/namespaces_0.js new file mode 100644 index 000000000..a78c8852d --- /dev/null +++ b/documentation/html/search/namespaces_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['builder_644',['builder',['../namespacebuilder.html',1,'']]] +]; diff --git a/documentation/html/search/namespaces_1.html b/documentation/html/search/namespaces_1.html new file mode 100644 index 000000000..35e0e4520 --- /dev/null +++ b/documentation/html/search/namespaces_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/namespaces_1.js b/documentation/html/search/namespaces_1.js new file mode 100644 index 000000000..d2074e970 --- /dev/null +++ b/documentation/html/search/namespaces_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['server_645',['server',['../namespaceserver.html',1,'']]] +]; diff --git a/documentation/html/search/namespaces_2.html b/documentation/html/search/namespaces_2.html new file mode 100644 index 000000000..1e82a8d5e --- /dev/null +++ b/documentation/html/search/namespaces_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/namespaces_2.js b/documentation/html/search/namespaces_2.js new file mode 100644 index 000000000..f6c94b0d4 --- /dev/null +++ b/documentation/html/search/namespaces_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_646',['world',['../namespaceworld.html',1,'']]] +]; diff --git a/documentation/html/search/nomatches.html b/documentation/html/search/nomatches.html new file mode 100644 index 000000000..2b9360b6b --- /dev/null +++ b/documentation/html/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/documentation/html/search/pages_0.html b/documentation/html/search/pages_0.html new file mode 100644 index 000000000..179054040 --- /dev/null +++ b/documentation/html/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/pages_0.js b/documentation/html/search/pages_0.js new file mode 100644 index 000000000..5e8ff4e8a --- /dev/null +++ b/documentation/html/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['craft_1282',['Craft',['../md__home_david_Desktop_Software_Eng_Group_9_Craft_README.html',1,'']]] +]; diff --git a/documentation/html/search/pages_1.html b/documentation/html/search/pages_1.html new file mode 100644 index 000000000..1ffd4f9a0 --- /dev/null +++ b/documentation/html/search/pages_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/pages_1.js b/documentation/html/search/pages_1.js new file mode 100644 index 000000000..f8c33b79b --- /dev/null +++ b/documentation/html/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['license_1283',['LICENSE',['../md__home_david_Desktop_Software_Eng_Group_9_Craft_LICENSE.html',1,'']]] +]; diff --git a/documentation/html/search/search.css b/documentation/html/search/search.css new file mode 100644 index 000000000..9074198f8 --- /dev/null +++ b/documentation/html/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/documentation/html/search/search.js b/documentation/html/search/search.js new file mode 100644 index 000000000..fb226f734 --- /dev/null +++ b/documentation/html/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e(R!W8j_r#qQ#gnr4kAxdU#F0+OBry$Z+ z_0PMi;P|#{d%mw(dnw=jM%@$onTJa%@6Nm3`;2S#nwtVFJI#`U@2Q@@JCCctagvF- z8H=anvo~dTmJ2YA%wA6IHRv%{vxvUm|R)kgZeo zmX%Zb;mpflGZdXCTAgit`||AFzkI#z&(3d4(htA?U2FOL4WF6wY&TB#n3n*I4+hl| z*NBpo#FA92vEu822WQ%mvv4FO#qs` BFGc_W literal 0 HcmV?d00001 diff --git a/documentation/html/search/search_r.png b/documentation/html/search/search_r.png new file mode 100644 index 0000000000000000000000000000000000000000..1af5d21ee13e070d7600f1c4657fde843b953a69 GIT binary patch literal 553 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9c!2%@BXHTsJQY`6?zK#qG8~eHcB(ehe3dtTp zz6=bxGZ+|(`xqD=STHa&U1eaXVrO7DwS|Gf*oA>XrmV$GYcEhOQT(QLuS{~ooZ2P@v=Xc@RKW@Irliv8_;wroU0*)0O?temdsA~70jrdux+`@W7 z-N(<(C)L?hOO?KV{>8(jC{hpKsws)#Fh zvsO>IB+gb@b+rGWaO&!a9Z{!U+fV*s7TS>fdt&j$L%^U@Epd$~Nl7e8wMs5Z1yT$~ z28I^8hDN#u<{^fLRz?<9hUVG^237_Jy7tbuQ8eV{r(~v8;?@w8^gA7>fx*+&&t;uc GLK6VEQpiUD literal 0 HcmV?d00001 diff --git a/documentation/html/search/searchdata.js b/documentation/html/search/searchdata.js new file mode 100644 index 000000000..87f5c3f11 --- /dev/null +++ b/documentation/html/search/searchdata.js @@ -0,0 +1,45 @@ +var indexSectionsWithContent = +{ + 0: "_abcdefghiklmnopqrstuvwxyz", + 1: "abcfhmprsw", + 2: "bsw", + 3: "abcdilmrsuw", + 4: "_abcdefghilmnoprstuw", + 5: "abcdefghiklmnopqrstuvwxyz", + 6: "w", + 7: "r", + 8: "bcek", + 9: "abcdefgilmpqrstuvwy", + 10: "cl" +}; + +var indexSectionNames = +{ + 0: "all", + 1: "classes", + 2: "namespaces", + 3: "files", + 4: "functions", + 5: "variables", + 6: "typedefs", + 7: "enums", + 8: "enumvalues", + 9: "defines", + 10: "pages" +}; + +var indexSectionLabels = +{ + 0: "All", + 1: "Classes", + 2: "Namespaces", + 3: "Files", + 4: "Functions", + 5: "Variables", + 6: "Typedefs", + 7: "Enumerations", + 8: "Enumerator", + 9: "Macros", + 10: "Pages" +}; + diff --git a/documentation/html/search/typedefs_0.html b/documentation/html/search/typedefs_0.html new file mode 100644 index 000000000..96fc8469a --- /dev/null +++ b/documentation/html/search/typedefs_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/typedefs_0.js b/documentation/html/search/typedefs_0.js new file mode 100644 index 000000000..48ffbe343 --- /dev/null +++ b/documentation/html/search/typedefs_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['world_5ffunc_1145',['world_func',['../world_8h.html#af39b6218b1ef794648fd33f67791fdfd',1,'world.h']]] +]; diff --git a/documentation/html/search/variables_0.html b/documentation/html/search/variables_0.html new file mode 100644 index 000000000..67493c603 --- /dev/null +++ b/documentation/html/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_0.js b/documentation/html/search/variables_0.js new file mode 100644 index 000000000..ae91d1624 --- /dev/null +++ b/documentation/html/search/variables_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['allow_5freuse_5faddress_958',['allow_reuse_address',['../classserver_1_1Server.html#a7c1648959a23d4d8809c3998bd332d05',1,'server::Server']]], + ['allowance_959',['allowance',['../classserver_1_1RateLimiter.html#a38671d921e0ab4188215da3b931681c6',1,'server::RateLimiter']]], + ['allowed_5fitems_960',['ALLOWED_ITEMS',['../namespaceserver.html#a8c7e21677cb482c3179cb33989c34e40',1,'server']]], + ['alpha_5fbuffer_961',['alpha_buffer',['../structChunk.html#a83a9bda3ad0b6a842297d3c7a7391494',1,'Chunk']]], + ['alpha_5ffaces_962',['alpha_faces',['../structChunk.html#a3b448dbc9b483e6a486d143d681fce32',1,'Chunk']]], + ['authenticate_963',['AUTHENTICATE',['../namespaceserver.html#ab98a35ee77382d77ac58e454c03a0225',1,'server']]] +]; diff --git a/documentation/html/search/variables_1.html b/documentation/html/search/variables_1.html new file mode 100644 index 000000000..44416bd1d --- /dev/null +++ b/documentation/html/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_1.js b/documentation/html/search/variables_1.js new file mode 100644 index 000000000..554b95a52 --- /dev/null +++ b/documentation/html/search/variables_1.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['block_964',['BLOCK',['../namespaceserver.html#a4d57d6c1f97136d70385c04f24c647f2',1,'server']]], + ['block0_965',['block0',['../structModel.html#afddf699a972eb1144e4e2b6165e6c825',1,'Model']]], + ['block1_966',['block1',['../structModel.html#a375b22a0a3043bc685947b33d83bcc17',1,'Model']]], + ['blocks_967',['blocks',['../item_8c.html#a579875f477e41abd0db90afe1b658d2c',1,'blocks(): item.c'],['../item_8h.html#a579875f477e41abd0db90afe1b658d2c',1,'blocks(): item.c']]], + ['blue_5fflower_968',['BLUE_FLOWER',['../namespacebuilder.html#a59ac7ae8459200530cb037840d17a7c6',1,'builder']]], + ['brick_969',['BRICK',['../namespacebuilder.html#a1c6b2ee83b7d646338dd21461d16eda6',1,'builder']]], + ['buffer_970',['buffer',['../structChunk.html#a37268084ae967da79d9e47033fcfd259',1,'Chunk::buffer()'],['../structPlayer.html#a6be397c2a7cb79256e85dc6a96055f45',1,'Player::buffer()']]], + ['buffer_5fsize_971',['BUFFER_SIZE',['../namespaceserver.html#a993857ed7244a3cc5392879347db0066',1,'server']]], + ['bytes_5freceived_972',['bytes_received',['../client_8c.html#a0f4ebdb196909cdad25bee632106b522',1,'client.c']]], + ['bytes_5fsent_973',['bytes_sent',['../client_8c.html#ab9e07f56cbc46818dce94414d79bff18',1,'client.c']]] +]; diff --git a/documentation/html/search/variables_10.html b/documentation/html/search/variables_10.html new file mode 100644 index 000000000..719e57837 --- /dev/null +++ b/documentation/html/search/variables_10.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_10.js b/documentation/html/search/variables_10.js new file mode 100644 index 000000000..fa08aa016 --- /dev/null +++ b/documentation/html/search/variables_10.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['rate_1083',['rate',['../classserver_1_1RateLimiter.html#aa1675e0ed19da619c2d1cc3db01190f8',1,'server::RateLimiter']]], + ['rate_5flimit_1084',['RATE_LIMIT',['../namespaceserver.html#acee82c390c8493ae35b967f5480555e6',1,'server']]], + ['record_5fhistory_1085',['RECORD_HISTORY',['../namespaceserver.html#a7cb7ac5d339b3f66fe850384732d60bb',1,'server']]], + ['recv_5fthread_1086',['recv_thread',['../client_8c.html#aaaa4e25033f4df7812de0122aff7b40d',1,'client.c']]], + ['red_5fflower_1087',['RED_FLOWER',['../namespacebuilder.html#a361f85656bf470c91b7e1b035df92caa',1,'builder']]], + ['redraw_1088',['REDRAW',['../namespaceserver.html#afe06f029a20a3be127ac2048838c562a',1,'server']]], + ['render_5fradius_1089',['render_radius',['../structModel.html#a78738d6f90d8a11202fec26912dddcde',1,'Model']]], + ['ring_1090',['ring',['../db_8c.html#afa742309dafdf7b11fa0328bce577488',1,'db.c']]], + ['running_1091',['running',['../classserver_1_1Handler.html#a06c044d851fc4b905d6dde0f005c3860',1,'server.Handler.running()'],['../client_8c.html#a2f45113638a0b749a8a205d2cd7fb42b',1,'running(): client.c']]], + ['rx_1092',['rx',['../structState.html#a44129661bc65bbbb6147793fd196c89f',1,'State']]], + ['ry_1093',['ry',['../structState.html#a9644786d1cc6a604052cc8eac719b888',1,'State']]] +]; diff --git a/documentation/html/search/variables_11.html b/documentation/html/search/variables_11.html new file mode 100644 index 000000000..172e594ea --- /dev/null +++ b/documentation/html/search/variables_11.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_11.js b/documentation/html/search/variables_11.js new file mode 100644 index 000000000..7cfec0c24 --- /dev/null +++ b/documentation/html/search/variables_11.js @@ -0,0 +1,29 @@ +var searchData= +[ + ['sampler_1094',['sampler',['../structAttrib.html#ab176427e061e47c040d0a8d25488fd6d',1,'Attrib']]], + ['sand_1095',['SAND',['../namespacebuilder.html#ad876414bda38386184fee1ddf6cb334f',1,'builder']]], + ['scale_1096',['scale',['../structModel.html#a2e5100141918bee00883703185ed79cd',1,'Model']]], + ['sd_1097',['sd',['../client_8c.html#a06b0afe769d54ae94259d8532bc878b0',1,'client.c']]], + ['seed_1098',['seed',['../classworld_1_1World.html#a4574f62bbf51758fe54381eb4b655505',1,'world::World']]], + ['sensitivity_1099',['sensitivity',['../structModel.html#a4ba66e0c4dd5a20eace9081426f82c47',1,'Model']]], + ['server_5faddr_1100',['server_addr',['../structModel.html#a945af3964810abe23abf7324a3da1b35',1,'Model']]], + ['server_5fport_1101',['server_port',['../structModel.html#ac47fe750112140fe346c32524bf1121b',1,'Model']]], + ['set_5fkey_5fstmt_1102',['set_key_stmt',['../db_8c.html#afe814e94032ba31c149d04cfab27e69a',1,'db.c']]], + ['sign_1103',['SIGN',['../namespaceserver.html#a5fd416c9b80e5cb2b3860a1d5486c01b',1,'server']]], + ['sign_5fbuffer_1104',['sign_buffer',['../structChunk.html#a7c89d7fc29dbdd94c50280e92def013c',1,'Chunk']]], + ['sign_5ffaces_1105',['sign_faces',['../structChunk.html#a6ffdf89c012dfaefe531aa0eb93fe69a',1,'Chunk']]], + ['sign_5fradius_1106',['sign_radius',['../structModel.html#a27a1d8e175370c2b238acb4e6f68e9b7',1,'Model']]], + ['signs_1107',['signs',['../structChunk.html#acd18dcf6bf17f499e36b5806519d8800',1,'Chunk']]], + ['since_1108',['since',['../structFPS.html#a00ae9e9c14b85585e20122a32e35000d',1,'FPS']]], + ['size_1109',['size',['../structMap.html#a73754296f937e5d5fbf40b4be90c8e8c',1,'Map::size()'],['../structSignList.html#a1a62d68f9161254e618060ab4ffe2d89',1,'SignList::size()']]], + ['slowed_1110',['slowed',['../structModel.html#ab133783da63ae092914af414a2ea7da4',1,'Model']]], + ['snow_1111',['SNOW',['../namespacebuilder.html#a5ae2e76a2f38da3947d65272682d36bb',1,'builder']]], + ['spawn_5fpoint_1112',['SPAWN_POINT',['../namespaceserver.html#a0ecaf08992cd9836ad247f6dc33ba933',1,'server']]], + ['start_1113',['start',['../structRing.html#a05ded3e84726b36d0b2266e733ddc61e',1,'Ring']]], + ['state_1114',['state',['../structPlayer.html#ac4a623bf6650a719187c50bb0413b9a0',1,'Player']]], + ['state1_1115',['state1',['../structPlayer.html#a7712ad6df23e875de18fb38537620909',1,'Player']]], + ['state2_1116',['state2',['../structPlayer.html#a7b894c51bb7a740af4a2ffef56a4e788',1,'Player']]], + ['stone_1117',['STONE',['../namespacebuilder.html#a1432b48ab2f4be80e2398b0ace4be53b',1,'builder']]], + ['sun_5fflower_1118',['SUN_FLOWER',['../namespacebuilder.html#a7bf0fa135b8132a37cd64f58f8517fa4',1,'builder']]], + ['suppress_5fchar_1119',['suppress_char',['../structModel.html#a71a28fca3a64903ea725641e4f63030b',1,'Model']]] +]; diff --git a/documentation/html/search/variables_12.html b/documentation/html/search/variables_12.html new file mode 100644 index 000000000..1039ed45b --- /dev/null +++ b/documentation/html/search/variables_12.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_12.js b/documentation/html/search/variables_12.js new file mode 100644 index 000000000..947eb7eac --- /dev/null +++ b/documentation/html/search/variables_12.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['t_1120',['t',['../structState.html#ab1a06cd5c56832f61483d897879e2b35',1,'State']]], + ['talk_1121',['TALK',['../namespaceserver.html#a138ab9e0bff57cc5f21bfef69bd95757',1,'server']]], + ['tall_5fgrass_1122',['TALL_GRASS',['../namespacebuilder.html#a2257d9d17c745213021539e95cea6ed7',1,'builder']]], + ['text_1123',['text',['../structSign.html#aa3053ca28e2fecc26cfbef7797da4646',1,'Sign']]], + ['thrd_1124',['thrd',['../db_8c.html#a5afe4fcdfbd486e2e63008a59ea6242f',1,'db.c']]], + ['timer_1125',['timer',['../structAttrib.html#aa27da229009adea9e3729e80f7b200b5',1,'Attrib']]], + ['type_1126',['type',['../structRingEntry.html#afc77cc123c354240feba6e92dd4ee882',1,'RingEntry']]], + ['typing_1127',['typing',['../structModel.html#a2fcef6db45ecfe5abca7e531c3edd58d',1,'Model']]], + ['typing_5fbuffer_1128',['typing_buffer',['../structModel.html#a69f3bc4862cb7190f7d28013da4fe629',1,'Model']]] +]; diff --git a/documentation/html/search/variables_13.html b/documentation/html/search/variables_13.html new file mode 100644 index 000000000..81b2bd9dd --- /dev/null +++ b/documentation/html/search/variables_13.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_13.js b/documentation/html/search/variables_13.js new file mode 100644 index 000000000..e07e426a5 --- /dev/null +++ b/documentation/html/search/variables_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['user_5fid_1129',['user_id',['../classserver_1_1Handler.html#a368e5ec92d1541bb7ee848835e2cdc1f',1,'server::Handler']]], + ['uv_1130',['uv',['../structAttrib.html#a91a6c5203f836990dfd2529a4dd128ce',1,'Attrib']]] +]; diff --git a/documentation/html/search/variables_14.html b/documentation/html/search/variables_14.html new file mode 100644 index 000000000..3a2741d1e --- /dev/null +++ b/documentation/html/search/variables_14.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_14.js b/documentation/html/search/variables_14.js new file mode 100644 index 000000000..06c7c71eb --- /dev/null +++ b/documentation/html/search/variables_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['version_1131',['version',['../classserver_1_1Handler.html#a515ccd70de8f9d2a4cbbb1c1c314837e',1,'server::Handler']]], + ['version_1132',['VERSION',['../namespaceserver.html#a63a0d74b795fcfd6bfc49c1f6deeb69d',1,'server']]] +]; diff --git a/documentation/html/search/variables_15.html b/documentation/html/search/variables_15.html new file mode 100644 index 000000000..2b367cf34 --- /dev/null +++ b/documentation/html/search/variables_15.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_15.js b/documentation/html/search/variables_15.js new file mode 100644 index 000000000..6b3c19c15 --- /dev/null +++ b/documentation/html/search/variables_15.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['w_1133',['w',['../structBlock.html#aea0530a4c08ea5892151575b5301940e',1,'Block::w()'],['../structMapEntry.html#a969cff77cf8a833cdf44d55da4428618',1,'MapEntry::w()'],['../structRingEntry.html#a5c4cd66b932f7f6c430b12b9b6dc4007',1,'RingEntry::w()']]], + ['white_5fflower_1134',['WHITE_FLOWER',['../namespacebuilder.html#a28480e397c9c49cc05809b655153e304',1,'builder']]], + ['width_1135',['width',['../structModel.html#a95fedd30937f05f07f81b7fa3aa29add',1,'Model']]], + ['window_1136',['window',['../structModel.html#af15f84653ef65888f996e6b78c1d6ff7',1,'Model']]], + ['wood_1137',['WOOD',['../namespacebuilder.html#a1dc2ae6aeebd5316454edef5c31c7185',1,'builder']]], + ['world_1138',['world',['../classserver_1_1Model.html#a6107594ebcdc6ff20794651a2f12e5b7',1,'server::Model']]], + ['world_5ffunc_1139',['WORLD_FUNC',['../namespaceworld.html#a2babf84acf1429abd767fd6e9e7311a9',1,'world']]] +]; diff --git a/documentation/html/search/variables_16.html b/documentation/html/search/variables_16.html new file mode 100644 index 000000000..e01ee772c --- /dev/null +++ b/documentation/html/search/variables_16.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_16.js b/documentation/html/search/variables_16.js new file mode 100644 index 000000000..dfbae2346 --- /dev/null +++ b/documentation/html/search/variables_16.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_1140',['x',['../structBlock.html#a13d0a6d225233353862fa5adcbadf661',1,'Block::x()'],['../structState.html#a9948cc668f49246582cfd131b7928f7e',1,'State::x()'],['../structMapEntry.html#a6da0d8c945c9cc674b888c899ca86ea0',1,'MapEntry::x()'],['../structRingEntry.html#a1d73e65971815248e917087ca69afd63',1,'RingEntry::x()'],['../structSign.html#a9672fe58fa3a1d75c9511fe8259eb4e6',1,'Sign::x()']]] +]; diff --git a/documentation/html/search/variables_17.html b/documentation/html/search/variables_17.html new file mode 100644 index 000000000..f248e6da0 --- /dev/null +++ b/documentation/html/search/variables_17.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_17.js b/documentation/html/search/variables_17.js new file mode 100644 index 000000000..0fb22f944 --- /dev/null +++ b/documentation/html/search/variables_17.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['y_1141',['y',['../structBlock.html#a9328d6b6fcc9f9c019d091d87ceda41c',1,'Block::y()'],['../structState.html#a89572abb38dea3b1a780ede589a2d59b',1,'State::y()'],['../structMapEntry.html#a8584df6a55b3d64744583fb532b8ee92',1,'MapEntry::y()'],['../structRingEntry.html#a7f50629b87d74360c6726903cf1452d2',1,'RingEntry::y()'],['../structSign.html#afdd7a7b76acc62dfd45965caed37c3f3',1,'Sign::y()']]], + ['yellow_5fflower_1142',['YELLOW_FLOWER',['../namespacebuilder.html#a120b3c6f77479b02f91df2bfe9183c16',1,'builder']]], + ['you_1143',['YOU',['../namespaceserver.html#a5c20fc4310a3196a277de462c63ac23b',1,'server']]] +]; diff --git a/documentation/html/search/variables_18.html b/documentation/html/search/variables_18.html new file mode 100644 index 000000000..04f9a2491 --- /dev/null +++ b/documentation/html/search/variables_18.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_18.js b/documentation/html/search/variables_18.js new file mode 100644 index 000000000..1b90f58af --- /dev/null +++ b/documentation/html/search/variables_18.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['z_1144',['z',['../structBlock.html#aeb6a2ee081d32a7c2e8f3ddcca235fc9',1,'Block::z()'],['../structState.html#aed6ded85740f752ec9c5c2ca499da5a9',1,'State::z()'],['../structMapEntry.html#a36ada5da307698020f02485d6866d57f',1,'MapEntry::z()'],['../structRingEntry.html#a8b88d0f404a59333eae214698675c712',1,'RingEntry::z()'],['../structSign.html#a5eb6412ecae2da81951ffdf073a994ed',1,'Sign::z()']]] +]; diff --git a/documentation/html/search/variables_2.html b/documentation/html/search/variables_2.html new file mode 100644 index 000000000..117be3aec --- /dev/null +++ b/documentation/html/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_2.js b/documentation/html/search/variables_2.js new file mode 100644 index 000000000..b31941312 --- /dev/null +++ b/documentation/html/search/variables_2.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['cache_974',['cache',['../classworld_1_1World.html#ac976ce86e41ea59f72ed21dac773419d',1,'world::World']]], + ['cache_5fsize_975',['cache_size',['../classworld_1_1World.html#aba042cdb1aa2f95a6eef806fc26b28ef',1,'world::World']]], + ['camera_976',['camera',['../structAttrib.html#a8f4457820b9ba58eeb332bac333c5e55',1,'Attrib']]], + ['capacity_977',['capacity',['../structRing.html#a49514c27dd8d8c6f850ac6cf86c3f8fc',1,'Ring::capacity()'],['../structSignList.html#a56d04de93571aa77cff50c4ee30f8682',1,'SignList::capacity()']]], + ['cement_978',['CEMENT',['../namespacebuilder.html#af41023da11380a6475b71a42c778a7ef',1,'builder']]], + ['chest_979',['CHEST',['../namespacebuilder.html#a8a577b7b77c8b77831c2bf834a30c71d',1,'builder']]], + ['chunk_980',['CHUNK',['../namespaceserver.html#a04b18b4fe2fbaa80531cd880fece4155',1,'server']]], + ['chunk_5fcount_981',['chunk_count',['../structModel.html#ac890daa53d9fca686f850c61707534d3',1,'Model']]], + ['chunk_5fsize_982',['CHUNK_SIZE',['../namespaceserver.html#ac544eeef1bf6560531b7ddbc2b134453',1,'server']]], + ['chunks_983',['chunks',['../structModel.html#a454955bd2cbb283c269a5189d29b6362',1,'Model']]], + ['client_5fenabled_984',['client_enabled',['../client_8c.html#ad12248ebff2b138681d413fdc115d5d5',1,'client.c']]], + ['client_5fid_985',['client_id',['../classserver_1_1Handler.html#a82fae77f6e18ca613f936302923e3910',1,'server::Handler']]], + ['clients_986',['clients',['../classserver_1_1Model.html#ae8aefbf418082334aba83df648f7597e',1,'server::Model']]], + ['cloud_987',['CLOUD',['../namespacebuilder.html#a2337ef428f849500c9c6c6bd6ef067a8',1,'builder']]], + ['cnd_988',['cnd',['../db_8c.html#a87771e27109c0c73156a4efeb6c4480b',1,'db.c']]], + ['cobble_989',['COBBLE',['../namespacebuilder.html#af32d0c69982332d80c24089e4c39de06',1,'builder']]], + ['commands_990',['commands',['../classserver_1_1Model.html#a9cc9e8300304ed383f576d97b357b074',1,'server::Model']]], + ['commit_5finterval_991',['COMMIT_INTERVAL',['../namespaceserver.html#aaf5b63efe6cc95b48018d86a5c13ed1d',1,'server']]], + ['conn_992',['conn',['../classbuilder_1_1Client.html#a96c2c0e990bc9cad36881d2506e29fb9',1,'builder::Client']]], + ['connection_993',['connection',['../classserver_1_1Model.html#afb3cee7bcfdd6157b3607d823ab5145e',1,'server::Model']]], + ['copy0_994',['copy0',['../structModel.html#a3ddb16326999cefcf195fdd796d411a4',1,'Model']]], + ['copy1_995',['copy1',['../structModel.html#a80358faa79d27e0e905f6542044458c5',1,'Model']]], + ['create_5fradius_996',['create_radius',['../structModel.html#ab285f5b424f0989de991724b7842f7ee',1,'Model']]] +]; diff --git a/documentation/html/search/variables_3.html b/documentation/html/search/variables_3.html new file mode 100644 index 000000000..c583cd67d --- /dev/null +++ b/documentation/html/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_3.js b/documentation/html/search/variables_3.js new file mode 100644 index 000000000..89f7382ec --- /dev/null +++ b/documentation/html/search/variables_3.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['daemon_5fthreads_997',['daemon_threads',['../classserver_1_1Server.html#abb009ef7bca9b51abe556105d2c3f18d',1,'server::Server']]], + ['dark_5fstone_998',['DARK_STONE',['../namespacebuilder.html#a2389d5ffd9b0c947bb627cb7a7c16aa4',1,'builder']]], + ['data_999',['data',['../structMap.html#a8ef299519738b44dc1ae95c6410f0b56',1,'Map::data()'],['../structRing.html#a610017b8cf1bff81f61e32bbf3cdf972',1,'Ring::data()'],['../structSignList.html#aee3357bed55f987188d91160a631ae64',1,'SignList::data()']]], + ['db_1000',['db',['../db_8c.html#ad6e663497d2c934364b3bcf07496b30b',1,'db.c']]], + ['db_5fenabled_1001',['db_enabled',['../db_8c.html#a542e31ff8709700973744252b3e7373f',1,'db.c']]], + ['db_5fpath_1002',['DB_PATH',['../namespaceserver.html#a77772ee066c2a1006356b8ff8c587115',1,'server']]], + ['db_5fpath_1003',['db_path',['../structModel.html#af802d2f02b947ba1772707eb247f8dac',1,'Model']]], + ['default_5fhost_1004',['DEFAULT_HOST',['../namespaceserver.html#ace3bdae79fa444c2cae4afb907008bed',1,'server.DEFAULT_HOST()'],['../namespacebuilder.html#a8be95e915db46c21c05559536976e368',1,'builder.DEFAULT_HOST()']]], + ['default_5fport_1005',['DEFAULT_PORT',['../namespaceserver.html#a799b32fdd2321df0f6d93809c1aca14a',1,'server.DEFAULT_PORT()'],['../namespacebuilder.html#a206e8bd8dca4763bb665ab17fd4dd2e2',1,'builder.DEFAULT_PORT()']]], + ['delete_5fradius_1006',['delete_radius',['../structModel.html#a424db0f8c4b9225fc177664d0564b9f6',1,'Model']]], + ['delete_5fsign_5fstmt_1007',['delete_sign_stmt',['../db_8c.html#a9162cf0c9f4f7b1e7c0f959f2aa0392a',1,'db.c']]], + ['delete_5fsigns_5fstmt_1008',['delete_signs_stmt',['../db_8c.html#a343c224c7346bf296e9b9da7d46c365b',1,'db.c']]], + ['dirt_1009',['DIRT',['../namespacebuilder.html#a7058e289380a1bc274fb9a650068c662',1,'builder']]], + ['dirty_1010',['dirty',['../structChunk.html#a67d8b303bbdb6b9928fec2783d08f59f',1,'Chunk']]], + ['disconnect_1011',['DISCONNECT',['../namespaceserver.html#a1f49fe4c59f9b957b023529ecc4fd70a',1,'server']]], + ['dll_1012',['dll',['../namespaceworld.html#a8a3c5f1f0950c07a36741873e8b2b9f0',1,'world']]] +]; diff --git a/documentation/html/search/variables_4.html b/documentation/html/search/variables_4.html new file mode 100644 index 000000000..c78c42f2b --- /dev/null +++ b/documentation/html/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_4.js b/documentation/html/search/variables_4.js new file mode 100644 index 000000000..93f81ba50 --- /dev/null +++ b/documentation/html/search/variables_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['empty_1013',['EMPTY',['../namespacebuilder.html#abaf694fbfa850f70778ebfb45d349e30',1,'builder']]], + ['end_1014',['end',['../structRing.html#a704c118e618f3fac90554954b90ff363',1,'Ring']]], + ['extra1_1015',['extra1',['../structAttrib.html#a128a2b0c82df58158709832564ad5ec2',1,'Attrib']]], + ['extra2_1016',['extra2',['../structAttrib.html#a3aeae3bea2c6eda1a2fd8e2387f46dc5',1,'Attrib']]], + ['extra3_1017',['extra3',['../structAttrib.html#a8695ec97ee35d7edda5578eb356ea89c',1,'Attrib']]], + ['extra4_1018',['extra4',['../structAttrib.html#a3cfb70967ab07898959cb0dce7a72ce4',1,'Attrib']]] +]; diff --git a/documentation/html/search/variables_5.html b/documentation/html/search/variables_5.html new file mode 100644 index 000000000..2fc8b5efa --- /dev/null +++ b/documentation/html/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_5.js b/documentation/html/search/variables_5.js new file mode 100644 index 000000000..33e6d9826 --- /dev/null +++ b/documentation/html/search/variables_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['face_1019',['face',['../structSign.html#a5a5f53a409cd7ec36733fc80e6d25785',1,'Sign']]], + ['faces_1020',['faces',['../structChunk.html#aed1e3841c79fac84de3514739ca0ff0e',1,'Chunk']]], + ['flying_1021',['flying',['../structModel.html#a5c6ca81f5d80886495091479812321f0',1,'Model']]], + ['fov_1022',['fov',['../structModel.html#ac42baa2c90d6e01bef3680719f59e905',1,'Model']]], + ['fps_1023',['fps',['../structFPS.html#ac960f6d060a8c1b0aa94b51ac695a75d',1,'FPS']]], + ['frames_1024',['frames',['../structFPS.html#acc427eae0a41ee5d36a4c9bdb5149393',1,'FPS']]] +]; diff --git a/documentation/html/search/variables_6.html b/documentation/html/search/variables_6.html new file mode 100644 index 000000000..d47102084 --- /dev/null +++ b/documentation/html/search/variables_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_6.js b/documentation/html/search/variables_6.js new file mode 100644 index 000000000..dfea11e99 --- /dev/null +++ b/documentation/html/search/variables_6.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['g_1025',['g',['../main_8c.html#aedf1ea1af759e007a23346431fb9a9f1',1,'main.c']]], + ['get_5fkey_5fstmt_1026',['get_key_stmt',['../db_8c.html#a565b419f1b417bb59328a6d4fc706eb1',1,'db.c']]], + ['glass_1027',['GLASS',['../namespacebuilder.html#ad2d0f19a02aff335dfac1bba794a48af',1,'builder']]], + ['grass_1028',['GRASS',['../namespacebuilder.html#a9a2226229cb0234dec43f2bad262032a',1,'builder']]] +]; diff --git a/documentation/html/search/variables_7.html b/documentation/html/search/variables_7.html new file mode 100644 index 000000000..e6f8bf8cb --- /dev/null +++ b/documentation/html/search/variables_7.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_7.js b/documentation/html/search/variables_7.js new file mode 100644 index 000000000..65d0d77e3 --- /dev/null +++ b/documentation/html/search/variables_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['health_1029',['health',['../structPlayer.html#adc89cdfcf04e9e8aa8a45090fc52dc96',1,'Player']]], + ['height_1030',['height',['../structModel.html#a710c2d2f710d349e4a76c7d78570e70f',1,'Model']]] +]; diff --git a/documentation/html/search/variables_8.html b/documentation/html/search/variables_8.html new file mode 100644 index 000000000..3b3de0a50 --- /dev/null +++ b/documentation/html/search/variables_8.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_8.js b/documentation/html/search/variables_8.js new file mode 100644 index 000000000..05d2aeb5b --- /dev/null +++ b/documentation/html/search/variables_8.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['id_1031',['id',['../structPlayer.html#a05e05f3a23de78da7ec032ec2bcf8c6c',1,'Player']]], + ['indestructible_5fitems_1032',['INDESTRUCTIBLE_ITEMS',['../namespaceserver.html#a1317b0769798b52724af1102849c6624',1,'server']]], + ['insert_5fblock_5fstmt_1033',['insert_block_stmt',['../db_8c.html#a50c07d0fbc47084f4bfb52db36809e8d',1,'db.c']]], + ['insert_5fsign_5fstmt_1034',['insert_sign_stmt',['../db_8c.html#a3972ea62cfd5d919a98adae509c2de7f',1,'db.c']]], + ['item_5fcount_1035',['item_count',['../item_8c.html#affa2d8934bd67035bb75e42da40ea75e',1,'item_count(): item.c'],['../item_8h.html#affa2d8934bd67035bb75e42da40ea75e',1,'item_count(): item.c']]], + ['item_5findex_1036',['item_index',['../structModel.html#a4ae976c019c23dff2d52f7fc89c6c0d0',1,'Model']]], + ['items_1037',['items',['../item_8c.html#a1364db8b1ef3aedea7542f732e23c391',1,'items(): item.c'],['../item_8h.html#a1364db8b1ef3aedea7542f732e23c391',1,'items(): item.c']]] +]; diff --git a/documentation/html/search/variables_9.html b/documentation/html/search/variables_9.html new file mode 100644 index 000000000..803220a03 --- /dev/null +++ b/documentation/html/search/variables_9.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_9.js b/documentation/html/search/variables_9.js new file mode 100644 index 000000000..606d5d744 --- /dev/null +++ b/documentation/html/search/variables_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_1038',['key',['../structRingEntry.html#a94645a5a7b12ad82ed76dce5fd5e1f2c',1,'RingEntry']]], + ['key_1039',['KEY',['../namespaceserver.html#a7eb07aebb7fe3321300aa2fb1e5e2a59',1,'server']]] +]; diff --git a/documentation/html/search/variables_a.html b/documentation/html/search/variables_a.html new file mode 100644 index 000000000..0f55e75b5 --- /dev/null +++ b/documentation/html/search/variables_a.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_a.js b/documentation/html/search/variables_a.js new file mode 100644 index 000000000..c3fce0f47 --- /dev/null +++ b/documentation/html/search/variables_a.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['last_5fcheck_1040',['last_check',['../classserver_1_1RateLimiter.html#a940bc36975e7961d394c089beb7abeb1',1,'server::RateLimiter']]], + ['last_5fcommit_1041',['last_commit',['../classserver_1_1Model.html#af17091b5639b2ea262bf50746c532dd6',1,'server::Model']]], + ['leaves_1042',['LEAVES',['../namespacebuilder.html#ad207992aaec3e5845320b5419f47c382',1,'builder']]], + ['light_5fstone_1043',['LIGHT_STONE',['../namespacebuilder.html#a11f22dec1143fc1c9250f670597d9203',1,'builder']]], + ['limiter_1044',['limiter',['../classserver_1_1Handler.html#ad9acac2a0d248d87d74c2be5d2c9732e',1,'server::Handler']]], + ['load_5fmap_5fstmt_1045',['load_map_stmt',['../db_8c.html#a12c9cd7ae89b493615854f4712bc0d27',1,'db.c']]], + ['load_5fsigns_5fstmt_1046',['load_signs_stmt',['../db_8c.html#accd0132b87685f6cfe76a6b58cfcc273',1,'db.c']]], + ['log_5fpath_1047',['LOG_PATH',['../namespaceserver.html#aa41c5c8a03a61efd55fd4071f0186c9d',1,'server']]] +]; diff --git a/documentation/html/search/variables_b.html b/documentation/html/search/variables_b.html new file mode 100644 index 000000000..44d030c83 --- /dev/null +++ b/documentation/html/search/variables_b.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_b.js b/documentation/html/search/variables_b.js new file mode 100644 index 000000000..3ada4c40e --- /dev/null +++ b/documentation/html/search/variables_b.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['map_1048',['map',['../structChunk.html#ac925ff5f92406dea6f56044d7e1e2089',1,'Chunk']]], + ['mask_1049',['mask',['../structMap.html#a2211aadc9745a27b0e07a3af85989bd5',1,'Map']]], + ['matrix_1050',['matrix',['../structAttrib.html#abf01f51d610dd0ddf14ef44565505dd0',1,'Attrib']]], + ['maxy_1051',['maxy',['../structChunk.html#a3745b0b938e79f1ee64eff354994994e',1,'Chunk']]], + ['message_5findex_1052',['message_index',['../structModel.html#a5026500a00cac3bb98dd3a2085802fa8',1,'Model']]], + ['messages_1053',['messages',['../structModel.html#aa623ba15ac148da584c8cc1b7a76b7e9',1,'Model']]], + ['miny_1054',['miny',['../structChunk.html#a528c51d2899b3f2d2c1fa8d7ef90621a',1,'Chunk']]], + ['mode_1055',['mode',['../structModel.html#add046a4b0c100fba89780214f96c02ba',1,'Model']]], + ['mode_5fchanged_1056',['mode_changed',['../structModel.html#a6540d35023bbfc1bae76c2932a9efe2b',1,'Model']]], + ['model_1057',['model',['../main_8c.html#aa7373a131d63421e546eaa40689df69d',1,'main.c']]], + ['mtx_1058',['mtx',['../db_8c.html#aece695d920e8a0ef6f4e63898bae7d0b',1,'db.c']]], + ['mutex_1059',['mutex',['../client_8c.html#a14994af3b2159c2738cdf6a0513d32ae',1,'client.c']]] +]; diff --git a/documentation/html/search/variables_c.html b/documentation/html/search/variables_c.html new file mode 100644 index 000000000..aa86a08b1 --- /dev/null +++ b/documentation/html/search/variables_c.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_c.js b/documentation/html/search/variables_c.js new file mode 100644 index 000000000..040734f4e --- /dev/null +++ b/documentation/html/search/variables_c.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['name_1060',['name',['../structPlayer.html#a000f74f4241ebc344866c82bec4ed5ef',1,'Player']]], + ['nick_1061',['nick',['../classserver_1_1Handler.html#afe540a1acc789d4fa3bbb84f4e3c66ca',1,'server::Handler']]], + ['nick_1062',['NICK',['../namespaceserver.html#a84ed5c5365c3740ff5effc30f171d83b',1,'server']]], + ['normal_1063',['normal',['../structAttrib.html#a1747ed761cce42decf0b1f48e2d424aa',1,'Attrib']]] +]; diff --git a/documentation/html/search/variables_d.html b/documentation/html/search/variables_d.html new file mode 100644 index 000000000..17d25e040 --- /dev/null +++ b/documentation/html/search/variables_d.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_d.js b/documentation/html/search/variables_d.js new file mode 100644 index 000000000..6cd00f65c --- /dev/null +++ b/documentation/html/search/variables_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['observe1_1064',['observe1',['../structModel.html#a3890d0a201c0de9b06065e1166c392bb',1,'Model']]], + ['observe2_1065',['observe2',['../structModel.html#a988b3760efa4ed902d218637fb19152e',1,'Model']]], + ['offsets_1066',['OFFSETS',['../namespacebuilder.html#a16c3dd69f9a9c90a3bedcdf4f830613c',1,'builder']]], + ['ortho_1067',['ortho',['../structModel.html#a9ce317de5c55c344b1ce279b0223941f',1,'Model']]] +]; diff --git a/documentation/html/search/variables_e.html b/documentation/html/search/variables_e.html new file mode 100644 index 000000000..0b5f5700f --- /dev/null +++ b/documentation/html/search/variables_e.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_e.js b/documentation/html/search/variables_e.js new file mode 100644 index 000000000..b84d12552 --- /dev/null +++ b/documentation/html/search/variables_e.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['p_1068',['p',['../structChunk.html#a016383084b50c856a1fb63f97ca63dc6',1,'Chunk::p()'],['../structRingEntry.html#a8b01eb77bb24ee7243b3c4966475f5d1',1,'RingEntry::p()']]], + ['patterns_1069',['patterns',['../classserver_1_1Model.html#a44f6ce8a304b6e72d5bbe4bcbd6795db',1,'server::Model']]], + ['per_1070',['per',['../classserver_1_1RateLimiter.html#aba1799f8a14f8e5d9a1a404ac8935d1d',1,'server::RateLimiter']]], + ['plank_1071',['PLANK',['../namespacebuilder.html#a0a8394a9dfc35c02362f9bf8d644fcf1',1,'builder']]], + ['plants_1072',['plants',['../item_8c.html#a44faad87c9595984a1c69e9d4fc505d4',1,'plants(): item.c'],['../item_8h.html#a44faad87c9595984a1c69e9d4fc505d4',1,'plants(): item.c']]], + ['player_5fcount_1073',['player_count',['../structModel.html#aaf87a246b0eaba7090708cbf06265948',1,'Model']]], + ['players_1074',['players',['../structModel.html#a35889c6e0321e390c7cc35678b561f0c',1,'Model']]], + ['position_1075',['position',['../structAttrib.html#a2e8900e46275e6dba5de47a6cb3fb014',1,'Attrib']]], + ['position_1076',['POSITION',['../namespaceserver.html#a80527517653f6fc9a6c11307515157d0',1,'server']]], + ['position_5flimiter_1077',['position_limiter',['../classserver_1_1Handler.html#a6fa3e8df9f40dccd1de4522096781985',1,'server::Handler']]], + ['program_1078',['program',['../structAttrib.html#accbe71d8cd2e04669694902abddf88fd',1,'Attrib']]], + ['purple_5fflower_1079',['PURPLE_FLOWER',['../namespacebuilder.html#aea173fe52e425426d43b7b9ea68416d8',1,'builder']]] +]; diff --git a/documentation/html/search/variables_f.html b/documentation/html/search/variables_f.html new file mode 100644 index 000000000..e034bd28f --- /dev/null +++ b/documentation/html/search/variables_f.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/documentation/html/search/variables_f.js b/documentation/html/search/variables_f.js new file mode 100644 index 000000000..36c1c135a --- /dev/null +++ b/documentation/html/search/variables_f.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['q_1080',['q',['../structChunk.html#a20fb30e8ac307726320ef6d3e4cd89a1',1,'Chunk::q()'],['../structRingEntry.html#ae944a4f58e8d867035a9d94366615ff2',1,'RingEntry::q()']]], + ['qsize_1081',['qsize',['../client_8c.html#a3751980c94cdf8b2e167fa7d0c0ab24e',1,'client.c']]], + ['queue_1082',['queue',['../classserver_1_1Handler.html#a437d5a22c96f1423facc1a87c546bfe9',1,'server.Handler.queue()'],['../classserver_1_1Model.html#a65c1208dbbe27fc4c2ebf9dbb465e8b2',1,'server.Model.queue()'],['../client_8c.html#abdac8928627c8ca88b5b325d9916d218',1,'queue(): client.c']]] +]; diff --git a/documentation/html/server_8py.html b/documentation/html/server_8py.html new file mode 100644 index 000000000..2828d744b --- /dev/null +++ b/documentation/html/server_8py.html @@ -0,0 +1,162 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/server.py File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/server.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Classes

    class  server.RateLimiter
     
    class  server.Server
     
    class  server.Handler
     
    class  server.Model
     
    + + + +

    +Namespaces

    namespace  server
     
    + + + + + + + + + + + +

    +Functions

    def server.log (*args)
     
    def server.chunked (x)
     
    def server.packet (*args)
     
    def server.cleanup ()
     
    def server.main ()
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Variables

    string server.DEFAULT_HOST = '0.0.0.0'
     
    int server.DEFAULT_PORT = 4080
     
    string server.DB_PATH = 'craft.db'
     
    string server.LOG_PATH = 'log.txt'
     
    int server.CHUNK_SIZE = 32
     
    int server.BUFFER_SIZE = 4096
     
    int server.COMMIT_INTERVAL = 5
     
    tuple server.SPAWN_POINT = (0, 0, 0, 0, 0)
     
    bool server.RATE_LIMIT = False
     
    bool server.RECORD_HISTORY = False
     
     server.INDESTRUCTIBLE_ITEMS = set([16])
     
     server.ALLOWED_ITEMS
     
    string server.AUTHENTICATE = 'A'
     
    string server.BLOCK = 'B'
     
    string server.CHUNK = 'C'
     
    string server.DISCONNECT = 'D'
     
    string server.KEY = 'K'
     
    string server.NICK = 'N'
     
    string server.POSITION = 'P'
     
    string server.REDRAW = 'R'
     
    string server.SIGN = 'S'
     
    string server.TALK = 'T'
     
    string server.VERSION = 'V'
     
    string server.YOU = 'U'
     
    +
    + + + + diff --git a/documentation/html/server_8py_source.html b/documentation/html/server_8py_source.html new file mode 100644 index 000000000..df21cfc22 --- /dev/null +++ b/documentation/html/server_8py_source.html @@ -0,0 +1,749 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/server.py Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/server.py
    +
    +
    +Go to the documentation of this file.
    1 from math import floor
    +
    2 from world import World
    +
    3 import Queue
    +
    4 import SocketServer
    +
    5 import datetime
    +
    6 import random
    +
    7 import re
    +
    8 import requests
    +
    9 import sqlite3
    +
    10 import sys
    +
    11 import threading
    +
    12 import time
    +
    13 import traceback
    +
    14 
    +
    15 DEFAULT_HOST = '0.0.0.0'
    +
    16 DEFAULT_PORT = 4080
    +
    17 
    +
    18 DB_PATH = 'craft.db'
    +
    19 LOG_PATH = 'log.txt'
    +
    20 
    +
    21 CHUNK_SIZE = 32
    +
    22 BUFFER_SIZE = 4096
    +
    23 COMMIT_INTERVAL = 5
    +
    24 
    +
    25 SPAWN_POINT = (0, 0, 0, 0, 0)
    +
    26 RATE_LIMIT = False
    +
    27 RECORD_HISTORY = False
    +
    28 INDESTRUCTIBLE_ITEMS = set([16])
    +
    29 ALLOWED_ITEMS = set([
    +
    30  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
    +
    31  17, 18, 19, 20, 21, 22, 23,
    +
    32  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
    +
    33  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63])
    +
    34 
    +
    35 AUTHENTICATE = 'A'
    +
    36 BLOCK = 'B'
    +
    37 CHUNK = 'C'
    +
    38 DISCONNECT = 'D'
    +
    39 KEY = 'K'
    +
    40 NICK = 'N'
    +
    41 POSITION = 'P'
    +
    42 REDRAW = 'R'
    +
    43 SIGN = 'S'
    +
    44 TALK = 'T'
    +
    45 VERSION = 'V'
    +
    46 YOU = 'U'
    +
    47 
    +
    48 try:
    +
    49  from config import *
    +
    50 except ImportError:
    +
    51  pass
    +
    52 
    +
    53 def log(*args):
    +
    54  now = datetime.datetime.utcnow()
    +
    55  line = ' '.join(map(str, (now,) + args))
    +
    56  print line
    +
    57  with open(LOG_PATH, 'a') as fp:
    +
    58  fp.write('%s\n' % line)
    +
    59 
    +
    60 def chunked(x):
    +
    61  return int(floor(round(x) / CHUNK_SIZE))
    +
    62 
    +
    63 def packet(*args):
    +
    64  return '%s\n' % ','.join(map(str, args))
    +
    65 
    +
    66 class RateLimiter(object):
    +
    67  def __init__(self, rate, per):
    +
    68  self.raterate = float(rate)
    +
    69  self.perper = float(per)
    +
    70  self.allowanceallowance = self.raterate
    +
    71  self.last_checklast_check = time.time()
    +
    72  def tick(self):
    +
    73  if not RATE_LIMIT:
    +
    74  return False
    +
    75  now = time.time()
    +
    76  elapsed = now - self.last_checklast_check
    +
    77  self.last_checklast_check = now
    +
    78  self.allowanceallowance += elapsed * (self.raterate / self.perper)
    +
    79  if self.allowanceallowance > self.raterate:
    +
    80  self.allowanceallowance = self.raterate
    +
    81  if self.allowanceallowance < 1:
    +
    82  return True # too fast
    +
    83  else:
    +
    84  self.allowanceallowance -= 1
    +
    85  return False # okay
    +
    86 
    +
    87 class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    +
    88  allow_reuse_address = True
    +
    89  daemon_threads = True
    +
    90 
    +
    91 class Handler(SocketServer.BaseRequestHandler):
    +
    92  def setup(self):
    +
    93  self.position_limiterposition_limiter = RateLimiter(100, 5)
    +
    94  self.limiterlimiter = RateLimiter(1000, 10)
    +
    95  self.versionversion = None
    +
    96  self.client_idclient_id = None
    +
    97  self.user_iduser_id = None
    +
    98  self.nicknick = None
    +
    99  self.queuequeue = Queue.Queue()
    +
    100  self.runningrunning = True
    +
    101  self.startstart()
    +
    102  def handle(self):
    +
    103  model = self.server.model
    +
    104  model.enqueue(model.on_connect, self)
    +
    105  try:
    +
    106  buf = []
    +
    107  while True:
    +
    108  data = self.request.recv(BUFFER_SIZE)
    +
    109  if not data:
    +
    110  break
    +
    111  buf.extend(data.replace('\r\n', '\n'))
    +
    112  while '\n' in buf:
    +
    113  index = buf.index('\n')
    +
    114  line = ''.join(buf[:index])
    +
    115  buf = buf[index + 1:]
    +
    116  if not line:
    +
    117  continue
    +
    118  if line[0] == POSITION:
    +
    119  if self.position_limiterposition_limiter.tick():
    +
    120  log('RATE', self.client_idclient_id)
    +
    121  self.stopstop()
    +
    122  return
    +
    123  else:
    +
    124  if self.limiterlimiter.tick():
    +
    125  log('RATE', self.client_idclient_id)
    +
    126  self.stopstop()
    +
    127  return
    +
    128  model.enqueue(model.on_data, self, line)
    +
    129  finally:
    +
    130  model.enqueue(model.on_disconnect, self)
    +
    131  def finish(self):
    +
    132  self.runningrunning = False
    +
    133  def stop(self):
    +
    134  self.request.close()
    +
    135  def start(self):
    +
    136  thread = threading.Thread(target=self.runrun)
    +
    137  thread.setDaemon(True)
    +
    138  thread.start()
    +
    139  def run(self):
    +
    140  while self.runningrunning:
    +
    141  try:
    +
    142  buf = []
    +
    143  try:
    +
    144  buf.append(self.queuequeue.get(timeout=5))
    +
    145  try:
    +
    146  while True:
    +
    147  buf.append(self.queuequeue.get(False))
    +
    148  except Queue.Empty:
    +
    149  pass
    +
    150  except Queue.Empty:
    +
    151  continue
    +
    152  data = ''.join(buf)
    +
    153  self.request.sendall(data)
    +
    154  except Exception:
    +
    155  self.request.close()
    +
    156  raise
    +
    157  def send_raw(self, data):
    +
    158  if data:
    +
    159  self.queuequeue.put(data)
    +
    160  def send(self, *args):
    +
    161  self.send_rawsend_raw(packet(*args))
    +
    162 
    +
    163 class Model(object):
    +
    164  def __init__(self, seed):
    +
    165  self.worldworld = World(seed)
    +
    166  self.clientsclients = []
    +
    167  self.queuequeue = Queue.Queue()
    +
    168  self.commandscommands = {
    +
    169  AUTHENTICATE: self.on_authenticateon_authenticate,
    +
    170  CHUNK: self.on_chunkon_chunk,
    +
    171  BLOCK: self.on_blockon_block,
    +
    172  POSITION: self.on_positionon_position,
    +
    173  TALK: self.on_talkon_talk,
    +
    174  SIGN: self.on_signon_sign,
    +
    175  VERSION: self.on_versionon_version,
    +
    176  }
    +
    177  self.patternspatterns = [
    +
    178  (re.compile(r'^/spawn$'), self.on_spawnon_spawn),
    +
    179  (re.compile(r'^/goto(?:\s+(\S+))?$'), self.on_gotoon_goto),
    +
    180  (re.compile(r'^/pq\s+(-?[0-9]+)\s*,?\s*(-?[0-9]+)$'), self.on_pqon_pq),
    +
    181  (re.compile(r'^/help(?:\s+(\S+))?$'), self.on_helpon_help),
    +
    182  (re.compile(r'^/list$'), self.on_liston_list),
    +
    183  ]
    +
    184  def start(self):
    +
    185  thread = threading.Thread(target=self.runrun)
    +
    186  thread.setDaemon(True)
    +
    187  thread.start()
    +
    188  def run(self):
    +
    189  self.connectionconnection = sqlite3.connect(DB_PATH)
    +
    190  self.create_tablescreate_tables()
    +
    191  self.commitcommit()
    +
    192  while True:
    +
    193  try:
    +
    194  if time.time() - self.last_commitlast_commit > COMMIT_INTERVAL:
    +
    195  self.commitcommit()
    +
    196  self.dequeuedequeue()
    +
    197  except Exception:
    +
    198  traceback.print_exc()
    +
    199  def enqueue(self, func, *args, **kwargs):
    +
    200  self.queuequeue.put((func, args, kwargs))
    +
    201  def dequeue(self):
    +
    202  try:
    +
    203  func, args, kwargs = self.queuequeue.get(timeout=5)
    +
    204  func(*args, **kwargs)
    +
    205  except Queue.Empty:
    +
    206  pass
    +
    207  def execute(self, *args, **kwargs):
    +
    208  return self.connectionconnection.execute(*args, **kwargs)
    +
    209  def commit(self):
    +
    210  self.last_commitlast_commit = time.time()
    +
    211  self.connectionconnection.commit()
    +
    212  def create_tables(self):
    +
    213  queries = [
    +
    214  'create table if not exists block ('
    +
    215  ' p int not null,'
    +
    216  ' q int not null,'
    +
    217  ' x int not null,'
    +
    218  ' y int not null,'
    +
    219  ' z int not null,'
    +
    220  ' w int not null'
    +
    221  ');',
    +
    222  'create unique index if not exists block_pqxyz_idx on '
    +
    223  ' block (p, q, x, y, z);',
    +
    224  'create table if not exists sign ('
    +
    225  ' p int not null,'
    +
    226  ' q int not null,'
    +
    227  ' x int not null,'
    +
    228  ' y int not null,'
    +
    229  ' z int not null,'
    +
    230  ' face int not null,'
    +
    231  ' text text not null'
    +
    232  ');',
    +
    233  'create index if not exists sign_pq_idx on sign (p, q);',
    +
    234  'create unique index if not exists sign_xyzface_idx on '
    +
    235  ' sign (x, y, z, face);',
    +
    236  'create table if not exists block_history ('
    +
    237  ' timestamp real not null,'
    +
    238  ' user_id int not null,'
    +
    239  ' x int not null,'
    +
    240  ' y int not null,'
    +
    241  ' z int not null,'
    +
    242  ' w int not null'
    +
    243  ');',
    +
    244  ]
    +
    245  for query in queries:
    +
    246  self.executeexecute(query)
    +
    247  def get_default_block(self, x, y, z):
    +
    248  p, q = chunked(x), chunked(z)
    +
    249  chunk = self.worldworld.get_chunk(p, q)
    +
    250  return chunk.get((x, y, z), 0)
    +
    251  def get_block(self, x, y, z):
    +
    252  query = (
    +
    253  'select w from block where '
    +
    254  'p = :p and q = :q and x = :x and y = :y and z = :z;'
    +
    255  )
    +
    256  p, q = chunked(x), chunked(z)
    +
    257  rows = list(self.executeexecute(query, dict(p=p, q=q, x=x, y=y, z=z)))
    +
    258  if rows:
    +
    259  return rows[0][0]
    +
    260  return self.get_default_blockget_default_block(x, y, z)
    +
    261  def next_client_id(self):
    +
    262  result = 1
    +
    263  client_ids = set(x.client_id for x in self.clientsclients)
    +
    264  while result in client_ids:
    +
    265  result += 1
    +
    266  return result
    +
    267  def on_connect(self, client):
    +
    268  client.client_id = self.next_client_idnext_client_id()
    +
    269  client.nick = 'guest%d' % client.client_id
    +
    270  log('CONN', client.client_id, *client.client_address)
    +
    271  client.position = SPAWN_POINT
    +
    272  self.clientsclients.append(client)
    +
    273  client.send(YOU, client.client_id, *client.position)
    +
    274  client.send(TALK, 'Welcome to Craft!')
    +
    275  client.send(TALK, 'Type "/help" for a list of commands.')
    +
    276  self.send_positionsend_position(client)
    +
    277  self.send_positionssend_positions(client)
    +
    278  self.send_nicksend_nick(client)
    +
    279  self.send_nickssend_nicks(client)
    +
    280  def on_data(self, client, data):
    +
    281  #log('RECV', client.client_id, data)
    +
    282  args = data.split(',')
    +
    283  command, args = args[0], args[1:]
    +
    284  if command in self.commandscommands:
    +
    285  func = self.commandscommands[command]
    +
    286  func(client, *args)
    +
    287  def on_disconnect(self, client):
    +
    288  log('DISC', client.client_id, *client.client_address)
    +
    289  self.clientsclients.remove(client)
    +
    290  self.send_disconnectsend_disconnect(client)
    +
    291  self.send_talksend_talk('%s has disconnected from the server.' % client.nick)
    +
    292  def on_version(self, client, version):
    +
    293  if client.version is not None:
    +
    294  return
    +
    295  version = int(version)
    +
    296  if version != 1:
    +
    297  client.stop()
    +
    298  return
    +
    299  client.version = version
    +
    300  # TODO: client.start() here
    +
    301  def on_authenticate(self, client, username, access_token):
    +
    302  user_id = None
    +
    303  if username and access_token:
    +
    304  url = 'https://craft.michaelfogleman.com/api/1/access'
    +
    305  payload = {
    +
    306  'username': username,
    +
    307  'access_token': access_token,
    +
    308  }
    +
    309  response = requests.post(url, data=payload)
    +
    310  if response.status_code == 200 and response.text.isdigit():
    +
    311  user_id = int(response.text)
    +
    312  client.user_id = user_id
    +
    313  if user_id is None:
    +
    314  client.nick = 'guest%d' % client.client_id
    +
    315  client.send(TALK, 'Visit craft.michaelfogleman.com to register!')
    +
    316  else:
    +
    317  client.nick = username
    +
    318  self.send_nicksend_nick(client)
    +
    319  # TODO: has left message if was already authenticated
    +
    320  self.send_talksend_talk('%s has joined the game.' % client.nick)
    +
    321  def on_chunk(self, client, p, q, key=0):
    +
    322  packets = []
    +
    323  p, q, key = map(int, (p, q, key))
    +
    324  query = (
    +
    325  'select rowid, x, y, z, w from block where '
    +
    326  'p = :p and q = :q and rowid > :key;'
    +
    327  )
    +
    328  rows = self.executeexecute(query, dict(p=p, q=q, key=key))
    +
    329  max_rowid = 0
    +
    330  blocks = 0
    +
    331  for rowid, x, y, z, w in rows:
    +
    332  blocks += 1
    +
    333  packets.append(packet(BLOCK, p, q, x, y, z, w))
    +
    334  max_rowid = max(max_rowid, rowid)
    +
    335  query = (
    +
    336  'select x, y, z, face, text from sign where '
    +
    337  'p = :p and q = :q;'
    +
    338  )
    +
    339  rows = self.executeexecute(query, dict(p=p, q=q))
    +
    340  signs = 0
    +
    341  for x, y, z, face, text in rows:
    +
    342  signs += 1
    +
    343  packets.append(packet(SIGN, p, q, x, y, z, face, text))
    +
    344  if blocks:
    +
    345  packets.append(packet(KEY, p, q, max_rowid))
    +
    346  if blocks or signs:
    +
    347  packets.append(packet(REDRAW, p, q))
    +
    348  packets.append(packet(CHUNK, p, q))
    +
    349  client.send_raw(''.join(packets))
    +
    350  def on_block(self, client, x, y, z, w):
    +
    351  x, y, z, w = map(int, (x, y, z, w))
    +
    352  p, q = chunked(x), chunked(z)
    +
    353  previous = self.get_blockget_block(x, y, z)
    +
    354  message = None
    +
    355  if client.user_id is None:
    +
    356  message = 'Only logged in users are allowed to build.'
    +
    357  elif y <= 0 or y > 255:
    +
    358  message = 'Invalid block coordinates.'
    +
    359  elif w not in ALLOWED_ITEMS:
    +
    360  message = 'That item is not allowed.'
    +
    361  elif w and previous:
    +
    362  message = 'Cannot create blocks in a non-empty space.'
    +
    363  elif not w and not previous:
    +
    364  message = 'That space is already empty.'
    +
    365  elif previous in INDESTRUCTIBLE_ITEMS:
    +
    366  message = 'Cannot destroy that type of block.'
    +
    367  if message is not None:
    +
    368  client.send(BLOCK, p, q, x, y, z, previous)
    +
    369  client.send(REDRAW, p, q)
    +
    370  client.send(TALK, message)
    +
    371  return
    +
    372  query = (
    +
    373  'insert into block_history (timestamp, user_id, x, y, z, w) '
    +
    374  'values (:timestamp, :user_id, :x, :y, :z, :w);'
    +
    375  )
    +
    376  if RECORD_HISTORY:
    +
    377  self.executeexecute(query, dict(timestamp=time.time(),
    +
    378  user_id=client.user_id, x=x, y=y, z=z, w=w))
    +
    379  query = (
    +
    380  'insert or replace into block (p, q, x, y, z, w) '
    +
    381  'values (:p, :q, :x, :y, :z, :w);'
    +
    382  )
    +
    383  self.executeexecute(query, dict(p=p, q=q, x=x, y=y, z=z, w=w))
    +
    384  self.send_blocksend_block(client, p, q, x, y, z, w)
    +
    385  for dx in range(-1, 2):
    +
    386  for dz in range(-1, 2):
    +
    387  if dx == 0 and dz == 0:
    +
    388  continue
    +
    389  if dx and chunked(x + dx) == p:
    +
    390  continue
    +
    391  if dz and chunked(z + dz) == q:
    +
    392  continue
    +
    393  np, nq = p + dx, q + dz
    +
    394  self.executeexecute(query, dict(p=np, q=nq, x=x, y=y, z=z, w=-w))
    +
    395  self.send_blocksend_block(client, np, nq, x, y, z, -w)
    +
    396  if w == 0:
    +
    397  query = (
    +
    398  'delete from sign where '
    +
    399  'x = :x and y = :y and z = :z;'
    +
    400  )
    +
    401  self.executeexecute(query, dict(x=x, y=y, z=z))
    +
    402  def on_sign(self, client, x, y, z, face, *args):
    +
    403  if client.user_id is None:
    +
    404  client.send(TALK, 'Only logged in users are allowed to build.')
    +
    405  return
    +
    406  text = ','.join(args)
    +
    407  x, y, z, face = map(int, (x, y, z, face))
    +
    408  if y <= 0 or y > 255:
    +
    409  return
    +
    410  if face < 0 or face > 7:
    +
    411  return
    +
    412  if len(text) > 48:
    +
    413  return
    +
    414  p, q = chunked(x), chunked(z)
    +
    415  if text:
    +
    416  query = (
    +
    417  'insert or replace into sign (p, q, x, y, z, face, text) '
    +
    418  'values (:p, :q, :x, :y, :z, :face, :text);'
    +
    419  )
    +
    420  self.executeexecute(query,
    +
    421  dict(p=p, q=q, x=x, y=y, z=z, face=face, text=text))
    +
    422  else:
    +
    423  query = (
    +
    424  'delete from sign where '
    +
    425  'x = :x and y = :y and z = :z and face = :face;'
    +
    426  )
    +
    427  self.executeexecute(query, dict(x=x, y=y, z=z, face=face))
    +
    428  self.send_signsend_sign(client, p, q, x, y, z, face, text)
    +
    429  def on_position(self, client, x, y, z, rx, ry):
    +
    430  x, y, z, rx, ry = map(float, (x, y, z, rx, ry))
    +
    431  client.position = (x, y, z, rx, ry)
    +
    432  self.send_positionsend_position(client)
    +
    433  def on_talk(self, client, *args):
    +
    434  text = ','.join(args)
    +
    435  if text.startswith('/'):
    +
    436  for pattern, func in self.patternspatterns:
    +
    437  match = pattern.match(text)
    +
    438  if match:
    +
    439  func(client, *match.groups())
    +
    440  break
    +
    441  else:
    +
    442  client.send(TALK, 'Unrecognized command: "%s"' % text)
    +
    443  elif text.startswith('@'):
    +
    444  nick = text[1:].split(' ', 1)[0]
    +
    445  for other in self.clientsclients:
    +
    446  if other.nick == nick:
    +
    447  client.send(TALK, '%s> %s' % (client.nick, text))
    +
    448  other.send(TALK, '%s> %s' % (client.nick, text))
    +
    449  break
    +
    450  else:
    +
    451  client.send(TALK, 'Unrecognized nick: "%s"' % nick)
    +
    452  else:
    +
    453  self.send_talksend_talk('%s> %s' % (client.nick, text))
    +
    454  def on_spawn(self, client):
    +
    455  client.position = SPAWN_POINT
    +
    456  client.send(YOU, client.client_id, *client.position)
    +
    457  self.send_positionsend_position(client)
    +
    458  def on_goto(self, client, nick=None):
    +
    459  if nick is None:
    +
    460  clients = [x for x in self.clientsclients if x != client]
    +
    461  other = random.choice(clients) if clients else None
    +
    462  else:
    +
    463  nicks = dict((client.nick, client) for client in self.clientsclients)
    +
    464  other = nicks.get(nick)
    +
    465  if other:
    +
    466  client.position = other.position
    +
    467  client.send(YOU, client.client_id, *client.position)
    +
    468  self.send_positionsend_position(client)
    +
    469  def on_pq(self, client, p, q):
    +
    470  p, q = map(int, (p, q))
    +
    471  if abs(p) > 1000 or abs(q) > 1000:
    +
    472  return
    +
    473  client.position = (p * CHUNK_SIZE, 0, q * CHUNK_SIZE, 0, 0)
    +
    474  client.send(YOU, client.client_id, *client.position)
    +
    475  self.send_positionsend_position(client)
    +
    476  def on_help(self, client, topic=None):
    +
    477  if topic is None:
    +
    478  client.send(TALK, 'Type "t" to chat. Type "/" to type commands:')
    +
    479  client.send(TALK, '/goto [NAME], /help [TOPIC], /list, /login NAME, /logout')
    +
    480  client.send(TALK, '/offline [FILE], /online HOST [PORT], /pq P Q, /spawn, /view N')
    +
    481  return
    +
    482  topic = topic.lower().strip()
    +
    483  if topic == 'goto':
    +
    484  client.send(TALK, 'Help: /goto [NAME]')
    +
    485  client.send(TALK, 'Teleport to another user.')
    +
    486  client.send(TALK, 'If NAME is unspecified, a random user is chosen.')
    +
    487  elif topic == 'list':
    +
    488  client.send(TALK, 'Help: /list')
    +
    489  client.send(TALK, 'Display a list of connected users.')
    +
    490  elif topic == 'login':
    +
    491  client.send(TALK, 'Help: /login NAME')
    +
    492  client.send(TALK, 'Switch to another registered username.')
    +
    493  client.send(TALK, 'The login server will be re-contacted. The username is case-sensitive.')
    +
    494  elif topic == 'logout':
    +
    495  client.send(TALK, 'Help: /logout')
    +
    496  client.send(TALK, 'Unauthenticate and become a guest user.')
    +
    497  client.send(TALK, 'Automatic logins will not occur again until the /login command is re-issued.')
    +
    498  elif topic == 'offline':
    +
    499  client.send(TALK, 'Help: /offline [FILE]')
    +
    500  client.send(TALK, 'Switch to offline mode.')
    +
    501  client.send(TALK, 'FILE specifies the save file to use and defaults to "craft".')
    +
    502  elif topic == 'online':
    +
    503  client.send(TALK, 'Help: /online HOST [PORT]')
    +
    504  client.send(TALK, 'Connect to the specified server.')
    +
    505  elif topic == 'pq':
    +
    506  client.send(TALK, 'Help: /pq P Q')
    +
    507  client.send(TALK, 'Teleport to the specified chunk.')
    +
    508  elif topic == 'spawn':
    +
    509  client.send(TALK, 'Help: /spawn')
    +
    510  client.send(TALK, 'Teleport back to the spawn point.')
    +
    511  elif topic == 'view':
    +
    512  client.send(TALK, 'Help: /view N')
    +
    513  client.send(TALK, 'Set viewing distance, 1 - 24.')
    +
    514  def on_list(self, client):
    +
    515  client.send(TALK,
    +
    516  'Players: %s' % ', '.join(x.nick for x in self.clientsclients))
    +
    517  def send_positions(self, client):
    +
    518  for other in self.clientsclients:
    +
    519  if other == client:
    +
    520  continue
    +
    521  client.send(POSITION, other.client_id, *other.position)
    +
    522  def send_position(self, client):
    +
    523  for other in self.clientsclients:
    +
    524  if other == client:
    +
    525  continue
    +
    526  other.send(POSITION, client.client_id, *client.position)
    +
    527  def send_nicks(self, client):
    +
    528  for other in self.clientsclients:
    +
    529  if other == client:
    +
    530  continue
    +
    531  client.send(NICK, other.client_id, other.nick)
    +
    532  def send_nick(self, client):
    +
    533  for other in self.clientsclients:
    +
    534  other.send(NICK, client.client_id, client.nick)
    +
    535  def send_disconnect(self, client):
    +
    536  for other in self.clientsclients:
    +
    537  if other == client:
    +
    538  continue
    +
    539  other.send(DISCONNECT, client.client_id)
    +
    540  def send_block(self, client, p, q, x, y, z, w):
    +
    541  for other in self.clientsclients:
    +
    542  if other == client:
    +
    543  continue
    +
    544  other.send(BLOCK, p, q, x, y, z, w)
    +
    545  other.send(REDRAW, p, q)
    +
    546  def send_sign(self, client, p, q, x, y, z, face, text):
    +
    547  for other in self.clientsclients:
    +
    548  if other == client:
    +
    549  continue
    +
    550  other.send(SIGN, p, q, x, y, z, face, text)
    +
    551  def send_talk(self, text):
    +
    552  log(text)
    +
    553  for client in self.clientsclients:
    +
    554  client.send(TALK, text)
    +
    555 
    +
    556 def cleanup():
    +
    557  world = World(None)
    +
    558  conn = sqlite3.connect(DB_PATH)
    +
    559  query = 'select x, y, z from block order by rowid desc limit 1;'
    +
    560  last = list(conn.execute(query))[0]
    +
    561  query = 'select distinct p, q from block;'
    +
    562  chunks = list(conn.execute(query))
    +
    563  count = 0
    +
    564  total = 0
    +
    565  delete_query = 'delete from block where x = %d and y = %d and z = %d;'
    +
    566  print 'begin;'
    +
    567  for p, q in chunks:
    +
    568  chunk = world.create_chunk(p, q)
    +
    569  query = 'select x, y, z, w from block where p = :p and q = :q;'
    +
    570  rows = conn.execute(query, {'p': p, 'q': q})
    +
    571  for x, y, z, w in rows:
    +
    572  if chunked(x) != p or chunked(z) != q:
    +
    573  continue
    +
    574  total += 1
    +
    575  if (x, y, z) == last:
    +
    576  continue
    +
    577  original = chunk.get((x, y, z), 0)
    +
    578  if w == original or original in INDESTRUCTIBLE_ITEMS:
    +
    579  count += 1
    +
    580  print delete_query % (x, y, z)
    +
    581  conn.close()
    +
    582  print 'commit;'
    +
    583  print >> sys.stderr, '%d of %d blocks will be cleaned up' % (count, total)
    +
    584 
    +
    585 def main():
    +
    586  if len(sys.argv) == 2 and sys.argv[1] == 'cleanup':
    +
    587  cleanup()
    +
    588  return
    +
    589  host, port = DEFAULT_HOST, DEFAULT_PORT
    +
    590  if len(sys.argv) > 1:
    +
    591  host = sys.argv[1]
    +
    592  if len(sys.argv) > 2:
    +
    593  port = int(sys.argv[2])
    +
    594  log('SERV', host, port)
    +
    595  model = Model(None)
    +
    596  model.start()
    +
    597  server = Server((host, port), Handler)
    +
    598  server.model = model
    +
    599  server.serve_forever()
    +
    600 
    +
    601 if __name__ == '__main__':
    +
    602  main()
    + +
    def run(self)
    Definition: server.py:139
    + + +
    def handle(self)
    Definition: server.py:102
    + + + + +
    def start(self)
    Definition: server.py:135
    +
    def finish(self)
    Definition: server.py:131
    +
    def stop(self)
    Definition: server.py:133
    +
    def setup(self)
    Definition: server.py:92
    + +
    def send(self, *args)
    Definition: server.py:160
    +
    def send_raw(self, data)
    Definition: server.py:157
    + + +
    def create_tables(self)
    Definition: server.py:212
    +
    def send_disconnect(self, client)
    Definition: server.py:535
    +
    def on_chunk(self, client, p, q, key=0)
    Definition: server.py:321
    +
    def on_data(self, client, data)
    Definition: server.py:280
    +
    def start(self)
    Definition: server.py:184
    +
    def send_block(self, client, p, q, x, y, z, w)
    Definition: server.py:540
    +
    def on_authenticate(self, client, username, access_token)
    Definition: server.py:301
    +
    def on_pq(self, client, p, q)
    Definition: server.py:469
    +
    def execute(self, *args, **kwargs)
    Definition: server.py:207
    +
    def get_block(self, x, y, z)
    Definition: server.py:251
    +
    def enqueue(self, func, *args, **kwargs)
    Definition: server.py:199
    +
    def next_client_id(self)
    Definition: server.py:261
    + +
    def on_talk(self, client, *args)
    Definition: server.py:433
    +
    def on_connect(self, client)
    Definition: server.py:267
    +
    def on_sign(self, client, x, y, z, face, *args)
    Definition: server.py:402
    + + +
    def run(self)
    Definition: server.py:188
    +
    def on_spawn(self, client)
    Definition: server.py:454
    +
    def on_version(self, client, version)
    Definition: server.py:292
    +
    def on_block(self, client, x, y, z, w)
    Definition: server.py:350
    +
    def __init__(self, seed)
    Definition: server.py:164
    +
    def send_nick(self, client)
    Definition: server.py:532
    + +
    def send_positions(self, client)
    Definition: server.py:517
    +
    def send_nicks(self, client)
    Definition: server.py:527
    +
    def commit(self)
    Definition: server.py:209
    +
    def on_disconnect(self, client)
    Definition: server.py:287
    +
    def get_default_block(self, x, y, z)
    Definition: server.py:247
    +
    def send_talk(self, text)
    Definition: server.py:551
    +
    def on_goto(self, client, nick=None)
    Definition: server.py:458
    +
    def dequeue(self)
    Definition: server.py:201
    +
    def on_position(self, client, x, y, z, rx, ry)
    Definition: server.py:429
    +
    def send_sign(self, client, p, q, x, y, z, face, text)
    Definition: server.py:546
    +
    def on_list(self, client)
    Definition: server.py:514
    + +
    def send_position(self, client)
    Definition: server.py:522
    + +
    def on_help(self, client, topic=None)
    Definition: server.py:476
    + + + +
    def __init__(self, rate, per)
    Definition: server.py:67
    + + + +
    def tick(self)
    Definition: server.py:72
    + + +
    def chunked(x)
    Definition: server.py:60
    +
    def cleanup()
    Definition: server.py:556
    +
    def main()
    Definition: server.py:585
    +
    def log(*args)
    Definition: server.py:53
    +
    def packet(*args)
    Definition: server.py:63
    +
    + + + + diff --git a/documentation/html/sign_8c.html b/documentation/html/sign_8c.html new file mode 100644 index 000000000..d040abaff --- /dev/null +++ b/documentation/html/sign_8c.html @@ -0,0 +1,423 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    sign.c File Reference
    +
    +
    +
    #include <stdlib.h>
    +#include <string.h>
    +#include "sign.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Functions

    void sign_list_alloc (SignList *list, int capacity)
     
    void sign_list_free (SignList *list)
     
    void sign_list_grow (SignList *list)
     
    void _sign_list_add (SignList *list, Sign *sign)
     
    void sign_list_add (SignList *list, int x, int y, int z, int face, const char *text)
     
    int sign_list_remove (SignList *list, int x, int y, int z, int face)
     
    int sign_list_remove_all (SignList *list, int x, int y, int z)
     
    +

    Function Documentation

    + +

    ◆ _sign_list_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void _sign_list_add (SignListlist,
    Signsign 
    )
    +
    + +

    Definition at line 24 of file sign.c.

    +
    24  {
    +
    25  if (list->size == list->capacity) {
    +
    26  sign_list_grow(list);
    +
    27  }
    +
    28  Sign *e = list->data + list->size++;
    +
    29  memcpy(e, sign, sizeof(Sign));
    +
    30 }
    +
    void sign_list_grow(SignList *list)
    Definition: sign.c:15
    +
    unsigned int size
    Definition: sign.h:16
    +
    unsigned int capacity
    Definition: sign.h:15
    +
    Sign * data
    Definition: sign.h:17
    +
    Definition: sign.h:6
    +
    +
    +
    + +

    ◆ sign_list_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void sign_list_add (SignListlist,
    int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 32 of file sign.c.

    +
    34 {
    +
    35  sign_list_remove(list, x, y, z, face);
    +
    36  Sign sign;
    +
    37  sign.x = x;
    +
    38  sign.y = y;
    +
    39  sign.z = z;
    +
    40  sign.face = face;
    +
    41  strncpy(sign.text, text, MAX_SIGN_LENGTH);
    +
    42  sign.text[MAX_SIGN_LENGTH - 1] = '\0';
    +
    43  _sign_list_add(list, &sign);
    +
    44 }
    +
    void _sign_list_add(SignList *list, Sign *sign)
    Definition: sign.c:24
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    char text[MAX_SIGN_LENGTH]
    Definition: sign.h:11
    +
    int y
    Definition: sign.h:8
    +
    +
    +
    + +

    ◆ sign_list_alloc()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void sign_list_alloc (SignListlist,
    int capacity 
    )
    +
    + +

    Definition at line 5 of file sign.c.

    +
    5  {
    +
    6  list->capacity = capacity;
    +
    7  list->size = 0;
    +
    8  list->data = (Sign *)calloc(capacity, sizeof(Sign));
    +
    9 }
    +
    +
    +
    + +

    ◆ sign_list_free()

    + +
    +
    + + + + + + + + +
    void sign_list_free (SignListlist)
    +
    + +

    Definition at line 11 of file sign.c.

    +
    11  {
    +
    12  free(list->data);
    +
    13 }
    +
    +
    +
    + +

    ◆ sign_list_grow()

    + +
    +
    + + + + + + + + +
    void sign_list_grow (SignListlist)
    +
    + +

    Definition at line 15 of file sign.c.

    +
    15  {
    +
    16  SignList new_list;
    +
    17  sign_list_alloc(&new_list, list->capacity * 2);
    +
    18  memcpy(new_list.data, list->data, list->size * sizeof(Sign));
    +
    19  free(list->data);
    +
    20  list->capacity = new_list.capacity;
    +
    21  list->data = new_list.data;
    +
    22 }
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    Definition: sign.h:14
    +
    +
    +
    + +

    ◆ sign_list_remove()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int sign_list_remove (SignListlist,
    int x,
    int y,
    int z,
    int face 
    )
    +
    + +

    Definition at line 46 of file sign.c.

    +
    46  {
    +
    47  int result = 0;
    +
    48  for (int i = 0; i < list->size; i++) {
    +
    49  Sign *e = list->data + i;
    +
    50  if (e->x == x && e->y == y && e->z == z && e->face == face) {
    +
    51  Sign *other = list->data + (--list->size);
    +
    52  memcpy(e, other, sizeof(Sign));
    +
    53  i--;
    +
    54  result++;
    +
    55  }
    +
    56  }
    +
    57  return result;
    +
    58 }
    +
    +
    +
    + +

    ◆ sign_list_remove_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int sign_list_remove_all (SignListlist,
    int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 60 of file sign.c.

    +
    60  {
    +
    61  int result = 0;
    +
    62  for (int i = 0; i < list->size; i++) {
    +
    63  Sign *e = list->data + i;
    +
    64  if (e->x == x && e->y == y && e->z == z) {
    +
    65  Sign *other = list->data + (--list->size);
    +
    66  memcpy(e, other, sizeof(Sign));
    +
    67  i--;
    +
    68  result++;
    +
    69  }
    +
    70  }
    +
    71  return result;
    +
    72 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/sign_8c_source.html b/documentation/html/sign_8c_source.html new file mode 100644 index 000000000..3d5f6a4e5 --- /dev/null +++ b/documentation/html/sign_8c_source.html @@ -0,0 +1,169 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sign.c
    +
    +
    +Go to the documentation of this file.
    1 #include <stdlib.h>
    +
    2 #include <string.h>
    +
    3 #include "sign.h"
    +
    4 
    +
    5 void sign_list_alloc(SignList *list, int capacity) {
    +
    6  list->capacity = capacity;
    +
    7  list->size = 0;
    +
    8  list->data = (Sign *)calloc(capacity, sizeof(Sign));
    +
    9 }
    +
    10 
    +
    11 void sign_list_free(SignList *list) {
    +
    12  free(list->data);
    +
    13 }
    +
    14 
    +
    15 void sign_list_grow(SignList *list) {
    +
    16  SignList new_list;
    +
    17  sign_list_alloc(&new_list, list->capacity * 2);
    +
    18  memcpy(new_list.data, list->data, list->size * sizeof(Sign));
    +
    19  free(list->data);
    +
    20  list->capacity = new_list.capacity;
    +
    21  list->data = new_list.data;
    +
    22 }
    +
    23 
    +
    24 void _sign_list_add(SignList *list, Sign *sign) {
    +
    25  if (list->size == list->capacity) {
    +
    26  sign_list_grow(list);
    +
    27  }
    +
    28  Sign *e = list->data + list->size++;
    +
    29  memcpy(e, sign, sizeof(Sign));
    +
    30 }
    +
    31 
    + +
    33  SignList *list, int x, int y, int z, int face, const char *text)
    +
    34 {
    +
    35  sign_list_remove(list, x, y, z, face);
    +
    36  Sign sign;
    +
    37  sign.x = x;
    +
    38  sign.y = y;
    +
    39  sign.z = z;
    +
    40  sign.face = face;
    +
    41  strncpy(sign.text, text, MAX_SIGN_LENGTH);
    +
    42  sign.text[MAX_SIGN_LENGTH - 1] = '\0';
    +
    43  _sign_list_add(list, &sign);
    +
    44 }
    +
    45 
    +
    46 int sign_list_remove(SignList *list, int x, int y, int z, int face) {
    +
    47  int result = 0;
    +
    48  for (int i = 0; i < list->size; i++) {
    +
    49  Sign *e = list->data + i;
    +
    50  if (e->x == x && e->y == y && e->z == z && e->face == face) {
    +
    51  Sign *other = list->data + (--list->size);
    +
    52  memcpy(e, other, sizeof(Sign));
    +
    53  i--;
    +
    54  result++;
    +
    55  }
    +
    56  }
    +
    57  return result;
    +
    58 }
    +
    59 
    +
    60 int sign_list_remove_all(SignList *list, int x, int y, int z) {
    +
    61  int result = 0;
    +
    62  for (int i = 0; i < list->size; i++) {
    +
    63  Sign *e = list->data + i;
    +
    64  if (e->x == x && e->y == y && e->z == z) {
    +
    65  Sign *other = list->data + (--list->size);
    +
    66  memcpy(e, other, sizeof(Sign));
    +
    67  i--;
    +
    68  result++;
    +
    69  }
    +
    70  }
    +
    71  return result;
    +
    72 }
    +
    void _sign_list_add(SignList *list, Sign *sign)
    Definition: sign.c:24
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    void sign_list_grow(SignList *list)
    Definition: sign.c:15
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    void sign_list_free(SignList *list)
    Definition: sign.c:11
    +
    int sign_list_remove_all(SignList *list, int x, int y, int z)
    Definition: sign.c:60
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    + +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    Definition: sign.h:14
    +
    unsigned int size
    Definition: sign.h:16
    +
    unsigned int capacity
    Definition: sign.h:15
    +
    Sign * data
    Definition: sign.h:17
    +
    Definition: sign.h:6
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    char text[MAX_SIGN_LENGTH]
    Definition: sign.h:11
    +
    int y
    Definition: sign.h:8
    +
    + + + + diff --git a/documentation/html/sign_8h.html b/documentation/html/sign_8h.html new file mode 100644 index 000000000..4ad1cbf33 --- /dev/null +++ b/documentation/html/sign_8h.html @@ -0,0 +1,411 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    sign.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + +

    +Classes

    struct  Sign
     
    struct  SignList
     
    + + + +

    +Macros

    #define MAX_SIGN_LENGTH   64
     
    + + + + + + + + + + + + + +

    +Functions

    void sign_list_alloc (SignList *list, int capacity)
     
    void sign_list_free (SignList *list)
     
    void sign_list_grow (SignList *list)
     
    void sign_list_add (SignList *list, int x, int y, int z, int face, const char *text)
     
    int sign_list_remove (SignList *list, int x, int y, int z, int face)
     
    int sign_list_remove_all (SignList *list, int x, int y, int z)
     
    +

    Macro Definition Documentation

    + +

    ◆ MAX_SIGN_LENGTH

    + +
    +
    + + + + +
    #define MAX_SIGN_LENGTH   64
    +
    + +

    Definition at line 4 of file sign.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ sign_list_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void sign_list_add (SignListlist,
    int x,
    int y,
    int z,
    int face,
    const char * text 
    )
    +
    + +

    Definition at line 32 of file sign.c.

    +
    34 {
    +
    35  sign_list_remove(list, x, y, z, face);
    +
    36  Sign sign;
    +
    37  sign.x = x;
    +
    38  sign.y = y;
    +
    39  sign.z = z;
    +
    40  sign.face = face;
    +
    41  strncpy(sign.text, text, MAX_SIGN_LENGTH);
    +
    42  sign.text[MAX_SIGN_LENGTH - 1] = '\0';
    +
    43  _sign_list_add(list, &sign);
    +
    44 }
    +
    void _sign_list_add(SignList *list, Sign *sign)
    Definition: sign.c:24
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    Definition: sign.h:6
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    char text[MAX_SIGN_LENGTH]
    Definition: sign.h:11
    +
    int y
    Definition: sign.h:8
    +
    +
    +
    + +

    ◆ sign_list_alloc()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void sign_list_alloc (SignListlist,
    int capacity 
    )
    +
    + +

    Definition at line 5 of file sign.c.

    +
    5  {
    +
    6  list->capacity = capacity;
    +
    7  list->size = 0;
    +
    8  list->data = (Sign *)calloc(capacity, sizeof(Sign));
    +
    9 }
    +
    unsigned int size
    Definition: sign.h:16
    +
    unsigned int capacity
    Definition: sign.h:15
    +
    Sign * data
    Definition: sign.h:17
    +
    +
    +
    + +

    ◆ sign_list_free()

    + +
    +
    + + + + + + + + +
    void sign_list_free (SignListlist)
    +
    + +

    Definition at line 11 of file sign.c.

    +
    11  {
    +
    12  free(list->data);
    +
    13 }
    +
    +
    +
    + +

    ◆ sign_list_grow()

    + +
    +
    + + + + + + + + +
    void sign_list_grow (SignListlist)
    +
    + +

    Definition at line 15 of file sign.c.

    +
    15  {
    +
    16  SignList new_list;
    +
    17  sign_list_alloc(&new_list, list->capacity * 2);
    +
    18  memcpy(new_list.data, list->data, list->size * sizeof(Sign));
    +
    19  free(list->data);
    +
    20  list->capacity = new_list.capacity;
    +
    21  list->data = new_list.data;
    +
    22 }
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    Definition: sign.h:14
    +
    +
    +
    + +

    ◆ sign_list_remove()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int sign_list_remove (SignListlist,
    int x,
    int y,
    int z,
    int face 
    )
    +
    + +

    Definition at line 46 of file sign.c.

    +
    46  {
    +
    47  int result = 0;
    +
    48  for (int i = 0; i < list->size; i++) {
    +
    49  Sign *e = list->data + i;
    +
    50  if (e->x == x && e->y == y && e->z == z && e->face == face) {
    +
    51  Sign *other = list->data + (--list->size);
    +
    52  memcpy(e, other, sizeof(Sign));
    +
    53  i--;
    +
    54  result++;
    +
    55  }
    +
    56  }
    +
    57  return result;
    +
    58 }
    +
    +
    +
    + +

    ◆ sign_list_remove_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int sign_list_remove_all (SignListlist,
    int x,
    int y,
    int z 
    )
    +
    + +

    Definition at line 60 of file sign.c.

    +
    60  {
    +
    61  int result = 0;
    +
    62  for (int i = 0; i < list->size; i++) {
    +
    63  Sign *e = list->data + i;
    +
    64  if (e->x == x && e->y == y && e->z == z) {
    +
    65  Sign *other = list->data + (--list->size);
    +
    66  memcpy(e, other, sizeof(Sign));
    +
    67  i--;
    +
    68  result++;
    +
    69  }
    +
    70  }
    +
    71  return result;
    +
    72 }
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/sign_8h_source.html b/documentation/html/sign_8h_source.html new file mode 100644 index 000000000..04142cbc1 --- /dev/null +++ b/documentation/html/sign_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    sign.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _sign_h_
    +
    2 #define _sign_h_
    +
    3 
    +
    4 #define MAX_SIGN_LENGTH 64
    +
    5 
    +
    6 typedef struct {
    +
    7  int x;
    +
    8  int y;
    +
    9  int z;
    +
    10  int face;
    +
    11  char text[MAX_SIGN_LENGTH];
    +
    12 } Sign;
    +
    13 
    +
    14 typedef struct {
    +
    15  unsigned int capacity;
    +
    16  unsigned int size;
    + +
    18 } SignList;
    +
    19 
    +
    20 void sign_list_alloc(SignList *list, int capacity);
    +
    21 void sign_list_free(SignList *list);
    +
    22 void sign_list_grow(SignList *list);
    +
    23 void sign_list_add(
    +
    24  SignList *list, int x, int y, int z, int face, const char *text);
    +
    25 int sign_list_remove(SignList *list, int x, int y, int z, int face);
    +
    26 int sign_list_remove_all(SignList *list, int x, int y, int z);
    +
    27 
    +
    28 #endif
    +
    int sign_list_remove(SignList *list, int x, int y, int z, int face)
    Definition: sign.c:46
    +
    void sign_list_grow(SignList *list)
    Definition: sign.c:15
    +
    void sign_list_alloc(SignList *list, int capacity)
    Definition: sign.c:5
    +
    #define MAX_SIGN_LENGTH
    Definition: sign.h:4
    +
    void sign_list_free(SignList *list)
    Definition: sign.c:11
    +
    int sign_list_remove_all(SignList *list, int x, int y, int z)
    Definition: sign.c:60
    +
    void sign_list_add(SignList *list, int x, int y, int z, int face, const char *text)
    Definition: sign.c:32
    +
    Definition: sign.h:14
    +
    unsigned int size
    Definition: sign.h:16
    +
    unsigned int capacity
    Definition: sign.h:15
    +
    Sign * data
    Definition: sign.h:17
    +
    Definition: sign.h:6
    +
    int face
    Definition: sign.h:10
    +
    int z
    Definition: sign.h:9
    +
    int x
    Definition: sign.h:7
    +
    int y
    Definition: sign.h:8
    +
    + + + + diff --git a/documentation/html/splitbar.png b/documentation/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/documentation/html/structAttrib-members.html b/documentation/html/structAttrib-members.html new file mode 100644 index 000000000..20f7b8b8d --- /dev/null +++ b/documentation/html/structAttrib-members.html @@ -0,0 +1,89 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Attrib Member List
    +
    +
    + +

    This is the complete list of members for Attrib, including all inherited members.

    + + + + + + + + + + + + + +
    cameraAttrib
    extra1Attrib
    extra2Attrib
    extra3Attrib
    extra4Attrib
    matrixAttrib
    normalAttrib
    positionAttrib
    programAttrib
    samplerAttrib
    timerAttrib
    uvAttrib
    + + + + diff --git a/documentation/html/structAttrib.html b/documentation/html/structAttrib.html new file mode 100644 index 000000000..c1dd61e68 --- /dev/null +++ b/documentation/html/structAttrib.html @@ -0,0 +1,304 @@ + + + + + + + +Craft: Attrib Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Attrib Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    GLuint program
     
    GLuint position
     
    GLuint normal
     
    GLuint uv
     
    GLuint matrix
     
    GLuint sampler
     
    GLuint camera
     
    GLuint timer
     
    GLuint extra1
     
    GLuint extra2
     
    GLuint extra3
     
    GLuint extra4
     
    +

    Detailed Description

    +
    +

    Definition at line 82 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ camera

    + +
    +
    + + + + +
    GLuint Attrib::camera
    +
    + +

    Definition at line 89 of file main.c.

    + +
    +
    + +

    ◆ extra1

    + +
    +
    + + + + +
    GLuint Attrib::extra1
    +
    + +

    Definition at line 91 of file main.c.

    + +
    +
    + +

    ◆ extra2

    + +
    +
    + + + + +
    GLuint Attrib::extra2
    +
    + +

    Definition at line 92 of file main.c.

    + +
    +
    + +

    ◆ extra3

    + +
    +
    + + + + +
    GLuint Attrib::extra3
    +
    + +

    Definition at line 93 of file main.c.

    + +
    +
    + +

    ◆ extra4

    + +
    +
    + + + + +
    GLuint Attrib::extra4
    +
    + +

    Definition at line 94 of file main.c.

    + +
    +
    + +

    ◆ matrix

    + +
    +
    + + + + +
    GLuint Attrib::matrix
    +
    + +

    Definition at line 87 of file main.c.

    + +
    +
    + +

    ◆ normal

    + +
    +
    + + + + +
    GLuint Attrib::normal
    +
    + +

    Definition at line 85 of file main.c.

    + +
    +
    + +

    ◆ position

    + +
    +
    + + + + +
    GLuint Attrib::position
    +
    + +

    Definition at line 84 of file main.c.

    + +
    +
    + +

    ◆ program

    + +
    +
    + + + + +
    GLuint Attrib::program
    +
    + +

    Definition at line 83 of file main.c.

    + +
    +
    + +

    ◆ sampler

    + +
    +
    + + + + +
    GLuint Attrib::sampler
    +
    + +

    Definition at line 88 of file main.c.

    + +
    +
    + +

    ◆ timer

    + +
    +
    + + + + +
    GLuint Attrib::timer
    +
    + +

    Definition at line 90 of file main.c.

    + +
    +
    + +

    ◆ uv

    + +
    +
    + + + + +
    GLuint Attrib::uv
    +
    + +

    Definition at line 86 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/structBlock-members.html b/documentation/html/structBlock-members.html new file mode 100644 index 000000000..aaf7a5366 --- /dev/null +++ b/documentation/html/structBlock-members.html @@ -0,0 +1,81 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Block Member List
    +
    +
    + +

    This is the complete list of members for Block, including all inherited members.

    + + + + + +
    wBlock
    xBlock
    yBlock
    zBlock
    + + + + diff --git a/documentation/html/structBlock.html b/documentation/html/structBlock.html new file mode 100644 index 000000000..0813024df --- /dev/null +++ b/documentation/html/structBlock.html @@ -0,0 +1,160 @@ + + + + + + + +Craft: Block Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Block Struct Reference
    +
    +
    + + + + + + + + + + +

    +Public Attributes

    int x
     
    int y
     
    int z
     
    int w
     
    +

    Detailed Description

    +
    +

    Definition at line 56 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ w

    + +
    +
    + + + + +
    int Block::w
    +
    + +

    Definition at line 60 of file main.c.

    + +
    +
    + +

    ◆ x

    + +
    +
    + + + + +
    int Block::x
    +
    + +

    Definition at line 57 of file main.c.

    + +
    +
    + +

    ◆ y

    + +
    +
    + + + + +
    int Block::y
    +
    + +

    Definition at line 58 of file main.c.

    + +
    +
    + +

    ◆ z

    + +
    +
    + + + + +
    int Block::z
    +
    + +

    Definition at line 59 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/structChunk-members.html b/documentation/html/structChunk-members.html new file mode 100644 index 000000000..3bf7a8df0 --- /dev/null +++ b/documentation/html/structChunk-members.html @@ -0,0 +1,90 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Chunk Member List
    +
    +
    + +

    This is the complete list of members for Chunk, including all inherited members.

    + + + + + + + + + + + + + + +
    alpha_bufferChunk
    alpha_facesChunk
    bufferChunk
    dirtyChunk
    facesChunk
    mapChunk
    maxyChunk
    minyChunk
    pChunk
    qChunk
    sign_bufferChunk
    sign_facesChunk
    signsChunk
    + + + + diff --git a/documentation/html/structChunk.html b/documentation/html/structChunk.html new file mode 100644 index 000000000..5d4a363c9 --- /dev/null +++ b/documentation/html/structChunk.html @@ -0,0 +1,322 @@ + + + + + + + +Craft: Chunk Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Chunk Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    Map map
     
    SignList signs
     
    int p
     
    int q
     
    int faces
     
    int alpha_faces
     
    int sign_faces
     
    int dirty
     
    int miny
     
    int maxy
     
    GLuint buffer
     
    GLuint alpha_buffer
     
    GLuint sign_buffer
     
    +

    Detailed Description

    +
    +

    Definition at line 40 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ alpha_buffer

    + +
    +
    + + + + +
    GLuint Chunk::alpha_buffer
    +
    + +

    Definition at line 52 of file main.c.

    + +
    +
    + +

    ◆ alpha_faces

    + +
    +
    + + + + +
    int Chunk::alpha_faces
    +
    + +

    Definition at line 46 of file main.c.

    + +
    +
    + +

    ◆ buffer

    + +
    +
    + + + + +
    GLuint Chunk::buffer
    +
    + +

    Definition at line 51 of file main.c.

    + +
    +
    + +

    ◆ dirty

    + +
    +
    + + + + +
    int Chunk::dirty
    +
    + +

    Definition at line 48 of file main.c.

    + +
    +
    + +

    ◆ faces

    + +
    +
    + + + + +
    int Chunk::faces
    +
    + +

    Definition at line 45 of file main.c.

    + +
    +
    + +

    ◆ map

    + +
    +
    + + + + +
    Map Chunk::map
    +
    + +

    Definition at line 41 of file main.c.

    + +
    +
    + +

    ◆ maxy

    + +
    +
    + + + + +
    int Chunk::maxy
    +
    + +

    Definition at line 50 of file main.c.

    + +
    +
    + +

    ◆ miny

    + +
    +
    + + + + +
    int Chunk::miny
    +
    + +

    Definition at line 49 of file main.c.

    + +
    +
    + +

    ◆ p

    + +
    +
    + + + + +
    int Chunk::p
    +
    + +

    Definition at line 43 of file main.c.

    + +
    +
    + +

    ◆ q

    + +
    +
    + + + + +
    int Chunk::q
    +
    + +

    Definition at line 44 of file main.c.

    + +
    +
    + +

    ◆ sign_buffer

    + +
    +
    + + + + +
    GLuint Chunk::sign_buffer
    +
    + +

    Definition at line 53 of file main.c.

    + +
    +
    + +

    ◆ sign_faces

    + +
    +
    + + + + +
    int Chunk::sign_faces
    +
    + +

    Definition at line 47 of file main.c.

    + +
    +
    + +

    ◆ signs

    + +
    +
    + + + + +
    SignList Chunk::signs
    +
    + +

    Definition at line 42 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/structFPS-members.html b/documentation/html/structFPS-members.html new file mode 100644 index 000000000..5ce98899b --- /dev/null +++ b/documentation/html/structFPS-members.html @@ -0,0 +1,80 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    FPS Member List
    +
    +
    + +

    This is the complete list of members for FPS, including all inherited members.

    + + + + +
    fpsFPS
    framesFPS
    sinceFPS
    + + + + diff --git a/documentation/html/structFPS.html b/documentation/html/structFPS.html new file mode 100644 index 000000000..a5d92d03a --- /dev/null +++ b/documentation/html/structFPS.html @@ -0,0 +1,144 @@ + + + + + + + +Craft: FPS Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    FPS Struct Reference
    +
    +
    + +

    #include <util.h>

    + + + + + + + + +

    +Public Attributes

    unsigned int fps
     
    unsigned int frames
     
    double since
     
    +

    Detailed Description

    +
    +

    Definition at line 22 of file util.h.

    +

    Member Data Documentation

    + +

    ◆ fps

    + +
    +
    + + + + +
    unsigned int FPS::fps
    +
    + +

    Definition at line 23 of file util.h.

    + +
    +
    + +

    ◆ frames

    + +
    +
    + + + + +
    unsigned int FPS::frames
    +
    + +

    Definition at line 24 of file util.h.

    + +
    +
    + +

    ◆ since

    + +
    +
    + + + + +
    double FPS::since
    +
    + +

    Definition at line 25 of file util.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/util.h
    • +
    +
    + + + + diff --git a/documentation/html/structMap-members.html b/documentation/html/structMap-members.html new file mode 100644 index 000000000..f746b2fc3 --- /dev/null +++ b/documentation/html/structMap-members.html @@ -0,0 +1,80 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Map Member List
    +
    +
    + +

    This is the complete list of members for Map, including all inherited members.

    + + + + +
    dataMap
    maskMap
    sizeMap
    + + + + diff --git a/documentation/html/structMap.html b/documentation/html/structMap.html new file mode 100644 index 000000000..b5d3a3848 --- /dev/null +++ b/documentation/html/structMap.html @@ -0,0 +1,144 @@ + + + + + + + +Craft: Map Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Map Struct Reference
    +
    +
    + +

    #include <map.h>

    + + + + + + + + +

    +Public Attributes

    unsigned int mask
     
    unsigned int size
     
    MapEntrydata
     
    +

    Detailed Description

    +
    +

    Definition at line 22 of file map.h.

    +

    Member Data Documentation

    + +

    ◆ data

    + +
    +
    + + + + +
    MapEntry* Map::data
    +
    + +

    Definition at line 25 of file map.h.

    + +
    +
    + +

    ◆ mask

    + +
    +
    + + + + +
    unsigned int Map::mask
    +
    + +

    Definition at line 23 of file map.h.

    + +
    +
    + +

    ◆ size

    + +
    +
    + + + + +
    unsigned int Map::size
    +
    + +

    Definition at line 24 of file map.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.h
    • +
    +
    + + + + diff --git a/documentation/html/structMapEntry-members.html b/documentation/html/structMapEntry-members.html new file mode 100644 index 000000000..724822e5d --- /dev/null +++ b/documentation/html/structMapEntry-members.html @@ -0,0 +1,81 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    MapEntry Member List
    +
    +
    + +

    This is the complete list of members for MapEntry, including all inherited members.

    + + + + + +
    wMapEntry
    xMapEntry
    yMapEntry
    zMapEntry
    + + + + diff --git a/documentation/html/structMapEntry.html b/documentation/html/structMapEntry.html new file mode 100644 index 000000000..6d8d09993 --- /dev/null +++ b/documentation/html/structMapEntry.html @@ -0,0 +1,162 @@ + + + + + + + +Craft: MapEntry Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    MapEntry Struct Reference
    +
    +
    + +

    #include <map.h>

    + + + + + + + + + + +

    +Public Attributes

    int x
     
    int y
     
    int z
     
    int w
     
    +

    Detailed Description

    +
    +

    Definition at line 15 of file map.h.

    +

    Member Data Documentation

    + +

    ◆ w

    + +
    +
    + + + + +
    int MapEntry::w
    +
    + +

    Definition at line 19 of file map.h.

    + +
    +
    + +

    ◆ x

    + +
    +
    + + + + +
    int MapEntry::x
    +
    + +

    Definition at line 16 of file map.h.

    + +
    +
    + +

    ◆ y

    + +
    +
    + + + + +
    int MapEntry::y
    +
    + +

    Definition at line 17 of file map.h.

    + +
    +
    + +

    ◆ z

    + +
    +
    + + + + +
    int MapEntry::z
    +
    + +

    Definition at line 18 of file map.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/map.h
    • +
    +
    + + + + diff --git a/documentation/html/structModel-members.html b/documentation/html/structModel-members.html new file mode 100644 index 000000000..7c648c29a --- /dev/null +++ b/documentation/html/structModel-members.html @@ -0,0 +1,111 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Model Member List
    +
    + + + + + diff --git a/documentation/html/structModel.html b/documentation/html/structModel.html new file mode 100644 index 000000000..904b9e6b4 --- /dev/null +++ b/documentation/html/structModel.html @@ -0,0 +1,700 @@ + + + + + + + +Craft: Model Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Model Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    GLFWwindow * window
     
    float sensitivity
     
    Chunk chunks [MAX_CHUNKS]
     
    int chunk_count
     
    int create_radius
     
    int render_radius
     
    int delete_radius
     
    int sign_radius
     
    Player players [MAX_PLAYERS]
     
    int player_count
     
    int typing
     
    char typing_buffer [MAX_TEXT_LENGTH]
     
    int message_index
     
    char messages [MAX_MESSAGES][MAX_TEXT_LENGTH]
     
    int width
     
    int height
     
    int observe1
     
    int observe2
     
    int flying
     
    int slowed
     
    int item_index
     
    int scale
     
    int ortho
     
    float fov
     
    int suppress_char
     
    int mode
     
    int mode_changed
     
    char db_path [MAX_PATH_LENGTH]
     
    char server_addr [MAX_ADDR_LENGTH]
     
    int server_port
     
    Block block0
     
    Block block1
     
    Block copy0
     
    Block copy1
     
    +

    Detailed Description

    +
    +

    Definition at line 97 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ block0

    + +
    +
    + + + + +
    Block Model::block0
    +
    + +

    Definition at line 128 of file main.c.

    + +
    +
    + +

    ◆ block1

    + +
    +
    + + + + +
    Block Model::block1
    +
    + +

    Definition at line 129 of file main.c.

    + +
    +
    + +

    ◆ chunk_count

    + +
    +
    + + + + +
    int Model::chunk_count
    +
    + +

    Definition at line 101 of file main.c.

    + +
    +
    + +

    ◆ chunks

    + +
    +
    + + + + +
    Chunk Model::chunks[MAX_CHUNKS]
    +
    + +

    Definition at line 100 of file main.c.

    + +
    +
    + +

    ◆ copy0

    + +
    +
    + + + + +
    Block Model::copy0
    +
    + +

    Definition at line 130 of file main.c.

    + +
    +
    + +

    ◆ copy1

    + +
    +
    + + + + +
    Block Model::copy1
    +
    + +

    Definition at line 131 of file main.c.

    + +
    +
    + +

    ◆ create_radius

    + +
    +
    + + + + +
    int Model::create_radius
    +
    + +

    Definition at line 102 of file main.c.

    + +
    +
    + +

    ◆ db_path

    + +
    +
    + + + + +
    char Model::db_path[MAX_PATH_LENGTH]
    +
    + +

    Definition at line 125 of file main.c.

    + +
    +
    + +

    ◆ delete_radius

    + +
    +
    + + + + +
    int Model::delete_radius
    +
    + +

    Definition at line 104 of file main.c.

    + +
    +
    + +

    ◆ flying

    + +
    +
    + + + + +
    int Model::flying
    +
    + +

    Definition at line 116 of file main.c.

    + +
    +
    + +

    ◆ fov

    + +
    +
    + + + + +
    float Model::fov
    +
    + +

    Definition at line 121 of file main.c.

    + +
    +
    + +

    ◆ height

    + +
    +
    + + + + +
    int Model::height
    +
    + +

    Definition at line 113 of file main.c.

    + +
    +
    + +

    ◆ item_index

    + +
    +
    + + + + +
    int Model::item_index
    +
    + +

    Definition at line 118 of file main.c.

    + +
    +
    + +

    ◆ message_index

    + +
    +
    + + + + +
    int Model::message_index
    +
    + +

    Definition at line 110 of file main.c.

    + +
    +
    + +

    ◆ messages

    + +
    +
    + + + + +
    char Model::messages[MAX_MESSAGES][MAX_TEXT_LENGTH]
    +
    + +

    Definition at line 111 of file main.c.

    + +
    +
    + +

    ◆ mode

    + +
    +
    + + + + +
    int Model::mode
    +
    + +

    Definition at line 123 of file main.c.

    + +
    +
    + +

    ◆ mode_changed

    + +
    +
    + + + + +
    int Model::mode_changed
    +
    + +

    Definition at line 124 of file main.c.

    + +
    +
    + +

    ◆ observe1

    + +
    +
    + + + + +
    int Model::observe1
    +
    + +

    Definition at line 114 of file main.c.

    + +
    +
    + +

    ◆ observe2

    + +
    +
    + + + + +
    int Model::observe2
    +
    + +

    Definition at line 115 of file main.c.

    + +
    +
    + +

    ◆ ortho

    + +
    +
    + + + + +
    int Model::ortho
    +
    + +

    Definition at line 120 of file main.c.

    + +
    +
    + +

    ◆ player_count

    + +
    +
    + + + + +
    int Model::player_count
    +
    + +

    Definition at line 107 of file main.c.

    + +
    +
    + +

    ◆ players

    + +
    +
    + + + + +
    Player Model::players[MAX_PLAYERS]
    +
    + +

    Definition at line 106 of file main.c.

    + +
    +
    + +

    ◆ render_radius

    + +
    +
    + + + + +
    int Model::render_radius
    +
    + +

    Definition at line 103 of file main.c.

    + +
    +
    + +

    ◆ scale

    + +
    +
    + + + + +
    int Model::scale
    +
    + +

    Definition at line 119 of file main.c.

    + +
    +
    + +

    ◆ sensitivity

    + +
    +
    + + + + +
    float Model::sensitivity
    +
    + +

    Definition at line 99 of file main.c.

    + +
    +
    + +

    ◆ server_addr

    + +
    +
    + + + + +
    char Model::server_addr[MAX_ADDR_LENGTH]
    +
    + +

    Definition at line 126 of file main.c.

    + +
    +
    + +

    ◆ server_port

    + +
    +
    + + + + +
    int Model::server_port
    +
    + +

    Definition at line 127 of file main.c.

    + +
    +
    + +

    ◆ sign_radius

    + +
    +
    + + + + +
    int Model::sign_radius
    +
    + +

    Definition at line 105 of file main.c.

    + +
    +
    + +

    ◆ slowed

    + +
    +
    + + + + +
    int Model::slowed
    +
    + +

    Definition at line 117 of file main.c.

    + +
    +
    + +

    ◆ suppress_char

    + +
    +
    + + + + +
    int Model::suppress_char
    +
    + +

    Definition at line 122 of file main.c.

    + +
    +
    + +

    ◆ typing

    + +
    +
    + + + + +
    int Model::typing
    +
    + +

    Definition at line 108 of file main.c.

    + +
    +
    + +

    ◆ typing_buffer

    + +
    +
    + + + + +
    char Model::typing_buffer[MAX_TEXT_LENGTH]
    +
    + +

    Definition at line 109 of file main.c.

    + +
    +
    + +

    ◆ width

    + +
    +
    + + + + +
    int Model::width
    +
    + +

    Definition at line 112 of file main.c.

    + +
    +
    + +

    ◆ window

    + +
    +
    + + + + +
    GLFWwindow* Model::window
    +
    + +

    Definition at line 98 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/structPlayer-members.html b/documentation/html/structPlayer-members.html new file mode 100644 index 000000000..01213080a --- /dev/null +++ b/documentation/html/structPlayer-members.html @@ -0,0 +1,84 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Player Member List
    +
    +
    + +

    This is the complete list of members for Player, including all inherited members.

    + + + + + + + + +
    bufferPlayer
    healthPlayer
    idPlayer
    namePlayer
    statePlayer
    state1Player
    state2Player
    + + + + diff --git a/documentation/html/structPlayer.html b/documentation/html/structPlayer.html new file mode 100644 index 000000000..63b355c71 --- /dev/null +++ b/documentation/html/structPlayer.html @@ -0,0 +1,214 @@ + + + + + + + +Craft: Player Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Player Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + +

    +Public Attributes

    int id
     
    char name [MAX_NAME_LENGTH]
     
    float health
     
    State state
     
    State state1
     
    State state2
     
    GLuint buffer
     
    +

    Detailed Description

    +
    +

    Definition at line 72 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ buffer

    + +
    +
    + + + + +
    GLuint Player::buffer
    +
    + +

    Definition at line 79 of file main.c.

    + +
    +
    + +

    ◆ health

    + +
    +
    + + + + +
    float Player::health
    +
    + +

    Definition at line 75 of file main.c.

    + +
    +
    + +

    ◆ id

    + +
    +
    + + + + +
    int Player::id
    +
    + +

    Definition at line 73 of file main.c.

    + +
    +
    + +

    ◆ name

    + +
    +
    + + + + +
    char Player::name[MAX_NAME_LENGTH]
    +
    + +

    Definition at line 74 of file main.c.

    + +
    +
    + +

    ◆ state

    + +
    +
    + + + + +
    State Player::state
    +
    + +

    Definition at line 76 of file main.c.

    + +
    +
    + +

    ◆ state1

    + +
    +
    + + + + +
    State Player::state1
    +
    + +

    Definition at line 77 of file main.c.

    + +
    +
    + +

    ◆ state2

    + +
    +
    + + + + +
    State Player::state2
    +
    + +

    Definition at line 78 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/structRing-members.html b/documentation/html/structRing-members.html new file mode 100644 index 000000000..1cea4da9a --- /dev/null +++ b/documentation/html/structRing-members.html @@ -0,0 +1,81 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Ring Member List
    +
    +
    + +

    This is the complete list of members for Ring, including all inherited members.

    + + + + + +
    capacityRing
    dataRing
    endRing
    startRing
    + + + + diff --git a/documentation/html/structRing.html b/documentation/html/structRing.html new file mode 100644 index 000000000..7eca86669 --- /dev/null +++ b/documentation/html/structRing.html @@ -0,0 +1,162 @@ + + + + + + + +Craft: Ring Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Ring Struct Reference
    +
    +
    + +

    #include <ring.h>

    + + + + + + + + + + +

    +Public Attributes

    unsigned int capacity
     
    unsigned int start
     
    unsigned int end
     
    RingEntrydata
     
    +

    Detailed Description

    +
    +

    Definition at line 22 of file ring.h.

    +

    Member Data Documentation

    + +

    ◆ capacity

    + +
    +
    + + + + +
    unsigned int Ring::capacity
    +
    + +

    Definition at line 23 of file ring.h.

    + +
    +
    + +

    ◆ data

    + +
    +
    + + + + +
    RingEntry* Ring::data
    +
    + +

    Definition at line 26 of file ring.h.

    + +
    +
    + +

    ◆ end

    + +
    +
    + + + + +
    unsigned int Ring::end
    +
    + +

    Definition at line 25 of file ring.h.

    + +
    +
    + +

    ◆ start

    + +
    +
    + + + + +
    unsigned int Ring::start
    +
    + +

    Definition at line 24 of file ring.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.h
    • +
    +
    + + + + diff --git a/documentation/html/structRingEntry-members.html b/documentation/html/structRingEntry-members.html new file mode 100644 index 000000000..577a14b73 --- /dev/null +++ b/documentation/html/structRingEntry-members.html @@ -0,0 +1,85 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    RingEntry Member List
    +
    +
    + +

    This is the complete list of members for RingEntry, including all inherited members.

    + + + + + + + + + +
    keyRingEntry
    pRingEntry
    qRingEntry
    typeRingEntry
    wRingEntry
    xRingEntry
    yRingEntry
    zRingEntry
    + + + + diff --git a/documentation/html/structRingEntry.html b/documentation/html/structRingEntry.html new file mode 100644 index 000000000..6565b8de4 --- /dev/null +++ b/documentation/html/structRingEntry.html @@ -0,0 +1,234 @@ + + + + + + + +Craft: RingEntry Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    RingEntry Struct Reference
    +
    +
    + +

    #include <ring.h>

    + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    RingEntryType type
     
    int p
     
    int q
     
    int x
     
    int y
     
    int z
     
    int w
     
    int key
     
    +

    Detailed Description

    +
    +

    Definition at line 11 of file ring.h.

    +

    Member Data Documentation

    + +

    ◆ key

    + +
    +
    + + + + +
    int RingEntry::key
    +
    + +

    Definition at line 19 of file ring.h.

    + +
    +
    + +

    ◆ p

    + +
    +
    + + + + +
    int RingEntry::p
    +
    + +

    Definition at line 13 of file ring.h.

    + +
    +
    + +

    ◆ q

    + +
    +
    + + + + +
    int RingEntry::q
    +
    + +

    Definition at line 14 of file ring.h.

    + +
    +
    + +

    ◆ type

    + +
    +
    + + + + +
    RingEntryType RingEntry::type
    +
    + +

    Definition at line 12 of file ring.h.

    + +
    +
    + +

    ◆ w

    + +
    +
    + + + + +
    int RingEntry::w
    +
    + +

    Definition at line 18 of file ring.h.

    + +
    +
    + +

    ◆ x

    + +
    +
    + + + + +
    int RingEntry::x
    +
    + +

    Definition at line 15 of file ring.h.

    + +
    +
    + +

    ◆ y

    + +
    +
    + + + + +
    int RingEntry::y
    +
    + +

    Definition at line 16 of file ring.h.

    + +
    +
    + +

    ◆ z

    + +
    +
    + + + + +
    int RingEntry::z
    +
    + +

    Definition at line 17 of file ring.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/ring.h
    • +
    +
    + + + + diff --git a/documentation/html/structSign-members.html b/documentation/html/structSign-members.html new file mode 100644 index 000000000..68626fb3d --- /dev/null +++ b/documentation/html/structSign-members.html @@ -0,0 +1,82 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    Sign Member List
    +
    +
    + +

    This is the complete list of members for Sign, including all inherited members.

    + + + + + + +
    faceSign
    textSign
    xSign
    ySign
    zSign
    + + + + diff --git a/documentation/html/structSign.html b/documentation/html/structSign.html new file mode 100644 index 000000000..ded14b1de --- /dev/null +++ b/documentation/html/structSign.html @@ -0,0 +1,180 @@ + + + + + + + +Craft: Sign Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    Sign Struct Reference
    +
    +
    + +

    #include <sign.h>

    + + + + + + + + + + + + +

    +Public Attributes

    int x
     
    int y
     
    int z
     
    int face
     
    char text [MAX_SIGN_LENGTH]
     
    +

    Detailed Description

    +
    +

    Definition at line 6 of file sign.h.

    +

    Member Data Documentation

    + +

    ◆ face

    + +
    +
    + + + + +
    int Sign::face
    +
    + +

    Definition at line 10 of file sign.h.

    + +
    +
    + +

    ◆ text

    + +
    +
    + + + + +
    char Sign::text[MAX_SIGN_LENGTH]
    +
    + +

    Definition at line 11 of file sign.h.

    + +
    +
    + +

    ◆ x

    + +
    +
    + + + + +
    int Sign::x
    +
    + +

    Definition at line 7 of file sign.h.

    + +
    +
    + +

    ◆ y

    + +
    +
    + + + + +
    int Sign::y
    +
    + +

    Definition at line 8 of file sign.h.

    + +
    +
    + +

    ◆ z

    + +
    +
    + + + + +
    int Sign::z
    +
    + +

    Definition at line 9 of file sign.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.h
    • +
    +
    + + + + diff --git a/documentation/html/structSignList-members.html b/documentation/html/structSignList-members.html new file mode 100644 index 000000000..4e57c1a8a --- /dev/null +++ b/documentation/html/structSignList-members.html @@ -0,0 +1,80 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    SignList Member List
    +
    +
    + +

    This is the complete list of members for SignList, including all inherited members.

    + + + + +
    capacitySignList
    dataSignList
    sizeSignList
    + + + + diff --git a/documentation/html/structSignList.html b/documentation/html/structSignList.html new file mode 100644 index 000000000..7da71312e --- /dev/null +++ b/documentation/html/structSignList.html @@ -0,0 +1,144 @@ + + + + + + + +Craft: SignList Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    SignList Struct Reference
    +
    +
    + +

    #include <sign.h>

    + + + + + + + + +

    +Public Attributes

    unsigned int capacity
     
    unsigned int size
     
    Signdata
     
    +

    Detailed Description

    +
    +

    Definition at line 14 of file sign.h.

    +

    Member Data Documentation

    + +

    ◆ capacity

    + +
    +
    + + + + +
    unsigned int SignList::capacity
    +
    + +

    Definition at line 15 of file sign.h.

    + +
    +
    + +

    ◆ data

    + +
    +
    + + + + +
    Sign* SignList::data
    +
    + +

    Definition at line 17 of file sign.h.

    + +
    +
    + +

    ◆ size

    + +
    +
    + + + + +
    unsigned int SignList::size
    +
    + +

    Definition at line 16 of file sign.h.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/sign.h
    • +
    +
    + + + + diff --git a/documentation/html/structState-members.html b/documentation/html/structState-members.html new file mode 100644 index 000000000..0843f798d --- /dev/null +++ b/documentation/html/structState-members.html @@ -0,0 +1,83 @@ + + + + + + + +Craft: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    State Member List
    +
    +
    + +

    This is the complete list of members for State, including all inherited members.

    + + + + + + + +
    rxState
    ryState
    tState
    xState
    yState
    zState
    + + + + diff --git a/documentation/html/structState.html b/documentation/html/structState.html new file mode 100644 index 000000000..f6ff35d3f --- /dev/null +++ b/documentation/html/structState.html @@ -0,0 +1,196 @@ + + + + + + + +Craft: State Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    State Struct Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Public Attributes

    float x
     
    float y
     
    float z
     
    float rx
     
    float ry
     
    float t
     
    +

    Detailed Description

    +
    +

    Definition at line 63 of file main.c.

    +

    Member Data Documentation

    + +

    ◆ rx

    + +
    +
    + + + + +
    float State::rx
    +
    + +

    Definition at line 67 of file main.c.

    + +
    +
    + +

    ◆ ry

    + +
    +
    + + + + +
    float State::ry
    +
    + +

    Definition at line 68 of file main.c.

    + +
    +
    + +

    ◆ t

    + +
    +
    + + + + +
    float State::t
    +
    + +

    Definition at line 69 of file main.c.

    + +
    +
    + +

    ◆ x

    + +
    +
    + + + + +
    float State::x
    +
    + +

    Definition at line 64 of file main.c.

    + +
    +
    + +

    ◆ y

    + +
    +
    + + + + +
    float State::y
    +
    + +

    Definition at line 65 of file main.c.

    + +
    +
    + +

    ◆ z

    + +
    +
    + + + + +
    float State::z
    +
    + +

    Definition at line 66 of file main.c.

    + +
    +
    +
    The documentation for this struct was generated from the following file:
      +
    • /home/david/Desktop/Software_Eng/Group_9/Craft/src/main.c
    • +
    +
    + + + + diff --git a/documentation/html/sync_off.png b/documentation/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/documentation/html/sync_on.png b/documentation/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_a.png b/documentation/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_b.png b/documentation/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/documentation/html/tabs.css b/documentation/html/tabs.css new file mode 100644 index 000000000..85a0cd5b5 --- /dev/null +++ b/documentation/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/documentation/html/util_8c.html b/documentation/html/util_8c.html new file mode 100644 index 000000000..0e9cdd2ae --- /dev/null +++ b/documentation/html/util_8c.html @@ -0,0 +1,823 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/util.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    util.c File Reference
    +
    +
    +
    #include <math.h>
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include "lodepng.h"
    +#include "matrix.h"
    +#include "util.h"
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int rand_int (int n)
     
    double rand_double ()
     
    void update_fps (FPS *fps)
     
    char * load_file (const char *path)
     
    GLuint gen_buffer (GLsizei size, GLfloat *data)
     
    void del_buffer (GLuint buffer)
     
    GLfloat * malloc_faces (int components, int faces)
     
    GLuint gen_faces (int components, int faces, GLfloat *data)
     
    GLuint make_shader (GLenum type, const char *source)
     
    GLuint load_shader (GLenum type, const char *path)
     
    GLuint make_program (GLuint shader1, GLuint shader2)
     
    GLuint load_program (const char *path1, const char *path2)
     
    void flip_image_vertical (unsigned char *data, unsigned int width, unsigned int height)
     
    void load_png_texture (const char *file_name)
     
    char * tokenize (char *str, const char *delim, char **key)
     
    int char_width (char input)
     
    int string_width (const char *input)
     
    int wrap (const char *input, int max_width, char *output, int max_length)
     
    +

    Function Documentation

    + +

    ◆ char_width()

    + +
    +
    + + + + + + + + +
    int char_width (char input)
    +
    + +

    Definition at line 163 of file util.c.

    +
    163  {
    +
    164  static const int lookup[128] = {
    +
    165  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    166  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    167  4, 2, 4, 7, 6, 9, 7, 2, 3, 3, 4, 6, 3, 5, 2, 7,
    +
    168  6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 2, 3, 5, 6, 5, 7,
    +
    169  8, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 5, 8, 8, 6,
    +
    170  6, 7, 6, 6, 6, 6, 8,10, 8, 6, 6, 3, 6, 3, 6, 6,
    +
    171  4, 7, 6, 6, 6, 6, 5, 6, 6, 2, 5, 5, 2, 9, 6, 6,
    +
    172  6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 4, 2, 5, 7, 0
    +
    173  };
    +
    174  return lookup[input];
    +
    175 }
    +
    +
    +
    + +

    ◆ del_buffer()

    + +
    +
    + + + + + + + + +
    void del_buffer (GLuint buffer)
    +
    + +

    Definition at line 49 of file util.c.

    +
    49  {
    +
    50  glDeleteBuffers(1, &buffer);
    +
    51 }
    +
    +
    +
    + +

    ◆ flip_image_vertical()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void flip_image_vertical (unsigned char * data,
    unsigned int width,
    unsigned int height 
    )
    +
    + +

    Definition at line 117 of file util.c.

    +
    119 {
    +
    120  unsigned int size = width * height * 4;
    +
    121  unsigned int stride = sizeof(char) * width * 4;
    +
    122  unsigned char *new_data = malloc(sizeof(unsigned char) * size);
    +
    123  for (unsigned int i = 0; i < height; i++) {
    +
    124  unsigned int j = height - i - 1;
    +
    125  memcpy(new_data + j * stride, data + i * stride, stride);
    +
    126  }
    +
    127  memcpy(data, new_data, size);
    +
    128  free(new_data);
    +
    129 }
    +
    +
    +
    + +

    ◆ gen_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint gen_buffer (GLsizei size,
    GLfloat * data 
    )
    +
    + +

    Definition at line 40 of file util.c.

    +
    40  {
    +
    41  GLuint buffer;
    +
    42  glGenBuffers(1, &buffer);
    +
    43  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    44  glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
    +
    45  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    46  return buffer;
    +
    47 }
    +
    +
    +
    + +

    ◆ gen_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_faces (int components,
    int faces,
    GLfloat * data 
    )
    +
    + +

    Definition at line 57 of file util.c.

    +
    57  {
    +
    58  GLuint buffer = gen_buffer(
    +
    59  sizeof(GLfloat) * 6 * components * faces, data);
    +
    60  free(data);
    +
    61  return buffer;
    +
    62 }
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    +
    +
    + +

    ◆ load_file()

    + +
    +
    + + + + + + + + +
    char* load_file (const char * path)
    +
    + +

    Definition at line 29 of file util.c.

    +
    29  {
    +
    30  FILE *file = fopen(path, "rb");
    +
    31  fseek(file, 0, SEEK_END);
    +
    32  int length = ftell(file);
    +
    33  rewind(file);
    +
    34  char *data = calloc(length + 1, sizeof(char));
    +
    35  fread(data, 1, length, file);
    +
    36  fclose(file);
    +
    37  return data;
    +
    38 }
    +
    +
    +
    + +

    ◆ load_png_texture()

    + +
    +
    + + + + + + + + +
    void load_png_texture (const char * file_name)
    +
    + +

    Definition at line 131 of file util.c.

    +
    131  {
    +
    132  unsigned int error;
    +
    133  unsigned char *data;
    +
    134  unsigned int width, height;
    +
    135  error = lodepng_decode32_file(&data, &width, &height, file_name);
    +
    136  if (error) {
    +
    137  fprintf(stderr, "error %u: %s\n", error, lodepng_error_text(error));
    +
    138  }
    +
    139  flip_image_vertical(data, width, height);
    +
    140  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
    +
    141  GL_UNSIGNED_BYTE, data);
    +
    142  free(data);
    +
    143 }
    +
    void flip_image_vertical(unsigned char *data, unsigned int width, unsigned int height)
    Definition: util.c:117
    +
    +
    +
    + +

    ◆ load_program()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint load_program (const char * path1,
    const char * path2 
    )
    +
    + +

    Definition at line 110 of file util.c.

    +
    110  {
    +
    111  GLuint shader1 = load_shader(GL_VERTEX_SHADER, path1);
    +
    112  GLuint shader2 = load_shader(GL_FRAGMENT_SHADER, path2);
    +
    113  GLuint program = make_program(shader1, shader2);
    +
    114  return program;
    +
    115 }
    +
    GLuint load_shader(GLenum type, const char *path)
    Definition: util.c:81
    +
    GLuint make_program(GLuint shader1, GLuint shader2)
    Definition: util.c:88
    +
    +
    +
    + +

    ◆ load_shader()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint load_shader (GLenum type,
    const char * path 
    )
    +
    + +

    Definition at line 81 of file util.c.

    +
    81  {
    +
    82  char *data = load_file(path);
    +
    83  GLuint result = make_shader(type, data);
    +
    84  free(data);
    +
    85  return result;
    +
    86 }
    +
    GLuint make_shader(GLenum type, const char *source)
    Definition: util.c:64
    +
    char * load_file(const char *path)
    Definition: util.c:29
    +
    +
    +
    + +

    ◆ make_program()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint make_program (GLuint shader1,
    GLuint shader2 
    )
    +
    + +

    Definition at line 88 of file util.c.

    +
    88  {
    +
    89  GLuint program = glCreateProgram();
    +
    90  glAttachShader(program, shader1);
    +
    91  glAttachShader(program, shader2);
    +
    92  glLinkProgram(program);
    +
    93  GLint status;
    +
    94  glGetProgramiv(program, GL_LINK_STATUS, &status);
    +
    95  if (status == GL_FALSE) {
    +
    96  GLint length;
    +
    97  glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
    +
    98  GLchar *info = calloc(length, sizeof(GLchar));
    +
    99  glGetProgramInfoLog(program, length, NULL, info);
    +
    100  fprintf(stderr, "glLinkProgram failed: %s\n", info);
    +
    101  free(info);
    +
    102  }
    +
    103  glDetachShader(program, shader1);
    +
    104  glDetachShader(program, shader2);
    +
    105  glDeleteShader(shader1);
    +
    106  glDeleteShader(shader2);
    +
    107  return program;
    +
    108 }
    +
    +
    +
    + +

    ◆ make_shader()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint make_shader (GLenum type,
    const char * source 
    )
    +
    + +

    Definition at line 64 of file util.c.

    +
    64  {
    +
    65  GLuint shader = glCreateShader(type);
    +
    66  glShaderSource(shader, 1, &source, NULL);
    +
    67  glCompileShader(shader);
    +
    68  GLint status;
    +
    69  glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    +
    70  if (status == GL_FALSE) {
    +
    71  GLint length;
    +
    72  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
    +
    73  GLchar *info = calloc(length, sizeof(GLchar));
    +
    74  glGetShaderInfoLog(shader, length, NULL, info);
    +
    75  fprintf(stderr, "glCompileShader failed:\n%s\n", info);
    +
    76  free(info);
    +
    77  }
    +
    78  return shader;
    +
    79 }
    +
    +
    +
    + +

    ◆ malloc_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLfloat* malloc_faces (int components,
    int faces 
    )
    +
    + +

    Definition at line 53 of file util.c.

    +
    53  {
    +
    54  return malloc(sizeof(GLfloat) * 6 * components * faces);
    +
    55 }
    +
    +
    +
    + +

    ◆ rand_double()

    + +
    +
    + + + + + + + +
    double rand_double ()
    +
    + +

    Definition at line 14 of file util.c.

    +
    14  {
    +
    15  return (double)rand() / (double)RAND_MAX;
    +
    16 }
    +
    +
    +
    + +

    ◆ rand_int()

    + +
    +
    + + + + + + + + +
    int rand_int (int n)
    +
    + +

    Definition at line 8 of file util.c.

    +
    8  {
    +
    9  int result;
    +
    10  while (n <= (result = rand() / (RAND_MAX / n)));
    +
    11  return result;
    +
    12 }
    +
    +
    +
    + +

    ◆ string_width()

    + +
    +
    + + + + + + + + +
    int string_width (const char * input)
    +
    + +

    Definition at line 177 of file util.c.

    +
    177  {
    +
    178  int result = 0;
    +
    179  int length = strlen(input);
    +
    180  for (int i = 0; i < length; i++) {
    +
    181  result += char_width(input[i]);
    +
    182  }
    +
    183  return result;
    +
    184 }
    +
    int char_width(char input)
    Definition: util.c:163
    +
    +
    +
    + +

    ◆ tokenize()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    char* tokenize (char * str,
    const char * delim,
    char ** key 
    )
    +
    + +

    Definition at line 145 of file util.c.

    +
    145  {
    +
    146  char *result;
    +
    147  if (str == NULL) {
    +
    148  str = *key;
    +
    149  }
    +
    150  str += strspn(str, delim);
    +
    151  if (*str == '\0') {
    +
    152  return NULL;
    +
    153  }
    +
    154  result = str;
    +
    155  str += strcspn(str, delim);
    +
    156  if (*str) {
    +
    157  *str++ = '\0';
    +
    158  }
    +
    159  *key = str;
    +
    160  return result;
    +
    161 }
    +
    +
    +
    + +

    ◆ update_fps()

    + +
    +
    + + + + + + + + +
    void update_fps (FPSfps)
    +
    + +

    Definition at line 18 of file util.c.

    +
    18  {
    +
    19  fps->frames++;
    +
    20  double now = glfwGetTime();
    +
    21  double elapsed = now - fps->since;
    +
    22  if (elapsed >= 1) {
    +
    23  fps->fps = round(fps->frames / elapsed);
    +
    24  fps->frames = 0;
    +
    25  fps->since = now;
    +
    26  }
    +
    27 }
    +
    double since
    Definition: util.h:25
    +
    unsigned int fps
    Definition: util.h:23
    +
    unsigned int frames
    Definition: util.h:24
    +
    +
    +
    + +

    ◆ wrap()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int wrap (const char * input,
    int max_width,
    char * output,
    int max_length 
    )
    +
    + +

    Definition at line 186 of file util.c.

    +
    186  {
    +
    187  *output = '\0';
    +
    188  char *text = malloc(sizeof(char) * (strlen(input) + 1));
    +
    189  strcpy(text, input);
    +
    190  int space_width = char_width(' ');
    +
    191  int line_number = 0;
    +
    192  char *key1, *key2;
    +
    193  char *line = tokenize(text, "\r\n", &key1);
    +
    194  while (line) {
    +
    195  int line_width = 0;
    +
    196  char *token = tokenize(line, " ", &key2);
    +
    197  while (token) {
    +
    198  int token_width = string_width(token);
    +
    199  if (line_width) {
    +
    200  if (line_width + token_width > max_width) {
    +
    201  line_width = 0;
    +
    202  line_number++;
    +
    203  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    204  }
    +
    205  else {
    +
    206  strncat(output, " ", max_length - strlen(output) - 1);
    +
    207  }
    +
    208  }
    +
    209  strncat(output, token, max_length - strlen(output) - 1);
    +
    210  line_width += token_width + space_width;
    +
    211  token = tokenize(NULL, " ", &key2);
    +
    212  }
    +
    213  line_number++;
    +
    214  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    215  line = tokenize(NULL, "\r\n", &key1);
    +
    216  }
    +
    217  free(text);
    +
    218  return line_number;
    +
    219 }
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/util_8c_source.html b/documentation/html/util_8c_source.html new file mode 100644 index 000000000..72de89941 --- /dev/null +++ b/documentation/html/util_8c_source.html @@ -0,0 +1,321 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/util.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    util.c
    +
    +
    +Go to the documentation of this file.
    1 #include <math.h>
    +
    2 #include <stdio.h>
    +
    3 #include <stdlib.h>
    +
    4 #include "lodepng.h"
    +
    5 #include "matrix.h"
    +
    6 #include "util.h"
    +
    7 
    +
    8 int rand_int(int n) {
    +
    9  int result;
    +
    10  while (n <= (result = rand() / (RAND_MAX / n)));
    +
    11  return result;
    +
    12 }
    +
    13 
    +
    14 double rand_double() {
    +
    15  return (double)rand() / (double)RAND_MAX;
    +
    16 }
    +
    17 
    +
    18 void update_fps(FPS *fps) {
    +
    19  fps->frames++;
    +
    20  double now = glfwGetTime();
    +
    21  double elapsed = now - fps->since;
    +
    22  if (elapsed >= 1) {
    +
    23  fps->fps = round(fps->frames / elapsed);
    +
    24  fps->frames = 0;
    +
    25  fps->since = now;
    +
    26  }
    +
    27 }
    +
    28 
    +
    29 char *load_file(const char *path) {
    +
    30  FILE *file = fopen(path, "rb");
    +
    31  fseek(file, 0, SEEK_END);
    +
    32  int length = ftell(file);
    +
    33  rewind(file);
    +
    34  char *data = calloc(length + 1, sizeof(char));
    +
    35  fread(data, 1, length, file);
    +
    36  fclose(file);
    +
    37  return data;
    +
    38 }
    +
    39 
    +
    40 GLuint gen_buffer(GLsizei size, GLfloat *data) {
    +
    41  GLuint buffer;
    +
    42  glGenBuffers(1, &buffer);
    +
    43  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    44  glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
    +
    45  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    46  return buffer;
    +
    47 }
    +
    48 
    +
    49 void del_buffer(GLuint buffer) {
    +
    50  glDeleteBuffers(1, &buffer);
    +
    51 }
    +
    52 
    +
    53 GLfloat *malloc_faces(int components, int faces) {
    +
    54  return malloc(sizeof(GLfloat) * 6 * components * faces);
    +
    55 }
    +
    56 
    +
    57 GLuint gen_faces(int components, int faces, GLfloat *data) {
    +
    58  GLuint buffer = gen_buffer(
    +
    59  sizeof(GLfloat) * 6 * components * faces, data);
    +
    60  free(data);
    +
    61  return buffer;
    +
    62 }
    +
    63 
    +
    64 GLuint make_shader(GLenum type, const char *source) {
    +
    65  GLuint shader = glCreateShader(type);
    +
    66  glShaderSource(shader, 1, &source, NULL);
    +
    67  glCompileShader(shader);
    +
    68  GLint status;
    +
    69  glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    +
    70  if (status == GL_FALSE) {
    +
    71  GLint length;
    +
    72  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
    +
    73  GLchar *info = calloc(length, sizeof(GLchar));
    +
    74  glGetShaderInfoLog(shader, length, NULL, info);
    +
    75  fprintf(stderr, "glCompileShader failed:\n%s\n", info);
    +
    76  free(info);
    +
    77  }
    +
    78  return shader;
    +
    79 }
    +
    80 
    +
    81 GLuint load_shader(GLenum type, const char *path) {
    +
    82  char *data = load_file(path);
    +
    83  GLuint result = make_shader(type, data);
    +
    84  free(data);
    +
    85  return result;
    +
    86 }
    +
    87 
    +
    88 GLuint make_program(GLuint shader1, GLuint shader2) {
    +
    89  GLuint program = glCreateProgram();
    +
    90  glAttachShader(program, shader1);
    +
    91  glAttachShader(program, shader2);
    +
    92  glLinkProgram(program);
    +
    93  GLint status;
    +
    94  glGetProgramiv(program, GL_LINK_STATUS, &status);
    +
    95  if (status == GL_FALSE) {
    +
    96  GLint length;
    +
    97  glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
    +
    98  GLchar *info = calloc(length, sizeof(GLchar));
    +
    99  glGetProgramInfoLog(program, length, NULL, info);
    +
    100  fprintf(stderr, "glLinkProgram failed: %s\n", info);
    +
    101  free(info);
    +
    102  }
    +
    103  glDetachShader(program, shader1);
    +
    104  glDetachShader(program, shader2);
    +
    105  glDeleteShader(shader1);
    +
    106  glDeleteShader(shader2);
    +
    107  return program;
    +
    108 }
    +
    109 
    +
    110 GLuint load_program(const char *path1, const char *path2) {
    +
    111  GLuint shader1 = load_shader(GL_VERTEX_SHADER, path1);
    +
    112  GLuint shader2 = load_shader(GL_FRAGMENT_SHADER, path2);
    +
    113  GLuint program = make_program(shader1, shader2);
    +
    114  return program;
    +
    115 }
    +
    116 
    + +
    118  unsigned char *data, unsigned int width, unsigned int height)
    +
    119 {
    +
    120  unsigned int size = width * height * 4;
    +
    121  unsigned int stride = sizeof(char) * width * 4;
    +
    122  unsigned char *new_data = malloc(sizeof(unsigned char) * size);
    +
    123  for (unsigned int i = 0; i < height; i++) {
    +
    124  unsigned int j = height - i - 1;
    +
    125  memcpy(new_data + j * stride, data + i * stride, stride);
    +
    126  }
    +
    127  memcpy(data, new_data, size);
    +
    128  free(new_data);
    +
    129 }
    +
    130 
    +
    131 void load_png_texture(const char *file_name) {
    +
    132  unsigned int error;
    +
    133  unsigned char *data;
    +
    134  unsigned int width, height;
    +
    135  error = lodepng_decode32_file(&data, &width, &height, file_name);
    +
    136  if (error) {
    +
    137  fprintf(stderr, "error %u: %s\n", error, lodepng_error_text(error));
    +
    138  }
    +
    139  flip_image_vertical(data, width, height);
    +
    140  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
    +
    141  GL_UNSIGNED_BYTE, data);
    +
    142  free(data);
    +
    143 }
    +
    144 
    +
    145 char *tokenize(char *str, const char *delim, char **key) {
    +
    146  char *result;
    +
    147  if (str == NULL) {
    +
    148  str = *key;
    +
    149  }
    +
    150  str += strspn(str, delim);
    +
    151  if (*str == '\0') {
    +
    152  return NULL;
    +
    153  }
    +
    154  result = str;
    +
    155  str += strcspn(str, delim);
    +
    156  if (*str) {
    +
    157  *str++ = '\0';
    +
    158  }
    +
    159  *key = str;
    +
    160  return result;
    +
    161 }
    +
    162 
    +
    163 int char_width(char input) {
    +
    164  static const int lookup[128] = {
    +
    165  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    166  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    167  4, 2, 4, 7, 6, 9, 7, 2, 3, 3, 4, 6, 3, 5, 2, 7,
    +
    168  6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 2, 3, 5, 6, 5, 7,
    +
    169  8, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 5, 8, 8, 6,
    +
    170  6, 7, 6, 6, 6, 6, 8,10, 8, 6, 6, 3, 6, 3, 6, 6,
    +
    171  4, 7, 6, 6, 6, 6, 5, 6, 6, 2, 5, 5, 2, 9, 6, 6,
    +
    172  6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 4, 2, 5, 7, 0
    +
    173  };
    +
    174  return lookup[input];
    +
    175 }
    +
    176 
    +
    177 int string_width(const char *input) {
    +
    178  int result = 0;
    +
    179  int length = strlen(input);
    +
    180  for (int i = 0; i < length; i++) {
    +
    181  result += char_width(input[i]);
    +
    182  }
    +
    183  return result;
    +
    184 }
    +
    185 
    +
    186 int wrap(const char *input, int max_width, char *output, int max_length) {
    +
    187  *output = '\0';
    +
    188  char *text = malloc(sizeof(char) * (strlen(input) + 1));
    +
    189  strcpy(text, input);
    +
    190  int space_width = char_width(' ');
    +
    191  int line_number = 0;
    +
    192  char *key1, *key2;
    +
    193  char *line = tokenize(text, "\r\n", &key1);
    +
    194  while (line) {
    +
    195  int line_width = 0;
    +
    196  char *token = tokenize(line, " ", &key2);
    +
    197  while (token) {
    +
    198  int token_width = string_width(token);
    +
    199  if (line_width) {
    +
    200  if (line_width + token_width > max_width) {
    +
    201  line_width = 0;
    +
    202  line_number++;
    +
    203  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    204  }
    +
    205  else {
    +
    206  strncat(output, " ", max_length - strlen(output) - 1);
    +
    207  }
    +
    208  }
    +
    209  strncat(output, token, max_length - strlen(output) - 1);
    +
    210  line_width += token_width + space_width;
    +
    211  token = tokenize(NULL, " ", &key2);
    +
    212  }
    +
    213  line_number++;
    +
    214  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    215  line = tokenize(NULL, "\r\n", &key1);
    +
    216  }
    +
    217  free(text);
    +
    218  return line_number;
    +
    219 }
    + +
    Definition: util.h:22
    +
    double since
    Definition: util.h:25
    +
    unsigned int fps
    Definition: util.h:23
    +
    unsigned int frames
    Definition: util.h:24
    +
    GLfloat * malloc_faces(int components, int faces)
    Definition: util.c:53
    +
    double rand_double()
    Definition: util.c:14
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    void flip_image_vertical(unsigned char *data, unsigned int width, unsigned int height)
    Definition: util.c:117
    +
    GLuint load_shader(GLenum type, const char *path)
    Definition: util.c:81
    +
    GLuint make_program(GLuint shader1, GLuint shader2)
    Definition: util.c:88
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    GLuint load_program(const char *path1, const char *path2)
    Definition: util.c:110
    +
    int rand_int(int n)
    Definition: util.c:8
    +
    int char_width(char input)
    Definition: util.c:163
    +
    int wrap(const char *input, int max_width, char *output, int max_length)
    Definition: util.c:186
    +
    GLuint make_shader(GLenum type, const char *source)
    Definition: util.c:64
    +
    void del_buffer(GLuint buffer)
    Definition: util.c:49
    +
    void load_png_texture(const char *file_name)
    Definition: util.c:131
    +
    char * load_file(const char *path)
    Definition: util.c:29
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    GLuint gen_faces(int components, int faces, GLfloat *data)
    Definition: util.c:57
    +
    void update_fps(FPS *fps)
    Definition: util.c:18
    + +
    + + + + diff --git a/documentation/html/util_8h.html b/documentation/html/util_8h.html new file mode 100644 index 000000000..e3a996d40 --- /dev/null +++ b/documentation/html/util_8h.html @@ -0,0 +1,942 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/util.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    util.h File Reference
    +
    +
    +
    #include <GL/glew.h>
    +#include <GLFW/glfw3.h>
    +#include "config.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Classes

    struct  FPS
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define PI   3.14159265359
     
    #define DEGREES(radians)   ((radians) * 180 / PI)
     
    #define RADIANS(degrees)   ((degrees) * PI / 180)
     
    #define ABS(x)   ((x) < 0 ? (-(x)) : (x))
     
    #define MIN(a, b)   ((a) < (b) ? (a) : (b))
     
    #define MAX(a, b)   ((a) > (b) ? (a) : (b))
     
    #define SIGN(x)   (((x) > 0) - ((x) < 0))
     
    #define LOG(...)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int rand_int (int n)
     
    double rand_double ()
     
    void update_fps (FPS *fps)
     
    GLuint gen_buffer (GLsizei size, GLfloat *data)
     
    void del_buffer (GLuint buffer)
     
    GLfloat * malloc_faces (int components, int faces)
     
    GLuint gen_faces (int components, int faces, GLfloat *data)
     
    GLuint make_shader (GLenum type, const char *source)
     
    GLuint load_shader (GLenum type, const char *path)
     
    GLuint make_program (GLuint shader1, GLuint shader2)
     
    GLuint load_program (const char *path1, const char *path2)
     
    void load_png_texture (const char *file_name)
     
    char * tokenize (char *str, const char *delim, char **key)
     
    int char_width (char input)
     
    int string_width (const char *input)
     
    int wrap (const char *input, int max_width, char *output, int max_length)
     
    +

    Macro Definition Documentation

    + +

    ◆ ABS

    + +
    +
    + + + + + + + + +
    #define ABS( x)   ((x) < 0 ? (-(x)) : (x))
    +
    + +

    Definition at line 11 of file util.h.

    + +
    +
    + +

    ◆ DEGREES

    + +
    +
    + + + + + + + + +
    #define DEGREES( radians)   ((radians) * 180 / PI)
    +
    + +

    Definition at line 9 of file util.h.

    + +
    +
    + +

    ◆ LOG

    + +
    +
    + + + + + + + + +
    #define LOG( ...)
    +
    + +

    Definition at line 19 of file util.h.

    + +
    +
    + +

    ◆ MAX

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define MAX( a,
     
    )   ((a) > (b) ? (a) : (b))
    +
    + +

    Definition at line 13 of file util.h.

    + +
    +
    + +

    ◆ MIN

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    #define MIN( a,
     
    )   ((a) < (b) ? (a) : (b))
    +
    + +

    Definition at line 12 of file util.h.

    + +
    +
    + +

    ◆ PI

    + +
    +
    + + + + +
    #define PI   3.14159265359
    +
    + +

    Definition at line 8 of file util.h.

    + +
    +
    + +

    ◆ RADIANS

    + +
    +
    + + + + + + + + +
    #define RADIANS( degrees)   ((degrees) * PI / 180)
    +
    + +

    Definition at line 10 of file util.h.

    + +
    +
    + +

    ◆ SIGN

    + +
    +
    + + + + + + + + +
    #define SIGN( x)   (((x) > 0) - ((x) < 0))
    +
    + +

    Definition at line 14 of file util.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ char_width()

    + +
    +
    + + + + + + + + +
    int char_width (char input)
    +
    + +

    Definition at line 163 of file util.c.

    +
    163  {
    +
    164  static const int lookup[128] = {
    +
    165  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    166  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    167  4, 2, 4, 7, 6, 9, 7, 2, 3, 3, 4, 6, 3, 5, 2, 7,
    +
    168  6, 3, 6, 6, 6, 6, 6, 6, 6, 6, 2, 3, 5, 6, 5, 7,
    +
    169  8, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 5, 8, 8, 6,
    +
    170  6, 7, 6, 6, 6, 6, 8,10, 8, 6, 6, 3, 6, 3, 6, 6,
    +
    171  4, 7, 6, 6, 6, 6, 5, 6, 6, 2, 5, 5, 2, 9, 6, 6,
    +
    172  6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 4, 2, 5, 7, 0
    +
    173  };
    +
    174  return lookup[input];
    +
    175 }
    +
    +
    +
    + +

    ◆ del_buffer()

    + +
    +
    + + + + + + + + +
    void del_buffer (GLuint buffer)
    +
    + +

    Definition at line 49 of file util.c.

    +
    49  {
    +
    50  glDeleteBuffers(1, &buffer);
    +
    51 }
    +
    +
    +
    + +

    ◆ gen_buffer()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint gen_buffer (GLsizei size,
    GLfloat * data 
    )
    +
    + +

    Definition at line 40 of file util.c.

    +
    40  {
    +
    41  GLuint buffer;
    +
    42  glGenBuffers(1, &buffer);
    +
    43  glBindBuffer(GL_ARRAY_BUFFER, buffer);
    +
    44  glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
    +
    45  glBindBuffer(GL_ARRAY_BUFFER, 0);
    +
    46  return buffer;
    +
    47 }
    +
    +
    +
    + +

    ◆ gen_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    GLuint gen_faces (int components,
    int faces,
    GLfloat * data 
    )
    +
    + +

    Definition at line 57 of file util.c.

    +
    57  {
    +
    58  GLuint buffer = gen_buffer(
    +
    59  sizeof(GLfloat) * 6 * components * faces, data);
    +
    60  free(data);
    +
    61  return buffer;
    +
    62 }
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    +
    +
    + +

    ◆ load_png_texture()

    + +
    +
    + + + + + + + + +
    void load_png_texture (const char * file_name)
    +
    + +

    Definition at line 131 of file util.c.

    +
    131  {
    +
    132  unsigned int error;
    +
    133  unsigned char *data;
    +
    134  unsigned int width, height;
    +
    135  error = lodepng_decode32_file(&data, &width, &height, file_name);
    +
    136  if (error) {
    +
    137  fprintf(stderr, "error %u: %s\n", error, lodepng_error_text(error));
    +
    138  }
    +
    139  flip_image_vertical(data, width, height);
    +
    140  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
    +
    141  GL_UNSIGNED_BYTE, data);
    +
    142  free(data);
    +
    143 }
    +
    void flip_image_vertical(unsigned char *data, unsigned int width, unsigned int height)
    Definition: util.c:117
    +
    +
    +
    + +

    ◆ load_program()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint load_program (const char * path1,
    const char * path2 
    )
    +
    + +

    Definition at line 110 of file util.c.

    +
    110  {
    +
    111  GLuint shader1 = load_shader(GL_VERTEX_SHADER, path1);
    +
    112  GLuint shader2 = load_shader(GL_FRAGMENT_SHADER, path2);
    +
    113  GLuint program = make_program(shader1, shader2);
    +
    114  return program;
    +
    115 }
    +
    GLuint load_shader(GLenum type, const char *path)
    Definition: util.c:81
    +
    GLuint make_program(GLuint shader1, GLuint shader2)
    Definition: util.c:88
    +
    +
    +
    + +

    ◆ load_shader()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint load_shader (GLenum type,
    const char * path 
    )
    +
    + +

    Definition at line 81 of file util.c.

    +
    81  {
    +
    82  char *data = load_file(path);
    +
    83  GLuint result = make_shader(type, data);
    +
    84  free(data);
    +
    85  return result;
    +
    86 }
    +
    GLuint make_shader(GLenum type, const char *source)
    Definition: util.c:64
    +
    char * load_file(const char *path)
    Definition: util.c:29
    +
    +
    +
    + +

    ◆ make_program()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint make_program (GLuint shader1,
    GLuint shader2 
    )
    +
    + +

    Definition at line 88 of file util.c.

    +
    88  {
    +
    89  GLuint program = glCreateProgram();
    +
    90  glAttachShader(program, shader1);
    +
    91  glAttachShader(program, shader2);
    +
    92  glLinkProgram(program);
    +
    93  GLint status;
    +
    94  glGetProgramiv(program, GL_LINK_STATUS, &status);
    +
    95  if (status == GL_FALSE) {
    +
    96  GLint length;
    +
    97  glGetProgramiv(program, GL_INFO_LOG_LENGTH, &length);
    +
    98  GLchar *info = calloc(length, sizeof(GLchar));
    +
    99  glGetProgramInfoLog(program, length, NULL, info);
    +
    100  fprintf(stderr, "glLinkProgram failed: %s\n", info);
    +
    101  free(info);
    +
    102  }
    +
    103  glDetachShader(program, shader1);
    +
    104  glDetachShader(program, shader2);
    +
    105  glDeleteShader(shader1);
    +
    106  glDeleteShader(shader2);
    +
    107  return program;
    +
    108 }
    +
    +
    +
    + +

    ◆ make_shader()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLuint make_shader (GLenum type,
    const char * source 
    )
    +
    + +

    Definition at line 64 of file util.c.

    +
    64  {
    +
    65  GLuint shader = glCreateShader(type);
    +
    66  glShaderSource(shader, 1, &source, NULL);
    +
    67  glCompileShader(shader);
    +
    68  GLint status;
    +
    69  glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
    +
    70  if (status == GL_FALSE) {
    +
    71  GLint length;
    +
    72  glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length);
    +
    73  GLchar *info = calloc(length, sizeof(GLchar));
    +
    74  glGetShaderInfoLog(shader, length, NULL, info);
    +
    75  fprintf(stderr, "glCompileShader failed:\n%s\n", info);
    +
    76  free(info);
    +
    77  }
    +
    78  return shader;
    +
    79 }
    +
    +
    +
    + +

    ◆ malloc_faces()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    GLfloat* malloc_faces (int components,
    int faces 
    )
    +
    + +

    Definition at line 53 of file util.c.

    +
    53  {
    +
    54  return malloc(sizeof(GLfloat) * 6 * components * faces);
    +
    55 }
    +
    +
    +
    + +

    ◆ rand_double()

    + +
    +
    + + + + + + + +
    double rand_double ()
    +
    + +

    Definition at line 14 of file util.c.

    +
    14  {
    +
    15  return (double)rand() / (double)RAND_MAX;
    +
    16 }
    +
    +
    +
    + +

    ◆ rand_int()

    + +
    +
    + + + + + + + + +
    int rand_int (int n)
    +
    + +

    Definition at line 8 of file util.c.

    +
    8  {
    +
    9  int result;
    +
    10  while (n <= (result = rand() / (RAND_MAX / n)));
    +
    11  return result;
    +
    12 }
    +
    +
    +
    + +

    ◆ string_width()

    + +
    +
    + + + + + + + + +
    int string_width (const char * input)
    +
    + +

    Definition at line 177 of file util.c.

    +
    177  {
    +
    178  int result = 0;
    +
    179  int length = strlen(input);
    +
    180  for (int i = 0; i < length; i++) {
    +
    181  result += char_width(input[i]);
    +
    182  }
    +
    183  return result;
    +
    184 }
    +
    int char_width(char input)
    Definition: util.c:163
    +
    +
    +
    + +

    ◆ tokenize()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    char* tokenize (char * str,
    const char * delim,
    char ** key 
    )
    +
    + +

    Definition at line 145 of file util.c.

    +
    145  {
    +
    146  char *result;
    +
    147  if (str == NULL) {
    +
    148  str = *key;
    +
    149  }
    +
    150  str += strspn(str, delim);
    +
    151  if (*str == '\0') {
    +
    152  return NULL;
    +
    153  }
    +
    154  result = str;
    +
    155  str += strcspn(str, delim);
    +
    156  if (*str) {
    +
    157  *str++ = '\0';
    +
    158  }
    +
    159  *key = str;
    +
    160  return result;
    +
    161 }
    +
    +
    +
    + +

    ◆ update_fps()

    + +
    +
    + + + + + + + + +
    void update_fps (FPSfps)
    +
    + +

    Definition at line 18 of file util.c.

    +
    18  {
    +
    19  fps->frames++;
    +
    20  double now = glfwGetTime();
    +
    21  double elapsed = now - fps->since;
    +
    22  if (elapsed >= 1) {
    +
    23  fps->fps = round(fps->frames / elapsed);
    +
    24  fps->frames = 0;
    +
    25  fps->since = now;
    +
    26  }
    +
    27 }
    +
    double since
    Definition: util.h:25
    +
    unsigned int fps
    Definition: util.h:23
    +
    unsigned int frames
    Definition: util.h:24
    +
    +
    +
    + +

    ◆ wrap()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int wrap (const char * input,
    int max_width,
    char * output,
    int max_length 
    )
    +
    + +

    Definition at line 186 of file util.c.

    +
    186  {
    +
    187  *output = '\0';
    +
    188  char *text = malloc(sizeof(char) * (strlen(input) + 1));
    +
    189  strcpy(text, input);
    +
    190  int space_width = char_width(' ');
    +
    191  int line_number = 0;
    +
    192  char *key1, *key2;
    +
    193  char *line = tokenize(text, "\r\n", &key1);
    +
    194  while (line) {
    +
    195  int line_width = 0;
    +
    196  char *token = tokenize(line, " ", &key2);
    +
    197  while (token) {
    +
    198  int token_width = string_width(token);
    +
    199  if (line_width) {
    +
    200  if (line_width + token_width > max_width) {
    +
    201  line_width = 0;
    +
    202  line_number++;
    +
    203  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    204  }
    +
    205  else {
    +
    206  strncat(output, " ", max_length - strlen(output) - 1);
    +
    207  }
    +
    208  }
    +
    209  strncat(output, token, max_length - strlen(output) - 1);
    +
    210  line_width += token_width + space_width;
    +
    211  token = tokenize(NULL, " ", &key2);
    +
    212  }
    +
    213  line_number++;
    +
    214  strncat(output, "\n", max_length - strlen(output) - 1);
    +
    215  line = tokenize(NULL, "\r\n", &key1);
    +
    216  }
    +
    217  free(text);
    +
    218  return line_number;
    +
    219 }
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/util_8h_source.html b/documentation/html/util_8h_source.html new file mode 100644 index 000000000..be47e0e06 --- /dev/null +++ b/documentation/html/util_8h_source.html @@ -0,0 +1,145 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/util.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    util.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _util_h_
    +
    2 #define _util_h_
    +
    3 
    +
    4 #include <GL/glew.h>
    +
    5 #include <GLFW/glfw3.h>
    +
    6 #include "config.h"
    +
    7 
    +
    8 #define PI 3.14159265359
    +
    9 #define DEGREES(radians) ((radians) * 180 / PI)
    +
    10 #define RADIANS(degrees) ((degrees) * PI / 180)
    +
    11 #define ABS(x) ((x) < 0 ? (-(x)) : (x))
    +
    12 #define MIN(a, b) ((a) < (b) ? (a) : (b))
    +
    13 #define MAX(a, b) ((a) > (b) ? (a) : (b))
    +
    14 #define SIGN(x) (((x) > 0) - ((x) < 0))
    +
    15 
    +
    16 #if DEBUG
    +
    17  #define LOG(...) printf(__VA_ARGS__)
    +
    18 #else
    +
    19  #define LOG(...)
    +
    20 #endif
    +
    21 
    +
    22 typedef struct {
    +
    23  unsigned int fps;
    +
    24  unsigned int frames;
    +
    25  double since;
    +
    26 } FPS;
    +
    27 
    +
    28 int rand_int(int n);
    +
    29 double rand_double();
    +
    30 void update_fps(FPS *fps);
    +
    31 
    +
    32 GLuint gen_buffer(GLsizei size, GLfloat *data);
    +
    33 void del_buffer(GLuint buffer);
    +
    34 GLfloat *malloc_faces(int components, int faces);
    +
    35 GLuint gen_faces(int components, int faces, GLfloat *data);
    +
    36 GLuint make_shader(GLenum type, const char *source);
    +
    37 GLuint load_shader(GLenum type, const char *path);
    +
    38 GLuint make_program(GLuint shader1, GLuint shader2);
    +
    39 GLuint load_program(const char *path1, const char *path2);
    +
    40 void load_png_texture(const char *file_name);
    +
    41 char *tokenize(char *str, const char *delim, char **key);
    +
    42 int char_width(char input);
    +
    43 int string_width(const char *input);
    +
    44 int wrap(const char *input, int max_width, char *output, int max_length);
    +
    45 
    +
    46 #endif
    + +
    Definition: util.h:22
    +
    double since
    Definition: util.h:25
    +
    unsigned int fps
    Definition: util.h:23
    +
    unsigned int frames
    Definition: util.h:24
    +
    GLfloat * malloc_faces(int components, int faces)
    Definition: util.c:53
    +
    double rand_double()
    Definition: util.c:14
    +
    char * tokenize(char *str, const char *delim, char **key)
    Definition: util.c:145
    +
    GLuint load_shader(GLenum type, const char *path)
    Definition: util.c:81
    +
    GLuint make_program(GLuint shader1, GLuint shader2)
    Definition: util.c:88
    +
    int string_width(const char *input)
    Definition: util.c:177
    +
    GLuint load_program(const char *path1, const char *path2)
    Definition: util.c:110
    +
    int rand_int(int n)
    Definition: util.c:8
    +
    int char_width(char input)
    Definition: util.c:163
    +
    int wrap(const char *input, int max_width, char *output, int max_length)
    Definition: util.c:186
    +
    GLuint make_shader(GLenum type, const char *source)
    Definition: util.c:64
    +
    void del_buffer(GLuint buffer)
    Definition: util.c:49
    +
    void load_png_texture(const char *file_name)
    Definition: util.c:131
    +
    GLuint gen_buffer(GLsizei size, GLfloat *data)
    Definition: util.c:40
    +
    GLuint gen_faces(int components, int faces, GLfloat *data)
    Definition: util.c:57
    +
    void update_fps(FPS *fps)
    Definition: util.c:18
    +
    + + + + diff --git a/documentation/html/world_8c.html b/documentation/html/world_8c.html new file mode 100644 index 000000000..1af774351 --- /dev/null +++ b/documentation/html/world_8c.html @@ -0,0 +1,219 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/world.c File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    world.c File Reference
    +
    +
    +
    #include "config.h"
    +#include "noise.h"
    +#include "world.h"
    +
    +

    Go to the source code of this file.

    + + + + +

    +Functions

    void create_world (int p, int q, world_func func, void *arg)
     
    +

    Function Documentation

    + +

    ◆ create_world()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void create_world (int p,
    int q,
    world_func func,
    void * arg 
    )
    +
    + +

    Definition at line 5 of file world.c.

    +
    5  {
    +
    6  int pad = 1;
    +
    7  for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
    +
    8  for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
    +
    9  int flag = 1;
    +
    10  if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
    +
    11  flag = -1;
    +
    12  }
    +
    13  int x = p * CHUNK_SIZE + dx;
    +
    14  int z = q * CHUNK_SIZE + dz;
    +
    15  float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
    +
    16  float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
    +
    17  int mh = g * 32 + 16;
    +
    18  int h = f * mh;
    +
    19  int w = 1;
    +
    20  int t = 12;
    +
    21  if (h <= t) {
    +
    22  h = t;
    +
    23  w = 2;
    +
    24  }
    +
    25  // sand and grass terrain
    +
    26  for (int y = 0; y < h; y++) {
    +
    27  func(x, y, z, w * flag, arg);
    +
    28  }
    +
    29  if (w == 1) {
    +
    30  if (SHOW_PLANTS) {
    +
    31  // grass
    +
    32  if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
    +
    33  func(x, h, z, 17 * flag, arg);
    +
    34  }
    +
    35  // flowers
    +
    36  if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
    +
    37  int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
    +
    38  func(x, h, z, w * flag, arg);
    +
    39  }
    +
    40  }
    +
    41  // trees
    +
    42  int ok = SHOW_TREES;
    +
    43  if (dx - 4 < 0 || dz - 4 < 0 ||
    +
    44  dx + 4 >= CHUNK_SIZE || dz + 4 >= CHUNK_SIZE)
    +
    45  {
    +
    46  ok = 0;
    +
    47  }
    +
    48  if (ok && simplex2(x, z, 6, 0.5, 2) > 0.84) {
    +
    49  for (int y = h + 3; y < h + 8; y++) {
    +
    50  for (int ox = -3; ox <= 3; ox++) {
    +
    51  for (int oz = -3; oz <= 3; oz++) {
    +
    52  int d = (ox * ox) + (oz * oz) +
    +
    53  (y - (h + 4)) * (y - (h + 4));
    +
    54  if (d < 11) {
    +
    55  func(x + ox, y, z + oz, 15, arg);
    +
    56  }
    +
    57  }
    +
    58  }
    +
    59  }
    +
    60  for (int y = h; y < h + 7; y++) {
    +
    61  func(x, y, z, 5, arg);
    +
    62  }
    +
    63  }
    +
    64  }
    +
    65  // clouds
    +
    66  if (SHOW_CLOUDS) {
    +
    67  for (int y = 64; y < 72; y++) {
    +
    68  if (simplex3(
    +
    69  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    70  {
    +
    71  func(x, y, z, 16 * flag, arg);
    +
    72  }
    +
    73  }
    +
    74  for (int y = 64; y < 72; y++) {
    +
    75  if (simplex3(
    +
    76  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    77  {
    +
    78  func(x, y-1, z, 25 * flag, arg);
    +
    79  }
    +
    80  }
    +
    81  }
    +
    82  }
    +
    83  }
    +
    84 }
    +
    #define SHOW_PLANTS
    Definition: config.h:18
    +
    #define SHOW_CLOUDS
    Definition: config.h:19
    +
    #define SHOW_TREES
    Definition: config.h:20
    +
    #define CHUNK_SIZE
    Definition: config.h:51
    +
    static Model * g
    Definition: main.c:135
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/world_8c_source.html b/documentation/html/world_8c_source.html new file mode 100644 index 000000000..68200a364 --- /dev/null +++ b/documentation/html/world_8c_source.html @@ -0,0 +1,171 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/world.c Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    world.c
    +
    +
    +Go to the documentation of this file.
    1 #include "config.h"
    +
    2 #include "noise.h"
    +
    3 #include "world.h"
    +
    4 
    +
    5 void create_world(int p, int q, world_func func, void *arg) {
    +
    6  int pad = 1;
    +
    7  for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
    +
    8  for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
    +
    9  int flag = 1;
    +
    10  if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
    +
    11  flag = -1;
    +
    12  }
    +
    13  int x = p * CHUNK_SIZE + dx;
    +
    14  int z = q * CHUNK_SIZE + dz;
    +
    15  float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
    +
    16  float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
    +
    17  int mh = g * 32 + 16;
    +
    18  int h = f * mh;
    +
    19  int w = 1;
    +
    20  int t = 12;
    +
    21  if (h <= t) {
    +
    22  h = t;
    +
    23  w = 2;
    +
    24  }
    +
    25  // sand and grass terrain
    +
    26  for (int y = 0; y < h; y++) {
    +
    27  func(x, y, z, w * flag, arg);
    +
    28  }
    +
    29  if (w == 1) {
    +
    30  if (SHOW_PLANTS) {
    +
    31  // grass
    +
    32  if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
    +
    33  func(x, h, z, 17 * flag, arg);
    +
    34  }
    +
    35  // flowers
    +
    36  if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
    +
    37  int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
    +
    38  func(x, h, z, w * flag, arg);
    +
    39  }
    +
    40  }
    +
    41  // trees
    +
    42  int ok = SHOW_TREES;
    +
    43  if (dx - 4 < 0 || dz - 4 < 0 ||
    +
    44  dx + 4 >= CHUNK_SIZE || dz + 4 >= CHUNK_SIZE)
    +
    45  {
    +
    46  ok = 0;
    +
    47  }
    +
    48  if (ok && simplex2(x, z, 6, 0.5, 2) > 0.84) {
    +
    49  for (int y = h + 3; y < h + 8; y++) {
    +
    50  for (int ox = -3; ox <= 3; ox++) {
    +
    51  for (int oz = -3; oz <= 3; oz++) {
    +
    52  int d = (ox * ox) + (oz * oz) +
    +
    53  (y - (h + 4)) * (y - (h + 4));
    +
    54  if (d < 11) {
    +
    55  func(x + ox, y, z + oz, 15, arg);
    +
    56  }
    +
    57  }
    +
    58  }
    +
    59  }
    +
    60  for (int y = h; y < h + 7; y++) {
    +
    61  func(x, y, z, 5, arg);
    +
    62  }
    +
    63  }
    +
    64  }
    +
    65  // clouds
    +
    66  if (SHOW_CLOUDS) {
    +
    67  for (int y = 64; y < 72; y++) {
    +
    68  if (simplex3(
    +
    69  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    70  {
    +
    71  func(x, y, z, 16 * flag, arg);
    +
    72  }
    +
    73  }
    +
    74  for (int y = 64; y < 72; y++) {
    +
    75  if (simplex3(
    +
    76  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    77  {
    +
    78  func(x, y-1, z, 25 * flag, arg);
    +
    79  }
    +
    80  }
    +
    81  }
    +
    82  }
    +
    83  }
    +
    84 }
    + +
    #define SHOW_PLANTS
    Definition: config.h:18
    +
    #define SHOW_CLOUDS
    Definition: config.h:19
    +
    #define SHOW_TREES
    Definition: config.h:20
    +
    #define CHUNK_SIZE
    Definition: config.h:51
    +
    static Model * g
    Definition: main.c:135
    +
    void create_world(int p, int q, world_func func, void *arg)
    Definition: world.c:5
    + +
    void(* world_func)(int, int, int, int, void *)
    Definition: world.h:4
    +
    + + + + diff --git a/documentation/html/world_8h.html b/documentation/html/world_8h.html new file mode 100644 index 000000000..ba56c5355 --- /dev/null +++ b/documentation/html/world_8h.html @@ -0,0 +1,239 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/world.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    world.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* world_func) (int, int, int, int, void *)
     
    + + + +

    +Functions

    void create_world (int p, int q, world_func func, void *arg)
     
    +

    Typedef Documentation

    + +

    ◆ world_func

    + +
    +
    + + + + +
    typedef void(* world_func) (int, int, int, int, void *)
    +
    + +

    Definition at line 4 of file world.h.

    + +
    +
    +

    Function Documentation

    + +

    ◆ create_world()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void create_world (int p,
    int q,
    world_func func,
    void * arg 
    )
    +
    + +

    Definition at line 5 of file world.c.

    +
    5  {
    +
    6  int pad = 1;
    +
    7  for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
    +
    8  for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
    +
    9  int flag = 1;
    +
    10  if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
    +
    11  flag = -1;
    +
    12  }
    +
    13  int x = p * CHUNK_SIZE + dx;
    +
    14  int z = q * CHUNK_SIZE + dz;
    +
    15  float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
    +
    16  float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
    +
    17  int mh = g * 32 + 16;
    +
    18  int h = f * mh;
    +
    19  int w = 1;
    +
    20  int t = 12;
    +
    21  if (h <= t) {
    +
    22  h = t;
    +
    23  w = 2;
    +
    24  }
    +
    25  // sand and grass terrain
    +
    26  for (int y = 0; y < h; y++) {
    +
    27  func(x, y, z, w * flag, arg);
    +
    28  }
    +
    29  if (w == 1) {
    +
    30  if (SHOW_PLANTS) {
    +
    31  // grass
    +
    32  if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
    +
    33  func(x, h, z, 17 * flag, arg);
    +
    34  }
    +
    35  // flowers
    +
    36  if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
    +
    37  int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
    +
    38  func(x, h, z, w * flag, arg);
    +
    39  }
    +
    40  }
    +
    41  // trees
    +
    42  int ok = SHOW_TREES;
    +
    43  if (dx - 4 < 0 || dz - 4 < 0 ||
    +
    44  dx + 4 >= CHUNK_SIZE || dz + 4 >= CHUNK_SIZE)
    +
    45  {
    +
    46  ok = 0;
    +
    47  }
    +
    48  if (ok && simplex2(x, z, 6, 0.5, 2) > 0.84) {
    +
    49  for (int y = h + 3; y < h + 8; y++) {
    +
    50  for (int ox = -3; ox <= 3; ox++) {
    +
    51  for (int oz = -3; oz <= 3; oz++) {
    +
    52  int d = (ox * ox) + (oz * oz) +
    +
    53  (y - (h + 4)) * (y - (h + 4));
    +
    54  if (d < 11) {
    +
    55  func(x + ox, y, z + oz, 15, arg);
    +
    56  }
    +
    57  }
    +
    58  }
    +
    59  }
    +
    60  for (int y = h; y < h + 7; y++) {
    +
    61  func(x, y, z, 5, arg);
    +
    62  }
    +
    63  }
    +
    64  }
    +
    65  // clouds
    +
    66  if (SHOW_CLOUDS) {
    +
    67  for (int y = 64; y < 72; y++) {
    +
    68  if (simplex3(
    +
    69  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    70  {
    +
    71  func(x, y, z, 16 * flag, arg);
    +
    72  }
    +
    73  }
    +
    74  for (int y = 64; y < 72; y++) {
    +
    75  if (simplex3(
    +
    76  x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
    +
    77  {
    +
    78  func(x, y-1, z, 25 * flag, arg);
    +
    79  }
    +
    80  }
    +
    81  }
    +
    82  }
    +
    83  }
    +
    84 }
    +
    #define SHOW_PLANTS
    Definition: config.h:18
    +
    #define SHOW_CLOUDS
    Definition: config.h:19
    +
    #define SHOW_TREES
    Definition: config.h:20
    +
    #define CHUNK_SIZE
    Definition: config.h:51
    +
    static Model * g
    Definition: main.c:135
    +
    +
    +
    +
    + + + + diff --git a/documentation/html/world_8h_source.html b/documentation/html/world_8h_source.html new file mode 100644 index 000000000..d0bb7243f --- /dev/null +++ b/documentation/html/world_8h_source.html @@ -0,0 +1,88 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/src/world.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    +
    +
    world.h
    +
    +
    +Go to the documentation of this file.
    1 #ifndef _world_h_
    +
    2 #define _world_h_
    +
    3 
    +
    4 typedef void (*world_func)(int, int, int, int, void *);
    +
    5 
    +
    6 void create_world(int p, int q, world_func func, void *arg);
    +
    7 
    +
    8 #endif
    +
    void create_world(int p, int q, world_func func, void *arg)
    Definition: world.c:5
    +
    void(* world_func)(int, int, int, int, void *)
    Definition: world.h:4
    +
    + + + + diff --git a/documentation/html/world_8py.html b/documentation/html/world_8py.html new file mode 100644 index 000000000..0d1524584 --- /dev/null +++ b/documentation/html/world_8py.html @@ -0,0 +1,110 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/world.py File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/world.py File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Classes

    class  world.World
     
    + + + +

    +Namespaces

    namespace  world
     
    + + + + + + + + + +

    +Functions

    def world.dll_seed (x)
     
    def world.dll_create_world (p, q)
     
    def world.dll_simplex2 (x, y, octaves=1, persistence=0.5, lacunarity=2.0)
     
    def world.dll_simplex3 (x, y, z, octaves=1, persistence=0.5, lacunarity=2.0)
     
    + + + + + +

    +Variables

     world.dll = CDLL('./world')
     
     world.WORLD_FUNC = CFUNCTYPE(None, c_int, c_int, c_int, c_int, c_void_p)
     
    +
    + + + + diff --git a/documentation/html/world_8py_source.html b/documentation/html/world_8py_source.html new file mode 100644 index 000000000..ff0981d0f --- /dev/null +++ b/documentation/html/world_8py_source.html @@ -0,0 +1,135 @@ + + + + + + + +Craft: /home/david/Desktop/Software_Eng/Group_9/Craft/world.py Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    /home/david/Desktop/Software_Eng/Group_9/Craft/world.py
    +
    +
    +Go to the documentation of this file.
    1 # gcc -std=c99 -O3 -shared -o world \
    +
    2 # -I src -I deps/noise deps/noise/noise.c src/world.c
    +
    3 
    +
    4 from ctypes import CDLL, CFUNCTYPE, c_float, c_int, c_void_p
    +
    5 from collections import OrderedDict
    +
    6 
    +
    7 dll = CDLL('./world')
    +
    8 
    +
    9 WORLD_FUNC = CFUNCTYPE(None, c_int, c_int, c_int, c_int, c_void_p)
    +
    10 
    +
    11 def dll_seed(x):
    +
    12  dll.seed(x)
    +
    13 
    +
    14 def dll_create_world(p, q):
    +
    15  result = {}
    +
    16  def world_func(x, y, z, w, arg):
    +
    17  result[(x, y, z)] = w
    +
    18  dll.create_world(p, q, WORLD_FUNC(world_func), None)
    +
    19  return result
    +
    20 
    +
    21 dll.simplex2.restype = c_float
    +
    22 dll.simplex2.argtypes = [c_float, c_float, c_int, c_float, c_float]
    +
    23 def dll_simplex2(x, y, octaves=1, persistence=0.5, lacunarity=2.0):
    +
    24  return dll.simplex2(x, y, octaves, persistence, lacunarity)
    +
    25 
    +
    26 dll.simplex3.restype = c_float
    +
    27 dll.simplex3.argtypes = [c_float, c_float, c_float, c_int, c_float, c_float]
    +
    28 def dll_simplex3(x, y, z, octaves=1, persistence=0.5, lacunarity=2.0):
    +
    29  return dll.simplex3(x, y, z, octaves, persistence, lacunarity)
    +
    30 
    +
    31 class World(object):
    +
    32  def __init__(self, seed=None, cache_size=64):
    +
    33  self.seedseed = seed
    +
    34  self.cachecache = OrderedDict()
    +
    35  self.cache_sizecache_size = cache_size
    +
    36  def create_chunk(self, p, q):
    +
    37  if self.seedseed is not None:
    +
    38  dll_seed(self.seedseed)
    +
    39  return dll_create_world(p, q)
    +
    40  def get_chunk(self, p, q):
    +
    41  try:
    +
    42  chunk = self.cachecache.pop((p, q))
    +
    43  except KeyError:
    +
    44  chunk = self.create_chunkcreate_chunk(p, q)
    +
    45  self.cachecache[(p, q)] = chunk
    +
    46  if len(self.cachecache) > self.cache_sizecache_size:
    +
    47  self.cachecache.popitem(False)
    +
    48  return chunk
    + +
    def create_chunk(self, p, q)
    Definition: world.py:36
    + +
    def __init__(self, seed=None, cache_size=64)
    Definition: world.py:32
    +
    cache_size
    Definition: world.py:35
    + +
    def get_chunk(self, p, q)
    Definition: world.py:40
    +
    WORLD_FUNC
    Definition: world.py:9
    +
    def dll_create_world(p, q)
    Definition: world.py:14
    +
    def dll_seed(x)
    Definition: world.py:11
    +
    def dll_simplex2(x, y, octaves=1, persistence=0.5, lacunarity=2.0)
    Definition: world.py:23
    +
    def dll_simplex3(x, y, z, octaves=1, persistence=0.5, lacunarity=2.0)
    Definition: world.py:28
    +
    void(* world_func)(int, int, int, int, void *)
    Definition: world.h:4
    +
    + + + + diff --git a/html/annotated.html b/html/annotated.html index 86b9c0c5c..89b6a2298 100644 --- a/html/annotated.html +++ b/html/annotated.html @@ -3,9 +3,9 @@ - + -My Project: Class List +Craft: Class List @@ -21,7 +21,7 @@ -
    My Project +
    Craft
    @@ -29,10 +29,10 @@
    - + @@ -70,10 +70,10 @@  Nbuilder  CClient  Nserver - CHandler - CModel - CRateLimiter - CServer + CRateLimiter + CServer + CHandler + CModel  Nworld  CWorld @@ -81,9 +81,7 @@
  • diff --git a/html/builder_8py_source.html b/html/builder_8py_source.html new file mode 100644 index 000000000..4697bc73e --- /dev/null +++ b/html/builder_8py_source.html @@ -0,0 +1,326 @@ + + + + + + + +Craft: builder.py Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Craft +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    + +
    + +
    +
    +
    builder.py
    +
    +
    +
    1 # This file allows you to programmatically create blocks in Craft.
    +
    2 # Please use this wisely. Test on your own server first. Do not abuse it.
    +
    3 
    +
    4 import requests
    +
    5 import socket
    +
    6 import sqlite3
    +
    7 import sys
    +
    8 
    +
    9 DEFAULT_HOST = '127.0.0.1'
    +
    10 DEFAULT_PORT = 4080
    +
    11 
    +
    12 EMPTY = 0
    +
    13 GRASS = 1
    +
    14 SAND = 2
    +
    15 STONE = 3
    +
    16 BRICK = 4
    +
    17 WOOD = 5
    +
    18 CEMENT = 6
    +
    19 DIRT = 7
    +
    20 PLANK = 8
    +
    21 SNOW = 9
    +
    22 GLASS = 10
    +
    23 COBBLE = 11
    +
    24 LIGHT_STONE = 12
    +
    25 DARK_STONE = 13
    +
    26 CHEST = 14
    +
    27 LEAVES = 15
    +
    28 CLOUD = 16
    +
    29 TALL_GRASS = 17
    +
    30 YELLOW_FLOWER = 18
    +
    31 RED_FLOWER = 19
    +
    32 PURPLE_FLOWER = 20
    +
    33 SUN_FLOWER = 21
    +
    34 WHITE_FLOWER = 22
    +
    35 BLUE_FLOWER = 23
    +
    36 
    +
    37 OFFSETS = [
    +
    38  (-0.5, -0.5, -0.5),
    +
    39  (-0.5, -0.5, 0.5),
    +
    40  (-0.5, 0.5, -0.5),
    +
    41  (-0.5, 0.5, 0.5),
    +
    42  (0.5, -0.5, -0.5),
    +
    43  (0.5, -0.5, 0.5),
    +
    44  (0.5, 0.5, -0.5),
    +
    45  (0.5, 0.5, 0.5),
    +
    46 ]
    +
    47 
    +
    48 def sphere(cx, cy, cz, r, fill=False, fx=False, fy=False, fz=False):
    +
    49  result = set()
    +
    50  for x in range(cx - r, cx + r + 1):
    +
    51  if fx and x != cx:
    +
    52  continue
    +
    53  for y in range(cy - r, cy + r + 1):
    +
    54  # if y < cy:
    +
    55  # continue # top hemisphere only
    +
    56  if fy and y != cy:
    +
    57  continue
    +
    58  for z in range(cz - r, cz + r + 1):
    +
    59  if fz and z != cz:
    +
    60  continue
    +
    61  inside = False
    +
    62  outside = fill
    +
    63  for dx, dy, dz in OFFSETS:
    +
    64  ox, oy, oz = x + dx, y + dy, z + dz
    +
    65  d2 = (ox - cx) ** 2 + (oy - cy) ** 2 + (oz - cz) ** 2
    +
    66  d = d2 ** 0.5
    +
    67  if d < r:
    +
    68  inside = True
    +
    69  else:
    +
    70  outside = True
    +
    71  if inside and outside:
    +
    72  result.add((x, y, z))
    +
    73  return result
    +
    74 
    +
    75 def circle_x(x, y, z, r, fill=False):
    +
    76  return sphere(x, y, z, r, fill, fx=True)
    +
    77 
    +
    78 def circle_y(x, y, z, r, fill=False):
    +
    79  return sphere(x, y, z, r, fill, fy=True)
    +
    80 
    +
    81 def circle_z(x, y, z, r, fill=False):
    +
    82  return sphere(x, y, z, r, fill, fz=True)
    +
    83 
    +
    84 def cylinder_x(x1, x2, y, z, r, fill=False):
    +
    85  x1, x2 = sorted((x1, x2))
    +
    86  result = set()
    +
    87  for x in range(x1, x2 + 1):
    +
    88  result |= circle_x(x, y, z, r, fill)
    +
    89  return result
    +
    90 
    +
    91 def cylinder_y(x, y1, y2, z, r, fill=False):
    +
    92  y1, y2 = sorted((y1, y2))
    +
    93  result = set()
    +
    94  for y in range(y1, y2 + 1):
    +
    95  result |= circle_y(x, y, z, r, fill)
    +
    96  return result
    +
    97 
    +
    98 def cylinder_z(x, y, z1, z2, r, fill=False):
    +
    99  z1, z2 = sorted((z1, z2))
    +
    100  result = set()
    +
    101  for z in range(z1, z2 + 1):
    +
    102  result |= circle_z(x, y, z, r, fill)
    +
    103  return result
    +
    104 
    +
    105 def cuboid(x1, x2, y1, y2, z1, z2, fill=True):
    +
    106  x1, x2 = sorted((x1, x2))
    +
    107  y1, y2 = sorted((y1, y2))
    +
    108  z1, z2 = sorted((z1, z2))
    +
    109  result = set()
    +
    110  a = (x1 == x2) + (y1 == y2) + (z1 == z2)
    +
    111  for x in range(x1, x2 + 1):
    +
    112  for y in range(y1, y2 + 1):
    +
    113  for z in range(z1, z2 + 1):
    +
    114  n = 0
    +
    115  n += x in (x1, x2)
    +
    116  n += y in (y1, y2)
    +
    117  n += z in (z1, z2)
    +
    118  if not fill and n <= a:
    +
    119  continue
    +
    120  result.add((x, y, z))
    +
    121  return result
    +
    122 
    +
    123 def pyramid(x1, x2, y, z1, z2, fill=False):
    +
    124  x1, x2 = sorted((x1, x2))
    +
    125  z1, z2 = sorted((z1, z2))
    +
    126  result = set()
    +
    127  while x2 >= x1 and z2 >= z2:
    +
    128  result |= cuboid(x1, x2, y, y, z1, z2, fill)
    +
    129  y, x1, x2, z1, z2 = y + 1, x1 + 1, x2 - 1, z1 + 1, z2 - 1
    +
    130  return result
    +
    131 
    +
    132 def get_identity():
    +
    133  query = (
    +
    134  'select username, token from identity_token where selected = 1;'
    +
    135  )
    +
    136  conn = sqlite3.connect('auth.db')
    +
    137  rows = conn.execute(query)
    +
    138  for row in rows:
    +
    139  return row
    +
    140  raise Exception('No identities found.')
    +
    141 
    +
    142 class Client(object):
    +
    143  def __init__(self, host, port):
    +
    144  self.connconn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    +
    145  self.connconn.connect((host, port))
    +
    146  self.authenticateauthenticate()
    +
    147  def authenticate(self):
    +
    148  username, identity_token = get_identity()
    +
    149  url = 'https://craft.michaelfogleman.com/api/1/identity'
    +
    150  payload = {
    +
    151  'username': username,
    +
    152  'identity_token': identity_token,
    +
    153  }
    +
    154  response = requests.post(url, data=payload)
    +
    155  if response.status_code == 200 and response.text.isalnum():
    +
    156  access_token = response.text
    +
    157  self.connconn.sendall('A,%s,%s\n' % (username, access_token))
    +
    158  else:
    +
    159  raise Exception('Failed to authenticate.')
    +
    160  def set_block(self, x, y, z, w):
    +
    161  self.connconn.sendall('B,%d,%d,%d,%d\n' % (x, y, z, w))
    +
    162  def set_blocks(self, blocks, w):
    +
    163  key = lambda block: (block[1], block[0], block[2])
    +
    164  for x, y, z in sorted(blocks, key=key):
    +
    165  self.set_blockset_block(x, y, z, w)
    +
    166  def bitmap(self, sx, sy, sz, d1, d2, data, lookup):
    +
    167  x, y, z = sx, sy, sz
    +
    168  dx1, dy1, dz1 = d1
    +
    169  dx2, dy2, dz2 = d2
    +
    170  for row in data:
    +
    171  x = sx if dx1 else x
    +
    172  y = sy if dy1 else y
    +
    173  z = sz if dz1 else z
    +
    174  for c in row:
    +
    175  w = lookup.get(c)
    +
    176  if w is not None:
    +
    177  self.set_blockset_block(x, y, z, w)
    +
    178  x, y, z = x + dx1, y + dy1, z + dz1
    +
    179  x, y, z = x + dx2, y + dy2, z + dz2
    +
    180 
    +
    181 def get_client():
    +
    182  default_args = [DEFAULT_HOST, DEFAULT_PORT]
    +
    183  args = sys.argv[1:] + [None] * len(default_args)
    +
    184  host, port = [a or b for a, b in zip(args, default_args)]
    +
    185  client = Client(host, int(port))
    +
    186  return client
    +
    187 
    +
    188 def main():
    +
    189  client = get_client()
    +
    190  set_block = client.set_block
    +
    191  set_blocks = client.set_blocks
    +
    192  # set_blocks(circle_y(0, 32, 0, 16, True), STONE)
    +
    193  # set_blocks(circle_y(0, 33, 0, 16), BRICK)
    +
    194  # set_blocks(cuboid(-1, 1, 1, 31, -1, 1), CEMENT)
    +
    195  # set_blocks(cuboid(-1024, 1024, 32, 32, -3, 3), STONE)
    +
    196  # set_blocks(cuboid(-3, 3, 32, 32, -1024, 1024), STONE)
    +
    197  # set_blocks(cuboid(-1024, 1024, 33, 33, -3, -3), BRICK)
    +
    198  # set_blocks(cuboid(-1024, 1024, 33, 33, 3, 3), BRICK)
    +
    199  # set_blocks(cuboid(-3, -3, 33, 33, -1024, 1024), BRICK)
    +
    200  # set_blocks(cuboid(3, 3, 33, 33, -1024, 1024), BRICK)
    +
    201  # set_blocks(sphere(0, 32, 0, 16), GLASS)
    +
    202  # for y in range(1, 32):
    +
    203  # set_blocks(circle_y(0, y, 0, 4, True), CEMENT)
    +
    204  # set_blocks(circle_x(16, 33, 0, 3), BRICK)
    +
    205  # set_blocks(circle_x(-16, 33, 0, 3), BRICK)
    +
    206  # set_blocks(circle_z(0, 33, 16, 3), BRICK)
    +
    207  # set_blocks(circle_z(0, 33, -16, 3), BRICK)
    +
    208  # for x in range(0, 1024, 32):
    +
    209  # set_blocks(cuboid(x - 1, x + 1, 31, 32, -1, 1), CEMENT)
    +
    210  # set_blocks(cuboid(-x - 1, -x + 1, 31, 32, -1, 1), CEMENT)
    +
    211  # set_blocks(cuboid(x, x, 1, 32, -1, 1), CEMENT)
    +
    212  # set_blocks(cuboid(-x, -x, 1, 32, -1, 1), CEMENT)
    +
    213  # for z in range(0, 1024, 32):
    +
    214  # set_blocks(cuboid(-1, 1, 31, 32, z - 1, z + 1), CEMENT)
    +
    215  # set_blocks(cuboid(-1, 1, 31, 32, -z - 1, -z + 1), CEMENT)
    +
    216  # set_blocks(cuboid(-1, 1, 1, 32, z, z), CEMENT)
    +
    217  # set_blocks(cuboid(-1, 1, 1, 32, -z, -z), CEMENT)
    +
    218  # for x in range(0, 1024, 8):
    +
    219  # set_block(x, 32, 0, CEMENT)
    +
    220  # set_block(-x, 32, 0, CEMENT)
    +
    221  # for z in range(0, 1024, 8):
    +
    222  # set_block(0, 32, z, CEMENT)
    +
    223  # set_block(0, 32, -z, CEMENT)
    +
    224  # set_blocks(pyramid(32, 32+64-1, 12, 32, 32+64-1), COBBLE)
    +
    225  # outer = circle_y(0, 11, 0, 176 + 3, True)
    +
    226  # inner = circle_y(0, 11, 0, 176 - 3, True)
    +
    227  # set_blocks(outer - inner, STONE)
    +
    228  # a = sphere(-32, 48, -32, 24, True)
    +
    229  # b = sphere(-24, 40, -24, 24, True)
    +
    230  # set_blocks(a - b, PLANK)
    +
    231  # set_blocks(cylinder_x(-64, 64, 32, 0, 8), STONE)
    +
    232  # data = [
    +
    233  # '...............................',
    +
    234  # '..xxx..xxxx...xxx..xxxxx.xxxxx.',
    +
    235  # '.x...x.x...x.x...x.x.......x...',
    +
    236  # '.x.....xxxx..xxxxx.xxx.....x...',
    +
    237  # '.x...x.x..x..x...x.x.......x...',
    +
    238  # '..xxx..x...x.x...x.x.......x...',
    +
    239  # '...............................',
    +
    240  # ]
    +
    241  # lookup = {
    +
    242  # 'x': STONE,
    +
    243  # '.': PLANK,
    +
    244  # }
    +
    245  # client.bitmap(0, 32, 32, (1, 0, 0), (0, -1, 0), data, lookup)
    +
    246 
    +
    247 if __name__ == '__main__':
    +
    248  main()
    + + +
    def set_block(self, x, y, z, w)
    Definition: builder.py:160
    +
    def authenticate(self)
    Definition: builder.py:147
    +
    + + + + diff --git a/html/classbuilder_1_1Client-members.html b/html/classbuilder_1_1Client-members.html index 770f8073c..388a0f748 100644 --- a/html/classbuilder_1_1Client-members.html +++ b/html/classbuilder_1_1Client-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
    My Project +
    Craft
    @@ -29,10 +29,10 @@
    - + @@ -81,9 +81,7 @@
    diff --git a/html/classbuilder_1_1Client.html b/html/classbuilder_1_1Client.html index af81c5c5d..d53a1e662 100644 --- a/html/classbuilder_1_1Client.html +++ b/html/classbuilder_1_1Client.html @@ -3,9 +3,9 @@ - + -My Project: builder.Client Class Reference +Craft: builder.Client Class Reference @@ -21,7 +21,7 @@ -
    My Project +
    Craft
    @@ -29,10 +29,10 @@
    - + @@ -76,13 +76,9 @@
    Inheritance diagram for builder.Client:
    -
    Inheritance graph
    -
    [legend]
    -
    -Collaboration diagram for builder.Client:
    -
    -
    Collaboration graph
    -
    [legend]
    +
    + +
    @@ -108,15 +104,16 @@  

    Public Member Functions

    conn
     
    -
    The documentation for this class was generated from the following file:
      -
    • builder.py
    • +

      Detailed Description

      +
      +

      Definition at line 142 of file builder.py.

      +

      The documentation for this class was generated from the following file: diff --git a/html/classbuilder_1_1Client.png b/html/classbuilder_1_1Client.png new file mode 100644 index 0000000000000000000000000000000000000000..67992aaae8f702f2c575f60d5ae3cb6c3ea60039 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^;XoX~!3-p$g(aT>DTx4|5ZC|z{{xvX-h3_XKQsZz z0^l`Nuvv^%9u>4+`*JHu*%}BpMb>*encemQ3>r8el&#;)j zWbv*$9=8>KXY{BV%guHJaZU$)9!`~KE(#CaN(JgnaRCDHEu-m?B5wm+lv zJp05M=3HfB5H{)Dty6qp@(%4Xt_rd5rGFp9JZCy_c;~rNJ%%eq>x%#LPFGRqU}<<* z^iIAo`_C?;zpnhDfuU*b(QFJ3YtN=T`o7!OI%DJ6LytG?7MWe3sg+Xe%cHx4b*;=z z@wl2N?=&l~UOV_eOzmS`!R%zqgJ+MY6disneWxw`&33jMUv<-bYkTV~0^2KI%zo}} vzhwWa`r@gN-2T)R=rt7WnczL?@mI#Jn@lQN-!;7k1|fr|tDnm{r-UW|*SfZ# literal 0 HcmV?d00001 diff --git a/html/classbuilder_1_1Client__coll__graph.dot b/html/classbuilder_1_1Client__coll__graph.dot deleted file mode 100644 index 622f77e43..000000000 --- a/html/classbuilder_1_1Client__coll__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "builder.Client" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classbuilder_1_1Client__inherit__graph.dot b/html/classbuilder_1_1Client__inherit__graph.dot deleted file mode 100644 index 622f77e43..000000000 --- a/html/classbuilder_1_1Client__inherit__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "builder.Client" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classes.html b/html/classes.html index ac1c130de..c93a0d695 100644 --- a/html/classes.html +++ b/html/classes.html @@ -3,9 +3,9 @@ - + -My Project: Class Index +Craft: Class Index @@ -21,7 +21,7 @@ -
      My Project +
      Craft
      @@ -29,10 +29,10 @@
      - + @@ -65,41 +65,31 @@
      Class Index
      -
      c | h | m | r | s | w
      - - - - - - - - - - - - - - - - - - - - -
        c  
      -
        m  
      -
        s  
      -
      Client (builder)   Model (server)   Server (server)   
        h  
      -
        r  
      -
        w  
      -
      Handler (server)   RateLimiter (server)   World (world)   
      -
      c | h | m | r | s | w
      +
      C | H | M | R | S | W
      +
      +
      +
      C
      +
      Client (builder)
      +
      +
      H
      +
      Handler (server)
      +
      +
      M
      +
      Model (server)
      +
      +
      R
      +
      RateLimiter (server)
      +
      +
      S
      +
      Server (server)
      +
      +
      W
      +
      World (world)
      +
      diff --git a/html/classserver_1_1Handler-members.html b/html/classserver_1_1Handler-members.html index 190a2f4df..b2ba2835f 100644 --- a/html/classserver_1_1Handler-members.html +++ b/html/classserver_1_1Handler-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
      My Project +
      Craft
      @@ -29,10 +29,10 @@
      - + @@ -91,9 +91,7 @@ diff --git a/html/classserver_1_1Handler.html b/html/classserver_1_1Handler.html index 17e257d2e..1ccda4ade 100644 --- a/html/classserver_1_1Handler.html +++ b/html/classserver_1_1Handler.html @@ -3,9 +3,9 @@ - + -My Project: server.Handler Class Reference +Craft: server.Handler Class Reference @@ -21,7 +21,7 @@ -
      My Project +
      Craft
      @@ -29,10 +29,10 @@
      - + @@ -76,13 +76,9 @@
      Inheritance diagram for server.Handler:
      -
      Inheritance graph
      -
      [legend]
      -
      -Collaboration diagram for server.Handler:
      -
      -
      Collaboration graph
      -
      [legend]
      +
      + +
      @@ -138,15 +134,16 @@  

      Public Member Functions

      running
       
      -
      The documentation for this class was generated from the following file:
        -
      • server.py
      • +

        Detailed Description

        +
        +

        Definition at line 91 of file server.py.

        +

        The documentation for this class was generated from the following file: diff --git a/html/classserver_1_1Handler.png b/html/classserver_1_1Handler.png new file mode 100644 index 0000000000000000000000000000000000000000..8b325bfec81f35b19ba22f61ff3cdb3442220815 GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0vp^mw-5cgBeIh+uvRcq$C1-LR|m<{|{uoc=NTi|Ih>= z3ycpOIKbL@M;^%KC<*clW&kPzfvcxNj2IZ0vOHZJLn;{G&b@f)lNOJwxcR&9^^f;& zV|8+{U;eE^LT&MGu9g;7#l5Oar(6^AoD>$M;Cbl{mx|}CSkae}+A1ppFMrPAS*x=0 za$Jo{=7RF%Nw3O{t=_a?O&TqKp4*kL3-L(>H#-KaJ^t=-oz^C2`v-=RN+H^*!b9HinvovxW56UrX`3 z{8Tu<y7hH9a(+#l#Oq=WlPM> xoWwU;atBKPzT3<4K^WQX*}hAFF82D*u&unDoy{S+444ubJYD@<);T3K0RW&+M}YtU literal 0 HcmV?d00001 diff --git a/html/classserver_1_1Handler__coll__graph.dot b/html/classserver_1_1Handler__coll__graph.dot deleted file mode 100644 index 5fe38b826..000000000 --- a/html/classserver_1_1Handler__coll__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.Handler" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="SocketServer::BaseRequest\lHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1Handler__inherit__graph.dot b/html/classserver_1_1Handler__inherit__graph.dot deleted file mode 100644 index 5fe38b826..000000000 --- a/html/classserver_1_1Handler__inherit__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.Handler" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="SocketServer::BaseRequest\lHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1Model-members.html b/html/classserver_1_1Model-members.html index 86d21e9e9..fdd796343 100644 --- a/html/classserver_1_1Model-members.html +++ b/html/classserver_1_1Model-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
        My Project +
        Craft
        @@ -29,10 +29,10 @@
        - + @@ -116,9 +116,7 @@ diff --git a/html/classserver_1_1Model.html b/html/classserver_1_1Model.html index 8c5b1927a..1af7286a4 100644 --- a/html/classserver_1_1Model.html +++ b/html/classserver_1_1Model.html @@ -3,9 +3,9 @@ - + -My Project: server.Model Class Reference +Craft: server.Model Class Reference @@ -21,7 +21,7 @@ -
        My Project +
        Craft
        @@ -29,10 +29,10 @@
        - + @@ -76,13 +76,9 @@
        Inheritance diagram for server.Model:
        -
        Inheritance graph
        -
        [legend]
        -
        -Collaboration diagram for server.Model:
        -
        -
        Collaboration graph
        -
        [legend]
        +
        + +
        @@ -213,15 +209,16 @@  

        Public Member Functions

        last_commit
         
        -
        The documentation for this class was generated from the following file:
          -
        • server.py
        • +

          Detailed Description

          +
          +

          Definition at line 163 of file server.py.

          +

          The documentation for this class was generated from the following file: diff --git a/html/classserver_1_1Model.png b/html/classserver_1_1Model.png new file mode 100644 index 0000000000000000000000000000000000000000..106b68b9954b5df10b2265735fd5f319aca03230 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^5kMTk!3-owHr!%<83e zlpZNCSgd7buzA87C#JqhyyEGv33m_J-wc~e>PQp?q9|^LRaQ6EI+Z9@#qW)UfTDWn%Jd#`SfRHs1Gc z=`>GZxU{;ihTCkJzU!@?U*94U_8ysXdyW2V5sM#{M{hU$&Z}US`)?EcSSsJ!P{A)N uXZNCA;d-Cn8pkp+ltXNv2eg}gFGHiKDgUZdYKwuv$l&Sf=d#Wzp$PzV=cs7_ literal 0 HcmV?d00001 diff --git a/html/classserver_1_1Model__coll__graph.dot b/html/classserver_1_1Model__coll__graph.dot deleted file mode 100644 index 9b847f2e4..000000000 --- a/html/classserver_1_1Model__coll__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.Model" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1Model__inherit__graph.dot b/html/classserver_1_1Model__inherit__graph.dot deleted file mode 100644 index 9b847f2e4..000000000 --- a/html/classserver_1_1Model__inherit__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.Model" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1RateLimiter-members.html b/html/classserver_1_1RateLimiter-members.html index 97abe98ed..c6cc4c122 100644 --- a/html/classserver_1_1RateLimiter-members.html +++ b/html/classserver_1_1RateLimiter-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
          My Project +
          Craft
          @@ -29,10 +29,10 @@
          - + @@ -81,9 +81,7 @@ diff --git a/html/classserver_1_1RateLimiter.html b/html/classserver_1_1RateLimiter.html index 74b4706da..d82d74aa5 100644 --- a/html/classserver_1_1RateLimiter.html +++ b/html/classserver_1_1RateLimiter.html @@ -3,9 +3,9 @@ - + -My Project: server.RateLimiter Class Reference +Craft: server.RateLimiter Class Reference @@ -21,7 +21,7 @@ -
          My Project +
          Craft
          @@ -29,10 +29,10 @@
          - + @@ -76,13 +76,9 @@
          Inheritance diagram for server.RateLimiter:
          -
          Inheritance graph
          -
          [legend]
          -
          -Collaboration diagram for server.RateLimiter:
          -
          -
          Collaboration graph
          -
          [legend]
          +
          + +
          @@ -108,15 +104,16 @@  

          Public Member Functions

          last_check
           
          -
          The documentation for this class was generated from the following file:
            -
          • server.py
          • +

            Detailed Description

            +
            +

            Definition at line 66 of file server.py.

            +

            The documentation for this class was generated from the following file: diff --git a/html/classserver_1_1RateLimiter.png b/html/classserver_1_1RateLimiter.png new file mode 100644 index 0000000000000000000000000000000000000000..a141a437e8c52c31d293ad60950c95b0bcab664b GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^#Xuau!3-p2m+tZbQW60^A+G=b{|7Q(y!l$%e`o@b z1;z&s9ANFdBM;$`*Z_6t*$;T ze$o2)_2e1r=Un=^U&+((m(sGCH)9xMF7qaAx_4mD-Dl4C55!EkyzqTOo$q}$VFizq zEFFPHj7d{`8YEPO72FWqJ;X99x&;C8{_BElR>vNm$zq0tgmA~>?;mzDT;o97fCFVK@voTx! z?60-`f0QNL{q==s+oX2Im?+klcTT@@bx+Ssem-B}isbO1`#g{Dlzlyt;r85MUHWys zjcIHgQu&X J%Q~loCIGKV-{k-R literal 0 HcmV?d00001 diff --git a/html/classserver_1_1RateLimiter__coll__graph.dot b/html/classserver_1_1RateLimiter__coll__graph.dot deleted file mode 100644 index 16f8ac429..000000000 --- a/html/classserver_1_1RateLimiter__coll__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.RateLimiter" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1RateLimiter__inherit__graph.dot b/html/classserver_1_1RateLimiter__inherit__graph.dot deleted file mode 100644 index 16f8ac429..000000000 --- a/html/classserver_1_1RateLimiter__inherit__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "server.RateLimiter" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1Server-members.html b/html/classserver_1_1Server-members.html index 1303a7510..7e3d5184d 100644 --- a/html/classserver_1_1Server-members.html +++ b/html/classserver_1_1Server-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
            My Project +
            Craft
            @@ -29,10 +29,10 @@
            - + @@ -77,9 +77,7 @@ diff --git a/html/classserver_1_1Server.html b/html/classserver_1_1Server.html index 6d2e50cbc..3fbc0e85f 100644 --- a/html/classserver_1_1Server.html +++ b/html/classserver_1_1Server.html @@ -3,9 +3,9 @@ - + -My Project: server.Server Class Reference +Craft: server.Server Class Reference @@ -21,7 +21,7 @@ -
            My Project +
            Craft
            @@ -29,10 +29,10 @@
            - + @@ -75,13 +75,9 @@
            Inheritance diagram for server.Server:
            -
            Inheritance graph
            -
            [legend]
            -
            -Collaboration diagram for server.Server:
            -
            -
            Collaboration graph
            -
            [legend]
            +
            + +
            @@ -92,15 +88,16 @@ bool 

            Static Public Attributes

            daemon_threads = True
             
            -
            The documentation for this class was generated from the following file:
              -
            • server.py
            • +

              Detailed Description

              +
              +

              Definition at line 87 of file server.py.

              +

              The documentation for this class was generated from the following file: diff --git a/html/classserver_1_1Server.png b/html/classserver_1_1Server.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ece5ab14187d5538aed58477895b6140418870 GIT binary patch literal 938 zcmeAS@N?(olHy`uVBq!ia0y~yU@QW%12~w0r149>O+ZQ_z$e7@|Ns9$=8HF9OZyK^ z0J6aNz<~p-opTl`nU^Ob?X9rI`Y^R?}>f%0!7C)q6si;KHkr`0)M{OX+8#q;9Dx0r+` zm!A!Ncf42izgTdS*;Cc<&f9T^8a@TPU5crlvM4^{o9T1E=swe_{aSH}6_I9;X-%prct^XFf-G0xHwdx5we ziGlHK-iFSZ8~$S&AD8f*|3EoVZ|%ID`~NeChwSsYYt;PqXROf9Wm@0wJ2SfNT=40) z^69`kx&MEwea~xiVr1L7tmr`B4{!au4Q+lJ2Lz_;>h!NIoE*m0mj5X`$v`BbAvbzaHmwspG^|mneOxn6@k}+F#M6ibQU~N jmWAh~nMpFJe`24q`@)iGR)^z&8H>Tw)z4*}Q$iB}y|Jz4 literal 0 HcmV?d00001 diff --git a/html/classserver_1_1Server__coll__graph.dot b/html/classserver_1_1Server__coll__graph.dot deleted file mode 100644 index 8e546c4f2..000000000 --- a/html/classserver_1_1Server__coll__graph.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph "server.Server" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="SocketServer::ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node3 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="SocketServer::TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classserver_1_1Server__inherit__graph.dot b/html/classserver_1_1Server__inherit__graph.dot deleted file mode 100644 index 8e546c4f2..000000000 --- a/html/classserver_1_1Server__inherit__graph.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph "server.Server" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="SocketServer::ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node3 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node3 [label="SocketServer::TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classworld_1_1World-members.html b/html/classworld_1_1World-members.html index 031933493..2d3f91fd3 100644 --- a/html/classworld_1_1World-members.html +++ b/html/classworld_1_1World-members.html @@ -3,9 +3,9 @@ - + -My Project: Member List +Craft: Member List @@ -21,7 +21,7 @@ -
              My Project +
              Craft
              @@ -29,10 +29,10 @@
              - + @@ -81,9 +81,7 @@ diff --git a/html/classworld_1_1World.html b/html/classworld_1_1World.html index 26ace4ede..b647d58d8 100644 --- a/html/classworld_1_1World.html +++ b/html/classworld_1_1World.html @@ -3,9 +3,9 @@ - + -My Project: world.World Class Reference +Craft: world.World Class Reference @@ -21,7 +21,7 @@ -
              My Project +
              Craft
              @@ -29,10 +29,10 @@
              - + @@ -76,13 +76,9 @@
              Inheritance diagram for world.World:
              -
              Inheritance graph
              -
              [legend]
              -
              -Collaboration diagram for world.World:
              -
              -
              Collaboration graph
              -
              [legend]
              +
              + +
              @@ -108,15 +104,16 @@  

              Public Member Functions

              cache_size
               
              -
              The documentation for this class was generated from the following file:
                -
              • world.py
              • +

                Detailed Description

                +
                +

                Definition at line 31 of file world.py.

                +

                The documentation for this class was generated from the following file: diff --git a/html/classworld_1_1World.png b/html/classworld_1_1World.png new file mode 100644 index 0000000000000000000000000000000000000000..7cf0563babc94720c27538fc1dd45c83e07ae9b7 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r53?z4+XPOVBBm#UwT>t<74`jZ0^R=}9&;%e0 zj1L?*z}k679?0b=3GxeO04f53tEWPY7#J7@JY5_^Dj46+z1??Mfrs_DzUBY_$7i!m znk4PIb@S?}GKNK5?Vj8V&(E0Y+TO&9tU0k&WkgUY<2G;`FUR zuf5Zk*nU5>Dl%>T+W?i9C(<8=eOt!y@HLm{x9xwwU*E9*^wRK2d_D7~JpBA6{Ln|{ z`StOWo;>DUI5Sd#!P$plq6_zO%^MQBb80spD|l#sW+uO#`iRvXH`<9E;?u>R`TI%%nvHqvu_apZ8 zGqTURF!_+wJC6JEY%LNo7uO~FS416F+mrWT+dK91u^Q)%8fF8nnbDe-*7%3va+(1T UPt)Rq!0=-5boFyt=akR{01ir~r2qf` literal 0 HcmV?d00001 diff --git a/html/classworld_1_1World__coll__graph.dot b/html/classworld_1_1World__coll__graph.dot deleted file mode 100644 index f99d99c59..000000000 --- a/html/classworld_1_1World__coll__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "world.World" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/classworld_1_1World__inherit__graph.dot b/html/classworld_1_1World__inherit__graph.dot deleted file mode 100644 index f99d99c59..000000000 --- a/html/classworld_1_1World__inherit__graph.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph "world.World" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node1 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="grey75", style="filled", fontcolor="black",tooltip=" "]; - Node2 -> Node1 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node2 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; -} diff --git a/html/doxygen.css b/html/doxygen.css index 73ecbb2cb..90d02c463 100644 --- a/html/doxygen.css +++ b/html/doxygen.css @@ -1,4 +1,4 @@ -/* The standard CSS for doxygen 1.8.17 */ +/* The standard CSS for doxygen 1.9.2 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; @@ -66,7 +66,7 @@ p.startli, p.startdd { margin-top: 2px; } -th p.starttd, p.intertd, p.endtd { +th p.starttd, th p.intertd, th p.endtd { font-size: 100%; font-weight: 700; } @@ -103,30 +103,96 @@ caption { } span.legend { - font-size: 70%; - text-align: center; + font-size: 70%; + text-align: center; } h3.version { - font-size: 90%; - text-align: center; + font-size: 90%; + text-align: center; } -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; } -div.qindex, div.navpath { +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; width: 100%; line-height: 140%; + font-size: 130%; + color: #A0A0A0; } -div.navtab { - margin-right: 15px; +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; } +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + /* @group Link Styling */ a { @@ -143,17 +209,6 @@ a:hover { text-decoration: underline; } -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #FFFFFF; - border: 1px double #869DCA; -} - .contents a.qindexHL:visited { color: #FFFFFF; } @@ -384,6 +439,12 @@ img.footer { vertical-align: middle; } +.compoundTemplParams { + color: #4665A2; + font-size: 80%; + line-height: 120%; +} + /* @group Code Colorization */ span.keyword { @@ -1358,10 +1419,12 @@ dl.citelist dt { font-weight:bold; margin-right:10px; padding:5px; + text-align:right; + width:52px; } dl.citelist dd { - margin:2px 0; + margin:2px 0 2px 72px; padding:5px 0; } @@ -1424,6 +1487,12 @@ div.toc li.level4 { margin-left: 45px; } +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + .PageDocRTL-title div.toc li.level1 { margin-left: 0 !important; margin-right: 0; @@ -1661,47 +1730,6 @@ tr.heading h2 { /* @group Markdown */ -/* -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTableHead tr { -} - -table.markdownTableBodyLeft td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft { - text-align: left -} - -th.markdownTableHeadRight { - text-align: right -} - -th.markdownTableHeadCenter { - text-align: center -} -*/ - table.markdownTable { border-collapse:collapse; margin-top: 4px; diff --git a/html/doxygen.png b/html/doxygen.png deleted file mode 100644 index 3ff17d807fd8aa003bed8bb2a69e8f0909592fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 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 diff --git a/html/doxygen.svg b/html/doxygen.svg new file mode 100644 index 000000000..d42dad52d --- /dev/null +++ b/html/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/html/dynsections.js b/html/dynsections.js index ea0a7b39a..88f2c27e6 100644 --- a/html/dynsections.js +++ b/html/dynsections.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function toggleVisibility(linkObj) { @@ -118,3 +119,10 @@ function toggleInherit(id) } } /* @license-end */ + +$(document).ready(function() { + $('.code,.codeRef').each(function() { + $(this).data('powertip',$('#a'+$(this).attr('href').replace(/.*\//,'').replace(/[^a-z_A-Z0-9]/g,'_')).html()); + $(this).powerTip({ placement: 's', smartPlacement: true, mouseOnToPopup: true }); + }); +}); diff --git a/html/files.html b/html/files.html new file mode 100644 index 000000000..5c5a460fe --- /dev/null +++ b/html/files.html @@ -0,0 +1,81 @@ + + + + + + + +Craft: File List + + + + + + + + + +
                +
                + + + + + + +
                +
                Craft +
                +
                +
                + + + + + + + +
                + +
                +
                + + +
                + +
                + +
                +
                +
                File List
                +
                +
                +
                Here is a list of all documented files with brief descriptions:
                + + + + +
                 builder.py
                 server.py
                 world.py
                +
                +
                + + + + diff --git a/html/graph_legend.dot b/html/graph_legend.dot deleted file mode 100644 index 4d6ac8c61..000000000 --- a/html/graph_legend.dot +++ /dev/null @@ -1,23 +0,0 @@ -digraph "Graph Legend" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - Node9 [shape="box",label="Inherited",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",fillcolor="grey75",style="filled" fontcolor="black"]; - Node10 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node10 [shape="box",label="PublicBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; - Node11 -> Node10 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node11 [shape="box",label="Truncated",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="red"]; - Node13 -> Node9 [dir="back",color="darkgreen",fontsize="10",style="solid",fontname="Helvetica"]; - Node13 [shape="box",label="ProtectedBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; - Node14 -> Node9 [dir="back",color="firebrick4",fontsize="10",style="solid",fontname="Helvetica"]; - Node14 [shape="box",label="PrivateBase",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; - Node15 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node15 [shape="box",label="Undocumented",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="grey75"]; - Node16 -> Node9 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node16 [shape="box",label="Templ< int >",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; - Node17 -> Node16 [dir="back",color="orange",fontsize="10",style="dashed",label="< int >",fontname="Helvetica"]; - Node17 [shape="box",label="Templ< T >",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; - Node18 -> Node9 [dir="back",color="darkorchid3",fontsize="10",style="dashed",label="m_usedClass",fontname="Helvetica"]; - Node18 [shape="box",label="Used",fontsize="10",height=0.2,width=0.4,fontname="Helvetica",color="black"]; -} diff --git a/html/graph_legend.html b/html/graph_legend.html deleted file mode 100644 index 7042904ac..000000000 --- a/html/graph_legend.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -My Project: Graph Legend - - - - - - - - - -
                -
                - - - - - - -
                -
                My Project -
                -
                -
                - - - - - - - -
                - -
                -
                - - -
                - -
                - -
                -
                -
                Graph Legend
                -
                -
                -

                This page explains how to interpret the graphs that are generated by doxygen.

                -

                Consider the following example:

                /*! Invisible class because of truncation */
                -
                class Invisible { };
                -
                -
                /*! Truncated class, inheritance relation is hidden */
                -
                class Truncated : public Invisible { };
                -
                -
                /* Class not documented with doxygen comments */
                -
                class Undocumented { };
                -
                -
                /*! Class that is inherited using public inheritance */
                -
                class PublicBase : public Truncated { };
                -
                -
                /*! A template class */
                -
                template<class T> class Templ { };
                -
                -
                /*! Class that is inherited using protected inheritance */
                -
                class ProtectedBase { };
                -
                -
                /*! Class that is inherited using private inheritance */
                -
                class PrivateBase { };
                -
                -
                /*! Class that is used by the Inherited class */
                -
                class Used { };
                -
                -
                /*! Super class that inherits a number of other classes */
                -
                class Inherited : public PublicBase,
                -
                protected ProtectedBase,
                -
                private PrivateBase,
                -
                public Undocumented,
                -
                public Templ<int>
                -
                {
                -
                private:
                -
                Used *m_usedClass;
                -
                };
                -

                This will result in the following graph:

                -

                The boxes in the above graph have the following meaning:

                -
                  -
                • -A filled gray box represents the struct or class for which the graph is generated.
                • -
                • -A box with a black border denotes a documented struct or class.
                • -
                • -A box with a gray border denotes an undocumented struct or class.
                • -
                • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
                • -
                -

                The arrows have the following meaning:

                -
                  -
                • -A dark blue arrow is used to visualize a public inheritance relation between two classes.
                • -
                • -A dark green arrow is used for protected inheritance.
                • -
                • -A dark red arrow is used for private inheritance.
                • -
                • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
                • -
                • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
                • -
                -
                - - - - diff --git a/html/hierarchy.html b/html/hierarchy.html index 956d3e358..b9ba517b3 100644 --- a/html/hierarchy.html +++ b/html/hierarchy.html @@ -3,9 +3,9 @@ - + -My Project: Class Hierarchy +Craft: Class Hierarchy @@ -21,7 +21,7 @@ -
                My Project +
                Craft
                @@ -29,10 +29,10 @@
                - + @@ -65,29 +65,25 @@
                Class Hierarchy
                -
                -

                Go to the graphical class hierarchy

                -This inheritance list is sorted roughly, but not completely, alphabetically:
                +
                This inheritance list is sorted roughly, but not completely, alphabetically:
                [detail level 12]
                - + - + - +
                 CBaseRequestHandler
                 CSocketServer.BaseRequestHandler
                 Cserver.Handler
                 Cobject
                 Cbuilder.Client
                 Cserver.Model
                 Cserver.RateLimiter
                 Cworld.World
                 CTCPServer
                 CSocketServer.TCPServer
                 Cserver.Server
                 CThreadingMixIn
                 CSocketServer.ThreadingMixIn
                 Cserver.Server
                diff --git a/html/index.html b/html/index.html index 6473b4e2e..ff9a34f51 100644 --- a/html/index.html +++ b/html/index.html @@ -3,9 +3,9 @@ - + -My Project: Main Page +Craft: Main Page @@ -21,7 +21,7 @@ -
                My Project +
                Craft
                @@ -29,10 +29,10 @@
                - + @@ -62,15 +62,13 @@
                -
                My Project Documentation
                +
                Craft Documentation
                diff --git a/html/inherit_graph_0.dot b/html/inherit_graph_0.dot deleted file mode 100644 index 3540b9d90..000000000 --- a/html/inherit_graph_0.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - rankdir="LR"; - Node4 [label="object",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node4 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node0 [label="builder.Client",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classbuilder_1_1Client.html",tooltip=" "]; - Node4 -> Node6 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node6 [label="server.Model",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Model.html",tooltip=" "]; - Node4 -> Node7 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node7 [label="server.RateLimiter",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1RateLimiter.html",tooltip=" "]; - Node4 -> Node8 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node8 [label="world.World",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classworld_1_1World.html",tooltip=" "]; -} diff --git a/html/inherit_graph_1.dot b/html/inherit_graph_1.dot deleted file mode 100644 index 3d940f8af..000000000 --- a/html/inherit_graph_1.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - rankdir="LR"; - Node9 [label="BaseRequestHandler",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node9 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node0 [label="server.Handler",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Handler.html",tooltip=" "]; -} diff --git a/html/inherit_graph_2.dot b/html/inherit_graph_2.dot deleted file mode 100644 index a00223c37..000000000 --- a/html/inherit_graph_2.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph "Graphical Class Hierarchy" -{ - // LATEX_PDF_SIZE - edge [fontname="Helvetica",fontsize="10",labelfontname="Helvetica",labelfontsize="10"]; - node [fontname="Helvetica",fontsize="10",shape=record]; - rankdir="LR"; - Node3 [label="TCPServer",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node3 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; - Node0 [label="server.Server",height=0.2,width=0.4,color="black", fillcolor="white", style="filled",URL="$classserver_1_1Server.html",tooltip=" "]; - Node1 [label="ThreadingMixIn",height=0.2,width=0.4,color="grey75", fillcolor="white", style="filled",tooltip=" "]; - Node1 -> Node0 [dir="back",color="midnightblue",fontsize="10",style="solid",fontname="Helvetica"]; -} diff --git a/html/md_LICENSE.html b/html/md_LICENSE.html index b642c60d6..e9f219a9e 100644 --- a/html/md_LICENSE.html +++ b/html/md_LICENSE.html @@ -3,9 +3,9 @@ - + -My Project: LICENSE +Craft: LICENSE @@ -21,7 +21,7 @@ -
                My Project +
                Craft
                @@ -29,10 +29,10 @@
                - + @@ -60,22 +60,20 @@ -
                +
                LICENSE
                -

                Copyright (C) 2013 Michael Fogleman

                -

                Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

                -

                The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

                -

                THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

                +

                Copyright (C) 2013 Michael Fogleman

                +

                Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

                +

                The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

                +

                THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

                diff --git a/html/md_README.html b/html/md_README.html index be06a5a85..e37ec61c0 100644 --- a/html/md_README.html +++ b/html/md_README.html @@ -3,9 +3,9 @@ - + -My Project: Craft +Craft: Craft @@ -21,7 +21,7 @@ -
                My Project +
                Craft
                @@ -29,10 +29,10 @@
                - + @@ -60,14 +60,14 @@
                -
                +
                Craft
                -

                Minecraft clone for Windows, Mac OS X and Linux. Just a few thousand lines of C using modern OpenGL (shaders). Online multiplayer support is included using a Python-based server.

                -

                http://www.michaelfogleman.com/craft/

                -

                +

                Minecraft clone for Windows, Mac OS X and Linux. Just a few thousand lines of C using modern OpenGL (shaders). Online multiplayer support is included using a Python-based server.

                +

                http://www.michaelfogleman.com/craft/

                +

                Features

                  @@ -81,44 +81,44 @@

                Download

                -

                Mac and Windows binaries are available on the website.

                -

                http://www.michaelfogleman.com/craft/

                -

                See below to run from source.

                +

                Mac and Windows binaries are available on the website.

                +

                http://www.michaelfogleman.com/craft/

                +

                See below to run from source.

                Install Dependencies

                Mac OS X

                -

                Download and install CMake if you don't already have it. You may use Homebrew to simplify the installation:

                brew install cmake
                -

                +

                Download and install CMake if you don't already have it. You may use Homebrew to simplify the installation:

                brew install cmake
                +

                Linux (Ubuntu)

                sudo apt-get install cmake libglew-dev xorg-dev
                 sudo apt-get build-dep glfw
                -

                +

                Windows

                -

                Download and install CMake and MinGW. Add C:\MinGW\bin to your PATH.

                -

                Download and install cURL so that CURL/lib and CURL/include are in your Program Files directory.

                -

                Use the following commands in place of the ones described in the next section.

                cmake -G "MinGW Makefiles"
                +

                Download and install CMake and MinGW. Add C:\MinGW\bin to your PATH.

                +

                Download and install cURL so that CURL/lib and CURL/include are in your Program Files directory.

                +

                Use the following commands in place of the ones described in the next section.

                cmake -G "MinGW Makefiles"
                 mingw32-make
                -

                +

                Compile and Run

                -

                Once you have the dependencies (see above), run the following commands in your terminal.

                git clone https://github.com/fogleman/Craft.git
                +

                Once you have the dependencies (see above), run the following commands in your terminal.

                git clone https://github.com/fogleman/Craft.git
                 cd Craft
                 cmake .
                 make
                 ./craft
                -

                +

                Multiplayer

                -

                Register for an account!

                -

                https://craft.michaelfogleman.com/

                +

                Register for an account!

                +

                https://craft.michaelfogleman.com/

                Client

                -

                You can connect to a server with command line arguments...

                ./craft michaelfogleman.com
                -

                Or, with the "/online" command in the game itself.

                /online michaelfogleman.com
                -

                +

                You can connect to a server with command line arguments...

                ./craft michaelfogleman.com
                +

                Or, with the "/online" command in the game itself.

                /online michaelfogleman.com
                +

                Server

                -

                You can run your own server or connect to mine. The server is written in Python but requires a compiled DLL so it can perform the terrain generation just like the client.

                gcc -std=c99 -O3 -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
                +

                You can run your own server or connect to mine. The server is written in Python but requires a compiled DLL so it can perform the terrain generation just like the client.

                gcc -std=c99 -O3 -shared -o world -I src -I deps/noise deps/noise/noise.c src/world.c
                 python server.py [HOST [PORT]]
                -

                +

                Controls

                • WASD to move forward, left, backward, right.
                • @@ -139,53 +139,53 @@

                  Chat Commands

                  /goto [NAME]
                  -

                  Teleport to another user. If NAME is unspecified, a random user is chosen.

                  /list
                  -

                  Display a list of connected users.

                  /login NAME
                  -

                  Switch to another registered username. The login server will be re-contacted. The username is case-sensitive.

                  /logout
                  -

                  Unauthenticate and become a guest user. Automatic logins will not occur again until the /login command is re-issued.

                  /offline [FILE]
                  -

                  Switch to offline mode. FILE specifies the save file to use and defaults to "craft".

                  /online HOST [PORT]
                  -

                  Connect to the specified server.

                  /pq P Q
                  -

                  Teleport to the specified chunk.

                  /spawn
                  -

                  Teleport back to the spawn point.

                  +

                  Teleport to another user. If NAME is unspecified, a random user is chosen.

                  /list
                  +

                  Display a list of connected users.

                  /login NAME
                  +

                  Switch to another registered username. The login server will be re-contacted. The username is case-sensitive.

                  /logout
                  +

                  Unauthenticate and become a guest user. Automatic logins will not occur again until the /login command is re-issued.

                  /offline [FILE]
                  +

                  Switch to offline mode. FILE specifies the save file to use and defaults to "craft".

                  /online HOST [PORT]
                  +

                  Connect to the specified server.

                  /pq P Q
                  +

                  Teleport to the specified chunk.

                  /spawn
                  +

                  Teleport back to the spawn point.

                  Screenshot

                  -

                  +

                  Implementation Details

                  Terrain Generation

                  -

                  The terrain is generated using Simplex noise - a deterministic noise function seeded based on position. So the world will always be generated the same way in a given location.

                  -

                  The world is split up into 32x32 block chunks in the XZ plane (Y is up). This allows the world to be “infinite” (floating point precision is currently a problem at large X or Z values) and also makes it easier to manage the data. Only visible chunks need to be queried from the database.

                  +

                  The terrain is generated using Simplex noise - a deterministic noise function seeded based on position. So the world will always be generated the same way in a given location.

                  +

                  The world is split up into 32x32 block chunks in the XZ plane (Y is up). This allows the world to be “infinite” (floating point precision is currently a problem at large X or Z values) and also makes it easier to manage the data. Only visible chunks need to be queried from the database.

                  Rendering

                  -

                  Only exposed faces are rendered. This is an important optimization as the vast majority of blocks are either completely hidden or are only exposing one or two faces. Each chunk records a one-block width overlap for each neighboring chunk so it knows which blocks along its perimeter are exposed.

                  -

                  Only visible chunks are rendered. A naive frustum-culling approach is used to test if a chunk is in the camera’s view. If it is not, it is not rendered. This results in a pretty decent performance improvement as well.

                  -

                  Chunk buffers are completely regenerated when a block is changed in that chunk, instead of trying to update the VBO.

                  -

                  Text is rendered using a bitmap atlas. Each character is rendered onto two triangles forming a 2D rectangle.

                  -

                  “Modern” OpenGL is used - no deprecated, fixed-function pipeline functions are used. Vertex buffer objects are used for position, normal and texture coordinates. Vertex and fragment shaders are used for rendering. Matrix manipulation functions are in matrix.c for translation, rotation, perspective, orthographic, etc. matrices. The 3D models are made up of very simple primitives - mostly cubes and rectangles. These models are generated in code in cube.c.

                  -

                  Transparency in glass blocks and plants (plants don’t take up the full rectangular shape of their triangle primitives) is implemented by discarding magenta-colored pixels in the fragment shader.

                  +

                  Only exposed faces are rendered. This is an important optimization as the vast majority of blocks are either completely hidden or are only exposing one or two faces. Each chunk records a one-block width overlap for each neighboring chunk so it knows which blocks along its perimeter are exposed.

                  +

                  Only visible chunks are rendered. A naive frustum-culling approach is used to test if a chunk is in the camera’s view. If it is not, it is not rendered. This results in a pretty decent performance improvement as well.

                  +

                  Chunk buffers are completely regenerated when a block is changed in that chunk, instead of trying to update the VBO.

                  +

                  Text is rendered using a bitmap atlas. Each character is rendered onto two triangles forming a 2D rectangle.

                  +

                  “Modern” OpenGL is used - no deprecated, fixed-function pipeline functions are used. Vertex buffer objects are used for position, normal and texture coordinates. Vertex and fragment shaders are used for rendering. Matrix manipulation functions are in matrix.c for translation, rotation, perspective, orthographic, etc. matrices. The 3D models are made up of very simple primitives - mostly cubes and rectangles. These models are generated in code in cube.c.

                  +

                  Transparency in glass blocks and plants (plants don’t take up the full rectangular shape of their triangle primitives) is implemented by discarding magenta-colored pixels in the fragment shader.

                  Database

                  -

                  User changes to the world are stored in a sqlite database. Only the delta is stored, so the default world is generated and then the user changes are applied on top when loading.

                  -

                  The main database table is named “block” and has columns p, q, x, y, z, w. (p, q) identifies the chunk, (x, y, z) identifies the block position and (w) identifies the block type. 0 represents an empty block (air).

                  -

                  In game, the chunks store their blocks in a hash map. An (x, y, z) key maps to a (w) value.

                  -

                  The y-position of blocks are limited to 0 <= y < 256. The upper limit is mainly an artificial limitation to prevent users from building unnecessarily tall structures. Users are not allowed to destroy blocks at y = 0 to avoid falling underneath the world.

                  +

                  User changes to the world are stored in a sqlite database. Only the delta is stored, so the default world is generated and then the user changes are applied on top when loading.

                  +

                  The main database table is named “block” and has columns p, q, x, y, z, w. (p, q) identifies the chunk, (x, y, z) identifies the block position and (w) identifies the block type. 0 represents an empty block (air).

                  +

                  In game, the chunks store their blocks in a hash map. An (x, y, z) key maps to a (w) value.

                  +

                  The y-position of blocks are limited to 0 <= y < 256. The upper limit is mainly an artificial limitation to prevent users from building unnecessarily tall structures. Users are not allowed to destroy blocks at y = 0 to avoid falling underneath the world.

                  Multiplayer

                  -

                  Multiplayer mode is implemented using plain-old sockets. A simple, ASCII, line-based protocol is used. Each line is made up of a command code and zero or more comma-separated arguments. The client requests chunks from the server with a simple command: C,p,q,key. “C” means “Chunk” and (p, q) identifies the chunk. The key is used for caching - the server will only send block updates that have been performed since the client last asked for that chunk. Block updates (in realtime or as part of a chunk request) are sent to the client in the format: B,p,q,x,y,z,w. After sending all of the blocks for a requested chunk, the server will send an updated cache key in the format: K,p,q,key. The client will store this key and use it the next time it needs to ask for that chunk. Player positions are sent in the format: P,pid,x,y,z,rx,ry. The pid is the player ID and the rx and ry values indicate the player’s rotation in two different axes. The client interpolates player positions from the past two position updates for smoother animation. The client sends its position to the server at most every 0.1 seconds (less if not moving).

                  -

                  Client-side caching to the sqlite database can be performance intensive when connecting to a server for the first time. For this reason, sqlite writes are performed on a background thread. All writes occur in a transaction for performance. The transaction is committed every 5 seconds as opposed to some logical amount of work completed. A ring / circular buffer is used as a queue for what data is to be written to the database.

                  -

                  In multiplayer mode, players can observe one another in the main view or in a picture-in-picture view. Implementation of the PnP was surprisingly simple - just change the viewport and render the scene again from the other player’s point of view.

                  +

                  Multiplayer mode is implemented using plain-old sockets. A simple, ASCII, line-based protocol is used. Each line is made up of a command code and zero or more comma-separated arguments. The client requests chunks from the server with a simple command: C,p,q,key. “C” means “Chunk” and (p, q) identifies the chunk. The key is used for caching - the server will only send block updates that have been performed since the client last asked for that chunk. Block updates (in realtime or as part of a chunk request) are sent to the client in the format: B,p,q,x,y,z,w. After sending all of the blocks for a requested chunk, the server will send an updated cache key in the format: K,p,q,key. The client will store this key and use it the next time it needs to ask for that chunk. Player positions are sent in the format: P,pid,x,y,z,rx,ry. The pid is the player ID and the rx and ry values indicate the player’s rotation in two different axes. The client interpolates player positions from the past two position updates for smoother animation. The client sends its position to the server at most every 0.1 seconds (less if not moving).

                  +

                  Client-side caching to the sqlite database can be performance intensive when connecting to a server for the first time. For this reason, sqlite writes are performed on a background thread. All writes occur in a transaction for performance. The transaction is committed every 5 seconds as opposed to some logical amount of work completed. A ring / circular buffer is used as a queue for what data is to be written to the database.

                  +

                  In multiplayer mode, players can observe one another in the main view or in a picture-in-picture view. Implementation of the PnP was surprisingly simple - just change the viewport and render the scene again from the other player’s point of view.

                  Collision Testing

                  -

                  Hit testing (what block the user is pointing at) is implemented by scanning a ray from the player’s position outward, following their sight vector. This is not a precise method, so the step rate can be made smaller to be more accurate.

                  -

                  Collision testing simply adjusts the player’s position to remain a certain distance away from any adjacent blocks that are obstacles. (Clouds and plants are not marked as obstacles, so you pass right through them.)

                  +

                  Hit testing (what block the user is pointing at) is implemented by scanning a ray from the player’s position outward, following their sight vector. This is not a precise method, so the step rate can be made smaller to be more accurate.

                  +

                  Collision testing simply adjusts the player’s position to remain a certain distance away from any adjacent blocks that are obstacles. (Clouds and plants are not marked as obstacles, so you pass right through them.)

                  Sky Dome

                  -

                  A textured sky dome is used for the sky. The X-coordinate of the texture represents time of day. The Y-values map from the bottom of the sky sphere to the top of the sky sphere. The player is always in the center of the sphere. The fragment shaders for the blocks also sample the sky texture to determine the appropriate fog color to blend with based on the block’s position relative to the backing sky.

                  +

                  A textured sky dome is used for the sky. The X-coordinate of the texture represents time of day. The Y-values map from the bottom of the sky sphere to the top of the sky sphere. The player is always in the center of the sphere. The fragment shaders for the blocks also sample the sky texture to determine the appropriate fog color to blend with based on the block’s position relative to the backing sky.

                  Ambient Occlusion

                  -

                  Ambient occlusion is implemented as described on this page:

                  -

                  http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/

                  +

                  Ambient occlusion is implemented as described on this page:

                  +

                  http://0fps.wordpress.com/2013/07/03/ambient-occlusion-for-minecraft-like-worlds/

                  Dependencies

                    @@ -200,9 +200,7 @@

                diff --git a/html/menu.js b/html/menu.js index 433c15b8f..2fe2214f2 100644 --- a/html/menu.js +++ b/html/menu.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { function makeTree(data,relPath) { @@ -40,9 +41,9 @@ function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); if (searchEnabled) { if (serverSide) { - $('#main-menu').append('
              • '); + $('#main-menu').append('
              • '); } else { - $('#main-menu').append('
              • '); + $('#main-menu').append('
              • '); } } $('#main-menu').smartmenus(); diff --git a/html/menudata.js b/html/menudata.js index e8f2d51c0..c943a6362 100644 --- a/html/menudata.js +++ b/html/menudata.js @@ -1,24 +1,26 @@ /* -@licstart The following is the entire license notice for the -JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. -Copyright (C) 1997-2019 by Dimitri van Heesch + The MIT License (MIT) -This program is free software; you can redistribute it and/or modify -it under the terms of version 2 of the GNU General Public License as published by -the Free Software Foundation + Copyright (C) 1997-2020 by Dimitri van Heesch -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -You should have received a copy of the GNU General Public License along -with this program; if not, write to the Free Software Foundation, Inc., -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. -@licend The above is the entire license notice -for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ var menudata={children:[ {text:"Main Page",url:"index.html"}, @@ -26,4 +28,6 @@ var menudata={children:[ {text:"Classes",url:"annotated.html",children:[ {text:"Class List",url:"annotated.html"}, {text:"Class Index",url:"classes.html"}, -{text:"Class Hierarchy",url:"inherits.html"}]}]} +{text:"Class Hierarchy",url:"hierarchy.html"}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/html/pages.html b/html/pages.html index 08fcdf95d..a547d7383 100644 --- a/html/pages.html +++ b/html/pages.html @@ -3,9 +3,9 @@ - + -My Project: Related Pages +Craft: Related Pages @@ -21,7 +21,7 @@ -
                My Project +
                Craft
                @@ -29,10 +29,10 @@
                - + @@ -67,16 +67,14 @@
                Here is a list of all related documentation pages:
                - - + +
                 LICENSE
                 Craft
                 Craft
                 LICENSE
                diff --git a/html/search/all_0.html b/html/search/all_0.html index 26dd244fd..5775aa178 100644 --- a/html/search/all_0.html +++ b/html/search/all_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_1.html b/html/search/all_1.html index 8eb215b90..6cbe23813 100644 --- a/html/search/all_1.html +++ b/html/search/all_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_2.html b/html/search/all_2.html index b26d91650..0a5f832e0 100644 --- a/html/search/all_2.html +++ b/html/search/all_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_3.html b/html/search/all_3.html index b61b96f83..93567f1e0 100644 --- a/html/search/all_3.html +++ b/html/search/all_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_4.html b/html/search/all_4.html index 06de1550e..9fab82fad 100644 --- a/html/search/all_4.html +++ b/html/search/all_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_5.html b/html/search/all_5.html index 2544c4e5b..ff4c7034b 100644 --- a/html/search/all_5.html +++ b/html/search/all_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/all_6.html b/html/search/all_6.html index 43f14eab3..671f73654 100644 --- a/html/search/all_6.html +++ b/html/search/all_6.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_0.html b/html/search/classes_0.html index f7e4c14e1..63d78fe69 100644 --- a/html/search/classes_0.html +++ b/html/search/classes_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_1.html b/html/search/classes_1.html index c7ff4b311..1a5618cfc 100644 --- a/html/search/classes_1.html +++ b/html/search/classes_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_2.html b/html/search/classes_2.html index 0d1e8a0cd..455fc5fed 100644 --- a/html/search/classes_2.html +++ b/html/search/classes_2.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_3.html b/html/search/classes_3.html index 21025456b..a7139980b 100644 --- a/html/search/classes_3.html +++ b/html/search/classes_3.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_4.html b/html/search/classes_4.html index 095ab5952..cb0026fdf 100644 --- a/html/search/classes_4.html +++ b/html/search/classes_4.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/classes_5.html b/html/search/classes_5.html index fc9cdc996..b77826f89 100644 --- a/html/search/classes_5.html +++ b/html/search/classes_5.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/close.png b/html/search/close.png deleted file mode 100644 index 9342d3dfeea7b7c4ee610987e717804b5a42ceb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 273 zcmV+s0q*{ZP)4(RlMby96)VwnbG{ zbe&}^BDn7x>$<{ck4zAK-=nT;=hHG)kmplIF${xqm8db3oX6wT3bvp`TE@m0cg;b) zBuSL}5?N7O(iZLdAlz@)b)Rd~DnSsSX&P5qC`XwuFwcAYLC+d2>+1(8on;wpt8QIC X2MT$R4iQDd00000NkvXXu0mjfia~GN diff --git a/html/search/close.svg b/html/search/close.svg new file mode 100644 index 000000000..a933eea1a --- /dev/null +++ b/html/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/html/search/mag_sel.png b/html/search/mag_sel.png deleted file mode 100644 index 39c0ed52a25dd9d080ee0d42ae6c6042bdfa04d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz6!2%?$TA$hhDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~NU84L`?eGCi_EEpJ?t}-xGu`@87+QPtK?83kxQ`TapwHK(CDaqU2h2ejD|C#+j z9%q3^WHAE+w=f7ZGR&GI0Tg5}@$_|Nf5gMiEhFgvHvB$N=!mC_V~EE2vzPXI9ZnEo zd+1zHor@dYLod2Y{ z@R$7$Z!PXTbY$|@#T!bMzm?`b<(R`cbw(gxJHzu zB$lLFB^RXvDF!10LknF)BV7aY5JN*NBMU1-b8Q0yD+2>vd*|CI8glbfGSez?Ylunu RoetE%;OXk;vd$@?2>>CYplSdB diff --git a/html/search/mag_sel.svg b/html/search/mag_sel.svg new file mode 100644 index 000000000..03626f64a --- /dev/null +++ b/html/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/html/search/nomatches.html b/html/search/nomatches.html index 437732089..2b9360b6b 100644 --- a/html/search/nomatches.html +++ b/html/search/nomatches.html @@ -1,5 +1,6 @@ - + + diff --git a/html/search/pages_0.html b/html/search/pages_0.html index 9a6a29ad3..179054040 100644 --- a/html/search/pages_0.html +++ b/html/search/pages_0.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/pages_1.html b/html/search/pages_1.html index 132ee038e..1ffd4f9a0 100644 --- a/html/search/pages_1.html +++ b/html/search/pages_1.html @@ -1,7 +1,8 @@ - + + - + @@ -10,21 +11,27 @@
                Loading...
                - +
                Searching...
                No Matches
                - +
                diff --git a/html/search/search.css b/html/search/search.css index 3cf9df94a..9074198f8 100644 --- a/html/search/search.css +++ b/html/search/search.css @@ -1,98 +1,82 @@ /*---------------- Search Box */ -#FSearchBox { - float: left; -} - #MSearchBox { white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; z-index: 102; } -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; } #MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; } #MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; border:none; - width:115px; - margin-left:20px; - padding-left:4px; color: #909090; outline: none; - font: 9pt Arial, Verdana, sans-serif; + font-family: Arial, Verdana, sans-serif; -webkit-border-radius: 0px; + border-radius: 0px; + background: none; } -#FSearchBox #MSearchField { - margin-left:15px; -} #MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; } #MSearchClose { display: none; - position: absolute; - top: 4px; + font-size: inherit; background : none; border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; + margin: 0; + padding: 0; outline: none; -} -.left #MSearchClose { - left: 6px; } -.right #MSearchClose { - right: 2px; +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; } .MSearchBoxActive #MSearchField { color: #000000; } +#main-menu > li:last-child { + /* This
              • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + /*---------------- Search filter selection */ #MSearchSelectWindow { @@ -220,19 +204,21 @@ a.SRScope:focus, a.SRScope:active { span.SRScope { padding-left: 4px; + font-family: Arial, Verdana, sans-serif; } .SRPage .SRStatus { padding: 2px 5px; font-size: 8pt; font-style: italic; + font-family: Arial, Verdana, sans-serif; } .SRResult { display: none; } -DIV.searchresults { +div.searchresults { margin-left: 10px; margin-right: 10px; } diff --git a/html/search/search.js b/html/search/search.js index a554ab9cb..fb226f734 100644 --- a/html/search/search.js +++ b/html/search/search.js @@ -1,25 +1,26 @@ /* - @licstart The following is the entire license notice for the - JavaScript code in this file. + @licstart The following is the entire license notice for the JavaScript code in this file. - Copyright (C) 1997-2017 by Dimitri van Heesch + The MIT License (MIT) - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + Copyright (C) 1997-2020 by Dimitri van Heesch - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. - @licend The above is the entire license notice - for the JavaScript code in this file + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file */ function convertToId(search) { @@ -79,9 +80,10 @@ function getYPos(item) storing this instance. Is needed to be able to set timeouts. resultPath - path to use for external files */ -function SearchBox(name, resultsPath, inFrame, label) +function SearchBox(name, resultsPath, inFrame, label, extension) { if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } // ---------- Instance variables this.name = name; @@ -96,6 +98,7 @@ function SearchBox(name, resultsPath, inFrame, label) this.searchActive = false; this.insideFrame = inFrame; this.searchLabel = label; + this.extension = extension; // ----------- DOM Elements @@ -200,10 +203,9 @@ function SearchBox(name, resultsPath, inFrame, label) } return; } - else if (window.frames.MSearchResults.searchResults) + else { - var elem = window.frames.MSearchResults.searchResults.NavNext(0); - if (elem) elem.focus(); + window.frames.MSearchResults.postMessage("take_focus", "*"); } } else if (e.keyCode==27) // Escape out of the search field @@ -347,13 +349,13 @@ function SearchBox(name, resultsPath, inFrame, label) if (idx!=-1) { var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; resultsPageWithSearch = resultsPage+'?'+escape(searchValue); hasResultsPage = true; } else // nothing available for this search term { - resultsPage = this.resultsPath + '/nomatches.html'; + resultsPage = this.resultsPath + '/nomatches' + this.extension; resultsPageWithSearch = resultsPage; hasResultsPage = false; } @@ -364,7 +366,7 @@ function SearchBox(name, resultsPath, inFrame, label) if (domPopupSearchResultsWindow.style.display!='block') { var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; + this.DOMSearchClose().style.display = 'inline-block'; if (this.insideFrame) { var domPopupSearchResults = this.DOMPopupSearchResults(); @@ -439,12 +441,12 @@ function SearchResults(name) while (element && element!=parentElement) { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { return element; } - if (element.nodeName == 'DIV' && element.hasChildNodes()) + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { element = element.firstChild; } diff --git a/html/server_8py_source.html b/html/server_8py_source.html new file mode 100644 index 000000000..76e0b8cc3 --- /dev/null +++ b/html/server_8py_source.html @@ -0,0 +1,732 @@ + + + + + + + +Craft: server.py Source File + + + + + + + + + +
                +
                + + + + + + +
                +
                Craft +
                +
                +
                + + + + + + + +
                + +
                +
                + + +
                + +
                + +
                +
                +
                server.py
                +
                +
                +
                1 from math import floor
                +
                2 from world import World
                +
                3 import Queue
                +
                4 import SocketServer
                +
                5 import datetime
                +
                6 import random
                +
                7 import re
                +
                8 import requests
                +
                9 import sqlite3
                +
                10 import sys
                +
                11 import threading
                +
                12 import time
                +
                13 import traceback
                +
                14 
                +
                15 DEFAULT_HOST = '0.0.0.0'
                +
                16 DEFAULT_PORT = 4080
                +
                17 
                +
                18 DB_PATH = 'craft.db'
                +
                19 LOG_PATH = 'log.txt'
                +
                20 
                +
                21 CHUNK_SIZE = 32
                +
                22 BUFFER_SIZE = 4096
                +
                23 COMMIT_INTERVAL = 5
                +
                24 
                +
                25 SPAWN_POINT = (0, 0, 0, 0, 0)
                +
                26 RATE_LIMIT = False
                +
                27 RECORD_HISTORY = False
                +
                28 INDESTRUCTIBLE_ITEMS = set([16])
                +
                29 ALLOWED_ITEMS = set([
                +
                30  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
                +
                31  17, 18, 19, 20, 21, 22, 23,
                +
                32  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
                +
                33  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63])
                +
                34 
                +
                35 AUTHENTICATE = 'A'
                +
                36 BLOCK = 'B'
                +
                37 CHUNK = 'C'
                +
                38 DISCONNECT = 'D'
                +
                39 KEY = 'K'
                +
                40 NICK = 'N'
                +
                41 POSITION = 'P'
                +
                42 REDRAW = 'R'
                +
                43 SIGN = 'S'
                +
                44 TALK = 'T'
                +
                45 VERSION = 'V'
                +
                46 YOU = 'U'
                +
                47 
                +
                48 try:
                +
                49  from config import *
                +
                50 except ImportError:
                +
                51  pass
                +
                52 
                +
                53 def log(*args):
                +
                54  now = datetime.datetime.utcnow()
                +
                55  line = ' '.join(map(str, (now,) + args))
                +
                56  print line
                +
                57  with open(LOG_PATH, 'a') as fp:
                +
                58  fp.write('%s\n' % line)
                +
                59 
                +
                60 def chunked(x):
                +
                61  return int(floor(round(x) / CHUNK_SIZE))
                +
                62 
                +
                63 def packet(*args):
                +
                64  return '%s\n' % ','.join(map(str, args))
                +
                65 
                +
                66 class RateLimiter(object):
                +
                67  def __init__(self, rate, per):
                +
                68  self.raterate = float(rate)
                +
                69  self.perper = float(per)
                +
                70  self.allowanceallowance = self.raterate
                +
                71  self.last_checklast_check = time.time()
                +
                72  def tick(self):
                +
                73  if not RATE_LIMIT:
                +
                74  return False
                +
                75  now = time.time()
                +
                76  elapsed = now - self.last_checklast_check
                +
                77  self.last_checklast_check = now
                +
                78  self.allowanceallowance += elapsed * (self.raterate / self.perper)
                +
                79  if self.allowanceallowance > self.raterate:
                +
                80  self.allowanceallowance = self.raterate
                +
                81  if self.allowanceallowance < 1:
                +
                82  return True # too fast
                +
                83  else:
                +
                84  self.allowanceallowance -= 1
                +
                85  return False # okay
                +
                86 
                +
                87 class Server(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
                +
                88  allow_reuse_address = True
                +
                89  daemon_threads = True
                +
                90 
                +
                91 class Handler(SocketServer.BaseRequestHandler):
                +
                92  def setup(self):
                +
                93  self.position_limiterposition_limiter = RateLimiter(100, 5)
                +
                94  self.limiterlimiter = RateLimiter(1000, 10)
                +
                95  self.versionversion = None
                +
                96  self.client_idclient_id = None
                +
                97  self.user_iduser_id = None
                +
                98  self.nicknick = None
                +
                99  self.queuequeue = Queue.Queue()
                +
                100  self.runningrunning = True
                +
                101  self.startstart()
                +
                102  def handle(self):
                +
                103  model = self.server.model
                +
                104  model.enqueue(model.on_connect, self)
                +
                105  try:
                +
                106  buf = []
                +
                107  while True:
                +
                108  data = self.request.recv(BUFFER_SIZE)
                +
                109  if not data:
                +
                110  break
                +
                111  buf.extend(data.replace('\r\n', '\n'))
                +
                112  while '\n' in buf:
                +
                113  index = buf.index('\n')
                +
                114  line = ''.join(buf[:index])
                +
                115  buf = buf[index + 1:]
                +
                116  if not line:
                +
                117  continue
                +
                118  if line[0] == POSITION:
                +
                119  if self.position_limiterposition_limiter.tick():
                +
                120  log('RATE', self.client_idclient_id)
                +
                121  self.stopstop()
                +
                122  return
                +
                123  else:
                +
                124  if self.limiterlimiter.tick():
                +
                125  log('RATE', self.client_idclient_id)
                +
                126  self.stopstop()
                +
                127  return
                +
                128  model.enqueue(model.on_data, self, line)
                +
                129  finally:
                +
                130  model.enqueue(model.on_disconnect, self)
                +
                131  def finish(self):
                +
                132  self.runningrunning = False
                +
                133  def stop(self):
                +
                134  self.request.close()
                +
                135  def start(self):
                +
                136  thread = threading.Thread(target=self.runrun)
                +
                137  thread.setDaemon(True)
                +
                138  thread.start()
                +
                139  def run(self):
                +
                140  while self.runningrunning:
                +
                141  try:
                +
                142  buf = []
                +
                143  try:
                +
                144  buf.append(self.queuequeue.get(timeout=5))
                +
                145  try:
                +
                146  while True:
                +
                147  buf.append(self.queuequeue.get(False))
                +
                148  except Queue.Empty:
                +
                149  pass
                +
                150  except Queue.Empty:
                +
                151  continue
                +
                152  data = ''.join(buf)
                +
                153  self.request.sendall(data)
                +
                154  except Exception:
                +
                155  self.request.close()
                +
                156  raise
                +
                157  def send_raw(self, data):
                +
                158  if data:
                +
                159  self.queuequeue.put(data)
                +
                160  def send(self, *args):
                +
                161  self.send_rawsend_raw(packet(*args))
                +
                162 
                +
                163 class Model(object):
                +
                164  def __init__(self, seed):
                +
                165  self.worldworld = World(seed)
                +
                166  self.clientsclients = []
                +
                167  self.queuequeue = Queue.Queue()
                +
                168  self.commandscommands = {
                +
                169  AUTHENTICATE: self.on_authenticateon_authenticate,
                +
                170  CHUNK: self.on_chunkon_chunk,
                +
                171  BLOCK: self.on_blockon_block,
                +
                172  POSITION: self.on_positionon_position,
                +
                173  TALK: self.on_talkon_talk,
                +
                174  SIGN: self.on_signon_sign,
                +
                175  VERSION: self.on_versionon_version,
                +
                176  }
                +
                177  self.patternspatterns = [
                +
                178  (re.compile(r'^/spawn$'), self.on_spawnon_spawn),
                +
                179  (re.compile(r'^/goto(?:\s+(\S+))?$'), self.on_gotoon_goto),
                +
                180  (re.compile(r'^/pq\s+(-?[0-9]+)\s*,?\s*(-?[0-9]+)$'), self.on_pqon_pq),
                +
                181  (re.compile(r'^/help(?:\s+(\S+))?$'), self.on_helpon_help),
                +
                182  (re.compile(r'^/list$'), self.on_liston_list),
                +
                183  ]
                +
                184  def start(self):
                +
                185  thread = threading.Thread(target=self.runrun)
                +
                186  thread.setDaemon(True)
                +
                187  thread.start()
                +
                188  def run(self):
                +
                189  self.connectionconnection = sqlite3.connect(DB_PATH)
                +
                190  self.create_tablescreate_tables()
                +
                191  self.commitcommit()
                +
                192  while True:
                +
                193  try:
                +
                194  if time.time() - self.last_commitlast_commit > COMMIT_INTERVAL:
                +
                195  self.commitcommit()
                +
                196  self.dequeuedequeue()
                +
                197  except Exception:
                +
                198  traceback.print_exc()
                +
                199  def enqueue(self, func, *args, **kwargs):
                +
                200  self.queuequeue.put((func, args, kwargs))
                +
                201  def dequeue(self):
                +
                202  try:
                +
                203  func, args, kwargs = self.queuequeue.get(timeout=5)
                +
                204  func(*args, **kwargs)
                +
                205  except Queue.Empty:
                +
                206  pass
                +
                207  def execute(self, *args, **kwargs):
                +
                208  return self.connectionconnection.execute(*args, **kwargs)
                +
                209  def commit(self):
                +
                210  self.last_commitlast_commit = time.time()
                +
                211  self.connectionconnection.commit()
                +
                212  def create_tables(self):
                +
                213  queries = [
                +
                214  'create table if not exists block ('
                +
                215  ' p int not null,'
                +
                216  ' q int not null,'
                +
                217  ' x int not null,'
                +
                218  ' y int not null,'
                +
                219  ' z int not null,'
                +
                220  ' w int not null'
                +
                221  ');',
                +
                222  'create unique index if not exists block_pqxyz_idx on '
                +
                223  ' block (p, q, x, y, z);',
                +
                224  'create table if not exists sign ('
                +
                225  ' p int not null,'
                +
                226  ' q int not null,'
                +
                227  ' x int not null,'
                +
                228  ' y int not null,'
                +
                229  ' z int not null,'
                +
                230  ' face int not null,'
                +
                231  ' text text not null'
                +
                232  ');',
                +
                233  'create index if not exists sign_pq_idx on sign (p, q);',
                +
                234  'create unique index if not exists sign_xyzface_idx on '
                +
                235  ' sign (x, y, z, face);',
                +
                236  'create table if not exists block_history ('
                +
                237  ' timestamp real not null,'
                +
                238  ' user_id int not null,'
                +
                239  ' x int not null,'
                +
                240  ' y int not null,'
                +
                241  ' z int not null,'
                +
                242  ' w int not null'
                +
                243  ');',
                +
                244  ]
                +
                245  for query in queries:
                +
                246  self.executeexecute(query)
                +
                247  def get_default_block(self, x, y, z):
                +
                248  p, q = chunked(x), chunked(z)
                +
                249  chunk = self.worldworld.get_chunk(p, q)
                +
                250  return chunk.get((x, y, z), 0)
                +
                251  def get_block(self, x, y, z):
                +
                252  query = (
                +
                253  'select w from block where '
                +
                254  'p = :p and q = :q and x = :x and y = :y and z = :z;'
                +
                255  )
                +
                256  p, q = chunked(x), chunked(z)
                +
                257  rows = list(self.executeexecute(query, dict(p=p, q=q, x=x, y=y, z=z)))
                +
                258  if rows:
                +
                259  return rows[0][0]
                +
                260  return self.get_default_blockget_default_block(x, y, z)
                +
                261  def next_client_id(self):
                +
                262  result = 1
                +
                263  client_ids = set(x.client_id for x in self.clientsclients)
                +
                264  while result in client_ids:
                +
                265  result += 1
                +
                266  return result
                +
                267  def on_connect(self, client):
                +
                268  client.client_id = self.next_client_idnext_client_id()
                +
                269  client.nick = 'guest%d' % client.client_id
                +
                270  log('CONN', client.client_id, *client.client_address)
                +
                271  client.position = SPAWN_POINT
                +
                272  self.clientsclients.append(client)
                +
                273  client.send(YOU, client.client_id, *client.position)
                +
                274  client.send(TALK, 'Welcome to Craft!')
                +
                275  client.send(TALK, 'Type "/help" for a list of commands.')
                +
                276  self.send_positionsend_position(client)
                +
                277  self.send_positionssend_positions(client)
                +
                278  self.send_nicksend_nick(client)
                +
                279  self.send_nickssend_nicks(client)
                +
                280  def on_data(self, client, data):
                +
                281  #log('RECV', client.client_id, data)
                +
                282  args = data.split(',')
                +
                283  command, args = args[0], args[1:]
                +
                284  if command in self.commandscommands:
                +
                285  func = self.commandscommands[command]
                +
                286  func(client, *args)
                +
                287  def on_disconnect(self, client):
                +
                288  log('DISC', client.client_id, *client.client_address)
                +
                289  self.clientsclients.remove(client)
                +
                290  self.send_disconnectsend_disconnect(client)
                +
                291  self.send_talksend_talk('%s has disconnected from the server.' % client.nick)
                +
                292  def on_version(self, client, version):
                +
                293  if client.version is not None:
                +
                294  return
                +
                295  version = int(version)
                +
                296  if version != 1:
                +
                297  client.stop()
                +
                298  return
                +
                299  client.version = version
                +
                300  # TODO: client.start() here
                +
                301  def on_authenticate(self, client, username, access_token):
                +
                302  user_id = None
                +
                303  if username and access_token:
                +
                304  url = 'https://craft.michaelfogleman.com/api/1/access'
                +
                305  payload = {
                +
                306  'username': username,
                +
                307  'access_token': access_token,
                +
                308  }
                +
                309  response = requests.post(url, data=payload)
                +
                310  if response.status_code == 200 and response.text.isdigit():
                +
                311  user_id = int(response.text)
                +
                312  client.user_id = user_id
                +
                313  if user_id is None:
                +
                314  client.nick = 'guest%d' % client.client_id
                +
                315  client.send(TALK, 'Visit craft.michaelfogleman.com to register!')
                +
                316  else:
                +
                317  client.nick = username
                +
                318  self.send_nicksend_nick(client)
                +
                319  # TODO: has left message if was already authenticated
                +
                320  self.send_talksend_talk('%s has joined the game.' % client.nick)
                +
                321  def on_chunk(self, client, p, q, key=0):
                +
                322  packets = []
                +
                323  p, q, key = map(int, (p, q, key))
                +
                324  query = (
                +
                325  'select rowid, x, y, z, w from block where '
                +
                326  'p = :p and q = :q and rowid > :key;'
                +
                327  )
                +
                328  rows = self.executeexecute(query, dict(p=p, q=q, key=key))
                +
                329  max_rowid = 0
                +
                330  blocks = 0
                +
                331  for rowid, x, y, z, w in rows:
                +
                332  blocks += 1
                +
                333  packets.append(packet(BLOCK, p, q, x, y, z, w))
                +
                334  max_rowid = max(max_rowid, rowid)
                +
                335  query = (
                +
                336  'select x, y, z, face, text from sign where '
                +
                337  'p = :p and q = :q;'
                +
                338  )
                +
                339  rows = self.executeexecute(query, dict(p=p, q=q))
                +
                340  signs = 0
                +
                341  for x, y, z, face, text in rows:
                +
                342  signs += 1
                +
                343  packets.append(packet(SIGN, p, q, x, y, z, face, text))
                +
                344  if blocks:
                +
                345  packets.append(packet(KEY, p, q, max_rowid))
                +
                346  if blocks or signs:
                +
                347  packets.append(packet(REDRAW, p, q))
                +
                348  packets.append(packet(CHUNK, p, q))
                +
                349  client.send_raw(''.join(packets))
                +
                350  def on_block(self, client, x, y, z, w):
                +
                351  x, y, z, w = map(int, (x, y, z, w))
                +
                352  p, q = chunked(x), chunked(z)
                +
                353  previous = self.get_blockget_block(x, y, z)
                +
                354  message = None
                +
                355  if client.user_id is None:
                +
                356  message = 'Only logged in users are allowed to build.'
                +
                357  elif y <= 0 or y > 255:
                +
                358  message = 'Invalid block coordinates.'
                +
                359  elif w not in ALLOWED_ITEMS:
                +
                360  message = 'That item is not allowed.'
                +
                361  elif w and previous:
                +
                362  message = 'Cannot create blocks in a non-empty space.'
                +
                363  elif not w and not previous:
                +
                364  message = 'That space is already empty.'
                +
                365  elif previous in INDESTRUCTIBLE_ITEMS:
                +
                366  message = 'Cannot destroy that type of block.'
                +
                367  if message is not None:
                +
                368  client.send(BLOCK, p, q, x, y, z, previous)
                +
                369  client.send(REDRAW, p, q)
                +
                370  client.send(TALK, message)
                +
                371  return
                +
                372  query = (
                +
                373  'insert into block_history (timestamp, user_id, x, y, z, w) '
                +
                374  'values (:timestamp, :user_id, :x, :y, :z, :w);'
                +
                375  )
                +
                376  if RECORD_HISTORY:
                +
                377  self.executeexecute(query, dict(timestamp=time.time(),
                +
                378  user_id=client.user_id, x=x, y=y, z=z, w=w))
                +
                379  query = (
                +
                380  'insert or replace into block (p, q, x, y, z, w) '
                +
                381  'values (:p, :q, :x, :y, :z, :w);'
                +
                382  )
                +
                383  self.executeexecute(query, dict(p=p, q=q, x=x, y=y, z=z, w=w))
                +
                384  self.send_blocksend_block(client, p, q, x, y, z, w)
                +
                385  for dx in range(-1, 2):
                +
                386  for dz in range(-1, 2):
                +
                387  if dx == 0 and dz == 0:
                +
                388  continue
                +
                389  if dx and chunked(x + dx) == p:
                +
                390  continue
                +
                391  if dz and chunked(z + dz) == q:
                +
                392  continue
                +
                393  np, nq = p + dx, q + dz
                +
                394  self.executeexecute(query, dict(p=np, q=nq, x=x, y=y, z=z, w=-w))
                +
                395  self.send_blocksend_block(client, np, nq, x, y, z, -w)
                +
                396  if w == 0:
                +
                397  query = (
                +
                398  'delete from sign where '
                +
                399  'x = :x and y = :y and z = :z;'
                +
                400  )
                +
                401  self.executeexecute(query, dict(x=x, y=y, z=z))
                +
                402  def on_sign(self, client, x, y, z, face, *args):
                +
                403  if client.user_id is None:
                +
                404  client.send(TALK, 'Only logged in users are allowed to build.')
                +
                405  return
                +
                406  text = ','.join(args)
                +
                407  x, y, z, face = map(int, (x, y, z, face))
                +
                408  if y <= 0 or y > 255:
                +
                409  return
                +
                410  if face < 0 or face > 7:
                +
                411  return
                +
                412  if len(text) > 48:
                +
                413  return
                +
                414  p, q = chunked(x), chunked(z)
                +
                415  if text:
                +
                416  query = (
                +
                417  'insert or replace into sign (p, q, x, y, z, face, text) '
                +
                418  'values (:p, :q, :x, :y, :z, :face, :text);'
                +
                419  )
                +
                420  self.executeexecute(query,
                +
                421  dict(p=p, q=q, x=x, y=y, z=z, face=face, text=text))
                +
                422  else:
                +
                423  query = (
                +
                424  'delete from sign where '
                +
                425  'x = :x and y = :y and z = :z and face = :face;'
                +
                426  )
                +
                427  self.executeexecute(query, dict(x=x, y=y, z=z, face=face))
                +
                428  self.send_signsend_sign(client, p, q, x, y, z, face, text)
                +
                429  def on_position(self, client, x, y, z, rx, ry):
                +
                430  x, y, z, rx, ry = map(float, (x, y, z, rx, ry))
                +
                431  client.position = (x, y, z, rx, ry)
                +
                432  self.send_positionsend_position(client)
                +
                433  def on_talk(self, client, *args):
                +
                434  text = ','.join(args)
                +
                435  if text.startswith('/'):
                +
                436  for pattern, func in self.patternspatterns:
                +
                437  match = pattern.match(text)
                +
                438  if match:
                +
                439  func(client, *match.groups())
                +
                440  break
                +
                441  else:
                +
                442  client.send(TALK, 'Unrecognized command: "%s"' % text)
                +
                443  elif text.startswith('@'):
                +
                444  nick = text[1:].split(' ', 1)[0]
                +
                445  for other in self.clientsclients:
                +
                446  if other.nick == nick:
                +
                447  client.send(TALK, '%s> %s' % (client.nick, text))
                +
                448  other.send(TALK, '%s> %s' % (client.nick, text))
                +
                449  break
                +
                450  else:
                +
                451  client.send(TALK, 'Unrecognized nick: "%s"' % nick)
                +
                452  else:
                +
                453  self.send_talksend_talk('%s> %s' % (client.nick, text))
                +
                454  def on_spawn(self, client):
                +
                455  client.position = SPAWN_POINT
                +
                456  client.send(YOU, client.client_id, *client.position)
                +
                457  self.send_positionsend_position(client)
                +
                458  def on_goto(self, client, nick=None):
                +
                459  if nick is None:
                +
                460  clients = [x for x in self.clientsclients if x != client]
                +
                461  other = random.choice(clients) if clients else None
                +
                462  else:
                +
                463  nicks = dict((client.nick, client) for client in self.clientsclients)
                +
                464  other = nicks.get(nick)
                +
                465  if other:
                +
                466  client.position = other.position
                +
                467  client.send(YOU, client.client_id, *client.position)
                +
                468  self.send_positionsend_position(client)
                +
                469  def on_pq(self, client, p, q):
                +
                470  p, q = map(int, (p, q))
                +
                471  if abs(p) > 1000 or abs(q) > 1000:
                +
                472  return
                +
                473  client.position = (p * CHUNK_SIZE, 0, q * CHUNK_SIZE, 0, 0)
                +
                474  client.send(YOU, client.client_id, *client.position)
                +
                475  self.send_positionsend_position(client)
                +
                476  def on_help(self, client, topic=None):
                +
                477  if topic is None:
                +
                478  client.send(TALK, 'Type "t" to chat. Type "/" to type commands:')
                +
                479  client.send(TALK, '/goto [NAME], /help [TOPIC], /list, /login NAME, /logout')
                +
                480  client.send(TALK, '/offline [FILE], /online HOST [PORT], /pq P Q, /spawn, /view N')
                +
                481  return
                +
                482  topic = topic.lower().strip()
                +
                483  if topic == 'goto':
                +
                484  client.send(TALK, 'Help: /goto [NAME]')
                +
                485  client.send(TALK, 'Teleport to another user.')
                +
                486  client.send(TALK, 'If NAME is unspecified, a random user is chosen.')
                +
                487  elif topic == 'list':
                +
                488  client.send(TALK, 'Help: /list')
                +
                489  client.send(TALK, 'Display a list of connected users.')
                +
                490  elif topic == 'login':
                +
                491  client.send(TALK, 'Help: /login NAME')
                +
                492  client.send(TALK, 'Switch to another registered username.')
                +
                493  client.send(TALK, 'The login server will be re-contacted. The username is case-sensitive.')
                +
                494  elif topic == 'logout':
                +
                495  client.send(TALK, 'Help: /logout')
                +
                496  client.send(TALK, 'Unauthenticate and become a guest user.')
                +
                497  client.send(TALK, 'Automatic logins will not occur again until the /login command is re-issued.')
                +
                498  elif topic == 'offline':
                +
                499  client.send(TALK, 'Help: /offline [FILE]')
                +
                500  client.send(TALK, 'Switch to offline mode.')
                +
                501  client.send(TALK, 'FILE specifies the save file to use and defaults to "craft".')
                +
                502  elif topic == 'online':
                +
                503  client.send(TALK, 'Help: /online HOST [PORT]')
                +
                504  client.send(TALK, 'Connect to the specified server.')
                +
                505  elif topic == 'pq':
                +
                506  client.send(TALK, 'Help: /pq P Q')
                +
                507  client.send(TALK, 'Teleport to the specified chunk.')
                +
                508  elif topic == 'spawn':
                +
                509  client.send(TALK, 'Help: /spawn')
                +
                510  client.send(TALK, 'Teleport back to the spawn point.')
                +
                511  elif topic == 'view':
                +
                512  client.send(TALK, 'Help: /view N')
                +
                513  client.send(TALK, 'Set viewing distance, 1 - 24.')
                +
                514  def on_list(self, client):
                +
                515  client.send(TALK,
                +
                516  'Players: %s' % ', '.join(x.nick for x in self.clientsclients))
                +
                517  def send_positions(self, client):
                +
                518  for other in self.clientsclients:
                +
                519  if other == client:
                +
                520  continue
                +
                521  client.send(POSITION, other.client_id, *other.position)
                +
                522  def send_position(self, client):
                +
                523  for other in self.clientsclients:
                +
                524  if other == client:
                +
                525  continue
                +
                526  other.send(POSITION, client.client_id, *client.position)
                +
                527  def send_nicks(self, client):
                +
                528  for other in self.clientsclients:
                +
                529  if other == client:
                +
                530  continue
                +
                531  client.send(NICK, other.client_id, other.nick)
                +
                532  def send_nick(self, client):
                +
                533  for other in self.clientsclients:
                +
                534  other.send(NICK, client.client_id, client.nick)
                +
                535  def send_disconnect(self, client):
                +
                536  for other in self.clientsclients:
                +
                537  if other == client:
                +
                538  continue
                +
                539  other.send(DISCONNECT, client.client_id)
                +
                540  def send_block(self, client, p, q, x, y, z, w):
                +
                541  for other in self.clientsclients:
                +
                542  if other == client:
                +
                543  continue
                +
                544  other.send(BLOCK, p, q, x, y, z, w)
                +
                545  other.send(REDRAW, p, q)
                +
                546  def send_sign(self, client, p, q, x, y, z, face, text):
                +
                547  for other in self.clientsclients:
                +
                548  if other == client:
                +
                549  continue
                +
                550  other.send(SIGN, p, q, x, y, z, face, text)
                +
                551  def send_talk(self, text):
                +
                552  log(text)
                +
                553  for client in self.clientsclients:
                +
                554  client.send(TALK, text)
                +
                555 
                +
                556 def cleanup():
                +
                557  world = World(None)
                +
                558  conn = sqlite3.connect(DB_PATH)
                +
                559  query = 'select x, y, z from block order by rowid desc limit 1;'
                +
                560  last = list(conn.execute(query))[0]
                +
                561  query = 'select distinct p, q from block;'
                +
                562  chunks = list(conn.execute(query))
                +
                563  count = 0
                +
                564  total = 0
                +
                565  delete_query = 'delete from block where x = %d and y = %d and z = %d;'
                +
                566  print 'begin;'
                +
                567  for p, q in chunks:
                +
                568  chunk = world.create_chunk(p, q)
                +
                569  query = 'select x, y, z, w from block where p = :p and q = :q;'
                +
                570  rows = conn.execute(query, {'p': p, 'q': q})
                +
                571  for x, y, z, w in rows:
                +
                572  if chunked(x) != p or chunked(z) != q:
                +
                573  continue
                +
                574  total += 1
                +
                575  if (x, y, z) == last:
                +
                576  continue
                +
                577  original = chunk.get((x, y, z), 0)
                +
                578  if w == original or original in INDESTRUCTIBLE_ITEMS:
                +
                579  count += 1
                +
                580  print delete_query % (x, y, z)
                +
                581  conn.close()
                +
                582  print 'commit;'
                +
                583  print >> sys.stderr, '%d of %d blocks will be cleaned up' % (count, total)
                +
                584 
                +
                585 def main():
                +
                586  if len(sys.argv) == 2 and sys.argv[1] == 'cleanup':
                +
                587  cleanup()
                +
                588  return
                +
                589  host, port = DEFAULT_HOST, DEFAULT_PORT
                +
                590  if len(sys.argv) > 1:
                +
                591  host = sys.argv[1]
                +
                592  if len(sys.argv) > 2:
                +
                593  port = int(sys.argv[2])
                +
                594  log('SERV', host, port)
                +
                595  model = Model(None)
                +
                596  model.start()
                +
                597  server = Server((host, port), Handler)
                +
                598  server.model = model
                +
                599  server.serve_forever()
                +
                600 
                +
                601 if __name__ == '__main__':
                +
                602  main()
                + +
                def run(self)
                Definition: server.py:139
                + + + + + + +
                def start(self)
                Definition: server.py:135
                +
                def stop(self)
                Definition: server.py:133
                + +
                def send_raw(self, data)
                Definition: server.py:157
                + + +
                def create_tables(self)
                Definition: server.py:212
                +
                def send_disconnect(self, client)
                Definition: server.py:535
                +
                def on_chunk(self, client, p, q, key=0)
                Definition: server.py:321
                +
                def send_block(self, client, p, q, x, y, z, w)
                Definition: server.py:540
                +
                def on_authenticate(self, client, username, access_token)
                Definition: server.py:301
                +
                def on_pq(self, client, p, q)
                Definition: server.py:469
                +
                def execute(self, *args, **kwargs)
                Definition: server.py:207
                +
                def get_block(self, x, y, z)
                Definition: server.py:251
                +
                def next_client_id(self)
                Definition: server.py:261
                + +
                def on_talk(self, client, *args)
                Definition: server.py:433
                +
                def on_sign(self, client, x, y, z, face, *args)
                Definition: server.py:402
                + + +
                def run(self)
                Definition: server.py:188
                +
                def on_spawn(self, client)
                Definition: server.py:454
                +
                def on_version(self, client, version)
                Definition: server.py:292
                +
                def on_block(self, client, x, y, z, w)
                Definition: server.py:350
                +
                def send_nick(self, client)
                Definition: server.py:532
                + +
                def send_positions(self, client)
                Definition: server.py:517
                +
                def send_nicks(self, client)
                Definition: server.py:527
                +
                def commit(self)
                Definition: server.py:209
                +
                def get_default_block(self, x, y, z)
                Definition: server.py:247
                +
                def send_talk(self, text)
                Definition: server.py:551
                +
                def on_goto(self, client, nick=None)
                Definition: server.py:458
                +
                def dequeue(self)
                Definition: server.py:201
                +
                def on_position(self, client, x, y, z, rx, ry)
                Definition: server.py:429
                +
                def send_sign(self, client, p, q, x, y, z, face, text)
                Definition: server.py:546
                +
                def on_list(self, client)
                Definition: server.py:514
                + +
                def send_position(self, client)
                Definition: server.py:522
                + +
                def on_help(self, client, topic=None)
                Definition: server.py:476
                + + + + + + + + +
                + + + + diff --git a/html/tabs.css b/html/tabs.css index 7d45d36c1..85a0cd5b5 100644 --- a/html/tabs.css +++ b/html/tabs.css @@ -1 +1 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0px 1px 1px rgba(255,255,255,0.9);color:#283A5D;outline:none}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283A5D transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox a:hover span.sub-arrow{border-color:#fff transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:#fff;text-shadow:0px 1px 1px #000}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent #fff}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/html/world_8py_source.html b/html/world_8py_source.html new file mode 100644 index 000000000..e97251b81 --- /dev/null +++ b/html/world_8py_source.html @@ -0,0 +1,127 @@ + + + + + + + +Craft: world.py Source File + + + + + + + + + +
                +
                + + + + + + +
                +
                Craft +
                +
                +
                + + + + + + + +
                + +
                +
                + + +
                + +
                + +
                +
                +
                world.py
                +
                +
                +
                1 # gcc -std=c99 -O3 -shared -o world \
                +
                2 # -I src -I deps/noise deps/noise/noise.c src/world.c
                +
                3 
                +
                4 from ctypes import CDLL, CFUNCTYPE, c_float, c_int, c_void_p
                +
                5 from collections import OrderedDict
                +
                6 
                +
                7 dll = CDLL('./world')
                +
                8 
                +
                9 WORLD_FUNC = CFUNCTYPE(None, c_int, c_int, c_int, c_int, c_void_p)
                +
                10 
                +
                11 def dll_seed(x):
                +
                12  dll.seed(x)
                +
                13 
                +
                14 def dll_create_world(p, q):
                +
                15  result = {}
                +
                16  def world_func(x, y, z, w, arg):
                +
                17  result[(x, y, z)] = w
                +
                18  dll.create_world(p, q, WORLD_FUNC(world_func), None)
                +
                19  return result
                +
                20 
                +
                21 dll.simplex2.restype = c_float
                +
                22 dll.simplex2.argtypes = [c_float, c_float, c_int, c_float, c_float]
                +
                23 def dll_simplex2(x, y, octaves=1, persistence=0.5, lacunarity=2.0):
                +
                24  return dll.simplex2(x, y, octaves, persistence, lacunarity)
                +
                25 
                +
                26 dll.simplex3.restype = c_float
                +
                27 dll.simplex3.argtypes = [c_float, c_float, c_float, c_int, c_float, c_float]
                +
                28 def dll_simplex3(x, y, z, octaves=1, persistence=0.5, lacunarity=2.0):
                +
                29  return dll.simplex3(x, y, z, octaves, persistence, lacunarity)
                +
                30 
                +
                31 class World(object):
                +
                32  def __init__(self, seed=None, cache_size=64):
                +
                33  self.seedseed = seed
                +
                34  self.cachecache = OrderedDict()
                +
                35  self.cache_sizecache_size = cache_size
                +
                36  def create_chunk(self, p, q):
                +
                37  if self.seedseed is not None:
                +
                38  dll_seed(self.seedseed)
                +
                39  return dll_create_world(p, q)
                +
                40  def get_chunk(self, p, q):
                +
                41  try:
                +
                42  chunk = self.cachecache.pop((p, q))
                +
                43  except KeyError:
                +
                44  chunk = self.create_chunkcreate_chunk(p, q)
                +
                45  self.cachecache[(p, q)] = chunk
                +
                46  if len(self.cachecache) > self.cache_sizecache_size:
                +
                47  self.cachecache.popitem(False)
                +
                48  return chunk
                + +
                def create_chunk(self, p, q)
                Definition: world.py:36
                + +
                cache_size
                Definition: world.py:35
                + +
                + + + + From e4b518ef6d4f0e3bcf5393c4074e993c13f1afee Mon Sep 17 00:00:00 2001 From: "bradj4017@gmail.com" Date: Wed, 21 Apr 2021 05:31:11 -0400 Subject: [PATCH 38/38] documentation.html in parent folder that points to index.html generated by doxygen in subdirectory --- documentation/documentation.html | 1 + 1 file changed, 1 insertion(+) create mode 100644 documentation/documentation.html diff --git a/documentation/documentation.html b/documentation/documentation.html new file mode 100644 index 000000000..6a80c390d --- /dev/null +++ b/documentation/documentation.html @@ -0,0 +1 @@ +