From 8cd432c9269e4bb802b49337afd649d2aa4e9f2a Mon Sep 17 00:00:00 2001 From: Bennyboiii Date: Thu, 9 Mar 2023 21:11:26 -0500 Subject: [PATCH] added a dock (sirius) --- examples/sirius.rs | 159 +++++++++++++++++++++++++++++++++++++++ res/protostar/button.glb | Bin 0 -> 21236 bytes 2 files changed, 159 insertions(+) create mode 100644 examples/sirius.rs create mode 100644 res/protostar/button.glb diff --git a/examples/sirius.rs b/examples/sirius.rs new file mode 100644 index 0000000..8fc0acc --- /dev/null +++ b/examples/sirius.rs @@ -0,0 +1,159 @@ +#![allow(dead_code)] + +use color_eyre::eyre::Result; +use glam::Vec3; +use manifest_dir_macros::directory_relative_path; +use protostar::protostar::ProtoStar; +use stardust_xr_fusion::{ + client::{Client, FrameInfo, RootHandler}, + core::values::Transform, + drawable::{MaterialParameter, Model, ResourceID}, + node::NodeError, input::{InputData, InputDataType}, spatial::Spatial, fields::BoxField, +}; +use stardust_xr_molecules::{touch_plane::TouchPlane, Grabbable, GrabData}; + + + +#[tokio::main(flavor = "current_thread")] +async fn main() -> Result<()> { + color_eyre::install()?; + let (client, event_loop) = Client::connect_with_async_loop().await?; + client.set_base_prefixes(&[directory_relative_path!("res")]); + + let _wrapped_root = client.wrap_root(Sirius::new(&client)?)?; + + tokio::select! { + _ = tokio::signal::ctrl_c() => (), + e = event_loop => e??, + } + Ok(()) +} + +struct Star { + cli: ProtoStar +} + +impl Star { + fn new(parent: &Spatial, name: Option<&str>,path: &str) -> Option { + let cli = ProtoStar::new_raw(parent, Vec3::default(), name, None, path.to_string()).unwrap(); + Some(Star { + cli, + }) + } +} + +impl RootHandler for Star { + fn frame(&mut self, info: FrameInfo) { + self.cli.frame(info); + } +} + +struct Sirius { + touch_plane: TouchPlane, + model: Model, + root: Spatial, + clients: Vec, + visibility: bool, + grabbable: Grabbable, + +} +impl Sirius { + fn new(client: &Client) -> Result { + let client_list: Vec<(Option<&str>, &str)> = Vec::from([ + (Some("Magnetar"), "$HOME/repos/stardust/telescope/repos/magnetar/target/release/magnetar"), + (Some("Atmosphere"), "$HOME/repos/stardust/telescope/repos/atmosphere/target/release/atmosphere"), + (Some("Manifold"), "$HOME/repos/stardust/telescope/repos/manifold/target/release/manifold"), + ]); + let root = Spatial::create(client.get_root(), Transform::default(), false).unwrap(); + + let field = BoxField::create(&root, Transform::default(), Vec3::from([0.1;3])).unwrap(); + let grabbable = Grabbable::new(&root, Transform::default(), &field, GrabData::default())?; + let touch_plane = TouchPlane::new(grabbable.content_parent(), Transform::default(), [0.1; 2], 0.03)?; + let mut clients = Vec::new(); + for clientkv in client_list { + clients.push(Star::new(grabbable.content_parent(), clientkv.0, clientkv.1).unwrap()); + } + let model = Model::create( + grabbable.content_parent(), + Transform::default(), + &ResourceID::new_namespaced("protostar", "button"), + )?; + field.set_spatial_parent(grabbable.content_parent())?; + let visibility = false; + + Ok(Sirius { touch_plane, model , root, clients, visibility, grabbable}) + } + +// fn left_hand(input_data: &InputData, _: &()) -> bool { +// match &input_data.input { +// InputDataType::Hand(h) => !h.right, +// _ => false, +// } +// } +} +impl RootHandler for Sirius { + fn frame(&mut self, info: FrameInfo) { + + for app in &mut self.clients { + app.frame(info); + } + + self.grabbable.update(&info); + self.touch_plane.update(); + if self.touch_plane.touch_started() { + println!("Touch started"); + self.visibility = !self.visibility; + match self.visibility { + true => for star in self.clients.iter().enumerate() { + let mut starpos = (star.0 as f32 +1.0)/10.0; + match starpos % 0.2 == 0.0 { + true => starpos = -starpos/2.0, + false => starpos = (starpos - 0.1)/2.0, + } + println!("{}", starpos); + star.1.cli.content_parent().set_position(Some(&self.grabbable.content_parent()), Vec3::from([starpos,0.1,0.0])).ok(); + }, + false => for star in &self.clients { + star.cli.content_parent().set_position(Some(&self.grabbable.content_parent()), Vec3::from([0.0,0.0,0.0])).ok(); + }, + + } + let color = [0.0, 1.0, 0.0, 1.0]; + self.model + .set_material_parameter(0, "color", MaterialParameter::Color(color)) + .unwrap(); + self.model + .set_material_parameter( + 0, + "emission_factor", + MaterialParameter::Color(color.map(|c| c * 0.75)), + ) + .unwrap(); + } + + if self.touch_plane.touch_stopped() { + println!("Touch ended"); + let color = [1.0, 0.0, 0.0, 1.0]; + self.model + .set_material_parameter(0, "color", MaterialParameter::Color(color)) + .unwrap(); + self.model + .set_material_parameter( + 0, + "emission_factor", + MaterialParameter::Color(color.map(|c| c * 0.5)), + ) + .unwrap(); + } + } +} + +fn position(data: &InputData) -> Vec3 { + match &data.input { + InputDataType::Hand(h) => h.palm.position.into(), + InputDataType::Pointer(w) => w.deepest_point.into(), + InputDataType::Tip(t) => t.origin.into(), + } + + +} diff --git a/res/protostar/button.glb b/res/protostar/button.glb new file mode 100644 index 0000000000000000000000000000000000000000..ed080bac8d7207e228ed2d16dc5d05edb9ade1f5 GIT binary patch literal 21236 zcmbuG2Xs}{wuaY{ra?Lhoj_=UAta=coUFYdNDl!+Q^b-$C;|y20g=!IqzNK|6fqbC zMFL1wL0Eeu9hD+QKxxtu5JYUC^8Pu`3iq67#=CDk@0fe7f3p97w{`aU4vgDxP}kNE z2_fzz2@zaOi1uANC1wXDXJ)2m1;u6u^-E1l%}CBl&j^YQ>d-$UJuN-6RzFy3#ScnN z>yw&Mt6h^$wT6d>M1(|!1_cKVPtC|2ke-H}n}&o2jSddV?2Uk+*ibXe42pdwJ18xA zFnU2<_|Jla($f2+(jSC9JNnuGsO+G@shR!RYWDA(KIr9s2oDa*%1BPj9F&~Jhk7P7 zxN&GmXjoWORMUuGCHPaB@Y@jpm$RGuzvm1QZtd8 z9h8!snc6aaP#dt0)IV&q;K+3QzlG#C>J9TN-wOyw~ellHKJ=L;Pr=%yI z4-JY93l2)`l+>|BLQrhe(ZN9j()tYOO_p#REdN4dLr3$yOYV(7%1qDj93W*_-@d6C z-3O$;#G$>@2MWH+!$U5VKJfMG2u<4VnU-bsUH<@D5wvjr5kk$-$Y$Z8F_B?0QBmO$k>O#y z#0u_-m@GcUpzf_&hGV(od3jw5Zpi<7DgW^|{fEEl|H=Q)Xl4B861<-dKbe%5vr-dM)B0uMa~T;Ef%Qe5PJR3G+X6BxIinxFIKm@h zqOb_^@5evP;W1GK%$~Ua*8k6g$HavGAC4ap8WG`p@?nw9=z6?QApAdf!`un4%MXib z)+_>xd1Xf-;@c&PcYcV_ZJVe=6qJ^K`2Us@M7AKNRObH3PBUKch$niR(S zB)(Wl7d9XKYzXfY*0Z`UY(8dABi^TOQf*z>d}m;N-Y24BeO=f*CagB^^XQ9>wD-JB zk?P#vST{sJd^~{X@ioGH<`@4g$Ng*3;W~LwDW3l|Fv4e^@WmtCr~4XE*-z4aE;tWb zT$=myMnq`u`M}T0bAMPD+}F%XJm1_5_s?s7XKZ!upKTPPz2~#%)aL%u){V6Hd{J6` z?jPA$PkYY~9&W__uQ%4xh0WK@3gLaqO|GU3n^(?V&d5$$Kv2J;eb?Y<7y5&CBu=Ji|-EtpmSpGM2 ztY_XIYg-mJ$J*w7u+C*+bF6dT2WwsyHpe>WeX!VKKLz4|<#xwwN~SN*O#A+n_Qo>!4= zb>NyxafeEl)ZX)qJMmf{3XY5U(ocKOMM9i@vrlZ?;g|ii_dNeR|MC4&+H;=WidWF@ zc;;@Jhg@#Y=Tqlkd3|6;8$O5cnwHmtx_gd$PL|VpyPJ;{{zzG$@1w7OY{%CgxVx%0 zb2rT&I?|Ri&!kk<@$a_c%p0nTzLMLVuVv@RO1g6QSkBz8{C&Q^-hHbzXAbQfq|Mw- z^SIYqapwM$wRPP|@tpa5$6C7hA<3C>XKHBYLNsS~JW$o=`!4$Nc+T9uqoFo)H_iRS zTX5#`>J9ZDDHdmb9nnC);ELtUdvSGj#Zh?fxX)9@*7Es&{PGy?Kc4#=+d{ROyJ`OW zZ8vAubcN~*J!3d?mNB86IlfYTpYPM@+oL!$sd=xq=MyS( z=0W5i|15wr7Y%Q&t7TW@%!whf+M7K#zCrI>XS2H4L7Tao=3jL!&zV6^dwt=9a-8|r zfHu0s{IZ-`uUWj_6kmoj@2qtDa0|U7D3jhFX6~kWU|31cr1!*>dw!fr?}oA;`f(<` z56)ZoUcmaKcYrtlAV+#-(wsAIM3j{D{-Mm?ekCQnb11X+9zRL%8OmIe z$qJkq_eg>^b2rVm9xl(BcfW71Q$5%Gu%;>)(^rBv17@TMEt4(~Evsg|vXBO!hrOn(; zb7yB1XD*u>sYSO4&ipkvT;H4=%9(Y>Hqra^uy53r?8D~z|T*Zf_p9yHsnJ=xZqRre*^CtJ&a^|#lRdn*s zR-Bp9sIu;}vpHwB9T=b|jELpT!_gIe*t@y+vy1tG zGe>0jvb|TPG;_+7cz19n7)IjV!I|I|nV$((k$4|@uKi`--vwX~K2NZRG;`t*2@c^* zaEJtla3(lJfC){1cyj)2xo#rBshdK!66bH z!kOR@pWh>356%R8NHZr6k>C){1cyj)2xo#rBshdK!66bH!kOR@pWiZI56%R8NHZr6 zk>C){1cyj)2xo#rBshdK!66bH!kOR@pWi-U56%R8NHZr6k>C){1cyj)2xo#rBshdK z!66bH!kOR@pWjMg56%R8NHZr6k>C){1cyj)2xo#rBshdK!66bH!kOR@pWjws56%R8 zNHZr6k>C){1cyj)2xo#rBshdK!66bH!kOR@pWk9&56%R8NHZr6k>C){1cyj)2xo#r zBshdK!66bH!kOR@pWkj^56%R8NHZr6k>C){1cyj)2xo#rBshdK!66bH!kOR@pWl68 z56`u4Z70o~I7EU&I1?Nq!6BRp4w2vx&IE@@a0q9DLwtTGf;~7B>>6$Z!Z{(wsBFA=+?=1czwDArc&-4Tnf@h&CMJ^ZOUs!I@wWY39Ts5**^m+}c)xLpT#0BEcb?2@a9q5Y7aL z`1}S3dvGS$Lz+2phy;glCOAZbLpT#0BEcb?2@a9q5Y7aL`22ncdvGS$Lz+2phy;gl zCOAZbLpT#0BEcb?2@a9q5Y7aL`26+y z93sIXoCyw*;1JFPhe&V;XM#f{ID|97AwGZq0QTTau!l5r;t&ZA;Y@Id1cz`YI7EU& zI1?Nq!6BRp4)OW>3a|%ff<2^}6NgA}2xo#rBshdK!66bH!kOR@2@c^*aEQ;}Z-6~G z6YL?)oH#^+LpT#0BEcb?2@a9q5Y7aLNN@;ef-=%v+_|iA-ag}sygb(VO);z;+v0J@_Le+i9q_n+Uq_$u@S!Bu`Q!0pJy;huVjc0H7aY%h zpUnM&vJ!{`H3b8V;5w9`N$opeM`9hqSn#1o68Y!Pf%JuYx(RmhW z@|!+Y*?4yxEk@FoAbPG&hxrCPwLZolBV;# zZqAeYV$tzO_+HaU$D@&s=jjWh^DNSIJkzK9$vzs*{bZk~&-W9W?EpgU!9E&2_vH!pdHQr;NYj0Jf_U#K zNIn|L=jqcrBTehGRG$8p%f^`8<98yz}u$ zlh5=;N`qh7M7(MUcT$>-_w_YwO@)AgA?)^$7f(MUcT$>-_Qx+YEU`F89xeXQ$5_R&Z_ z8p-GB)4C>2>pGErrjK>qg?%)Vk4Ex&`n0Y|)4J}$KGUb~P4>}9J{rmA>C?I<&EK2s zGkvV@$6=>lF6UNIn|L=jqeBCQa))g?*-vb={ABG?I@- z@_G8Su1V9n?#DjUr|)<6(MUcT$>-_w_dEMY)AKWZtm~odqmg_xlF!qpbxoSS$A+@c z^s%movyVpd(MUc|pVl>LTGzwbXZl#z+3cf{d^D2J)2DS!n$~qT`%GU%{B>&$y?3#| z$D#0_XWr_=noaZP!RzgH`E&37w1>kV>~k(S=fOT#D!jY){{69>>AlZWcPjnsKHkTj zHn!ioe6RQZ>iahy9Lsy3@hyITa4hefqqkc>IM#o&kGI!*zWH3K_4()H-7h%*|LpU> zc?&y-!usCV?tPwx-3Rac>Ak=AJ@(;v;x!!uPmc09ygKIqKcaEI3_TRjN?#z3zPvrMyAFMI&evxi(KiJ1RKXTuK z2j}CxPxkMw2RYvRpRhJR$Voi??1O#0`!#+!`(Ph$Z^8b*t+AYQrNX_h@!$6G&irrZ zh2`Y;y^rgCUEcZL=U>?V-uKP>o_P1YGrjM>_p|fvdp{TNeZ1F$_p|oydmqbtEfv-; zY#n;9Tkm}eTl3!g_x*URL&uBg-BNqct6d-CG|bMG3-`ur@A=HOna;frbFAeTW3=}? zC90EiO$4Y0-D_&^`K&(!oE-}j)o%OJ7Vr7E^0{`!I+^NVZq^p>dA%cn_D|oAQgvF~ z+3Y><@l`gTXW))z_Jv~E&Kq-b<&dV$>|ZWtsPWwg=sSN^xBomnN)1iDwB>NSp`3ZQ>NAUd@#; z)AH=!=B7GFN9S0JcfM!WTGG;a?U=vnyMCJ8d2?wepnsyuNoj9i{Ar%O>TZU*opDUB zpBrHJJ~c}9n$%72P4CT_rHWm%KiQJvG#QgC{S$t$H}!qWd2xDs2n z#W{oL(y(qBr^&K*PSS!LYw9}>JAdtd+!=q{U+r+N*k^~_wO36`RO^;6x5IBtv|9&c zs@JMU*gp>}YQOc}D3v~Ny>36QC1>7mRnHl4Dc%`_%(L6;I?Y_MPR@Hd)>f;Avp&71 zQ~I92%DPp|*?HrVeQ{2rsvNW3ZuWDQ{b!9#HLXG?yWcZ+bQ5F-&EBtHsMnM;A3hQ7 z)LRhd^hM^AZKIv3qZ>LY%W|xQA3~h-y~;YN_x;t*dlj8xeGb`wEJ#!r15en?D?V>K zwKLU>W_|6HHK(-;neyw4dhf_U&P;95)@lA%O=lc3KVQ?d&Tv9z!(BXXDz>@0nze z7`#eH(RpSRx65t5Xw&B?XHOqT7QbjGkII$fD)w=Hoc*o+>AV~(bk)<&+VIcp5cp9LsmU|-3S=(5S=wGYXC-IuDmv8p>d}?< zy0Q4Th&Dr<=OdTevH1Iwaa~d!_m$V|qUZfpQty^dk8%li;!BC@#+cGhuV0Squo9W7 z=h%66`zby2SgfTD;{xoZX$hRU;rK{r&b|)zq-nXbYK4)`*;nK3RU>k&B5Tr|_B-m? z-+b+_0{V4u%H8-$H+~^eB@V9WJa=-O{`=<))u!em`>Ox_E!VN;yN;`F&u=wK)3v`f zVXRYkY_{GuI#&+*Y>ZRn;URj;>p9lY8kx@JF$wyaEB(HT%DP1e7Zq29Z($ZqoJwYbO5j8fm7s&2ajRA;LfcjE34@2x9kXD60bbnO!|yExZRmQh)_pO5TI zaz0OZMCrG4tbiu%oHEz0T4#RtSANNlJ5l5Ftd7$YRjcEF*zetquqIZ@RCnf0w6AyF zAYaA(oL#f1-G3?ln}`ryLt8pUg6gS`$Xq=)-WfE%hN`$U$GW{C#_1GST)q6Kzp55e z(^>QWc5Ck3L}kBr$*wrAljRP?c}~c(t&#_1ATrPY@w47`JDM~1`!#iLCP%9%${Z8s z`=b06 z-y=KTIISDH>EBd@STsJ+nU>Q=g(I^}u|Q|>I7k`&dPu<22OSmfq&hu)Y-FjUk`u7(hmTvHKdcM+KRYB(9HhxaW zPZQLETwMEaMVu)wgs91X_^W=0&f0GW|7``#PE^00SYi)6G|5_2JyV@I)Yx7)ytvgI znNRmxrRSDS<;E*j=iWu?`?J_~7fhepGhGU85*UG~*<^;AZVHE?v8eYsYGdglv& z^OdYRt%idhxH-t!?-&PRYHp<@9R){U<`kwAXK6 z8l!$4nJZsE-A-R>nW;LxpJPp5)?BxV=%g0^<*$xauB+etJ3w8Tm#7*wyt$=stz0Xr zR;Jqa?&vMO_61rMaqVYo{IwZ8!{-UMkzg3r2+!!9z3~#hhe&XUWjI8FLoCA~ zao`Zn1czAQ5M?;T0*5HWAr?4984j_)AnScXF^aEN6%M1n&&6C9$zAC){1cxYah%y|az#+mf;Wu4zUb}C~$~nI7ER%EW;rR93l;eSl|$8IK%>na3(lJfkQ0AAqpH~84gk4 z5X*3g0*6S$AqpHK4To6ZkT}C37C3~N0UV;hA<}S&0*6S$AqpHK4TmUjh%_9cz#(yl zLo9GeoZ%1)9Kvh^4pHC`Z8$`ML$u)#1rE`MLlihuML>msVz#-ajhy@PeOmK(-huDTg6gb2-9HPJ>w&4&34zUe~C~$~v zIK%>nXu}~EIK-iA2Ztzdh+{ZJfkPa_AqpH~8xB$65ZiEw1rD(dhgjecZ8*dNhj1o1 zM1eyb!yyVB;usE5;1I`fhysV$hC?iHh;2B;0*7eBArc(Incxrw4si^JC~$~lI7ER% z9K#_B9AX;|vA`j=;SdWPq78>ga0q9DL-6<9Z5+cP3LN4X4pHC`$8d-OhuDTgEO3Zz zIK%>nXu}~A9KxC45Csl#42LLih+{ZJfkPa_Ar?5qHXLGsLu|t#7C6K<93sIXoCyxG zz#)#|5DOgQ7!I+(A&%h?3moDY4za)?w&4&99AX;|k>C){1czAQ5XW$c1rBixhgjec z$8d-R4si^JSl|%baEJtl*oH$SID|97Ar?5qF&tunLma~)7C6K)9Abe(9K#_J9AX;| zk>C*9a7Y|Dgfqb*5**?f4w2vx$8d-Qhd72qBsjz|91;f(u?>gBfkSM=A@1rTP}C6B zL@iNMR2M;_wy272b!_Wmtb%P-QCZXzbwnjmAG(rw3}XPcl|*^bK=_M_q7hVC(NI(n zo^P-#REuItI zMHkTv+vmiy;wjNXJcI4C*glQ1C$`UsG2%5b4clpA6#ju>I@CDS7%^VVfEte)Cnk#5 zp(dini%DW8)FjkIF-5!qH3c;Zo;SrTY-b^9x|j_$9rYSKbD(CRro;0V)a$4j@XUpp ziFzF=^Pt{9&4g!xn2+szB+V9YL(N9L3C}{PIjGt2yaV+XY7RU(P;*glA!QNNJk(rx za>cvYzKf){#bT(pQ48RC4{9OmZFrVIy@Of^&r+xy)H_IdA8HXQ2cBi(18hG)(qi!; z)M8XFJjQLqYAtFFJe#1_ zq1GbhGpO~bb?|Hvo3Y)Dq)&u~`ULecJT}y)s88T=pf;jDg=Z_&Ce%ixd=B*)Y7;!$ z#WrlWAxVoJP#U!bo}ExOO2e}Y%0b!i?1tKka*(nI>T}dqc)k#OvE7TL9pX!<9jNW_ zd!i4xskKb6gz5_85{5i4#zVP+!CIE!1JuA$Y!nI)XY3&q=7Gs3S-@ z1@#T;C_HDxX>3m;>4Z27bpmx9p6{W)MV)}>9MpHHZ{ax)brSU*QZ7K9LY;)?lDLTN zMI@aSm!Zz0&cJg8>U-2#c&H_LKJU7I3Y_B8fviK3|GU^gM zH=(YeF2i#R>MH6AJU>DGfVzs5+fdg~KfrTG{EY3-NcvIy0`(*620Xt)-9-He&u>t- zP&eWE9qK34Eu{PbbsO~)Jom(1Z0{oJ7x5?5FQ_~4`~~$Z>KAzahWZWlD?In1enMG*;3!OjVDdsBb`Wv0U;3@7Z26r)N z;VR)O?h>f`@I2yr819FWR>b88RRr}Ad?lfZqKd%xC{!_2QFuy06-O0AN@=JPsN(RH zb(O)k43hj@<)HjfkHAwNswBz}o(fQpqDsP35vmmGQKa}ol}43mFPc^8Ds0v7_4&{%k2v1E{4Qy*5sj@2&sxqn)Jhh;zpen;t z8>%X*3Oqqj)lgNDQU|I!sv11?Ty?Rni=;qTeW*ZGO?VnW)j|cr^B7cZR4sTKLIt5} zBc%~k9aIoJ!LG-#eH=;kU5%mYqw2vE0@VOjAD$*qkD(gC6AIN3^%zpZpclR1;JPJke00s3u5h1{H=1g(ub(gKZ3wB3y2$2vj&c zaZr({2zVq^6e6Je3s-Y&n(Ha)Kl;zL-j;Gjg%CqXHY%i>Er5+ZEqw!=Sqco4)rWNeW9L5JqJ%es25Pr!_yxs z8TA5E20*2tlHnQXdJ)?fk(BBh1eJ>F1J7WnzNl1q(xCdG`ofbA)gRRlDMO$Jp!&m; z;TnqVP$UgLt{0c*eQLVmlT|BVDgRjYPc+&v>Y8)JS+H zK#f9W!!r?TG-?!5UWFQi8V%26*CcEwA?X#@6sT8F`)HY6?8Fpr)aw!t*B7Yp7{RnGH1^^%^{H zx#nOy2T3zsbD?IUUWaEM)ElUo@XUvrg?a;?1yFCIW+CNmsM)AD;d#fk5Zi@Fn(NAe znu~f1o<&geP;=pV7ivCg9z3~F3sCcsvKZ=Z)B<>xxZcC|JtXD0mO|yA-htV)hvy@x zWvCC3vKs0`)G~P1y4GO321zSi>!4Pk^59tywGy=go()i|P%Gj280sU`Dx`b@wHoyi zJR4n~V*4qQ*10x8twXJa=QF7FsCDpchT4Ey56>2;k5Leeiq(bpW*=o?}o4Q3v2T4)rzaAW}|19YTE# z&v&kGvHccFM_nhOj-rmha|-Gk)KPd&LmfkX1J4<#