From 8bd4f13b0d0fd40c99e420d4819aa41e149d974f Mon Sep 17 00:00:00 2001 From: Ricardo de Almeida Gonzaga Date: Mon, 8 Oct 2012 22:46:19 +0000 Subject: [PATCH] ephysics: initial commit to sandbox Patch by: Ricardo de Almeida Gonzaga SVN revision: 77592 --- legacy/ephysics/data/themes/Makefile.am | 10 +- legacy/ephysics/data/themes/ephysics_test.edc | 1 + .../data/themes/images/ball-concrete.png | Bin 0 -> 9002 bytes .../data/themes/images/ball-custom.png | Bin 0 -> 3867 bytes .../ephysics/data/themes/images/ball-iron.png | Bin 0 -> 5049 bytes .../data/themes/images/ball-plastic.png | Bin 0 -> 7509 bytes .../data/themes/images/ball-polystyrene.png | Bin 0 -> 7810 bytes .../data/themes/images/ball-rubber.png | Bin 0 -> 8896 bytes .../ephysics/data/themes/images/ball-wood.png | Bin 0 -> 9961 bytes legacy/ephysics/data/themes/sandbox.edc | 165 ++++ legacy/ephysics/src/bin/Makefile.am | 13 +- legacy/ephysics/src/bin/ephysics_sandbox.c | 876 ++++++++++++++++++ 12 files changed, 1062 insertions(+), 3 deletions(-) create mode 100644 legacy/ephysics/data/themes/images/ball-concrete.png create mode 100644 legacy/ephysics/data/themes/images/ball-custom.png create mode 100644 legacy/ephysics/data/themes/images/ball-iron.png create mode 100644 legacy/ephysics/data/themes/images/ball-plastic.png create mode 100644 legacy/ephysics/data/themes/images/ball-polystyrene.png create mode 100644 legacy/ephysics/data/themes/images/ball-rubber.png create mode 100644 legacy/ephysics/data/themes/images/ball-wood.png create mode 100644 legacy/ephysics/data/themes/sandbox.edc create mode 100644 legacy/ephysics/src/bin/ephysics_sandbox.c diff --git a/legacy/ephysics/data/themes/Makefile.am b/legacy/ephysics/data/themes/Makefile.am index 87fd0499be..c9075a5c2d 100644 --- a/legacy/ephysics/data/themes/Makefile.am +++ b/legacy/ephysics/data/themes/Makefile.am @@ -20,6 +20,7 @@ EXTRA_DIST = \ frame.edc \ list.edc \ loading_bar.edc \ + sandbox.edc \ shadows.edc \ shapes.edc \ spinner.edc \ @@ -60,7 +61,14 @@ EXTRA_DIST = \ images/spinner_bt_right_pressed.png \ images/star.png \ images/green-flag.png \ - images/brown-pole.png + images/brown-pole.png \ + images/ball-custom.png \ + images/ball-concrete.png \ + images/ball-iron.png \ + images/ball-plastic.png \ + images/ball-polystyrene.png \ + images/ball-rubber.png \ + images/ball-wood.png ephysics_test.edj: Makefile $(EXTRA_DIST) $(EDJE_CC) $(EDJE_FLAGS) \ diff --git a/legacy/ephysics/data/themes/ephysics_test.edc b/legacy/ephysics/data/themes/ephysics_test.edc index f0bec3e4ac..87594cd64b 100644 --- a/legacy/ephysics/data/themes/ephysics_test.edc +++ b/legacy/ephysics/data/themes/ephysics_test.edc @@ -10,6 +10,7 @@ collections { #include "frame.edc" #include "list.edc" #include "loading_bar.edc" +#include "sandbox.edc" #include "shadows.edc" #include "shapes.edc" #include "spinner.edc" diff --git a/legacy/ephysics/data/themes/images/ball-concrete.png b/legacy/ephysics/data/themes/images/ball-concrete.png new file mode 100644 index 0000000000000000000000000000000000000000..d2d18831c9ea3200a2d0f5fe303185671cab9351 GIT binary patch literal 9002 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 literal 0 HcmV?d00001 diff --git a/legacy/ephysics/data/themes/images/ball-custom.png b/legacy/ephysics/data/themes/images/ball-custom.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4af0adf616ef3410d28521d7a851b0e6646070 GIT binary patch literal 3867 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 literal 0 HcmV?d00001 diff --git a/legacy/ephysics/data/themes/images/ball-plastic.png b/legacy/ephysics/data/themes/images/ball-plastic.png new file mode 100644 index 0000000000000000000000000000000000000000..fb08b23b224727a98be8eda8385b9ad8a2b57872 GIT binary patch literal 7509 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 Aga7~l literal 0 HcmV?d00001 diff --git a/legacy/ephysics/data/themes/images/ball-polystyrene.png b/legacy/ephysics/data/themes/images/ball-polystyrene.png new file mode 100644 index 0000000000000000000000000000000000000000..14f00bef7f65d14812491dbe75fe03300967878e GIT binary patch literal 7810 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 literal 0 HcmV?d00001 diff --git a/legacy/ephysics/data/themes/images/ball-rubber.png b/legacy/ephysics/data/themes/images/ball-rubber.png new file mode 100644 index 0000000000000000000000000000000000000000..7a1bd734d7d6dffa11a65c0b80df7116dcd7ae8e GIT binary patch literal 8896 zcmaKSWmFv9(k|{0+}(pagA;tP;K75#po2>ooWS4?!2^WgK1gtaLvVK|c#z<7lk=VT zeD}vaw^w)Xy=y(sQ&qd_$6mb}s-dokjX{n92M31@RFc#BGb;Rj&`|!oUAeZx{tRRu z^7(G_tZ9Kx=C;;a*5+2eu0z)1aBzr>ART=VeKl24OBW|D^S>A_ zA1Cl1HXNL|ln>b4(!tt;*23BrwgV~oxmj!bsq0w! zIarEV(Mw6viu;KE5pc5hFsJo#a&&eV^^u_em#*la`Cl_PJ?+0B9u5-p{}YtHng*?` zi<>pAAQwNUB@Ztzt&k8GuYjPC5HANU9}h1dH_xA2h?7@9R8UBiPnh=K7yTb^ZdNv; zT5<~i_Vs5aL2u{b0T$)v_V)JX^5*AqakJ&-6%i5ntHH;|`3J%2?(6Jf?!)Qq&hU?d zoVB~98wl(Ha&e~pt7vZF;^`ql|0mM_Nx=#HA6aMje{a*D4deDP2Xpgs@%&BcAE27r z{~zk)^dGdlhnDsK#{2&icGvL*TXSn!ySsS0S^g=U4Z~koU{P5&YjY15Hysxj$A5NF z!_LLS#of*YOe?D`M9ZpXZV7V!Yk2)HhMJlv(AnL?+}Y9^C?`SxM}rFlvJ&Ox5#bl% z0f_Jj$jR{X%JYfv^D6*&-U#r&;S~`Ul2`bLE9YYA>16Hf@ekMPf4Oh|EB9|RID!9o zma}#Pd0AU2xVbpd{wrxw(0`9b_`mA?n``yoV*&hEF87~cxc`>+|0?xAra%4jclw{k z{j>N_>svej>36q3jqUbHAPx?Wh7TzBM#pEV!q}n0%0PE*-yq(|lV(*yBA!|f8v~0r zMiVVWjuAc;7nzBVK8jqk0Ev_j3YCiG#iP&9$EOKSn4s@rq$ht#D1qYj$q{}e)g-j> z`}URQX07boZ@}A5mlK#*&WF}}uVk>TdS03P^|OS0C8V| zX+*A>eXdCnA%BZqf@4hPWmpQu7TvZ;P3H`7D-}(cL)#+l?SY`^tf0k z^0NONQeBR7INRe~-48XS6{U=2Tx-PiYz18Z2j1*8=3a1>^2M6K*-aL!nk5NKC?M`W zo8-X`@*eMD!(xk-Ueh>4?7(cJt~m9#9HYK2QJ=;6iapGqjQY-mY3c#|GCi>8%8np^ zlBpoifhj&?>b(Oy1^bX#UDHcAl!2g5rFw7=84P? z1=D0GZcl2o7?SPi1D2$ZO&6PUV;jdUfaSFo;o*x)J(@5NGw49CN#xXF5e1h_6|9cd zAo5g5>QZ|Z&Ag?e1UPl#|6#wQvVOn7-$8Ecg*o?yJ}yFN?0kV)fdy|oZWy2VJQXC_$+lUYJ zb#?C~Cvu%=ZQZa}h*Ry-ul)>CY`nj;2N-be@9Whs(gZOCQorpa>U|sro-Q&PQlJwk zoyQXFnjc>d?i!+!-hDz! z=ya=0AU~6Nf&nouGHt+U9xXU+8mUy*8J9X z*219nG_&9g=WIN>&t;kSGY@sSdZIc8UESfafFa>EMYhO?VnYtS=%LN(U;sA?S;=f# z7Sx?WGwL*m_4dZ-*B$-X_|Mp;o1|yjO)E!S{18N8O48)YmSyo!(iP9;U3|>yNiV2; zay`AZr*FXGa8K3}gH|~Ivaaq)ZR8EBIv2)@6(r;1_xDLx_o184NgS_k-ba1N>#G#r zc%DB^0f2BnFB9zE1$D(21O4czVh0iq1fZ6mu)Na=cDSM%yKf>5BS{nXGkmsbK{Yz~ z-DHj1MdGmK)~`?F`JH+F{+$y{W3NfwFV~q1@(bhN{FZd8X$j6@!@V(@rdnqjgObMX6)N@rWAt-8Gi^Iu-xjz#V+Vcf9NCn7kH+zAk-D?5gNvyr+*!U3@=Bb1~X@BiGv8S5-l zerXeqd4gBpQP62dY4NmS)Wg{G-0j0zSsqtl_{90^h<@+sd-F@+sX&}aEbDC{`U|hd z^K9owNB(Y`+2pm0$61`)rg0s-4=95(u_$7feC@WY|aoed$e{@y4J3Sg+A5j=? z@F|#u{+S`7RzjrP-Q+lF@CLqo@khK34$m1|LqvJd^T$)O!1w*8qw#hE81qy=Y@9LO z#WK~yL)lj|02Ei!F(*Z!qhhuftRp|V(L<>C_EHa%a#gbD@&Tb@=ohpi6=Rn~XZ_ zjjA)8ITGzqPqRWT=nIgefoanx)|i%@^_n>_g_&OHf`+1B({6cd!KUu`ujPNr(r-3Po;Y-zoCoe%2=r1g7gd5A6(H;V|% z$UTXDKuE0>D0IRP*Y}N8hbC3t(IZryM~%lB4D$?NN6RKSvDNF zf4hAVR{ko)VePR+kvpJSC1a&H{PZD=>(=oRYTouA-hiC(EZw%f(CJJS;4 zsg#$HXLKQh0n#!74=8IiU$Z&OkzE>!4Biqzz_jCtk|_^JjeLD?L4z%4i#$p{Kf#pW z?8aX*36Ok~7Pcc1MfM<^+#TISQmp_HuFu3K{%Ia;!w-Ire)+kb_c+1bvB^>v+kyWK z!K4P{VJpg-5*#Iog%4d5nt5Me%RM+cxoCr}-P~2NJW?FG7}GTgYg!?=2`hx=7Z&Y@ zVM-kE+VGoeOI?WGt{fr4(0)*N-3>}^RJb*Ud0KN`Q5Himv4qy?_g z#NND9tZ#B*#ImgS`L$NG{`Pezu}W<-N&A|O=?GVX_C|pS1{`+Bx%wWC^Kt8IucA&t z{8K10qjq-$wJZDyC4}+r81lNC{G*!)UI=~v#uj=P6rqEK+@B{#aSYU#3ilPR{^NH} zk$JWE8XvpFNp(U3d(*NZiP8A++JxoQd+#v^ieeC=3NdYcs&mx5g9WQm=KK{HeBLm$ zV_WdxIYTY6*%jy*?T)!_EMkL(+Vz;#L-4dme=+#D1>5-aX%c4l%w_A&DkE9ABB+G| zsuvN^9HfM%mHOXd57s{RflUMw*$VS2h}7AY zcKRt5VRlL3R{&bOH3HZ{x<9U~Uv^Lk%AZB)msNE2tX5bhTfV`W#`=`iAAvWBd{vH? zzbZ7P4xemmpQ})z|DyUuj7#CY39_}Bw9%q%eO7~1y~7eti(et0^mO}Gcs1mw3@($# zX~d37wXoS>s=bar9*03REK5nF)G5A;%!rS-%qF(QLB9)%wu{=5MM)hcx=J1|KZA0d zWl?0PevD7V6s6(Nn&o5Ex6JDhoxOhGAdk=$iz{CRlii#{bB}6!MTbHi+!&&yZPn)) zl(Gf2wO_Wsr3i))@3=*aUOYp8%o?d-aVxfAy!adDlz7(X2zIL`|cU* z$lb1=!fFsne31yUqrKU<_;DkQ>%6bCOSCgji`jDe!9TwII?hHDE+$7Ub{%}4jY*F! z5Gwb)f%;yO31Q?8UD#1`xY?^m(d>&LahbQqR=R6an4~8O#dp#tNBzl?&e<{=>sw2O>@ck(L)lyp zBerh(G6<-=`5ikdEXtrx1o#cr5Z57Btw;PPVqb<|#j^$_DrdtS0`Cm%KIlV(mr zVYT3>qaZ3V?;DA_5{GwHB_L`sTYX%CIcQs2pEHcx_Kpd8B;id;N1P&6>~hR>HcHpy z)2;r>Yr93e6Qj@LI+gXRzRuG-3`Q-QU>%^r2RFf9_r{1Xk02O=gl`eZ?caPuX^mSd{Of$aGN!((W{> z3`10+R5*c{EwOY0N{WODvm9*)I|OA{I zgsp0rdJPd#3{aIUXjs8-jsjHH`~@wF$>aFGGehW?V}E_^{stc4^vr-NqN{xQp`S@A zC(u*4WR9S(3(jjXiiUyB08xT6JD3SyhQl<(AaH}hhP?gj9A31ZK{A91BNNFopaZ3< zC3yQ3lcdN6FELKZntTfPq&Tp}u(Kazft6Gb*7)u91Fi*?Nt&zBz`Ugtz!vgt>_IYJ z9!Gez4$Nti4Tv@8YW*N#o)qS%hb6oWTI59M0|k|FAdULOigj%yA!Va`WT1J+BXNQy z9Qc0_++DGwenHu+lJq=CYQ5h{#;tAbGpx$ovtm-I;mme}ub)L|KEwx)65hNUmKUI5 zbgnQJ6Aq>ZIMJ}7ep1|(t?V)3$Y!0ReeYnVGI!v;8$drrO`t;@i4hQu;`cM1zhVPX zwsbFsfb`pf+Ed(Ow9fPVu_4y`Eu3hPDG?i{q24z{XML&w;MV*K-vQNpKmZ z-q-RD`5>qfaKIB?f1 zvwn-a{Ggo+D5gubJfIxjinm5Lyi6=p<}^7Y>2qa(dPgOV6U^cl5-Aaj^@KVHPLOC2 zRV816J}0*EG0ytBV2#lwRt58<(**Xcy1yVpv6P>I$&UT)NuFK3$Q6}K!9x;J_}wWt zWm7JULNzIE-purB+3ZXK#-+%{?7y@qS4Hh~bsfk{PRznU^wzSX0r;g6j#2j7*j*g( z{7~OD_aD;V(Gu?@OYJDs#Zi?;PR+GiT!W*ei*UY1&Yo6{2H9t4xIgE9FfIC1r)QJys{rIh75OiOD>LRkGOF0rQNnk7%p(XFIgCEP#yb7Z#p0?+T5II?FPqyh8& z$o$YLz`DKx>+lbNi@D?aOvX+AbJboB6ca`6?!n+EO8RFWHgF0}S8OhbdHY0E&g7 z4OH4|D9)jVaWV&}eNih~7Q#?5{NuxKSUE|tdZCskdCLAw#m-_VMw}~)9{s|<*TV{r z3?f2`%9s&N=**uf;&dHN9US1x=Dv!to13_FDrv>gs_w@EdDghw7+8S(qFz=eYIWx& zFvr3Jlw4aSkwIjkD!(*+&W?Z$Nw_|?luwXc#73rcy76cwm#)bo}~ z?P<-c4mGwfkLm6`@)3#qm*AWC9_U;fJ@Gc7=FE-Q&Y2%c?a9-8=*>}&2kky6GAr^B zyo3h~<)8JHtxx-F7F#rMtt!pLp>=2sK>2M`yOg@}5E)-V&=?0rV-&=U$Nt+1IUjQ0n$oEeNe{o1IunqW@pcE%a< zT!rj;^iFy31tn89dY_35En2bN%7FP#*=N4e)8corW0OU~%GMgg`F(zoS8l3aOhvfi zGBlf0PAiLJsBMjthy;9Ik5}~avPX4~}7C1-fZoN{&ZL~F!{AnoNAV+EB@+=c1r%RdpC1jKk0f3y zDz6LU&rqUn=b7E$Pv0r%6TjL;)I2mPA2<=6l%Ds~H5s*e0KAMyN%@^Kq%qy5J_Y}ZJhmho` zfpJClH|~GKe!{4JSh<&Te$OvmY(y`Z3P)CovXE;h9R?dzIW#wADstENMvE(I$LD@a$lIgX)BQ}$Yd z)TxEKH?*1OlWNfkwPPNu6JS&zS|;ku2LQ z>mJGX1Ti;=`Bx@sGQ27i_;;pEdUfpVk!USNbN3{#7vOI%j+4*UKAJ71WrhT?>aptQ zzOfB34MTcXwrrAw3mT(TEuKGrdQYc7^NZ4wxZ3?J0s!IrPT-r{>%UNkv=urr-&N4mI54L6 zwJw<$Fb*GJw4HdX4gE+S&fe_aMiMJ{JA<;$R!dHTs8b&!=xD|T4@-F!hAqo;+&^3H zEEKzf1BfsiZpvYFmR(yX2WrH+@0$~uJ^Ba5en#(^iMv%cgam(8Y3AGK**jZJY2AB} zYIZF(l*-8yorDqCNeQJ=ojQ;VPp;O8A5Ca16Zd@yRBMn$xIZBc~WHbWnl@JVNO z^oLUeZL46Rdy9Clc>EPr3HBG8jZBLGIag3c#po8BYZ(*W$_Xou7==tm6gL#5SyrRO zy^*y88h%vbw8?W>d8GvF#QmT-Mjq^dJ{$rcfodx5IVyLO3)om)dW)%0VARQujI2#u z|Jo`2MkXe6JB(MVx8>DlaQUo%qX5C3RRyz;+F`vw6wA?ffpDUOnWOoW5SuA~Phn!6 z>ZiJXjI>Mzm=Sv_5nZg7%1IRk4kYRt&6pn6KNcaAqZd&n=y3E+UgIbrNVpssj_2Dj zjHbNg+u5ga^h91au4f6P!47;q$0ZG+hK1(YzK=}`gp>}D!2BS!?gZOft55djM7o&o zv5{*$W~ku|(5>+7K-dI!BqP82(O2Q1%LUvoGDb|BZ--R#UvVR(MiTud?ao|K(A?xF zEY!oSfo%PF@P*wQpfq=LSFm+N!uJtAi8k+EW}(+tRon~LOqTQ1^4Em97dt`V%2*J2 zsCv3T8hyvL|Mg5j)opSR&1ND4--S&Ms!b`oh7b{Q>iv+|CAPD`VO5b`jSk26|L`Jm zx|i4>qY@+egF5o*3)7YA_o)^tEY$A0v~0k(%pt0b<$U?jCbq^=bl!)nEioZtmPX-D z@Go_&i}_jqj_|cFrZ%6$#}zdq9LL@2^_hC@K_K%?a|Mf(LkiyRG2=QieF*2Vd0*JB zpB5|^s5CC}EP;q{K`aysnW!MCGP)z_(09#Ue!%pQ$QMEXCR}BV_ek%ZiD!3Y`5B=) zbwvJiaFw@n*%D#gq6QpHXY2oy3af?n0%n#+uqRvhs_J1o`ERD!WyRP~m5K9D%)iDhPy zQn?bRL>>2taV4t}{k}|dS)m~&qy}j`Q`D}`aE4k!E=v!Hg{^H_Tc5$?kO(fPR zZN37WK&E&TDz8P9%e+a&ICN=cVCEEso%c1v%5U|tbS4T>E=E*7hCC*!A%D=8X3MNT zEI(bZ*eI6+&RutIgHWH7>CYF|8IVhE1?T(n)&&l&m*~wkG@cH$-X~(?pWhc$lq(~* z))Vh3>%T(-Sqx)2F@2SN>RCf2YG)$bcl^6}Yf*~WKkS!Q$rQu}sduF~BFoiHW{RPV zAK}_m&SwW(em2+ieLb5+#^nDQnX->%;w-DVSWPMr9K&<+(Hkg?yN`MMtYK0mxul-? z)pq-w=WOHy%2b-!K06r)YYJ)%nf+$N%&A}p8t*g@!}_~|Wm>#Ia8&i>$w&cbt&66F z!Vx20wWjPhDi7vLLmhw|gBMwY_NMy+XM>^UkK%}odF{>F&ShLCKw{;+M89AYV_dW; z;$dI~K-`D95zKP>d)In0ykD%hevSm7Hex_pJ5%=7m6!CHu+WjrYuQaTt#B$Pqhv&~1 z5;OWd-*l86&f4${_U9Nl?+;K`A_|y~IdSrE9LSihrJC zp8gA^cC0G@Babk1odPk~8UHe|T(AK3!RXP;atdcR2BGwr7+(eL6JM zqC?*-t~2&|?Th=GQc9Ef)xD8)jm!|58i234SB$R@C^rI0Ffr2s{ zcfKRV|7oxNBVMRq(+$Q9un2ofBSi^|$!=!T@HKD#u9Ggh;SA|xBY7H6_Sl2h+Ur?N%+;d_Rjb9a5PnH9{ zMShE&GB(_OO0sbLD;(G7C^04d18>lEIb@;V?jd01l+|i9#x9JNBdz#Z74b03L z78dcz;Qb4A9S-xvvD)C-_|z zD{_=1KkJ?oBb~e5NEe!Rv&Lz9??Rhz$QLBeHZZj|vXLV_GU|M|fddyfs52!{@X>n? zth)oH6B^&ywS`!zT7(3bayN|2KpaPk>HhES1Eg_s$(`ceYfa39Ig@=dSy|BSW0GJ5 zlQ{QrPPCmXk|4?0qnpj=_%2&ts<`wG$xU12ao@}xi`gC}^*elBw&C8l!MSj%xyl?) zxWdSv`|S8$Rx9|^k3Xx0twsTJ(1vrJ?vrGt0l zbEIx5P{w5o&qCi{9ouLIh*d!-;@mGDw4VpskFl*Xt0KnA^|uz%!OtvA!-rXS+a^u- d4}tI~aLL6`lX@9l^}qj=0Oi%?s$|SU{tqeGjTis` literal 0 HcmV?d00001 diff --git a/legacy/ephysics/data/themes/images/ball-wood.png b/legacy/ephysics/data/themes/images/ball-wood.png new file mode 100644 index 0000000000000000000000000000000000000000..acb4599880f091e76a0420c163266288c96a95a4 GIT binary patch literal 9961 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 +#endif + +#include +#include +#include +#include +#include + +#define EPHYSICS_TEST_THEME "ephysics_test" +#define WIDTH (1280) +#define HEIGHT (720) + +typedef struct _Sandie_Data { + Evas_Object *win; + EPhysics_World *world; + EPhysics_Body *body1, *body2; +} Sandie_Data; + +static void +_body_del(void *data __UNUSED__, EPhysics_Body *body __UNUSED__, + void *event_info) +{ + if (event_info) evas_object_del(event_info); +} + +static void +_world_gravity_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + double gravity_y; + + ephysics_world_gravity_get(world, NULL, &gravity_y); + ephysics_world_gravity_set(world, elm_spinner_value_get(obj), gravity_y); +} + +static void +_world_gravity_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + double gravity_x; + + ephysics_world_gravity_get(world, &gravity_x, NULL); + ephysics_world_gravity_set(world, gravity_x, elm_spinner_value_get(obj)); +} + +static void +_world_rate_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + + ephysics_world_rate_set(world, elm_spinner_value_get(obj)); +} + +static void +_world_max_sleeping_time_cb(void *data, Evas_Object *obj, + void *event_info __UNUSED__) +{ + EPhysics_World *world = data; + + ephysics_world_max_sleeping_time_set(world, elm_spinner_value_get(obj)); +} + +static void +_world_friction_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + + ephysics_body_friction_set(evas_object_data_get(win, "top"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "bottom"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "left"), + elm_spinner_value_get(obj)); + ephysics_body_friction_set(evas_object_data_get(win, "right"), + elm_spinner_value_get(obj)); +} + +static void +_world_restitution_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + Evas_Object *win = data; + + ephysics_body_restitution_set(evas_object_data_get(win, "top"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "bottom"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "left"), + elm_spinner_value_get(obj)); + ephysics_body_restitution_set(evas_object_data_get(win, "right"), + elm_spinner_value_get(obj)); +} +/* +static void +_body_type_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + EPhysics_World *world; + Evas_Object *body_image; + double mass, rotation, friction, restitution, lin_damping, ang_damping; + double lin_sleeping, ang_sleeping; + + mass = ephysics_body_mass_get(body); + rotation = ephysics_body_rotation_get(body); + friction = ephysics_body_friction_get(body); + restitution = ephysics_body_restitution_get(body); + ephysics_body_damping_get(body, &lin_damping, &ang_damping); + ephysics_body_sleeping_threshold_get(body, &lin_sleeping, &ang_sleeping); + body_image = ephysics_body_evas_object_unset(body); + world = ephysics_body_world_get(body); + + ephysics_body_del(body); + + if (elm_check_state_get(obj)) + { + body = ephysics_body_soft_circle_add(world); + ephysics_body_soft_body_hardness_set(body, 10); + elm_object_disabled_set(evas_object_data_get(obj, "hardness"), EINA_FALSE); + } + else + { + body = ephysics_body_circle_add(world); + elm_object_disabled_set(evas_object_data_get(obj, "hardness"), EINA_TRUE); + } + + body_image = ephysics_body_evas_object_set(body, body_image, EINA_TRUE); + ephysics_body_mass_set(body, mass); + ephysics_body_rotation_set(body, rotation); + ephysics_body_friction_set(body, friction); +} +*/ +static void +_body_material_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + //Evas_Object *body_image; + + ephysics_body_material_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "density"), + ephysics_body_density_get(body)); + elm_spinner_value_set(evas_object_data_get(obj, "friction"), + ephysics_body_friction_get(body)); + elm_spinner_value_set(evas_object_data_get(obj, "restitution"), + ephysics_body_restitution_get(body)); +/* + + img_name = elm_spinner_value_get(obj); //name if its possible + evas_object_del(ephysics_body_evas_object_unset(body)); + + body_image = elm_image_add(evas_object_data_get(obj, "win")); + elm_image_file_set( + body_image, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", img_name); + evas_object_resize(body_image, 70, 70); + evas_object_move(body_image, 150, 150);//FIX! + evas_object_show(body_image); + ephysics_body_evas_object_set(body, body_image, EINA_TRUE); +*/ +} + +static void +_body_mass_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_mass_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "density"), 0); +} + +static void +_body_density_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_density_set(body, elm_spinner_value_get(obj)); + + elm_spinner_value_set(evas_object_data_get(obj, "mass"), + ephysics_body_mass_get(body)); +} + +static void +_body_rotation_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_rotation_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_friction_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_friction_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_restitution_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_restitution_set(body, elm_spinner_value_get(obj)); +} + +static void +_body_damping_linear_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double angular_damping; + + ephysics_body_damping_get(body, NULL, &angular_damping); + ephysics_body_damping_set(body, elm_spinner_value_get(obj), angular_damping); +} + +static void +_body_damping_angular_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double linear_damping; + + ephysics_body_damping_get(body, &linear_damping, NULL); + ephysics_body_damping_set(body, linear_damping, elm_spinner_value_get(obj)); +} + +static void +_body_sleeping_threshold_linear_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double angular_sleeping; + + ephysics_body_sleeping_threshold_get(body, NULL, &angular_sleeping); + ephysics_body_sleeping_threshold_set(body, elm_spinner_value_get(obj), + angular_sleeping); +} + +static void +_body_sleeping_threshold_angular_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double linear_sleeping; + + ephysics_body_sleeping_threshold_get(body, &linear_sleeping, NULL); + ephysics_body_sleeping_threshold_set(body, linear_sleeping, + elm_spinner_value_get(obj)); +} + +static void +_body_torque_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_torque_apply(body, elm_spinner_value_get(obj)); +} + +static void +_body_impulse_x_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Coord rel_x, rel_y; + double y; + + y = elm_spinner_value_get(evas_object_data_get(obj, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(obj, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(obj, "rely")); + + ephysics_body_impulse_apply(body, elm_spinner_value_get(obj), y, rel_x, + rel_y); +} + +static void +_body_impulse_x_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_y; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_impulse_apply(body, x, y, elm_spinner_value_get(obj), rel_y); +} + +static void +_body_impulse_y_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x, rel_y; + double x; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_impulse_apply(body, x, elm_spinner_value_get(obj), rel_x, + rel_y); +} + +static void +_body_impulse_y_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + + ephysics_body_impulse_apply(body, x, y, rel_x, elm_spinner_value_get(obj)); +} + +static void +_body_force_x_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Coord rel_x, rel_y; + double y; + + y = elm_spinner_value_get(evas_object_data_get(obj, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(obj, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(obj, "rely")); + + ephysics_body_force_apply(body, elm_spinner_value_get(obj), y, rel_x, rel_y); +} + +static void +_body_force_x_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_y; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_force_apply(body, x, y, elm_spinner_value_get(obj), rel_y); +} + +static void +_body_force_y_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x, rel_y; + double x; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); + + ephysics_body_force_apply(body, x, elm_spinner_value_get(obj), rel_x, rel_y); +} + +static void +_body_force_y_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + Evas_Object *aux; + Evas_Coord rel_x; + double x, y; + + aux = evas_object_data_get(obj, "x"); + + x = elm_spinner_value_get(aux); + y = elm_spinner_value_get(evas_object_data_get(aux, "y")); + rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); + + ephysics_body_force_apply(body, x, y, rel_x, elm_spinner_value_get(obj)); +} + +static void +_body_linear_velocity_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double ylinear; + + ylinear = elm_spinner_value_get(evas_object_data_get(obj, "y")); + ephysics_body_linear_velocity_set(body, elm_spinner_value_get(obj), ylinear); +} + +static void +_body_linear_velocity_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + double xlinear; + + xlinear = elm_spinner_value_get(evas_object_data_get(obj, "x")); + ephysics_body_linear_velocity_set(body, xlinear, elm_spinner_value_get(obj)); +} + +static void +_body_angular_velocity_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_angular_velocity_set(body, elm_spinner_value_get(obj)); +} +/* +static void +_body_hardness_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) +{ + EPhysics_Body *body = data; + + ephysics_body_soft_body_hardness_set(body, elm_spinner_value_get(obj)); +} +*/ +static void +_sandie_label_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *label; + + label = elm_label_add(win); + elm_object_text_set(label, subcategory); + elm_box_pack_end(bxparent, label); + evas_object_show(label); +} + +static Evas_Object * +_sandie_enum_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *sp; + + _sandie_label_add(win, bxparent, subcategory); + + sp = elm_spinner_add(win); + elm_spinner_wrap_set(sp, EINA_TRUE); + elm_spinner_min_max_set(sp, 0, 6); + elm_spinner_value_set(sp, 0); + elm_spinner_step_set(sp, 1); + elm_spinner_label_format_set(sp, "%.0f"); + elm_spinner_editable_set(sp, EINA_FALSE); + + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CUSTOM, "Custom"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_CONCRETE, "Concrete"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_IRON, "Iron"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_PLASTIC, "Plastic"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_POLYSTYRENE, "Polystyrene"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_RUBBER, "Rubber"); + elm_spinner_special_value_add(sp, EPHYSICS_BODY_MATERIAL_WOOD, "Wood"); + + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, sp); + evas_object_show(sp); + + evas_object_data_set(sp, "win", win); + + return sp; +} + +static Evas_Object * +_sandie_toggle_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory, const char *labeloff, + const char *labelon) +{ + Evas_Object *tg; + + _sandie_label_add(win, bxparent, subcategory); + + tg = elm_check_add(win); + elm_object_style_set(tg, "toggle"); + elm_object_part_text_set(tg, "off", labeloff); + elm_object_part_text_set(tg, "on", labelon); + evas_object_size_hint_align_set(tg, 0.5, 0.5); + evas_object_size_hint_weight_set(tg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, tg); + evas_object_show(tg); + + return tg; +} + +static Evas_Object * +_sandie_spinner_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory, const char *itemlb, float min, + float max, float initial, float step) +{ + Evas_Object *sp; + + _sandie_label_add(win, bxparent, subcategory); + + sp = elm_spinner_add(win); + elm_spinner_label_format_set(sp, itemlb); + elm_spinner_step_set(sp, step); + elm_spinner_wrap_set(sp, ELM_WRAP_CHAR); + elm_spinner_value_set(sp, initial); + elm_spinner_min_max_set(sp, min, max); + evas_object_size_hint_align_set(sp, EVAS_HINT_FILL, 0.5); + evas_object_size_hint_weight_set(sp, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_box_pack_end(bxparent, sp); + evas_object_show(sp); + + return sp; +} + +static Evas_Object * +_sandie_double_spinner_box_add(Evas_Object *win, Evas_Object *bxparent, + const char *subcategory) +{ + Evas_Object *dbx; + + _sandie_label_add(win, bxparent, subcategory); + + dbx = elm_box_add(win); + elm_box_horizontal_set(dbx, EINA_TRUE); + evas_object_size_hint_weight_set(dbx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(dbx, EVAS_HINT_FILL, 0.0); + elm_box_align_set(dbx, 0.0, 0.5); + elm_box_pack_end(bxparent, dbx); + evas_object_show(dbx); + + return dbx; +} + +static Evas_Object * +_category_add(Evas_Object *win, Evas_Object *bxparent, const char *label) +{ + Evas_Object *cfr, *cbx; + + cfr = elm_frame_add(win); + elm_frame_autocollapse_set(cfr, EINA_TRUE); + elm_object_text_set(cfr, label); + evas_object_size_hint_weight_set(cfr, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_fill_set(cfr, EVAS_HINT_FILL, 0.0); + elm_box_pack_end(bxparent, cfr); + evas_object_show(cfr); + + cbx = elm_box_add(win); + elm_box_horizontal_set(cbx, EINA_FALSE); + evas_object_size_hint_weight_set(cbx, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(cbx, EVAS_HINT_FILL, 0.0); + elm_box_align_set(cbx, 0.0, 0.5); + elm_object_content_set(cfr, cbx); + evas_object_show(cbx); + + return cbx; +} + +static void +_menu_body_items_create(Evas_Object *win, Evas_Object *bxparent, + const char *category, EPhysics_Body *body) +{ + Evas_Object *bx, *dbx, *widget, *aux_widget, *material_widget, *type_widget; + + bx = _category_add(win, bxparent, category); + type_widget = _sandie_toggle_add(win, bx, "Body Type", "Solid", "Soft"); + material_widget = _sandie_enum_add(win, bx, "Body Material"); + aux_widget = _sandie_spinner_add(win, bx, "Mass", "%1.3f kg", + 0, 100, 15, 2); + widget = _sandie_spinner_add(win, bx, "Density", "%1.3f kg/m³", + 0, 9999, 0, 2); + evas_object_data_set(aux_widget, "density", widget); + evas_object_data_set(material_widget, "density", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_mass_cb, body); + evas_object_data_set(widget, "mass", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_density_cb, body); + widget = _sandie_spinner_add(win, bx, "Rotation", "%1.0fº", + -360, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_rotation_cb, body); + widget = _sandie_spinner_add(win, bx, "Friction", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_data_set(material_widget, "friction", widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_friction_cb, body); + widget = _sandie_spinner_add(win, bx, "Restitution", "%1.3f", + 0, 1, 0, 0.05); + evas_object_data_set(material_widget, "restitution", widget); + evas_object_smart_callback_add(material_widget, "delay,changed", _body_material_cb, body); + evas_object_smart_callback_add(widget, "delay,changed", _body_restitution_cb, body); + dbx = _sandie_double_spinner_box_add(win, bx, "Damping"); + widget = _sandie_spinner_add(win, dbx, "Linear:", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_damping_linear_cb, body); + widget = _sandie_spinner_add(win, dbx, "Angular:", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_damping_angular_cb, body); + dbx = _sandie_double_spinner_box_add(win, bx, "Sleeping Threshold"); + widget = _sandie_spinner_add(win, dbx, "Linear:", "%1.2f p/s", + 0, 100, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_sleeping_threshold_linear_cb, body); + widget = _sandie_spinner_add(win, dbx, "Angular:", "%1.2f º/s", + 0, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_sleeping_threshold_angular_cb, body); + widget = _sandie_spinner_add(win, bx, "Torque", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _body_torque_cb, body); + + //Impulse needs four values + dbx = _sandie_double_spinner_box_add(win, bx, "Impulse X"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.3f kg * p/s", + -360, 360, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Rel Position X:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "relx", widget); + dbx = _sandie_double_spinner_box_add(win, bx, "Impulse Y"); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.3f kg * p/s", + -360, 360, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + widget = _sandie_spinner_add(win, dbx, "Rel Position Y:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "rely", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_impulse_x_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_x_rel_cb, body); + widget = evas_object_data_get(aux_widget, "y"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_y_y_cb, body); + widget = evas_object_data_get(aux_widget, "relx"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_impulse_y_rel_cb, body); + + //Force needs four values + dbx = _sandie_double_spinner_box_add(win, bx, "Force X"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.3f kg * p/s/s", + -360, 360, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Rel Position X:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "relx", widget); + dbx = _sandie_double_spinner_box_add(win, bx, "Force Y"); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.3f kg * p/s/s", + -360, 360, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + widget = _sandie_spinner_add(win, dbx, "Rel Position Y:", "%1.2f", + 0, 360, 0, 2); + evas_object_data_set(aux_widget, "rely", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_force_x_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_x_rel_cb, body); + widget = evas_object_data_get(aux_widget, "y"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_y_y_cb, body); + widget = evas_object_data_get(aux_widget, "relx"); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_force_y_rel_cb, body); + + dbx = _sandie_double_spinner_box_add(win, bx, "Linear Velocity"); + aux_widget = _sandie_spinner_add(win, dbx, "X:", "%1.2f p/s", + -800, 800, 0, 2); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.2f p/s", + -800, 800, 0, 2); + evas_object_data_set(aux_widget, "y", widget); + evas_object_smart_callback_add(aux_widget, "delay,changed", _body_linear_velocity_x_cb, body); + evas_object_data_set(widget, "x", aux_widget); + evas_object_smart_callback_add(widget, "delay,changed", _body_linear_velocity_y_cb, body); + + widget = _sandie_spinner_add(win, bx, "Angular Velocity", "%1.2f º/s", + 0, 360, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _body_angular_velocity_cb, body); +/* widget = _sandie_spinner_add(win, bx, "Soft Body Hardness", "%1.2f%%", + 0, 100, 100, 2); + elm_object_disabled_set(widget, EINA_TRUE); + evas_object_smart_callback_add(widget, "delay,changed", _body_hardness_cb, body); + evas_object_data_set(type_widget, "hardness", widget); + evas_object_smart_callback_add(type_widget, "changed", _body_type_cb, body);//FIX CB +*/ +} + +static EPhysics_Body * +_sandie_body_add(Evas_Object *win, EPhysics_World *world, int x, int y) +{ + Evas_Object *body_image; + EPhysics_Body *body; + + body_image = elm_image_add(win); + elm_image_file_set( + body_image, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", "big-blue-ball"); + evas_object_resize(body_image, 70, 70); + evas_object_move(body_image, x, y); + evas_object_show(body_image); + + body = ephysics_body_circle_add(world); + ephysics_body_evas_object_set(body, body_image, EINA_TRUE); + ephysics_body_mass_set(body, 20); + ephysics_body_central_impulse_apply(body, 8201, 2110); + ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_DEL, + _body_del, NULL); + + return body; +} +static void +_menu_items_create(Evas_Object *win, Evas_Object *bxparent, + EPhysics_World *world) +{ + Evas_Object *bx, *dbx, *widget; + + bx = _category_add(win, bxparent, "EPhysics World"); + dbx = _sandie_double_spinner_box_add(win, bx, "Gravity"); + widget = _sandie_spinner_add(win, dbx, "X:", "%1.2f m/s²", + 0, 100, 0, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_gravity_x_cb, world); + widget = _sandie_spinner_add(win, dbx, "Y:", "%1.2f m/s²", + 0, 100, 9.81, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_gravity_y_cb, world); + widget = _sandie_spinner_add(win, bx, "Rate", "%1.0f pixel/meter", + 0, 100, 20, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_rate_cb, world); + widget = _sandie_spinner_add(win, bx, "Max Sleeping Time", "%1.0f s", + 0, 100, 2, 2); + evas_object_smart_callback_add(widget, "delay,changed", _world_max_sleeping_time_cb, world); + + bx = _category_add(win, bxparent, "EPhysics Boundaries"); + widget = _sandie_spinner_add(win, bx, "Friction", "%1.3f", + 0, 1, 0.5, 0.05); + evas_object_data_set(widget, "win", win); + evas_object_smart_callback_add(widget, "delay,changed", _world_friction_cb, win); + widget = _sandie_spinner_add(win, bx, "Restitution", "%1.3f", + 0, 1, 0, 0.05); + evas_object_smart_callback_add(widget, "delay,changed", _world_restitution_cb, win); +} + +static void +_world_populate(Sandie_Data *sandie, Evas_Object *bxparent) +{ + sandie->body1 = _sandie_body_add(sandie->win, sandie->world, (int) WIDTH / 4, + (int) HEIGHT / 5); + sandie->body2 = _sandie_body_add(sandie->win, sandie->world, (int) WIDTH / 4, + (int) HEIGHT / 2); + + _menu_body_items_create(sandie->win, bxparent, "EPhysics Body 1", + sandie->body1); + _menu_body_items_create(sandie->win, bxparent, "EPhysics Body 2", + sandie->body2); + +} + +static void +_restart(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Sandie_Data *sandie = data; + + ephysics_body_del(sandie->body1); + ephysics_body_del(sandie->body2); +} + +static Evas_Object * +_menu_create(Sandie_Data *sandie) +{ + Evas_Object *bx0, *fr, *lb, *bt, *sc, *bxparent, *layout; + + layout = evas_object_data_get(sandie->win, "layout"); + + bx0 = elm_box_add(sandie->win); + evas_object_size_hint_weight_set(bx0, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(layout, "swallow", bx0); + evas_object_show(bx0); + + fr = elm_frame_add(sandie->win); + elm_frame_autocollapse_set(fr, EINA_TRUE); + elm_object_text_set(fr, "Information"); + elm_box_pack_end(bx0, fr); + evas_object_show(fr); + + lb = elm_label_add(sandie->win); + elm_object_text_set(lb, + "Please modify physical parameters below
" + "the test button to show the test window."); + elm_object_content_set(fr, lb); + evas_object_show(lb); + + bt = elm_button_add(sandie->win); + elm_object_text_set(bt, " Try "); + elm_box_pack_end(bx0, bt); + evas_object_show(bt); + evas_object_smart_callback_add(bt, "clicked", _restart, sandie); + + sc = elm_scroller_add(sandie->win); + elm_scroller_bounce_set(sc, EINA_FALSE, EINA_TRUE); + elm_scroller_policy_set(sc, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_ON); + evas_object_size_hint_weight_set(sc, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_fill_set(sc, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(bx0, sc); + evas_object_show(sc); + + bxparent = elm_box_add(sandie->win); + evas_object_size_hint_weight_set(bxparent, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(bxparent, EVAS_HINT_FILL, 0.0); + elm_object_content_set(sc, bxparent); + evas_object_show(bxparent); + + _menu_items_create(sandie->win, bxparent, sandie->world); + + return bxparent; +} + +static EPhysics_World * +_sandie_world_add(Evas_Object *win) +{ + EPhysics_World *world; + + world = ephysics_world_new(); + ephysics_world_render_geometry_set(world, 80, 80, (int) WIDTH * 0.7 - 160, + HEIGHT - 160); + evas_object_data_set(win, "top", ephysics_body_top_boundary_add(world)); + evas_object_data_set(win, "bottom", ephysics_body_bottom_boundary_add(world)); + evas_object_data_set(win, "left", ephysics_body_left_boundary_add(world)); + evas_object_data_set(win, "right", ephysics_body_right_boundary_add(world)); + + return world; +} + +EAPI int +elm_main() +{ + Sandie_Data *sandie; + Evas_Object *layout, *bxparent; + short int r = 0; + + if (!ephysics_init()) + { + printf("\nFailed to init ephysics");//ERR + r = -1; + goto shutdown; + } + + sandie = calloc(1, sizeof(Sandie_Data)); + if (!sandie) + { + printf("Failed to alloc sandie data");//ERR + r = -1; + return r; + } + + elm_theme_extension_add(NULL, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj"); + + sandie->win = elm_win_add(NULL, "Sandbox", ELM_WIN_BASIC); + + elm_win_title_set(sandie->win, "EPhysics Sandbox"); + evas_object_resize(sandie->win, WIDTH, HEIGHT); + elm_win_screen_constrain_set(sandie->win, EINA_TRUE); + elm_win_autodel_set(sandie->win, EINA_TRUE); + elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); + + layout = elm_layout_add(sandie->win); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_win_resize_object_add(sandie->win, layout); + elm_layout_file_set(layout, PACKAGE_DATA_DIR "/" EPHYSICS_TEST_THEME ".edj", + "sandbox"); + evas_object_show(layout); + evas_object_data_set(sandie->win, "layout", layout); + + evas_object_show(sandie->win); + + sandie->world = _sandie_world_add(sandie->win); + + bxparent = _menu_create(sandie); + + _world_populate(sandie, bxparent); + + elm_run(); + +shutdown: + ephysics_shutdown(); + + elm_shutdown(); + + return r; +} +ELM_MAIN()