From 8b9e85a0a5762ff05048b9aa651f9668c31b5d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Thu, 12 Jan 2012 14:12:20 +0000 Subject: [PATCH] Added sphere to primitives generator git-svn-id: http://www.openflipper.org/svnrepo/OpenFlipper/branches/Free@13358 383ad7c9-94d9-4d36-a494-682f7c89f535 --- Icons/primitive_sphere.png | Bin 0 -> 41951 bytes PrimitivesGenerator.cc | 178 ++++++++++++++++++++++++++++++++++--- PrimitivesGenerator.hh | 9 ++ 3 files changed, 176 insertions(+), 11 deletions(-) create mode 100644 Icons/primitive_sphere.png diff --git a/Icons/primitive_sphere.png b/Icons/primitive_sphere.png new file mode 100644 index 0000000000000000000000000000000000000000..855d73853be68b0c8710e54bf01fc5b8b39ff209 GIT binary patch literal 41951 zcmc$`hdbNf`#&zW*u-85L85BbZjD%xq7k%;)+$wdRJBFzStE!|#TG5Ki?+7frLEeE z8dbaY_KVm1^ZgrsT+g`Vx^k{_?)yIXdEAftaT1L-)TIY<14&3o==G3V7!ndvR^mfW zO-X#Gz~dbi@ejZoql+M^_{#g2_z$J+ZCx#r%d21f=aOXNJ2W21``#oZ3oq#||J9Fpqy3zk% zUR<+Xi)KPb%`GYp<{1MUrZ!0KdOT=tIiG5&Q!TiflhikJXFIYGmCc3@PP>7VlM@Nv zy}$%sC9kRKW&;t{A3ig0d=BI{m95sAzJA&twfHzC!A`rooaMgRtnelM?Y;NhcCjxG zCLUV^{xEl@7a=ZEZsVYh@l|D(zQ}TCG^>M5M!H>hd`9mh+q-w~4kQZcy73&Hrk%IY zlH?si(A%zdq1t0Uzs}c}&JUig&9`&f)z{Y#lv{jwb{TlSKNctb<>u~yZ229h@;XY^ zD=U`WI$0^0c_bq(dgsk_c=$sN4=YuqM{pYzEmL|>kQOR~x-HDTkx|NJ+f1DOyp9BI1veCq4$-0$M*%4HYZ=(U6jjs3rI7M?Jwop~ta7!LL(iw>TgG~Ktb zmrhLb+`GIau4`a0OJUHqO6p#P<&z68;)<;E>qb}I z6K?JxeRmf1YO1Pit_(FfImuraOv@-ijyB*jDUBj9RoQjoBC#}`5B~5A+4Fn0rJ@O&&^h5c3Vw_!B>2Ae?rl*7}5B&1mlKb&@9?tul9s$%*44ZYe&sPqesmbK12$czr-2a(xj^ta1 zCL>)1a6Tl|osXOsZ*Bd4jmn7TM?~R7C@DiGP}_-*QtV{x?fYh@rV81>^Rd90livSx zVT&W9>XG%83y*jI49<5%Ud?Ggz#{;Ba+vvw3DU3)2y+);xarXb_;|Da0Ub4Qf)-o- zzVo~9E7SHHC9mT3%BKl|XAA7{lmG1ki~56MO-7&Y1OWve9v(k`0kA4lg`fr?diZ3# zzA9J%NIs&U#_JIj6h_NTFqttqqE>oxVl7x~ws&8}wRL=ALi&C4N!eAT$wvOqW?$Z^ z?6+D(^C$o9P}da_&!Jm~=|Z~k>;D2hG}`%l0^)Hd*r;Gq5Ia}|7=K@A z`8f^!VJ9i21J7YYo`;E**^{0^=E-h){7Cq%cVP(*X7kx z@jtg_R3ERLBcqCC748nxD9;J@sV-bhsieAZ2#VB7)%O(;C@jRiHnXW>%5K0ig(Qyq zeRRxNYnX`4Y2N9(w*3BL^}V^k)PE83)-=3<7#@d;MiFOVm;E+VL8F?z!F-|yV*cK;)s}zw z{^;+WK&Oi(tBa!j&;MI(wwM+pGckYo4RA@Qt9xmx|D>{#8ycS-Q7%Pk7>P<%w#`I* zG~||m#pN4@Wy{-z_pC3~V~B~U@x^X&65upZvEQPOr4Kg&8JPomnq&` zFGmI(YNiCG@cUAw-#D=_x+hV?QRBmgm@c0NaT<1rIyKuhT0oC&RfEAi^?6-hdqixS z)vJlKMNzdUHpTzVPA>Y{<@w>3vdQGCrnp!K6^Zn&j=oP2j73#3NFrIv)7q3qFK8Ge z=B1(2XCq6&z?2K*LE08GT1EZ63gbHGu}pXE{{n@6O2V>XI7iX5{oVWbTZphb;VS`9 zj93^W*gp@?^fP$j63Zhf6%$b`1~9z_i_h4+;9S9ad@o!q_0SNcWPf&}XQ@9ei>C0u zoRsSH8NRSR-{ByiHN!qhGlRCK^HJm`^gcdzgw6NwV>@3 zIt9p}Ti1~{9`a?ZglsNf9*g~&+q8b@0&m7WLo zF1(>1T&C66o0P<5%)?z-M)Bx{%YCt|VtP@xikOE4NA$O=wdv3@M=}b;pJ*Mi7>489 zKKu%pbx*@U5M|`#ig;_leMtZhC@Z8Xv4mh0o$Ye7%xc&2MPzYHa6NgSXb}tc23Un=nC0Zdm z7V}>4mMsWVNMWoK`|iw##yDI!UY#+aPl$Wp-S=?DcMJY$DTGYqPMC9kl&f9m3OGrscnL?mk zOON_n&iY4ZKU}$dXQM;l!s9TQ(cd~jsbl~3iUuI-X1Azef zLDd3>|HV;i(Tv~L=a~%I$5+U~?VN5b)pmXdH(P0>aJaNXdmi z9}Fj3*l3WFa@8k<-zoAqhd+Gzx5(k-KjSxTqy-+Q`5JInc-tcrEAv{@xOuo&30#|m z#0?f8pShD(G&O_kE@er6>8(~Td`CDt$_+@(sh(<6mVEGMqdi>muc`aV|3#$9NK}Dt z!e(%U3DAW{5Hknn$_plxKnVIsI6JQg79%P(Wi&$f=b ztZuNsU%wj423&17xmPN_o0h%@>-W7Edzjy|B%*Gz_1n^1r;4YbHuSj@H!`mI`ZpFW zSc=8c@5(LddnM@CXWaZ%<0gXgB!meiNwihGK&eSaqqLAD$0GAHLcwb2?6VNGgn?L6*Y~M4%vZ_TptUv-4(pLZlSM<1l#rN_Sv2(%WB7kSzIKMV;jW$!Jga}NF>aDY zo7hOWaJ$5^7^xsfEMIHdaZ!Q3tVhA=nXpT|r7M7TQ!$s)mEiot5=Vy2tHWdPCJ|hJ zY-VnzONEH`n-Dyr#B6*o;JO2rVCj1Cw7Q5eRE8v!Px^Kl3)ZzNuK;_gAtKfNwXs3(p<9pNyj&&7 zr`||+bamPIUUYlrf$xm{-Fx@k`ybL=|Gs1lQ+&n3QXKakY*am}^F&v_cPU-tRV+hB zk^^HdJUnR;xS%_qskXe^_~Ks|N0y{EakGCJQ9b#V@a!}9{E4pm2z73a@C|Kw({L;$ z5RMIU$+Ad<83~)P2o^efAxX%WIFo!-U}ajUfL0g>I^E;a*FZqB`6&PRb<5Ff`Qod2 z^=u4e$j*e*aty4lI!P_ECaIBQIboy{{2rZw*s$=6?v=(sT-DR7{C|HOnk>Iqqa&LSyI{3Q0r zKq4(P0;i+$SWDM+8w}v!teitoj4H{35R(J^#DL{7J58}VPH}T}b>)DbOmeHXP+L8J z4D%AAV3GIe#J$G#p>NZ8(#S@VdpHK`xHa_9Fk`mC^pK<{A0TUR2L=}k%&d$;uj!WV zzb`!Q>1xNxYESI+i57Emd;B%~ue^f76(|qAV6MUrVfDyZ${`O_Em^=`>|04_C`#J} zC-VenXl)wm1WB1jwWpDia)N&7=E`{!OAn5R&)fWu`>ovU46ep=PLp`By4kS6Ae&?8 z%NA{xSkcV7boZ?GCp94|js*Ig@Kr~bH%!O`cxdbw5G%>$NVPK? zSwEtk%8L)SI~cb@v@S!AwAJ-_lbp!A{euCKc|l?Finxm2Jg&CHAJY&DaOO8YPScQl zeY6QM_iqPhO}F%JQQAYNZ&yZpo40?#{5iRZ5ek;FVVoRyq%VJ$3JSuS-9v;%wo|n6-Icd_v!*nMQz2x%h6XS^zzW<+0azO58|oB;_B_~J*L(!=Um8w zKIRqQXh~mB9rk%v@_-g;J!S{dvi+DB+=&L;QZF;;^D*k#hvXX`S(7>)TpdWugIUY7 zm*=w5mkSD9y5Fk87u+XFd{jJ(TKHbrvFHjxSPct@#knFtl1RTJNny(cyG z_0O`BizE}Ys6}j@v{2FbGG?XzC`LJ694))>oS>*R@?9DwwH|eEMh~hfR*4)6jtRGT zQJb*m7@t9O4l8-I-)3X?`qYQ5dZdRyt-p(`LgusfvY-h4dhUhhdD!kUpQVD2kwm@P#- z>pvFLPh~UjB;cX>eMLIzfM5&!?YDxZ&nDM1)e#nnb3tLXy>_r~eA%ve5)C5}TQoq< zFAU?M(0%18n&2?kNoo!9+LOm+=^XbmhA|N6ITUI_yIuuZE7T|`M705;^Psg!Bus{n zsOn>2_G;8xXpBBt7#H%eq77}(Rkx1l(la{^LLV8l4ClI-Sz}w2^UI9XdbC8ldVIoKzM#wAuX6>A& z5bq5I6YCtA8J}lik!$J4-GOJ_uJ4EoF$Y2|(~(MMU(TS=ACJ0mk=*A(U)+9~-Np7i z@T`5h!BEi~niWdAisdpE#H-JTMCFY1QO58nxTUL|b*Q;4m=Y63tn?KzbhJq@E>ZQ` zTQPcnzaU|bx~QXmko&tT3&@y~ov!f5quY<`c`?vPs3nd(+FYOC#3N|4WZu8mNEm|+ z3XVxf1rKU`yL5j`T%q$=MTXi*ftr)u-Oy-CmOo!}PJ1rSPYalN@{shfo7VcAEH?OT z@zkQ2=PB~;)&DEsEJ#9Hv)(V!wOr&xm$$ch3^d_5XhJ zcrn>^z3koK5mb8+=&U%%Ka%*h_FsJ(jXD67cZ1YQ$7-xLho`|Q<4%~;We0nf6xKG5$`^uxwn)( zJv1CF-6;AVCM2~61vwaxW%k<&i8vh#kKxqcvnhI(JAO6j_u$SM-`USpP}`rXGxo!6 z)I5pI#yt2}G%PiW@5G3Oe`Sq1{Vet0U?8mnZb)K7#mFvLdh?JYEABL&)|AV(zp5XD zohOUnv@E{nn9HpvmY)m(L&k$KTgPz*9UTd22*NG1fHa)eMbHcZQW0mW5M=j&3!!8-au^FmV239L82M6_67-5j3<)};k4Vz2yGulT}#96mY zXUVUhF*D^-E8Mm(BQrQgs<*33hgL%sk>*5Hmn*7UZ?#l36tVBR)&Lfy>4u=QCme=S?x`&u9h_t`Gx`3J2$^&jKY@k9AwS?3tC5zH(!lFly{xL=!FSMi^OmnQ?rq}1& zPDRIr-wsdzQc*+|!!Jh6PlF2yYQKW=(asJGc~=K9k(hOMu(!8oMD8&L3@my~rLn-6 zLZZH*URC1`x1xq8 zNABStz7>NMVI0#HobHO@rL_Ms2L;g_e2A0wJ5d!avP4v{td#q1pqm#`r6XHJ4<;-REhK| zXHW;Jc8~wlf4{YN8;1fa0O9p7$K3!G#1i3|?~G4c#-PJTCgz>wAZ7ESzF5uF@Hyyy zXlE9VzX_UzdJt>h8Eev!9m<9C8YmTJi(Nj2A0;kpqv_PA7_qZimf&eRJ!yq-H{V{JwgU zk&W^u&O517{DGJPIh901lImlrAM(DApu?ni?!==v!fl~%(bjkfxyZN%cNxMQ>WE|v1^R}!S7WMOfczLWbD$QIv1fYW zx}Rbx?l<<@layLP4Wo7Na7>&FGFX=mDz*O{V;Tm*0w{Q>pK8o$wDX1xJ_-Ie5h8}X zPDL!k1i_xft#He})2=3siPIVkAZ3S_bwB#vS;~q-;lGpB)xWb6<29k>MTHTZg6@fF z3h5A9=}IlBR?SWx_rxkwvJe6)U$GEQ1t}P^w`7Xm6mI(EhW@_lzFh6L9x4_h-~WMa zV@L0`v;YkDqw;X(Kdj8M$w$o2*L`#l}Z-s@G)hroH)r7i!Vh|}g zl!w>H0ZcG-q-$5&(Zk)PE*-mz%KK&_rwH#;V!jO$5Q+KBzkuZmp{7nR)EC;kOm{A6 zrI5E*rGk}~;mXm|#LT~JoO@zI1`HlWVX3%5P=7Tv4CX<_<%Hp^P=?sA_Aoa>Xecss z%Y9}VNrK5Td1u+;cO^>0KTarNL8wwpLD4b1{sF1>q@=!YNMxdo@;Oj1X2!R*M=-v@e}lFs5c z4K3FPnuz)D$ZHBoN>TKX38daI7iI7@YfJBVBOK zi2?cj8}DQ<0rsaa`uAL>7V2Rjfttx}gv4|sWcghy^!qFfTWU+vG_lZZsQnPQu#;MD!T$lf~>5UoZ%7lqiwB@Jg-~4xybJv^y#kt?OjHYC* z9aXW6hp2sZTE7IS^Y<@}@JJrjW!)7}1y z-8LpF12*l^iG3k-prp#G+jEwPI_IO+?oxE}+BD92^#8N~WemnA$}8mb3)sIBTU%>e z=fAe(yr~X8d{|eQyD~2^TOZ;;k;>P?Q^WZ!4JlOzPRC_>ns730*M+{qRo*Pz^7+Vn z`G?3NizlD)3kMoYi)u&7wEepd-1za9HvJxQX501gTMoidwQ1z=pYi_b{Y{x3KS#ZN ztocG_%=FqcvB|f4JpJkD_v>X^t0P2~9?29YOX+L2Qq7tupqKwovJ@l<=Hu|?y6D#o zdQ_GoY5+kvEL%3`wexzOLQdoIhMEqo&K5f^gW9B--DQ?>?|gW!{#Tam=%Jeg(292H zlgE&3y=&i4TYx|lBg8n$uYyR&3`o~sc8U@~eQF@FX#3>q;&K+TA*w-GrOA1re*2?F>+A;5f*{ZJTv@#jo(_GSbx_XPJRw#O+{DaC{ozN+oy%m&PO-b8LZek- z%7QRXw7n058B&V@4Ja-SZmIwM;5#b3*sCZHqnF--cOqw(C|zcBbI_k{O?%lj64_;2 zrDA`j#WnN1Mqew-3>ceV^9yu02WtQ3mC;L5{#zj?+4N^o8Zz&X;s9!TGZbhJSs5g=^ zu=U_yf5@t;tE*|L4+3Za;aj{fy`$V)zZCxdqOJvm*-m}zBVT-x`9F!n@^0>>|Ja!* zi`Z!OgYD&I2jBJas?rx^KxS!HBr0x>B)pibpgu#!;UII@(o4}C_25o4%Wv*h*gQva z*#-Pxh?b6ZlF4ztq<4IiOKl){CW)6wcvC5ZxLAs?$#Z@g- z5nd~R$VBPqsjd4yzQ$PpqTrqg`|B=OAVPdHU+rN_Lb*xjnJD;$fGtH^X&L$A&1oNq zz2M&T{&GAmheW#Qo9Fp{JH4V=h^lod&z;5IG&^u23YoIQ8A(EEUmOGH)#0nv3?eCS zPqV9hKND!vlY1`mCR9Sd&R?kmG?&$U63N0jcdw!s-b zNWGcN8fSgx+{}?E`)zlaDf(T6-|K%??flnL_ha@b9|VC ze4!(ykXx0FzAi&)8jY~)BxY$@U-255Z&?bMW2mi%x-=sa#xm0O$T5^qyle0F*Q%iN z`QQahqeeKUiTgyYOCZSh0_)FklJUX$m&YKRbe&-RKu%la02qrKB~a78YZM}e(hk~s zfba8nBIfLJ*fhJFuJ~eSvHuqGNSQ>%i);ZDW+Vs=CUyReH1a2CAb#I;DvvYTmBRr= zf0~F^s_XS`32qd^ebijjJqm6hx>}`zm`~P1*-mThqThnUoBf%XKU!6}+M-!PfmZjA ziCB{u_TL;fJtkKMdFx*Yi3}Zs+c*%E#LBrS(HloQM8h?n!A9BY)!NN;E*tUG>PG&3 zXfCr$<{9VnPJKR3R^7fm>8!znPcD~IRsc<>TD^DAbdkZqqhFC4wy24=!i&hGqT`Ck z@>vyY&R$9FD(O8LQqHTK_kPs(?bsUDjZ`oDLwu=e=Q#w@ptL_JZM9iA0nw;M?3h% zPMvw`?#`P%B1xCFX7MfXJxBn^Beb#yfvv$^ZlVF?Q!)P|t5qvRpFoEF24|ZcGa8hu~Br)3yD3E2SD=g5|K4tk?9_qTq`wh^1&&(f@$B!zSlj8PAiw zzhCbP+cIjc+r*oa&?%vf`pk`AK{0%%OxZNvi#aekWNObs9*tB$sG|C*NL1s zAc$!>=Irf0dP{CnC&*6!{nGuKV1*J%K7S{U<}ee#%;3v)Lm=EwqUsMJP>tBXx=IXJ zrSYx(5#!sgo1DV>d*J!6FvQnXCgu1+H`^}%QdQOw`|nFN!X0;90Tf3 z8fn3cnAg-ZV$M)-HYPmQO&)6fu>MK={`<4YG|%G+|D)$z#gt4D+X4eJ_w2<&PY0 zBgaL%$V1|OMQMi;x5wt&1aePWNW=gq);^Djq(R*W3nU_o>1esP87ewu`s#x`oR!Ey z#~VQi!903xSI!^mTDMfGw!c^o6{LE%hfx;Kh3o+7pM#3pOHxt(3ZLQZPRo^6M1Jf8 z`Jun+tN~%>kieJ5|IIxZuWA6tL+96#Nm6 z#;C=ekx4#%@6QzDCrj^0cW`7TKYstFBBY?%kM*UFNhW7kMZ#-**Ar!PHE75IRiSyb$Bs0^A`JD*=2uK#$Q9| zqsQ-2<6xV6V&SdYWo3@~RjuqK1!8Q&H$j_6(nReNG3HX`4?7+GMNYo|#tx)HCi-4g zDmgIFS$j}UnGcYH>I#d433WCd(K>mOF$7Hn0pAS1VBCD%&}`52=NtNxd&lVY(ypFC zS>p~z=YtY3eSCU)-J$0GwhaRyJd8k=l$HM|uSDKXV6-mw zXCliKxCR-k%&hXT&sz=WEm(Jb@%bh=x9k^9ugX0CtYJAl1r_oJ5R{5w3ZbB(jk5+Nymo>cq`_xI|;U`Dci+>4{ zY-l=ukrOo9QIVx+z+=VcPb;Y~doG6gMoOZwvYNIr@1)O9FG=u_ya^!q$Vv~!<^~f1 z@%sPy&2V&3fAGgz|N00P?Z_+@V+)zELY&NTGEH7u5#@DoR?R0w0%6Pz@_vMlRP2GL zvUIeqrBc7IvC88Ojra7astT_+Wk+lKerp)2Qil#)s z*L*W+cz+RZ+3X z7R(`S%0}9 zWv1Ouk!AMR-N1*Gm7Dvm7|^rgd^l2d1Q%^S_4h}~#|al5RLXU>R6+`iMVY4fgr{?E z=yK5PNazW-{5#faz5^~VSya=|>j!lG5n)WQhOK}#ysY&*Wk4`h6c>2`au1(^xhB;o zTx|K`tLkh3pW3VGvt{>-<&~e&8V;@NtR_V!G^ezYg=JkL#UYF7SYCfkHZDRUZ~u)_ zd8FeY|GR(|PrnB)R#pc(3MxWNpWXTP8sqIx_Dp5!`=dXCSgiOM;BThY8KmrM&3Q>a}Gd~ ziTi$$X5ZB|7_$&d^pq3^ET+{j(W9cakgC51qBPMc#qdRZxNAM zt)9lGL=`U)1>UgFPklzrmkfxH@TRanV@ytMtze?}Tq38GQ;&iX+0kNHTpmoCup4%A z+xkol(?{z2q7;2s0#A&h=GaU$vEOH?9u#b`2BRb)G`~rbSJ{6-2-r9!_G5K(9Q@Ey z^TmT-`d-1SabSx+P4ius76Rjot)=P=yV5xgpT5p?*;1mu293PwE1gVrBREC!y6?No z*Y=+}5fpzu2qkuknUwJ*IZZWN{Ta%2@6-DG>|lN3s{uM?hc3SBm7Q`xIWLnE)hh1< zV2Y%-g;B19XUT6-#|YW3iOP%0Fb4PA5%m=k&_ER?AHhXY=C^~)US1z=r`#s6nngbE zyFmL0E%meZxt&{}G9Gf|PT>c;Z|uF+UVqV#9{Rysr;ye2yh4e2R1xr{1)SSvyi z&$J)RD#p!IXve0L*AE#>kPAe1Jcn8S_)4Mi&o3goR@aS=78V28Jr$%vJ&wqug= zB#Ktr2^lXC9pYA{FaeXYJoQc}h|*Xc)h$A|LH z7+@LK?9grJE>4dkM;_59b&A#Ax>0SfoRfLS|2J!au_z^g6>TaA{bPiq-SAq_jF&YCkJ3qPpg{rRzFC_(ka z(O3jk%F=B6kTaUji93-T*c(|{JaNI9FNh%cS-cgHhZ&|1YpBXOdh7F{ecI3a<5sr; znD-%jftuf_MnW8LZED4LajT(~4lbpa4|CbPT~@XBrK*VST8oE=!)Ys`=rWt%SCu?bA5rOlUASWWgMf&enVtGupJDzTYiM0yXxzVG zTIhnk(`Wafw1d1#s(UL+r^FWTR|?=EFCN|YS9Zo{oII2_98gX7QUZJWy+vMLUZ=>= zgr1eybXc*Kf)MCWhV62qpaVPxiKV{Vy#ce`)RJ|UtQ=tfWocw5MOWuMkC`UA13-gp zrsEN_Euw8md|CzID?==b-%9xVQPW7q4kKC?9<3S@D)e5Xc^e(YNy!VvtII4n#0OWl z4erda4z7hN%6a{=BMC9D(In;fH%x!_*UQQjBY|wN|EBq8<(j$<0Jt6&S7SH{VKo=y z<36rxZdT>?vBh|IFNx^2-F%9r$|MDw^Ev(H^4thrU~*Wu!?2+qzJ9hy%Ekl*bWqU~ z&m?@CuOTls$YFQy0hvf=av4dOdTTkiSW$?_iB{A?i{B7G5y=$mJJ!iQ{`#~#o{yCv zuiG0$1Bl74|HMrdmPenhsWe-Bv=|`L0LjmD%B^C$1G~`)1{Z=oMu1Vu^B*r>skzDD zcB(Vv5UbS}7zqn&mhPaeii@M)?PR?}_ew;DP^X#l93~vaD(L%D{&_7oQ+b_(IuO7P zMu0VfgGW@WT>bHad3UXUMi1i|jBpRag(z8)k`*evVdP>MNbRP)-F8kXg9uSC@^OFP z=jl7yJ=#0W(%KrW%?SaNkFf%pVbn#jPs?L;dY>Ojm&#)!1D7(}j9JHq$zQBA6UPl(yT&Z2p@q$|R&I1wP;%{z(l#sl z0v%0U#>1TF#ABN3t)U48D^YE@A;pkdH8No?`<@#*FRiJyyJYt3Frs8zF%OGduO z3r90MCt#stDhl0<+sdq54PzX@Gy7orw4!HezP#h(&N{(tYaZs50!8BaRFkvD9$RYF7dVoJ^sQB4+LF8nJDt-IO$;(h0xM}+#Nl`Z3m<{1N5qAov*JCSPvh;4( zF_vEx6CNeyB#@d}c9GJunXyt6)$V1KS{ZY#saww>KJ8RYBYO8%{36m7OGO^j1V-V! zVI%sRr-8&XY{-9EHgvtSEI9hty>`P1?h~2H-eN^9i>%yE8BIO1q?6{gq#?@g&iPPk zn2B`?&AVPQ9)KW)DH=JCV`^1SUZ!SSa=Vj({jwvFqZZf%?cNTmih z{d`^OYb_8mp=n%>9BeY)f}<$DkhlNKYt;%uPQOm~>fl2vo!8{FXT9X@rH&gvz~RW7 zdv}=lq($X?va7U2$NgC_AiaP}^TIB#px}|9bRNpu$InKbJC-AdWjs4aH9FKZGbHjv z7>W4RSPF(;GNzw)u9CGx?d1(ujtwhy56p27Ro6ZtPg-$`vdK4X?X0rv4q>F}1e8G0 zBkPKU2MhQ`lE&ELC|)+^BGsBbSxNif)VJI@{|uN!iGpC5ePt=Vj|iGZf10N0p>F+b zsHj=9vqU)}@&tlZ6`E}ry;G_nFHc!QRP;yx>a@{y_vnA=O?C9$2C2D4glx&~t%;9C zM9=Avi#f<(q&P^X_%2cmL{R1P-T!@jE8L#|Ix z|6+_qq&8N*73i@Eri?=m!i{bxN9L)dI$GU}}8aQ3~LCC2Lw=eFEX4KJj4a z{a0Q0w0m~00+dS$aF#nC#xwO;}nil zp8w@;^(16?SCD`~j-7aDhpD3+j@J~sCdk&gV>?qklV>gjKk?a$>a9Re^Nn`%Cy{8 zg4%=0O^5|^l}0laB@g#YEcN-;HOtYrK#*FrNy9aA35;RZFp@!kyr^DT^xI*{z$vkb z;o{q<}Z}rcu)0OtTW^`)8dwPx@iM~%@ ztml&qP{5imC9~4Hj$M>~PF}j$_Bum4e?BmG*t2W8EXr3Ye8Xkcb$izD!>*M$yWc?V zf#-?O!RfC{YnhC7Ps?@Ddo2C7U9Gl1F?q-Q7$@?PcMHa%VD%N{?(XcRJaxT*WzA+T zc=z!5?y_NhB<6iVl*|>gGf_r9qNS18=#?(-lzvNc;h15G9|1h~xE#AH>4Y(c{){nE z{xb~D^m-mUxc#wWw+zVAk66{}ArINl#jBGO&6cdWF&jQAyY}$*in(TT+^cNf5JCa9 z{&+JBy!*Cc6UG2vIyh0X2QL3BAl->%T#-$a+0{@%11pgPcex`YbkF85at(|Opz!nFbYQuYnfK(fd8U9kJ~duF*b z3U>B%Q2*8uO*W{Ih-tr;_zvJQ~@rv0i;uWaRtA^4l`sxO}X4)aE z{`V0gJTIM%IF*4ERN|$TK}PaKWo%|b2oRLMq3Hps5@*BwHKvCZ$76}wP?OGq8^fgx zAM2^)OOSNpHwO5Wl0mlKhMdNMIs@wr>7S!Jh?G}+I^jO&B5fOq_CVqt^He@m7kUt( zEW8!E7L<1FZ$@nkxyT94$5^j8b0%9A&Zb!l7p`Zg!>!e3;%;kmRsHLW{#D-6U)Ggf zZ24sD;!`(e`sB~|JHNYp{Kn&kcx(0<3j$$yCGv*Kak36Q(F*%Yo8D8B-pR`H_U&iB z`DNq!NSQYcxEm^3;p(yzrf#g1#VbbeaKt2Y^1^L^sdPijb;9hMR74^M-mt0#qrtgn z+%X6$1$~B-mg%T}s7ij^*lK-^X+%Gruq9!t0RoO?2JriQ3Nc}s86THwIdE>dTP~h$ zno()ME4@!5oBX3^2YA!zE>9^8$M;M;_DHtS2>f%4cswX1@`+%U z=?r6~4_^-e_%ylHo!^c|%bC*s)Wa=2kKUJV*LvEpR>;!iIUqQx&TO&#b-IcvQN~j} zwQE42s+0kCvlHLDpM#~OqG1}@3;27inwK$X z&zd{=QIVSNsUmiWFmnS+fw!!oWQW464LsL7{Sz=3tdL!*pGK@Tx$iafdCy-M=V%6q zF!)hAXDQ%l%Lux=sBpftukHySkMB>emPu?BfLj`XyVOw#C z!_TD**x?=qnAymvsPT@_{+7VYl{~T2FD`wZZJ|`!2D~GZAL;?h2cgO7MPpvERX2J` z)hB`BVZGRVq{rrKom;%o6KXm$#L~Bl$w*-!x$JJClaDo9)JV1245QdP<1>qh;Yjt> zgs|)g=klM4+8HYaiU=-Ac#fEZUvF)D9@n%Pi_(*b$kFE)Of9iVe5vwCWJGw=X~aXz zqx>UjBTdb!G99tE4&sk+`FA@_$i~!2^JUaWyB=13UxlDsFYX$zb}*gVIvSKcoOv&; zb%R#_T}8zv#GzFDHXvqtRnwKxP5hD5${Y#TTopcDXz3+GIO1BeI5`6pF{;SSH@pF< zfBtoS+BX)hGdM!RAnjS0e+yhpBWBh)2cZBRoO^e8<(<<~fl&t&+3F+~Kg+(2Bz6sW zZqI2D%Xy6h^XQ358F`vNy3s?yeFIf?dXI`1>DEC#JsZ>4Xjqa^d_`nwJsN-+_Jtt$ z6QHMs`wns`1({QGC)j6@S7L6Q3obms5AoQ!p5VH6T0y**RU{gUbxC*2GAvmhud@3Y zr?J}CNo0pqraBb&wo9x5D%3cyR-EBvh$%RttOo&vePr!-|O5T#$=zEb&hI0KLO z^tLAxi5G_+$JUu~btRCpWDdy5I$mSJ`rsHiKep&-Q7zsC6F$t?SG^+H(f@++H`eE_ z3Q*L;SL%Jj7t{Cbuq1;9he8!MB7xx(uUMO_d`6_^?@}9R08A3`PuDehx1p?eJ?A3V zuH|{=DmJrmi!dO6fy5rEx0lqV(9)oL{@o&K0y1uTk?O3h{;nYb7)QGjjHMvqX1y=tz6lqC~}ZP9hhtGDoKof-Do3y=?;#5Aw{NQ%GcqaCcUKL!OS+5C9X#XgQOuCMe^6|uQ3V8D{*=sw+L=@i_dBd^c7@$~*B3`; zV|}Mr(cBQt+e_v|xhk1?-=s?nsi6k$9(hIq&Y54aG7TzCJi-E|} zLQ0RqPm_c)O(*LJ7&Mb12xsSfOuWw)eSL_YQ3*muMuu($YSf-u4iJgVRx-x)lH6A> zKS_D+t$f3SXa_y?40J+0^?$q>WTZzIro65K@GdDCDA{?nl9I7yU)srf_YCBeq1AD4 zATJtE$}Q3tPWP_hVd+FW& z?R;~X*(dsW*zK$!Rb$N?p%=-aH=4_YM0u_OUNR)))+CvW$Hzjj@d} zG{!En@07hH8v9ad?0aSy%h*bmsH{nL@|hx3DhZK_2+{BE`#jI@FaLOXnR~ALy3Xr7 zkK=tXHrRzpGja;hHwz8T+w!}af`dND2UYv@&{;F*J8B<#qQ@V4+p#r&be-8QF4aZ6 z=(f4XaurvMllL>Mbo``4VH5;Phzpqd>4_Y5Q;a>NfS5GDY*-jJCNKxB7(rZ(IAfiI z$S4KOmprZ>14*T-MraE8toY3I3$rK>`YqSCx%@zyBgE?s(s(R+PvQX;m~|-WP?bD5%VxJw3$Hn0i>hQmOkd)*aBc~7C{KpH^c0jZuAZjq4p`9 z2D+Y5iH1w~a!nXi)|Y31A&IIE(qp^*-b6W!czl`M2Y&w*xL1Bk&irRZEY-bnZ>Ze) zw4a$Rlj2HP*wAlBx=5&v%ulo}rK$mfZ%c>R4S7fjijCR8A8asFgA`uuCZ;kqT!*U7 zr-p3Mr%6BWl8Ee0CAc%#6iyYr;B>&T{c*H$$nzuMZmy`nF^RDvD1;Sua6u9?Hr;g) zu2FX-$srek&D@^ZA4+B2XlweQV`TM0xtV~?>#!vYE66%Md_YM1M)4Cc`dA!(QPe(1i)loUMb zlf!rn5`u%p;QTlGwvWC&xxW@YrFo@1#XY%w1(#an+nixh(G&h?GCm&g`AJ3@pAY*M zOPCPKT?`uU5HYv1h-7=c3#FJ0?foc8K<_g?J{u+RK4Qbi_&@igPwr|dqvfow`7wi# zzqjjN)D{I3l7lmyo4s8iKB8?EiEuFka4 zhG&!rvWS6wa02VGvKZlfOtoRFU>!tbwD`%eSx6Vvo|d=ySU=OwQbasF z0$%Jgm8U1ErnZ0K<5{m)#_`iL|D?jb$6Hr;rR4Xv-*3m0Ta#OSv?t1EZ1Onz!^usw zh=7*3tk_lZ30v-8aqr9HZ*wow)?}TrrOiR=CE<4IkZbsDCY^_}I(7jxIRapI(13T` zJ-Vp8t^++BJ=)uP5-RE#^8sxVm|B%4XDhH6dEYyL*5Td2B&;YWp+@PJ(=5m==63)2 z#;SxpmuNL_xtF_3x39 zMszR6mmAk;2o{IQ5#M);&1N2d%$VgTAi*LoZD(@p|#VEZIsD@5A^Px zKsES>y6s$GWL#J~gmF{5cQBv>5daV(9+}$m2*|&lo13oF4`KHS;Qn3XKe%8WphuB6 zPgI4EkkjNWg&u#b=To~zY{^T?Jh?P1!+`zUf=xE&dJJtyp+}yIJpIan5&acwl4lWO z%OMT8Lbs=PTkpm<9Zg;B&5Q3BOwI&8LQyL%xfNR74as(S#ooL_Z<5fb#>vsJm;;-X z>>OJPW+0_@o$2t87n^0M7Go7QtOD73EIJI41@XBsMOpO<608f=QUetQ{nd)s;$`Ik zv&rJ?v#3|a2kLWQf@r7oT4e3b<#q6Q51Bf3evNnx{3^+x%#88y>zuVN&i`7MpPF8O zeksXW>_o@q#R$y-e?#FkaAA_+m-Iq@xV17f!D4iLyY!#4&^|RV zCg*fHR<{s+E5V|XFLznNhJ^cg&v+XuR8B?>jNWtR#&!AeD2vp$Hq>=idvDw~kx_t$ z)xWth5X(~&&%d<$QZ0kbkSdJ(4au1Q`R)(p!!$8*O<*cKx4|?}I+vN9!-NYe;S_gs z?Ml6Bryizwet!Np_bDZEjQ<)hMqjO9Pr4{FY=zigjFZ&ENzfBTm_E@`>;*_Uobora zScD6`r$LVt9q%v|rd0Ge%mZEtTGXNotwSyAu8%UQpg`#Vud-jiDPhL}o5Qhf1CzDA z5uG{RH^@7tSK{NjXT|5xsKiv(i9J1_Uf4z1DAr>$V@iTXXYg3}5^-t3R|bzX<4Ly+ zGQ3qfY^0`P-rz*?8CPSf;gW~k%$$i?z+$$tOs34D4-2&8P(fjsQhhSsC^eIGljYT} zkquPNAU>3oF_2v-+R^Ss0eYdXWo9i|kQEO=uKa0*N$Ph$((_|~B9jd)>AxJ_=LYWA z9bg}*B>=G@aD%KUMjr}*rq?=6K_=eMe_43-w|#(-Nl;CfsOvk7wF+ir@sS!`F%@`0 z(Ps|&6|Q%DCIT*$`~10F<*6W-&?kUamCLb&bdB_ak*DSu7SRBKGmz#x(^h$&w(urj z5pNjd*NDTE=}F^1BwVq(30{i`x(5cc(_X&35J7s@f8+8pDTN)J3N^3b#oiMLFw8L; z90FW;&fTzjBL0ZM&NfFiu%K%Ate`-a$y)hlQgrSK2V5(K15&rE(Ye2j&P4tKOFk^nV7sti6ee`ardt(_h%HsxYq9)oSr!r z&w#FgbnFbCJdk@-bTU9Eqo}O0nU6&~AAgX45MjV-5jpImp4ltC81Qrn?`-|DZAO2> zP#{mpy7Y(LJ?auM+#g@WtJ8drq&XV&va|jM<`_swt`h zKDexuwD-()jEd%yB5gET77>>qqX59`FIbHqV%2MsVtL*NFsV4BdynG`U|j}+6KcgC zp?|wqE-QDSU7}}pE7-Ze!Tx9wD%Iwx_USy5hqh}hDf)0Or4_NL!kW_=QP~`sJF`h# z>xhn)YB~GnkSWtKja&k~J-rt1H#M`@ z%VXdm&SYy`&5R02WYC6nck07?tPQrA9r<7WnTj-znxGm4y#HHHdXbxKI%VXxvmHY1!mAjoU=t%Pft+d*os*xW0c= zQ}pA_ROG!H_F`%SdPFTOQqgEp3*e#^e7~DZI3p*cAN1It7CJXKm(C&>BbS~chNQak z<-S;@icQs+P_u8@$OYNNbopsrZa1;sNn;L}-&gXfE?~`=_kV4OnhQ9Y!F_}E^wj=M z@zchIzLIHo8~qXK@DcP`qOzxoQ z@Wg&hNUTK-dORI4ahH_OA;1Eq{KB&~*91D8SxfxA{+=8s=dNRyd;nSuLa)^nzS}% ze%$MQEH045e2c>M(3mO1bye)n^vhjf`jcq(jqI{$@=>}sB%Z*e`=xf3m6;|buzO$r z*RapIv3+XJcyF!0Eb}S2!X$(pzh?=ntTMavd+!dc^rzd^md`K_Z_iv^ZWd|XZf$Db z_Gg6TeK%)2Z1hW!VFo{nvj$3Z&&hlB`nE>%?HKn7t!tm;n|Cy=4UV zx%tS49%!-*tJvOO{92XDzU0ldwj(Fj3D^5e-zgLal)Bq0Zj6QdN@1x|{BE_>q?uTV zFQbeOLEn1~<@QP1+D0-cmE8hK#3prU1~}Er1I~pA9$RxRBtbd{L9DGod-T_&AfN@; zuj4jYe2~-44j!{1kplLqg+?E$?9fVD#kx0se?Q-S>QbX)Z|BE;Nl2@Fwkwu-Si3n? zc$E7zX)|$tAj{s*WMZXRvVkFHuPDfnOE##MuNKf_p8XopXUiZuM_{-RH zM|qU9Pq)f{91z>G4E{0i+A z0uGq45&B-u@*$X;vWf{*z>Ov7l_M?X8*;f+m01Ph5n_3a(AabHc$3<4e8PgKx`1$$9xq)wQ&MjH;6^xQkW~mbcGYPD{j|fxxnu5A^$;PT!($Bd&rYLP_6^ zSWKOl8w3U3Xlms>PhGZ0{IIhiE;nfFwfSIoAC)KEH(M*mEa_$_sF~I*_hYuCpHVE} zEaA(ybv6+r^I34*QOs6TE<4MKBtJ_u4>Z!w6;#1+FT zkR6bw`R?>TkLtZc!;9yEu6ox*kukQ(sQWv&z-(JMcmK$iDy8JAyUcl1cGPh1_VA_G zj^Bpf8ISbeY5r{V77!i`{ZY~lvf+BymHar(#l}`j2cj?`u*w70Vtjb_$qj%UB7!us zXNp*d=g7W^B>)_4NG+9t;qChJglWdDz7K$C9EBNOiJCQ znscItnfb&lwj%Ue36iSbejz+(JrwHg2Zl(0WFjgX^N%Ywx@?Ups@yk$ul-ZXt=0BE zbRyu7Cwxy#)WV)Cq{oKc6B^sJI~2`hB&ji^FxT50%SNmgFaOrT!1~AD$P4f~PWGz_ zE8wlpgX@_U*7M;n4+!8(vZ8n%jr8qv!Vul>iK5?W{iMg%ncJ3LWxnHgq``bk0X($0 zGl5gf`j@awrkVbk71m`kk%fP3R&=F;N(15yu&cODE!(;7uibAnx<%o7?+xTF{l9$~ zJEwEBzhZDDPMr43uz#SQ8?u}co$bVCv>u9mO%e4HP#W8OI{a8-KGEerlgSDvhejNg zNNM+RjBMeAXF3=UknE%)0P)@4{Wli|b;>RP3I!pVcEc6#mj($z45=n3LbUg;fg}-v zbA+{KM%v9xyD6~MbD0_joA{xK{ov$!vC_!zQ$I>_JKe4Nmk-S_2bL=j^n$K7%sVRO zNj@)PRQE8JmS>gA1;#&81Vw6=hD~4a)FHHye+iHOc05|~l%sm2=FrRP?}J{FdvYd> z_0;6;LK0hFiar!7`)?s9%6&HYVBokI0$tA#Wy&NaLAfFMZzNy&z-mMSOc7kp@%@A5 zfq88HwW@BXW%2 z4bxF~;%=SupE9He@YFNO`$#_L*QhOg&cKv+jq{=5ZV4TPd*)6{`_*ybUb{5ft4fX^ zJUFU05Nqw|;IOC2?>4tZ(?84ZJGk%td8OmZSnB3oYqZ%UK{2gcfmiX|KO2x%-*1z&bO6HOxuCTHQy2QNjC9=Q^(1J+nD>m?=*8VxW3V3rE zzJRR>Yc!gX`KvMmE+nFb#)gv>#b>d}%mMk#84^bk`7D_aBHTr#WLj8em9;LIWuZ}6KLv$rQHdjosHc;}l#L7lxb}tg0vVuBq_lq(3C;4y$ACJ(T8YggM z#!p`9`Slv44oq@6^$uCk9$zK>%}`Ft^om=M%SD@OsXcDO^OLB z(Mh(>7e2-ZEI<4JW##Fe18h)?>73%FJjFB7dK2QsxYEx58iaK*4hoYjV#bcra`dy{ zelpP%F_+@7Hz7iNGS2!*<7L0Jst5iV38|4_6)jUlO9NcNpi>QY9s|$bzCOksiCq4| z5FV1xz@@yyYPVMq)jxEShOEr9d?})i!c5ZP8gWzcg(~qpv8%LRe;Cd~V>DUWyF0u& z@_BimUmV~x7<1g9h7fuAH~b( zjebiwz8+VywFr5#{q2{RCuA|4VC+pv-^TH;D_PEGiuBI7Zxd<^!Q%sPjOEB7`9UVyG}tHGt%QA zHpOc|pP<*;ApUZQ^UckZvxocN)Iu3rg#`AmtUYecVI&d0(8G+Ho!inj>eY0=DB
Qid*Z|(TIto8uJJ=7Uhj{@2BE!!Zq>ybAP^%@ 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 - action = primitivesMenu->addAction("Tetrahedron",this,SLOT(addTetrahedron())); - icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_tetrahedron.png"); + action = primitivesMenu->addAction("Dodecahedron" ,this,SLOT(addDodecahedron())); + icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_dodecahedron.png"); action->setIcon(*icon); - action = primitivesMenu->addAction("Icosahedron" ,this,SLOT(addIcosahedron())); icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_icosahedron.png"); action->setIcon(*icon); + action = primitivesMenu->addAction("Octahedron" ,this,SLOT(addOctahedron())); + icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_octahedron.png"); + action->setIcon(*icon); action = primitivesMenu->addAction("Pyramid" ,this,SLOT(addPyramid())); icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_pyramid.png"); action->setIcon(*icon); - action = primitivesMenu->addAction("Octahedron" ,this,SLOT(addOctahedron())); - icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_octahedron.png"); + action = primitivesMenu->addAction("Sphere",this,SLOT(addSphere())); + icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_sphere.png"); action->setIcon(*icon); - action = primitivesMenu->addAction("Dodecahedron" ,this,SLOT(addDodecahedron())); - icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_dodecahedron.png"); + action = primitivesMenu->addAction("Tetrahedron",this,SLOT(addTetrahedron())); + icon = new QIcon(OpenFlipper::Options::iconDirStr()+OpenFlipper::Options::dirSeparator()+"primitive_tetrahedron.png"); action->setIcon(*icon); + } } @@ -234,12 +240,162 @@ int PrimitivesGeneratorPlugin::addTriangulatedCube() { return -1; } +//======================================================================== +// Sphere +//======================================================================== + + +void PrimitivesGeneratorPlugin::addSphereTriangle(int sl0, int st0, int sl1, int st1, int sl2, int st2) +{ + ACG::Vec2f tex[3]; + + tex[0] = texCoordOnSphere(sl0, st0); + tex[1] = texCoordOnSphere(sl1, st1); + tex[2] = texCoordOnSphere(sl2, st2); + +// std::vector vhandles; +// +// vhandles.push_back(vhandles_[_vh1]); +// vhandles.push_back(vhandles_[_vh2]); +// vhandles.push_back(vhandles_[_vh3]); +// +// triMesh_->add_face(vhandles); + + //addTriangleToVBO(p, n, tex); +} + +//------------------------------------------------------------------------ + +ACG::Vec3d PrimitivesGeneratorPlugin::positionOnSphere(int _sliceNumber, int _stackNumber) +{ + ACG::Vec3d position; + + double alpha = (M_PI / double(stacks_)) * double(_stackNumber); + double beta = ((2.0 * M_PI) / double(slices_)) * double(_sliceNumber); + + double ringRadius = sin(alpha); + position[0] = sin(beta) * ringRadius; + position[1] = cos(beta) * ringRadius; + position[2] = cos(alpha); + + return position; +} + +//------------------------------------------------------------------------ + +ACG::Vec2f PrimitivesGeneratorPlugin::texCoordOnSphere(int _sliceNumber, int _stackNumber) +{ + ACG::Vec2f texCoord; + + double alpha = (M_PI / double(stacks_)) * double(_stackNumber); + texCoord[0] = double(_sliceNumber) / double(slices_); + texCoord[1] = 0.5 * (cos(alpha) + 1.0); + + return texCoord; +} + +//------------------------------------------------------------------------ + int PrimitivesGeneratorPlugin::addSphere() { -std::cerr << "Todo :add Sphere" << std::endl; -return -1; + int newObject = addTriMesh(); + + TriMeshObject* object; + if (!PluginFunctions::getObject(newObject, object)) { + emit log(LOGERR, "Unable to create new Object"); + return -1; + } else { + + triMesh_ = object->mesh(); + triMesh_->request_vertex_texcoords2D(); + + TriMesh::VertexHandle vh; + + vh = triMesh_->add_vertex(positionOnSphere(0, 0)); + triMesh_->set_texcoord2D(vh, texCoordOnSphere(0, 0)); + + for (int st = 1; st < stacks_ - 1; ++st) { + for (int sl = 0; sl < slices_; ++sl) { + vh = triMesh_->add_vertex(positionOnSphere(sl, st)); + triMesh_->set_texcoord2D(vh, texCoordOnSphere(sl, st)); + } + } + + vh = triMesh_->add_vertex(positionOnSphere(slices_, stacks_)); + triMesh_->set_texcoord2D(vh, texCoordOnSphere(slices_, stacks_)); + + std::vector vhandles; + + // Add top triangle fan ( Vertex index is shifted by one for the first slice ) + for (int sl = 1; sl < slices_ + 1; ++sl) { + + vhandles.clear(); + + vhandles.push_back(triMesh_->vertex_handle(sl)); + vhandles.push_back(triMesh_->vertex_handle(0)); + vhandles.push_back(triMesh_->vertex_handle(1 * 1 + (sl % slices_))); + + triMesh_->add_face(vhandles); + } + + for (int st = 0; st < stacks_ - 3; ++st) { + + // Move around one slice + for (int sl = 0; sl < slices_; ++sl) { + + // Offset 1 because of singular vertex + unsigned int startTop = 1 + slices_ * st; + unsigned int startBottom = 1 + slices_ * (st + 1); + + vhandles.clear(); + + vhandles.push_back(triMesh_->vertex_handle(startTop + sl)); + vhandles.push_back(triMesh_->vertex_handle(startTop + ((sl + 1) % slices_))); + vhandles.push_back(triMesh_->vertex_handle(startBottom + sl)); + + triMesh_->add_face(vhandles); + + vhandles.clear(); + + vhandles.push_back(triMesh_->vertex_handle(startBottom + sl)); + vhandles.push_back(triMesh_->vertex_handle(startTop + ((sl + 1) % slices_))); + vhandles.push_back(triMesh_->vertex_handle(startBottom + ((sl + 1) % slices_))); + + triMesh_->add_face(vhandles); + } + + } + + const int startTop = 1 + (stacks_ - 3) * slices_; + const int bottomVertex = 1 + (stacks_ - 2) * slices_; + + // Add bottom triangle fan + for (int sl = 0; sl < slices_; ++sl) { + + vhandles.clear(); + + vhandles.push_back(triMesh_->vertex_handle(bottomVertex)); + vhandles.push_back(triMesh_->vertex_handle(startTop + sl)); + vhandles.push_back(triMesh_->vertex_handle(startTop + ((sl + 1) % slices_))); + + triMesh_->add_face(vhandles); + } + + triMesh_->update_normals(); + + emit updatedObject(newObject,UPDATE_ALL); + + return object->id(); + } + + } + +//======================================================================== +// Pyramid +//======================================================================== + int PrimitivesGeneratorPlugin::addPyramid() { int newObject = addTriMesh(); diff --git a/PrimitivesGenerator.hh b/PrimitivesGenerator.hh index 69fb2d4..4125f03 100644 --- a/PrimitivesGenerator.hh +++ b/PrimitivesGenerator.hh @@ -115,11 +115,20 @@ private: inline void add_face( int _vh1 , int _vh2, int _vh3, int _vh4 , int _vh5 ); + + void addSphereTriangle(int sl0, int st0, int sl1, int st1, int sl2, int st2); + inline ACG::Vec3d positionOnSphere(int _sliceNumber, int _stackNumber); + inline ACG::Vec2f texCoordOnSphere(int _sliceNumber, int _stackNumber); + std::vector vhandles_; std::vector vphandles_; TriMesh* triMesh_; PolyMesh* polyMesh_; + + int slices_; + int stacks_; + }; #endif //PRIMITIVESGENERATORPLUGIN_HH -- GitLab