From f31f044d4e104d88b0194303f5554101f74aad68 Mon Sep 17 00:00:00 2001 From: Slyvtt Date: Tue, 17 Jan 2023 12:29:49 +0100 Subject: [PATCH] first working, non optimized, version of the Shader (Julia set only) --- .gitignore | 13 +++ CMakeLists.txt | 35 +++++++ README.md | 5 + assets-cg/font.png | Bin 0 -> 19394 bytes assets-cg/fxconv-metadata.txt | 4 + assets-cg/icon-sel.png | Bin 0 -> 19340 bytes assets-cg/icon-uns.png | Bin 0 -> 20220 bytes build | 3 + capture | 1 + clean | 4 + send | 1 + src/main.cpp | 169 ++++++++++++++++++++++++++++++++++ src/mandelbrotshader.cpp | 164 +++++++++++++++++++++++++++++++++ src/mandelbrotshader.h | 9 ++ src/utilities.cpp | 27 ++++++ src/utilities.h | 6 ++ 16 files changed, 441 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 assets-cg/font.png create mode 100644 assets-cg/fxconv-metadata.txt create mode 100644 assets-cg/icon-sel.png create mode 100644 assets-cg/icon-uns.png create mode 100755 build create mode 100755 capture create mode 100755 clean create mode 100755 send create mode 100644 src/main.cpp create mode 100644 src/mandelbrotshader.cpp create mode 100644 src/mandelbrotshader.h create mode 100644 src/utilities.cpp create mode 100644 src/utilities.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..be51d83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Build files +/build-fx +/build-cg +/*.g1a +/*.g3a + +# Python bytecode +__pycache__/ + +# Common IDE files +*.sublime-project +*.sublime-workspace +.vscode diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e517756 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,35 @@ +# Configure with [fxsdk build-fx] or [fxsdk build-cg], which provide the +# toolchain file and module path of the fxSDK + +cmake_minimum_required(VERSION 3.15) +project(Schmup VERSION 1.0 LANGUAGES CXX C ASM) + +include(GenerateG3A) +include(Fxconv) + +find_package(Azur 0.1 REQUIRED) +find_package(Gint 2.9 REQUIRED) +find_package(LibProf 2.4 REQUIRED) + +set(SOURCES + src/main.cpp + src/mandelbrotshader.cpp + src/utilities.cpp + # ... +) +set(ASSETS_cg + assets-cg/font.png + # ... +) + +fxconv_declare_assets(${ASSETS} ${ASSETS_fx} ${ASSETS_cg} WITH_METADATA) + +add_executable(shmup ${SOURCES} ${ASSETS} ${ASSETS_${FXSDK_PLATFORM}}) +target_compile_options(shmup PRIVATE -Wall -Wextra -Os -std=c++20) +target_link_options(shmup PRIVATE -Wl,-Map=Build_Addin.map -Wl,--print-memory-usage -fpermissive) +target_link_libraries(shmup Azur::Azur -lnum LibProf::LibProf Gint::Gint -lstdc++) + +if("${FXSDK_PLATFORM_LONG}" STREQUAL fxCG50) + generate_g3a(TARGET shmup OUTPUT "MandAzur.g3a" + NAME " " ICONS assets-cg/icon-uns.png assets-cg/icon-sel.png) +endif() diff --git a/README.md b/README.md new file mode 100644 index 0000000..d8100eb --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# A simple shader for AZUR aiming at computating the Mandelbrot or Julia set + +Current data set is for Julia only (for evaluation). + +This is a WIP, more cases to be implemented soon. diff --git a/assets-cg/font.png b/assets-cg/font.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf37764785927c158e2adde476388eb4e9201bb GIT binary patch literal 19394 zcmeFYWmFv9wl3VbyK8WFr)k{X-KBANOK^9By9ReBxH|-Q4HDb~0g}u6?tS*zXMFe1 z8RNVEcK4{RsZ%G&$ju0 ze!ZR8cYU}DIDBCK{kE{8I9BK6-Gluk0Qys1SNFB8?(0t^P=JS!{0A0|<1?azW2fe) z&QEWLVs*TTos_e*XC8%*ohsL}yqjl`Z$3=f`ph3bn4TYBJv>G}JokQ!P`PZ`VZA-; zH8*|G+K=gfAu*`;N8a;*68-a&#$71Nf3dA&Pvt4c>6(4>!EH9!zg6k#5BKHCiPk}x z@clwW9p4wv9TB9ua$&QV_g2;KW{%);^gzMCJcX}T@jz1asIhmne;^-TQ$}) z{v&L)Ng zJYMp=qKIggOgRh;D+UA>TKFFBIpM=evR&DG_7aRf1#xWoG zBv-wvqD(%VqNYT>w5T>qKAPh?Lyd&(hd`Z`EXPv1I4@UMIFe;sTe`e%>(m1y!r8JZ zS5?!p?K3-*Do}U%DsnZLz_u@A`CV0t#Nj^bd5Ujgs%Z+iaXwjB-IU2uKz?uS?=#1yE=!ri&2A;Io!oh}w4a6tRi#~q0|-jV zkFh9sG(gWTYa}-7I>Dx;;gc4(bfg;yzjrQkzAb-rJN~rOHtXp?k39X=JOR&E)uHd@k^k3;8Dm$r&{Zw++lBl#O^&+P zfWAWl6eqpaTEqPXu2d2po-nRUGB2N~u`qYT#IMm>n={6y8q?4UCNcicFv3iW{NLO{ zHea(Og^w(E7)z$wzN*~ZH@|v%q~qio3mhfc^0F^#5N>qavc|p5EL@U${`7dBQf%#4 z?$lDN&SX|BP^qZK7G~r9oulK2yLBEJhP+SCxY+)7@uw9tzzF`%l-k#jU&4>)B?Kal z{i=+9wxR5dl*gFp)AOIBQ& zGBb7)59wNKc1%K{OX@CAYg*{I+f1Md0|cIWZpMWwm|7X_cl+|m$UAn;3VD8QD@&Qk z2}$+SXA8&AU-!CigXX!eq?$Ix3Afh>?BYO$O!+v~VpYcimYK<v z#b4M^;a~5^Up)#t^#9 z@7F*D)IWPtL>PYiQ=cTf8ORK1;|B@j2DKyZhLv29#>#&Rnn9jbQ)1x@v5uY!m~_#4KuysJGgp%b0*kwh#n5F70B4Gy9Cjw^ttk_t->S@Bd*O1 zIxenR-P!rD!*AQf>F7{i@z{AvOzzkT9rL)dLFBCo*#NGD9UW3B0@hj{|vi*Bp!av1?`gi zYA!CAZ>j``z05YQ=jq~wlZYUrHd|Uzm{YIrQ7kELMDPi+j@)LgE{zW#Z0*v_DDlB; z3hKo&D?oQrGFAFXm~SZ^`$@f4pb*)owG7R|3Djzaci$KqOt`G@DTbALL4w*8c9m_K zsWPcsqZM#ep?T-oRH7iy-FWRC*UfLo3?!8&wo3eXmkPCSURAIAi@O4A+CMhWp|D7T zE@#g50Q6-qW1U3h(&!l3!@g7chh=>vPlGY_UYCs1|~c6mZ=qRa9|Ho?n)zMR!wcK2c# zxDnJoIdpH{;00G2m$8R}sA%)>)gfx7T_m7)o_s9uI#lHA3G=$fqGGiER z&H=|eM*+nW40!X1ftJ;Mhi#OG6rrEc2V5TH070(%zq|W&{3OjoPu1g{GooEWOT#!& zNT(-tSa6H>K6sNTB)o_fVuK`@j%$6ki-8L9^} z1=13QoazZHmJFV*Rt?3%PP8M@Nlrx(z$AW~rmf+khP@|+^R0xl1zJ`DC4@0PLVE(s zdmuRWR<@6Jq7@Sc#|^Cqfxs-GU-LJ5WA--ERH`ogGS>H5tMk+v`4hxrqTQ?2ghta? zZ@gDJ#;xpCw=iS{B3h z#4vl5{?kxns3~#m5Tg6=#vw_Uf>Y7WsBzhE{30Rf zmmTso>PVKvwC3o=wPzm8f0x(o`{3vBs>;liLi4l6S{f@0j z7+RO{HG`dkuG%WUcL}b>Z7G?VeXNIvb%v~diFa7aT!oKk5TA9aYDbezD{rN z!l{IZZWK8;h*A+dQY8r>U_24h33MEUe6&F+um}QU8-LBQzC$MA8Bmw4SnR|Il!M<( znl9vqbWZQ=pNM>Bi`j3-G8v`+J!zt)4GH0u1PqQO^RXx`GerkI4QwupU5IKU%+x0# z{}$xY>jzz;!E{78B&W#VsIwawXLiCM2Z+LrW^&Rmi}G`-E)ll7(D)nKi|;VG_%Gkw z@)0v|C&@mA_$6yzV+|=NK7hmUGSj{>PL81-M>KfeauZK6s zat%ZH5kHMcY4U}x_EuHTNIWWqQXXMcLd=AS5JKJv9{(C{n>sLXWo9D|eP*zKjV3%A zfbFU9%Zz%fW4irnyH_m+bt^*hlWqjt%8 zXP6KYIL+Iy-iM(S=Y>*-LGFw#55bWTscg;E ztw!GUgMn!-HH2K2dzSbcw@d&?fn^f2tFbS;d%G}p93=!Xx5ft4PWwYzH@iDgg>WBr z^xA>_4?2`L6$*r3T!Dzikd{MeId+N!49i3Dx84{OGSFCw>E12uzu~nElvY)w@n0ph zBPX|N7I9dey@x2t(ZMAFIPJLe${n=|v7>2;oU-X%3KRsv{z-o1l>p!&CFl7*ij6I)(M?1L5y7|hjoKVbw@$cV7OneOYMblaP&fuo~A9kH*v zOenPA&-i7HaJ0`*3AjZWhY`V8s-Z&ya(cS-3)P@sIFTQz$q1wlMY8RE#iQx)fx7l% zh~^b;4K%izei|fj?ecwuQo2E3ia#*TIU~dNi9!w(Acw=m8137TagyT1we)N47z_9N#A!y}>_6h|Q(zX{gj% zt5MQ{@7dR$=PTXUb3Sq`$s|@r%B2K3IvavD9C6_Ya4Z9%#nfr}#Up^IOAj{;yrMky z*(MQ65lcK%h+76Kf-c(Z4G6-)4vf+=C)9`@Y-=&STT?DN@eb5O<{5SAMXZINcy&e# zw9OUlm8vR!EDbrHMA5QP3bpSv#t=h&Kb3sWTh~DKbY#8;5z&@HDT7H0P*L({>B5n( z`VCCZDkU)Bv(-t<825f8&(H9QxvqcV06OU*$4V~Y^lENH2X`75_iHCPpEuC*h{%>2 zw|=dF%)CP}0AsEgFB1>)Y%+NJPWxDqA!XiYaAGDOrtmkp8e4`wltTM8_`syWmqE^W=0irdLpVDb*IJm%MIl zSo%CQ@1wZ!9m4Bx#(VAqStNjbQQx|b{%Wb3%BPl1XbLhoZdU%LdmQHKlHU7+DG+kQ zH|fo3c(bEFeTvA|6!5gzX1J{>cw6$&Y|db5s5E=!moNY-1bgyR9zD zemx2pc9aS@2JGZiM2Q8ne9dM9Ng8;`D_y6&qT3c5Ii!NSTttp?3x2jM^) zI%2Bw_=EQMpD^rKjJFd97|u--cxpCQPy+U}i`AGenvpiDhTQ6FGKqa@q)dg9AfgvH zv!!6i9IOnDPO&93T%`3DNs2D2t~MirM;Jr(OE`Gsu8hfpP4ct&B8HMSTMZ=B6n$68 zFzBae1o_v{Kt5M)#U5^~a3i=BM3dq()mlE7#BFLWjT`~_r6 zP>cS9x&0_1?np*Bf;e#G#mW?@INgQc@s0aqb5cS=@=X#MNEjs<-I({fgd?BRm2Wpf zGMr$fH$TNzWGn^}gINpjDk9vYgNSC6HTn=ha!t{rZXeubzFVa&RCRzdmSBH|I+0Oz zq{I})P{EWwxNg%>YP3e1A;GXEo<(L>r_)WdN8h@I;6W(04BR2^eF53X=D}T9kt0;g zahutms`0CNw`19HtK5plNEWCBqq<$rz0!U|pui|$0lh2%;J!6?VQ%EBn{%hsK#>t5 zE7J2<6MLm2+QO@PGZwTa{_f*!^>g}RdKQSw#M0kXrxAGSX#&x^_mQ`J}v<_i|w@Z=uV!k%= zs?qk$I>B>qcM)de&s==qrf3=Xgh0vR4e0G1=-}utWSGF==gm}cwS;hv z^*KhKu8{GX)x&}?Zw=)ts8ko$K z9w%l|3jAjEbm7om>g@sk+x13>QErj|PeR|FtWZ46fCT8)dTEDOYrN<@K6t7Br9wKt%S z4D_x#un_Z#pz2p?cXY|mm@=6-lYF|>IU^$#%i%l5j-1soIh$zNJ+D}Cv! zWxmF$VM|$;iRX?wl^mPvDR|V#DZzBDaSQz8c?(Q45uFChR9Ouf!pW=3br;cc*4<@# zv%KtEY0&4oa(bVf%UAfQD@VjQ#jZTUwCFG_pmPEw>Sk)qL>*hip+J(|3g7OoAsmsI zMmZ&rqqaeWgwlwl7@bTi4XJ~h(xuvgy_(dE3va)))M@3_omwbGaZo?C{xlju@kCil z@~nq`kWCq{3JtwL|Qs7#^ztC5wDpH0yKs zz_prRD&i@d^+~=uqe`c)&ZqD2uRmdkJo6tw-ux=4^OdWEcUX$IovmqsxGhdx!+tzw zQr`1}S4m(5`cC*U<#EM{v0rRD=|OBn(u&3t)+zEeH?!F;AIRe5jJv#cDH}VG?+IVJ zl}9Zoz7&~V-Li}b(Q4G#CM;GaK(-&od48(1sbm=s+n&q<9SbjVrH9cC;;)a$#He+W zO&iK9Y>4y~;w?3LGvBNLplKxV=%kac5%#V?5P%~Hh1zFCfP5xsryvaxaAXsQ$O{-U zzy@g8OZ%44GNXhtP}a2)gCuLj?23ha{*>JMRq;8fG@=TH3j*EY6W#n0Ci>=nH84@K zq<^IXZHMetda^JG?RrIz{2<%csMBH`yeDeGuX}u&Bzzsjq|4u0TcL*hn8)EA-jB}x z?fsHU(*>P?x1_ErI-q_ zyv8S?eoZYHD!@Lfjq&`$#GTWU&mFJ27SgT`59lKr#1d(q=OW}F{}8pa@80&wFUv&^ zOKmG^vQE8;EimG$%=3b)e<$IQG1F*SmFadmC5{Qv5gRpI660Ld%{GV%rCnmPvvORe z405273W8UW;1l}P0+%RLP;iABG!gC-#@+1q5fcX`>!oD0uEz2!3dn02NPdkrZ~P3j zhYj1Dr{AAnSGDP>yfpA^h^CWcP(Xf=6}OUwqmWV0ze zF>+#Fb{Y?8>4@EUZ%ZCY1I)j8FUD_*NMx21J;Horek%*h2f#VsVFmvITnB_+W%q@I zfx7#*2xO_*wKkW1`1rz8RMOPZihE!%o_tb^`3z{yJd2#wopeH5n#$yJ3D(G_!$E>= z5PwXXG^N)h5WGNpz@p#2_dtmQu9Q+Par{#$&dsUVsuIrKS9N{>cnRFs&k^R;hlG#t|rx8 z>mJ7=<=4FX-H(OL#rrf$l}fdh72F8letPPOg1cZ8$Bb*n#b?^qYZto+VVIS!iLi#~%HU@*& zQ9Y4Nk1EmgO{;;v8qCnga{cB+6lHrB89e(UnuJ4%no&axTp~kj9_(4wp-9aPaw>R( z2h|WVLWu}##!iOe=RAvI>mi3D{owcjDTO;mi{BXR7(;cyg*fxxaQ3@HzBDH(D!rfp zpNDwsvZN{JXuxbZ|3T&t;7Po#64_I3-y_o;57sb@~UwAWM5e;j}8c)d@Pq*R()koF%p2-08#D zJ;*Oki_a9fUrxs(Wd*i6c!^;fG<8O!;f?S%f_>|nw5<;?)t&{LOxO+yuUih0)TV=O zZ8<(LZWbc)NX3OzDdX<&B9qY9?$$y=@8Qy_oobafpuDK_L#@~e{?!xeubRh55@XD;5l13!=nY0Aev7Zut(8A&weh6*|%PimL7|< z0g;J6wC_FTk!G)nrONyDFz9uznT@!2kPaCxPLNt!q@4#5himnkYpUa|W%KL4LCd6i$%mD-C=`6GU z<&+*|!eS^LIRtC*;QU`aQT)SHn%#}QwNHh*sk<&~;;>*jTd9Wgvk2sqe9VHQD}uSo z{b)FQa-M<~+YLUZMpp9+CLFKIhO^qeLv>Kz0kK81tgP2kRpPH`)VJ2@N{mt$2xf%y z6sxedRyrs$G3&XxQAZO5x*Y#Eqqs!EvW)K4D4Csfay>HWqP1*7eQZ)&4OdrsO>E6I z9D54M-1UysACzg|@k@0Yghis3a=&eB`ZgAx3#Qdr@*b9iEX>o_G~!go9)07YvNXRX z)h9w?7g!8X;qpn#sbtYnQ4NLSNKQVh7&^d?TD;8!GSkZ-KvFWy4mR(m zoXHB+lQY8cK*J8DrV$dc)qy+DM%QW83*bIj5zx^Q-Er0*3CX&$?Y8eTXKS!jGs)a+s9bB1SJ0=$=)LeW+#?@_^v%1(pXi8LecQMmr^N9VScGg|GbDEY73zC&l z0Gq%-lQt$=nhxld>; zDD51D*+fSq?$QKv8|^_=Lj)ph*pkId#Ygg~md|nnBVDtNA7xhgN;f3Xw!{apRJr7v zLBw%!6%)|Df+DJqiGIABuVLb;6fRC4YvgL8<{mAD%4wKe)s>xy?X8d6D0vc_Ma%j* z*=>l{7@Eb0LZw@m9*XFw>;ld35KO_9(hsCmOm=FkrbS`4Z;>7p$dli>Esk2G40MM* zxQOXOCML&b^N*gh2(#eET&0OO717!#217oMQHX}K z5UX)>I&ZOMN~ukH8Qo1+AUY3^nl+-s)D%`*$*SVElR)|r80BPFwJ+bFNt{HDQ#^xs z2xDZ9z>diXEjD2)7-w~D)coSmlQvVKhX5~o7OYAO4ukS;ax`RZkT}Oi4b@oyoBSz=Y;E?drVWQK*}40I}fW{>#lC&Rv@aja<$?L>^w6Vpy4SWWAzzgI&F&`j>B zcmW8@R@Ny(Xv{@62~UjcCy~Rb4p1N(gNc)T*h8i~?`BtvX)Hb;)pJ^)>Z?BLB)!=L zQs*!ixbD!LAa}t>VxKc7o4`Fqi^~QI4T0dwg+9yJcvr1?jCJ_(ET}1?XO~LpZH5RC zwt27}6KQ`em!K&ypF#fJPi{2@;RQgUXdemFA&M)J$udz3gjH^w+b3W=U4@*7Du7*B z5}3oWZ-1-onIS`5Brjs9$|&;_6%@n50^B48>`QuLd|FN4g=aFnS_@6yO!~4eMybVx zgWjc}LUJI#1Y0v=a7sNC@7Rl5gjn;VvQvgc;8d<_^z5mehe$?CP?euSq5PEU{Z8vn zgM%5r1!M~3aJXK6S+dV{BWd?sgEeBO+&6222Y1q56)U2ul5xi3_ycCgPnM{mO1lZ( z-y+TFs*tPZd2HJE9=Tlub{TS}eyC*oCs=eigW{x8^?P%HL(EGeooahFHm|wmlg4f_ z@Z@n0pi@3I8!85F+&lz&U0v>L^$)FGcb%ge3*Q9!_EfXQEOCgdP}Klgh3Rq*q)R0* z%a0S1$ZJ#(#dw@mp{4jh0hwz2H}3CYKj59ge@L}&iLh)hHz9eKm)4FoUqDitm!Iw+ z027D@wmUyNp-n%Gohue6qOPU;uy|vdx)-G_ke4fObKP0f%2bw)ecAXh7?kyUdwMHq zdT5f71L3*?2CtjMElOXXaGo$rQ2Zs!gWd_9eZ5WAhat^_UFW-PTm;HJI_?8i3CeNL z#Y}aQ?QT8`8YVm%HP#Jqy=fW7kgD$yZz! zVqvd^r$(JYOz|!8Q*~V|itXgJDJ7aw2dX`mYW8XFeYU*<5!5_8TK#fLng&>>5c{oa zkI|7N8|gGc!>2WuC4`bkL^~W+&7{ik7SN@K8Ray=mgX2nX8S}wxLB=XciSZ`FeGLq$KPf8yxSCyNAIAbj* zvEKvvOc*q09m_+Bh3X&=O_YJZ{KgYobA!&)JY9M~!gY?G^=r#uSRHl)X0JCX%xa1N z33}`)pmjo^O7h^uyCgcu5hYHF>Lbso;)$(L*Azj@yh&?3kB9&*%btf!;u75mO?i-! zW1DXio!)~h7rO!Cb^u(qL}D^(miJOYUPyPeqy%+jw zTs+vTOWlE^{+Lm%f2CiqJS!)AYTj3X(e~I?A=X;1$BP;(-_x6Qzz17sX2_PBN< zB4J9(-I1G`^cypGDQ8dGm`WEwul}9Xk#*Ma@F}9mlGLst_lNdI-FaG3A;|p;ui?>* zS}0Ruxe0@)UfaKzQA zjX52zH;SM;zclXMe2Kg(=e9zR0G%#;Z8^NxiZ{!KHS_G4HU!E=_?d2v3i9vU$8l3; zoUrnb8Fro|-vs1m$2gyej+f1GUi*(wLdVV@`Ac9xEo&F>%Cik7fdg;zgKf z&=@3^9%Y&?USboskLnzLK5N( zM}s%yy0_ZL5T}Jk(h=pV@}DOeZS5h(OY`iLs)@^HLK6Kk`xkvE_i+frn$bP)w|eDvjaE8I~rs~Zsu@u4ycaSpu%KOUngrBVg4u-;xI1Usm49B3*= zFQx5GEkKTtv?RmVD2Zp&BQwx64s2D0(O8?Wmh@*RC+0a{b&m9u5?Clm`|c zHUgceaRU{L%~B8)7QU&aZP^Sqz4gqTGx3ss%rHc3r~R^9~dPO+c{BueRzb{kCYli1?6Z9HRAUM=nJIcYf4-{Pmk0@J?a zZsD4?0ipItGm20)(@Q_VY$Q67g6&jMy9|7Ltg&}z>DBJ?DBnPmgzn!rw11gTJE1h@ z-;d_$aiRXvz+_%`q0C!Dq+U@PO;>RY4=5)~$Rd$?wysVbhv<+&$95QgOMQFG3e#?d5~c--=~3SxmyMQI6*p zEhd2(tHlFZl24i~j$a&Nq_95WbsH~r9Yq^Wr#1CGar-)+)i-8KWyPPAgh+Y#ew({7 zGcvr;N+p7nsN%QQyL-gRz_y@`i~^=B4Snl?d>T`gOc>QU`_hwd5HsO+%JQgYH$>Lr zhTY!b`peSk`gX~%K+L9V8nykt%R>!i=mDDEcS+V%IF2uLKYmZ@m_{p(lw)lB>lR{8 z7Bl32w|mfxqCSvfMr)4a9-|>-g27IR_%ozs)qJVb`y9pj*0?yzr+*xc=^2=8{rKx+ zVn66J@(#Ym*p*ucrOvxo9i5+hpLchvsp3wL}%2-pc~qJ?o#9fmOp zVnOG!8`})W*&}~pqA~3uI=G90DoauOY@>(7o9MTvzULBJoAk6Et(9Z2(%Oh6QN>1G9RGbsfO>*U=UR>mB?2yfD9NG!wE;LED9Pnv|YfQ4N zB-%N^)?7GtJ)<%Bl$rbdc{o!zYqNOL39N|HYzEI;5s>zg`|a)~eiW~?L_w7sNv|5K z!QE^s$DtBOgnNKB<$0&-_2?%@z_$i<-uT9H;C-c3>S&st>n}s+A=70aAuBI?ZN>Lz z_A)Ll2X18tqy?3j_f-ab-$B=JHA!9i9X+f}edBW}uj&pqyrq`aU;H%^RIGaCSfyKN ztLe)0#Xt;8F(Q&Aa+*r=FB}|8-;k;^BSsC{IJ0cJ;VN5?Q>x;TmnpZOL?ekoiH)I? zc8`FOFo{t>(K3t$o~R_9J?TaH=$0giKr8B3ub2*VPy2`)4N*d=I<-UAuB)1`fF6<- zWW|!cu%&I60b{ElSuo~4Z$kTJj;uFg+-iBQ?dP3CQt9fDq3x{RPh5N%0qpy!LPTBc z##vp@9@kO_fo%kb%fS*;;i{uQND`zvZHxBH@u*Mv7)0T^PEQnY$qHh-Q#bnRBW4>p zHqHgf)4hgmz})p#slA%$E4%QIElvakmD=do=nNiSMl*O|EB!-pv1p)X{^v9inLNF2 z3Leoo3eobjYm~(bUwTt>LaY$m)1ftOJD2vV;xtCZ4yII$mb>tFiRLwJ;&GW0Su+hr ze0TAPNk^oD)?$c;2c*w$G8WS-8RvF6G72PpM4DSTwpG9^s88{XTAvBlE2I{sFLz;+ zA7|zu`^JVUEuXXmby{(kOVUgpEDSMAi@mQpfTOQ z7sO8eJRXbDzt9fIP_MjHGKS6FVvoHn#OmZBs_?zx_Qp2F2x_Zq?G~7RU3P=l9(unV z&ps=lKDZI$bqYqD>R)RKMr5Ub{em>b|3GMG=?zJC)wTuCMyv5Ex5aacyv`uD=7(NI zQRm^kwL##bsa#6-C(HWL9k0A|ra#KDItN{+j8{&` zalG*xgJ*pFDrPj~Rmnskrwoso5|%7Ke#>K3&gwpmA1ZJ(Wnxd zU6_Na4!FNxEZwa*QF;!(d8{ALlU)ZAJeOiD`XrRj?;-8YZ2ic|P}AYWpJMk))Mi%1 z?-~Ctotx~`@&M<}-X z@w7u3e4aU^?3$@XMT0Iz6<_YI_)I?r2eh+ytW@SH zdVi@Uz_$1Zi}KC7_z^a@*od0j=ZU-Q%t(bqb1Rf==WgnteZefNevymJQNUSJ(+3AR z&wPGi1@_PM@#jAbgY+xQnn9h11-@7$wii)h0Y5AP>IMU^5QITVF18bItU#3yg1z0( z$q~QL^LxJ@J8z)lazOB0Yk30b;;1KuK8S=4^Pt&cu^3 zg=)Z&ovPTT)H*kY3D`GnWox+r`xayjL1tlRwKW*URa&hw#Y&+eVVH6>3_4Z=^lOuj zB3PKQ7q~QEj{X$;zz#AA%-fw1;;fhW*&cJmQt0mzY=lSBk8-2#j;OLYM zL~W|QOI2vO&y)%XrIJStE`uHkjFtlJ#Xc?HnK?Qp?btJDA>a{c(sW6@s+$J|N%zOS zZayF8eGW6y1wy9ra{B}#$U2RB68~r^5qB}%US)Dzy(E{=vY)bp4jSu88IDvoBgWUZ z^|s@a-eUBECc$$@>}^CVqXb{xM}PV=oIFxf0Qt$QddHUB{<5{>m{_`R`*AjDq`D@(^x~8V%dL>~|`jxZa690#cAI{u>-&H%CzA)Y2HGY=V2-M&% z_6B>Mm}JzSZv>_B?yNgC-t)6?(s2JNdeKA(qeBlfBZ0C%gkZ-aQ2}-95p4*@z#g;$ zosGyioLn?34)VB6Nc0VD=OKO&%V?$qVH*a`7JXR^|5_A7lL?e2{k&fZ{)7+B1Ae|?mm zt!ta>m;?^#_ol-+5PLYw=SRw|!n2eeGb;}$niYI(W4kb+ zEqkoX6DOl*YH!Oe3RxIL@lxt3;NGRVFo-qZ!?8;_FUk*{LA& zmWHS(igG9fUUJX=+ENQ|2~#>5JEJ5nv2APsxz(olCNqI#E97MzeQAM0z?6p3MJ9n> z66xl{U8Rw24F94M(;(ZMF44OunYAnH8%zVV%J}NOmv`%%kb)}P9bn&*W!iLwg zu0s$4@+iMFcu?@e%}zdM82Btuuay=9wo2&{0!ys(F1G1v;~YC;>B?E}^e)+Kd9-*j z^JANx_4Ln+UnUTV;eXJuA*d8mB(NgiE8I-~ucd7^&hF-am9_~+HJ}8FAVa+<^ux>A z-^>E3P`2>SS;eU8!IR75EtiQkl6VS0v@eaXlk;LE#Ydsyj80gv4w#ZNzQqXjF~?q- zhY)Oa*y}i%`Mm%DM5v9pxQeW}_iDnP;%b~W^Tj&u8FDm)uYn0XI!NztM6 ztl#XfwkRJ`A7YnWqT9*$(B11A)~#98Im>$u+v{p=obt#Tlrh7QM<*ANLIG=-kSkS5 zMMrU6(1KpY2%~`Egak5XWyq{`6ltP7iz!&Bj&&7_zp$u|v9FK~8r%1bo== zyn}`ZL22u47&`zs^GjAX^v>Z=c3@d*H?q3m3@!m7%AFQ6@z@1FSg`|ta{l^4%;t=A zU)#~$^62slU{PMRh~n%FAB#)xw{@^pIJ5m*aN+a{?kV5Za|BCfz*aVnf)rO@dnw3lECeaExfR(IoyEb{ zHZs1hV0B+54Rc>RbAAg7VIf42H}D<60qkx{=Ivnb=mzu_r1%>b_`dyDGb;tz-y-gI zf)qN6DrDkLu3$1Q7A_VxW=U@wPYwzpL^6=8g(Xl;Lh7Fo?|Xt2*6!}kKvq^SFE17^ zP8KIuD^_-XetuRq4pt5h=64BZHy=lLQ*UNRH_E>t{(&I@b~AT#P0gG< z+yyBp-uub^YkUsQii-b&cXazF3-5fedYd}4va_(UIykWYyM~*)q~|-xKL_-G)o{~z zFArr^1G_nSxSE3{J;9Fdl>ZK4Vg4_DXAf8VzumDgX9e4X9o|LV-mS9#50lceiYouo z_=^H78wcmVwcg48ACm4imj6xG{}|g}J%79N?*n;P{}=B6kp3^<{}z6iQd9&=IGKC= zH9T1fL5jcZ11+4)Z7hI)Z*p*Qa+;f&b1?Jqfz6q@_)U43&CGc@nK?Ol`OVC@z!v75 zX8#5y>*(fg>SzxB3+f%5#pWHyg3Zj7m&1aenV*O69fI48;~m1BjTy|#&Tq~Q=H%iu zW&1Y>WmlW`tTeU%_fh=?W$_Nh$!o@K!NLFfXKBuC&S%MMYG%pH zWy#I`Hor$o@`SpsD#kjJTP4f-U|w^se`hE^}*BM=S9A@%_()`mc7I z|4Xnq*?3KPdD(fH%{ago@4@1HXPC>Ji`kN$kB5(+8~h&of5iJ==x$Dy?p~&@U{R}g zPv50FUkJf=+IcaV&m z?f3Zn<;P8KGxvpFLc11LrT3@F=Gwa;VeJ#OBR(>=BhL7cE(u+KcVKKU2TSl|F zzHqNf0nDn4IG?JqESUGzMlSdm)F(>c+9o8gCcjS(1V+;{_k}w9$@)2TKE!_&MoA}4 zs~8W}kGG)wC8VLO{Bvn$GA+~LOg%G>;iYgX#4lE^7?X%SZABV(o5-Y9$B5Ji8gPxu zOftdAE7vW_yuDCkL2`A>ONvZ4t zt5~UO;(Fo97;bKfsx~x;-?aT41_rRt;9TrjfJ#Nbl}@SWZC{p7yA(D z(@X+uR*~(Db&Ogzq&!1isqCEwOHEdC?_n3`g zVHnd%kmY5iKI_hpX%2K`d(TV64K;$4eL?bj7dp$hW~sXYnnr8`tWwF_uUh$iV>C6d zVKY@`>JzBJoMXreeLhCFQ}O-;Ah>wH{wET$Hm0cn1xpy#po;zA*VFaim}uDa#RT8A z``oZ&t@_-c`TR--WtKe-W%^<71TOAB_P;V5o%T6wdBnZ)AXQUZ-R!u0`W*|HS~~fz z@ZFUvUt8HD$!kWqI?#i$^1W>EDDQ*w>%0};7q_YQi>dzTYF8yn*WZOeC{=6IU4=*w zAb<5B1ZaU)n-HenmuXr|CJcxbojrLGs|+<(rb(iN#usgpRas=ibh2A{s1hn=Y3+ZD z_oWO}((ewb$ezWB z0{zwB^L#RIDx?BoA?qBx6;iRHNOoqghE!N}UBQ9q)+jK*_0aki5X=-%sU#3mkygCg z5yRPaNBJ1eqb$VAVq@h1i(5{|eW5T!ycuAdJJ!{Z3LbG#m|@hZ504s%4zx1^$g8Hz zyJS^fr%~LIr}1@8|7F&TkO~RBBbOYMEFMt9^ZfVFi;-XQ>1 n$%-z#3hR=&taK9q-zfb9HWQ-8?Qv{$00000NkvXXu0mjfDP_{T literal 0 HcmV?d00001 diff --git a/assets-cg/fxconv-metadata.txt b/assets-cg/fxconv-metadata.txt new file mode 100644 index 0000000..5e3f5a8 --- /dev/null +++ b/assets-cg/fxconv-metadata.txt @@ -0,0 +1,4 @@ +*.png: + type: bopti-image + name_regex: (.*)\.png img_\1 + profile: p8_rgb565a diff --git a/assets-cg/icon-sel.png b/assets-cg/icon-sel.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2b1e6d3c5ae9ae2fe3b2ba957c7a2d79fe30c3 GIT binary patch literal 19340 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�s;^ zn=r9VL%pRzCaqB@B2BPsr)S@O$0JXS;IxNDXAQFW+?Vl-YcAm4?QQJep0NAS0csPY zP_Lm$J%g*z;Zm=S_4M8c!H*A6=Ns8{)1Ft;kylUN;LXY*nTb^t7xdFU(_pCP%?w(C zX7d`DmhwW2vjjzNfEJa;00>!uOhHXH2w8d%?wceC9`6#yf80*gQRXXO8s>?!hPdIa z1Kjt}4m2I7o=iYRAk7W!5SOCfg@N=111UBgYuXt|n>HP5kbzc996x9Z(`o_JH=}8q z_Qila|4R!&UDHdmJ*C8l|DN$WEw?P{H(7-)^jS5{ByipZnpOi}ffTfE&|232PW>ox zI>GrDb@9N%!(4UwLaw>yJWAzGaFdW`ySovLtv)MB6j`MD4AZ@D@#tc&BF*_aOFn}7IYs7;_gL0!f+#5a3($R;)HgVJQo zV(%jLt)8CG*~&k@&|1p>oU70HeVK`7wg%P=FQ?>2ja6PPJ=S8s#!xgXay^$K&QrIF zZxc2?_$=sh~-UxCHfSmdLcgg>P&WDKynhS}EX3s%JrKpFgpeAE#Dc z7)EslvG0k#KXtgSQSlc zcuhca*+-*wBSiw!R2vbW18OfKzQXrB0DYbD78 zqBgY-LxQGFTjUA8$ +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + +#include "utilities.h" +#include "mandelbrotshader.h" + + +bool screenshot = false; +bool record = false; +bool textoutput = false; +bool exitToOS = false; + +#define SCALE_PIXEL 1 +#define X_RESOL (DWIDTH / SCALE_PIXEL) +#define Y_RESOL (DHEIGHT / SCALE_PIXEL) + +#define BIAS 1 +#define NOBIAS (1-BIAS) + +uint8_t texttodraw=1; + + + + +static void update( float dt ) +{ + + +} + + +static void get_inputs( void ) +{ + key_event_t ev; + while((ev = pollevent()).type != KEYEV_NONE) + { + + } + + if(keydown(KEY_SHIFT)) { } + + if(keydown(KEY_EXIT)) {exitToOS = true; }; + + if(keydown(KEY_7)) {screenshot = true;}; + if(keydown(KEY_8)) {record = !record; }; + if(keydown(KEY_9)) {textoutput = true;}; + + if(keydown(KEY_F1)) {texttodraw=0;} + if(keydown(KEY_F2)) {texttodraw=1;} + if(keydown(KEY_F3)) {texttodraw=2;} + if(keydown(KEY_F4)) {texttodraw=3;} +} + + +int main(void) +{ + exitToOS = false; + float elapsedTime = 0.0f; + + kmalloc_arena_t *_uram = kmalloc_get_arena("_uram"); + kmalloc_gint_stats_t *_uram_stats; + + __printf_enable_fp(); + __printf_enable_fixed(); + + azrp_config_scale(SCALE_PIXEL); + azrp_shader_clear_configure(); + azrp_shader_image_rgb16_configure(); + azrp_shader_image_p8_configure(); + azrp_shader_image_p4_configure(); + + azrp_mandelbrot_init(); + + usb_interface_t const *interfaces[] = { &usb_ff_bulk, NULL }; + usb_open(interfaces, GINT_CALL_NULL); + + prof_init(); + prof_t perf_update, perf_render; + uint32_t time_update=0, time_render=0; + + do + { + perf_update = prof_make(); + prof_enter(perf_update); + + { + // read inputs from the player + get_inputs( ); + + // update as per the time spend to do the loop + update( elapsedTime ); + + // update the RAM consumption status + _uram_stats = kmalloc_get_gint_stats(_uram); + } + + prof_leave(perf_update); + time_update = prof_time(perf_update); + + perf_render = prof_make(); + prof_enter(perf_render); + + { + // all the stuff to be rendered should be put here + azrp_clear( C_BLACK ); + + azrp_mandelbrot(); + + if (texttodraw>=1) Azur_draw_text(1,01, " FPS = %.0f", (float) (1000000.0f / elapsedTime) ); + if (texttodraw>=2) Azur_draw_text(1,31, "Update = %.0f mc secs", (float) time_update ); + if (texttodraw>=2) Azur_draw_text(1,41, "Render = %.0f mc secs", (float) time_render ); + if (texttodraw>=2) Azur_draw_text(1,51, ">Total = %.3f ml secs", (float) elapsedTime / 1000.0f ); + if (texttodraw>=2) Azur_draw_text(1,61, ">Total = %.0f seconds", (float) elapsedTime ); + if (texttodraw>=3) Azur_draw_text(1,81, "Mem Used : %d", _uram_stats->used_memory ); + if (texttodraw>=3) Azur_draw_text(1,91, "Mem Free : %d", _uram_stats->free_memory ); + if (texttodraw>=3) Azur_draw_text(1,101, "Mem Peak Used : %d", _uram_stats->peak_used_memory ); + + azrp_update(); + } + + prof_leave(perf_render); + time_render = prof_time(perf_render); + + elapsedTime = ((float) (time_update+time_render)); + + if (screenshot && usb_is_open()) + { + usb_fxlink_screenshot(false); + screenshot = false; + } + + if(record && usb_is_open()) + { + usb_fxlink_videocapture(false); + } + + if (textoutput && usb_is_open()) + { + azrp_mandelbrot_USBDEBUG( ); + textoutput = false; + } + } + while (exitToOS==false); + + + azrp_mandelbrot_close( ); + + prof_quit(); + usb_close(); + + return 1; +} diff --git a/src/mandelbrotshader.cpp b/src/mandelbrotshader.cpp new file mode 100644 index 0000000..4ed765c --- /dev/null +++ b/src/mandelbrotshader.cpp @@ -0,0 +1,164 @@ +#include +#include "mandelbrotshader.h" +#include +#include + +#include +#include +#include + +#include + + + +uint8_t AZRP_SHADER_MANDELBROT = -1; + + +__attribute__((constructor)) +static void register_shader(void) +{ + extern azrp_shader_t azrp_shader_mandelbrot; + AZRP_SHADER_MANDELBROT = azrp_register_shader(azrp_shader_mandelbrot); +} + + +void azrp_shader_mandelbrot_configure(void) +{ + azrp_set_uniforms(AZRP_SHADER_MANDELBROT, (void *)azrp_width); +} + + +void azrp_mandelbrot_USBDEBUG( void ) +{ + char texttosend[1024]; + + sprintf( texttosend, "data" ); + usb_fxlink_text(texttosend, 0); + +} + + +void azrp_mandelbrot_init( ) +{ + +} + + +void azrp_mandelbrot_close( void ) +{ + +} + + +struct command { + uint8_t shader_id; + uint8_t current_frag; + libnum::num xmin; + libnum::num xmax; + libnum::num ymin; + libnum::num ymax; + libnum::num xinc; + libnum::num yinc; +}; + + +void azrp_mandelbrot( void ) +{ + prof_enter(azrp_perf_cmdgen); + + struct command cmd; + + cmd.shader_id = AZRP_SHADER_MANDELBROT; + cmd.current_frag = 0; + cmd.xmin = libnum::num(-1.98f); + cmd.xmax = libnum::num(1.98f); + cmd.ymin = libnum::num(-1.12f); + cmd.ymax = libnum::num(1.12f); + cmd.xinc = libnum::num((2*1.98f)/azrp_width); + cmd.yinc = libnum::num((2*1.12f)/azrp_height); + int fragmin = 0; + int fragcount = (azrp_height >> 4) + 1; + + azrp_queue_command(&cmd, sizeof cmd, fragmin, fragcount); + prof_leave(azrp_perf_cmdgen); +} + + +void azrp_shader_mandelbrot( void *uniforms, void *comnd, void *fragment ) +{ + struct command *cmd = (struct command *) comnd; + uint16_t *frag = (uint16_t *) fragment; + + int maxiter = 256; + libnum::num cr = libnum::num(-0.480f); + libnum::num ci = libnum::num(0.600f); + + + for( int j=0; j<16; j++) + { + int offset = azrp_width * j; + + for( int i=0; ixmin + libnum::num(i)* cmd->xinc; + libnum::num zi = cmd->ymax - libnum::num(cmd->current_frag*16)*cmd->yinc - libnum::num(j)*cmd->yinc; + + libnum::num zr2 = zr * zr; + libnum::num zi2 = zi * zi; + + int u=0; + + while((zr2+zi2)<4 && (ucurrent_frag++; +} diff --git a/src/mandelbrotshader.h b/src/mandelbrotshader.h new file mode 100644 index 0000000..775bffc --- /dev/null +++ b/src/mandelbrotshader.h @@ -0,0 +1,9 @@ +#ifndef MANDELBROT_SHADER_H +#define MANDELBROT_SHADER_H + +void azrp_mandelbrot( void ); +void azrp_mandelbrot_init( void ); +void azrp_mandelbrot_close( void ); +void azrp_mandelbrot_USBDEBUG( void ); + +#endif //MYAZURSHADERS_H diff --git a/src/utilities.cpp b/src/utilities.cpp new file mode 100644 index 0000000..570ddac --- /dev/null +++ b/src/utilities.cpp @@ -0,0 +1,27 @@ +#include +#include + +#include +#include +#include +#include + +/* Render text with Azur images - quite bad, but I don't have time lol. */ +void Azur_draw_text(int x, int y, char const *fmt, ...) +{ + char str[128]; + va_list args; + va_start(args, fmt); + vsnprintf(str, 128, fmt, args); + va_end(args); + + extern bopti_image_t img_font; + + for(int i = 0; str[i]; i++) { + if(str[i] < 32 || str[i] >= 0x7f) continue; + + int row = (str[i] - 32) >> 4; + int col = (str[i] - 32) & 15; + azrp_subimage(x + 5 * i, y, &img_font, 7 * col + 1, 9 * row + 1, 6, 8, DIMAGE_NONE); + } +} diff --git a/src/utilities.h b/src/utilities.h new file mode 100644 index 0000000..41fbdd3 --- /dev/null +++ b/src/utilities.h @@ -0,0 +1,6 @@ +#ifndef UTILITIES_H +#define UTILITIES_H + +void Azur_draw_text(int x, int y, char const *fmt, ...); + +#endif \ No newline at end of file