From aca8f5e73f857ad06fc97d6c8efa29f9dba80234 Mon Sep 17 00:00:00 2001 From: Luca Della Vedova Date: Tue, 27 Jun 2023 12:24:46 +0800 Subject: [PATCH 1/3] Add icons for location tags Signed-off-by: Luca Della Vedova --- assets/textures/battery.png | Bin 0 -> 618 bytes assets/textures/battery.svg | 89 ++++++++++++++ assets/textures/parking.png | Bin 0 -> 1031 bytes assets/textures/parking.svg | 83 +++++++++++++ assets/textures/robot.png | Bin 0 -> 1783 bytes assets/textures/robot.svg | 111 +++++++++++++++++ assets/textures/stopwatch.png | Bin 0 -> 2748 bytes assets/textures/stopwatch.svg | 113 +++++++++++++++++ assets/textures/workcell.png | Bin 0 -> 2996 bytes assets/textures/workcell.svg | 92 ++++++++++++++ rmf_site_editor/src/shapes.rs | 20 +++ rmf_site_editor/src/site/assets.rs | 65 ++++++++++ rmf_site_editor/src/site/location.rs | 176 ++++++++++++++++++++++++++- rmf_site_editor/src/site/mod.rs | 1 + rmf_site_editor/src/site_asset_io.rs | 20 +++ 15 files changed, 768 insertions(+), 2 deletions(-) create mode 100644 assets/textures/battery.png create mode 100644 assets/textures/battery.svg create mode 100644 assets/textures/parking.png create mode 100644 assets/textures/parking.svg create mode 100644 assets/textures/robot.png create mode 100644 assets/textures/robot.svg create mode 100644 assets/textures/stopwatch.png create mode 100644 assets/textures/stopwatch.svg create mode 100644 assets/textures/workcell.png create mode 100644 assets/textures/workcell.svg diff --git a/assets/textures/battery.png b/assets/textures/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..16969dd2f90fdeb318ee163e661119e671bb7f41 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMprB-l zYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9lJzX3_D(1YMZP<0lL8R?} zB(vI9R|js#J&j3AmsTipuYcfp#QR1i!$BwQ;3Wdmsu7w(>DG%kN18tK-L$zf-u&E$ zXCEitKhwa)AjEo%i9xgb<$}9;>|tWkmGiz&d=j;m?e;d)5|N3W4QZQyPHgyD)0ek> z^}@v+`fIQ9F8IJ?)Oo;msuyeXL4~rsjS&fZWKVy>WWmB8%`Q}c6#hDm~hsp<- zKIJLovoOqjrgG!;*9~{`=CAu`qkk)aBO>fixW7c(j=1&P3%5qqRte1VTmGWNiqpDJ z!IJaWKK}dP@5kvcJ@T}uGW)Ie#^sk^zOAia{6SEmmUo($>Xp}D<>#wcI=w556@Oav z)67nWkE7{<*|Hr+CUO!zMu&+5~72ROMG)DZ+o@Ge@n*apCvcn?Ai1rSR=39&DEjxJ`>B5z5_)& zYktf=ZGB@K@A1M*dA>~y3ejuBJ`_E*PuUt}dH>k!CAX3v{8#`?Ck&phelF{r5}E)z CR{kIW literal 0 HcmV?d00001 diff --git a/assets/textures/battery.svg b/assets/textures/battery.svg new file mode 100644 index 00000000..b78088c2 --- /dev/null +++ b/assets/textures/battery.svg @@ -0,0 +1,89 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/assets/textures/parking.png b/assets/textures/parking.png new file mode 100644 index 0000000000000000000000000000000000000000..05ce9e4e497121a2615aa4fd681c29dc5cb04766 GIT binary patch literal 1031 zcmV+i1o-=jP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H11C&Wb zK~#90?VGVn>rfcQPiwVGO(dEYbQGi@TB)s@sNm2+1Vsu?F5N_2UBp4199+adKxYRB zC+#5Obt4yvj`RaIoOS!A4YrHkYyQew;Pfqv5NEGVg?|YOrpKLoyw!3p#fg67v0_6=C|LzrUZHoSZPp zOGpWTshVIc7Q^uHFb)n5n0cBC006waykKHt0=KufO#GNN!Acq*AIJRs{Fhofody6r zKR-iJ6eJP}D2jr3JdTTt3n+?G)ia;ZV{vg2+uPerGBUZJD)oT5xw&t9B@zj;x3@=T zXJ?5dNfn!8DwU$jY}g*)@pv#cHipg3P2AkvV03g;Gp0}|V0U+ydM-l(_^g(e7A!3- zl|6TSd`#_ccmMz}I5-GV6gBl&EJp2Z3IKMy9esU$ntD7Qr}w6I_$768bZBa-s^aza zmCDyN04l8q{#|H&SEd1w%jL?}o12@dd`$!3?(R-gbGck_IOv|`Oab8S?G5MW=bF0L z>!tQK1%UnieWAcSCTZLRFNp`jsaf5QVbZ0WP%IX!o-Y&%NTpJ^zP`rU*%?kxPZ5nq ztFHIk+S;(Pvce>v4W;EUwb8@FL)A@DNs=InBI@eu0F-u-A0Hp_^z`)Yxwf{pFf%jr zVnVbgQ}{?WHMiVjUq`BWLZXQYb)Gt zH+p({;P?B{+1Ux3&8BxW0KWhr6bfNuV?*z0ek{ZH0KH`a;2nUsEC9R%@RkLDcL3h9 z0PqgLTNVJ`0eH&-z&ikMSpawk;4KRP?*P12^8lD_i8VGhA{-8D>MY*i>M3S#hRi7I zZ*#DEfCaz;z&ikM)jR+j01^lUGQ5NE(ACvd(;vt$AHJTbSGoWI002ovPDHLkV1g{P B)Xe|@ literal 0 HcmV?d00001 diff --git a/assets/textures/parking.svg b/assets/textures/parking.svg new file mode 100644 index 00000000..139bc9c2 --- /dev/null +++ b/assets/textures/parking.svg @@ -0,0 +1,83 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/assets/textures/robot.png b/assets/textures/robot.png new file mode 100644 index 0000000000000000000000000000000000000000..094bfe352e6dd8a066b0b0ead29817ddaf0f93c2 GIT binary patch literal 1783 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H1282mO zK~#90?VC?b6HgS!zqC!Dgc?&0T0#+RVr)XZbVH-u!0;#0YU4o@J%~p=aHEA%7^(tW>!KUQYj-A=o-g}^7-#5Xhh=FPV| z%bVG;3;MCj@1*{oP{#_RQB z@7}$deB>km5n*Ct0-;a{u~-ZX3kw(@AJ-Is7RJWLP*+z6yWI|#%LPFYP*zr!vmfFi z5{Xb_VPg9L?T?{AtG`(9Lrn+3=IvDPNysR0C_H*PDevSL)-#nodSVC zfP0=FJ$e*(@80EVn-9Icy?FNQnQ9wR6yfoBKt%9(JY0Si6$*#LX}`S1Vxi&TVVa$t zrQg4QGj+$0ALo7g^5WdNb4-69KYpay*;yJM9wv*$lJ+Eo!(ml_s#8D|MG^#oaoW_> zM2m}yQkzsNRa61apFhv^_xbZ@scvy`k(!#Cn0i4FNEAgye-4LZSuqcYMx&UVoRsXE zni@QQ{20~M)m)ENF`x~Lxa#U^jE;_?rlv+Jo1C1)>({SUeJBbrIy%bO9*<{B4L%cQ zvl(8mmnoBvLyn>Vu~>|;&zw1z?G**svuBU=Z&4Jnva+%X;T4{rKYt>XN=f#{ab!YKfV#Rm#(wqc zmB!Gt!!re5zI@5p2M!!i^{FU8YilcG2ZO;azja1L2nK^pnS2~_6b0z$=z!U5mh5mi zjDdjxjUg76fq?Q^ySN+y%k($bQ);Lz*!*x8xWM$+-ri15 zr<3%0eOipo&CQfdCRP1$tp=BtmdNRJa;?OQEr8PHbUK-oT?y4xcpbCZjBq%ND_5?- zV9>OIq?v4+9R`B|SFc`0I2`8ATDkTFD=I2*=gu8WO--Szs|$w?9pZ9cENnI#y1KeB zH8q9Xw{N4Oq9UjJ^LiXtS6AuNr%y$l0v9h{WcrIlBDA`?nzui$DWF7od3jp0RA}T= zz+$nWyu4hK&mF%lzO4kvXU8`i+e!dAvU2^&*NXeel1j78Iezc)2C0vYPG^{x8u~QQ)q5(&TGZWwQvZ9 zLUiQFk&^BQbar;C_HVb_DHIBE`{P;+iK2+!-d?y|F3il#47MU zT=!%Z!0-2CaBwi=8@H;eD)%TgAfE!2m6d62hzNl|0DXOZTs~C=c>44y1_uY3GMmkY zk&zL6|Nb5Ec$}+~LNPHhfu*G-jEs!HX0tJMfj|IHo;>05lW~5eQYmU^Xkg}8Yild5 ztgJ9?P{en@<;$0u{@%WQE7c_u32JL=W9l0k8fa~8P0^p~J79c#9MjX&l3ib4j|UGP z6#cQ^h*~0KGMRAy{(aQf*Gpy7)6-cGaVZKA3WXTk>-BQ&v6m8)$&_}SM?MZYiUPcU z|DLf=o;;}`wBjL;Q$7wkiUNH5_U&IIoema@MPq2%;aLkAB>Dfqf*(vef#o1A7C^ZaqZeQ zrYsl?!tHi%nKi-sk1;bd1Gn3aTeog8_1CXo&zLT6r0lPs%)hEAig3H#8IPJBK71Hf zs};|mKbOjEHXFLTyK@{yW`6zpg+G7(Fl7%PKE#_hZzS94bYgjV86Q4;NW0(Va^caV zN6_h%vwcAjegIjP!-+(KPMkQg>4%yNd9}2(P$H4Ynp$(87EdOV4O1ApHEngrPH?EcSD>~4$i3Qz`s91h2iQU_8B-o1Ng Z{14VXaRXdDh2H=G002ovPDHLkV1j3AQcwT@ literal 0 HcmV?d00001 diff --git a/assets/textures/robot.svg b/assets/textures/robot.svg new file mode 100644 index 00000000..24f7d01f --- /dev/null +++ b/assets/textures/robot.svg @@ -0,0 +1,111 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/assets/textures/stopwatch.png b/assets/textures/stopwatch.png new file mode 100644 index 0000000000000000000000000000000000000000..78e3135ffcb6c4a4ca025b77b0d9eff7525c3384 GIT binary patch literal 2748 zcmV;t3PbgYP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H13Q0*s zK~#90?OSV56jv7h<|%JfL=jL_Sdm)9ECVX8f;_CCEJG64lq?uopNR_+S1W~Pabj6U zoTQA&YEX!=ic)cWY?Z9#l zbGq+$PJi9^_PMt&A^-%hFr)xL$g8PAP*9LgJlIJLHeL&0Eh2-#fNk5h;q>X#)}o|P zQ&WS`&`^|=lvtgcSc>}kdNOzJTmpc&y1J5@ni`8ad!wtXi$p|35CFu+#)j7$-Dhl`R-J_04Boef?wwgs+v3>h?q@<+udmhkT2?7jHKwVuOadUH{)b{f7BD;3&B2uZ8@~>I5hHqC=a-FPQ zyM>Gy6GDJ-f_?!3(Ig`ylT=rCKUK$%A15M_h>Ep&^Jbz_sfa`(;eBGUn4CR(miY-_ z5`YjwPMonCRAkPaM8Ox`*H0$%A#cCEgg81n8ufXD!9WP1U&U!@ zX-wB6SO7u@Nl#BF+1c5Y&tNc+1q&8DCxVCo9wskNF8>XYNW4v)=S2V+#qZ!oHML7fAV}R6B z5<&d$xA$0hdymDud9wikrKRQA zyZ111b92zu)jOUGmMr-j06F60m6oOti=F_3!GLAU(y(vek*A&x0QC@wY_W9dU-0qA zDR6MGvnauun)_I}at$tBIuF1Bz;FP7SS-euU#gIt{GQp|K|w(}iv(D;Djk`b`zfEh zyAuu^$b`TD#D3e>)zzV+ql35I+}vPi_hPa3?aRfdpJqd+>nX8CA`!m*R*j@2^ST4` zYp^e<)q9Kvtnl!K?2$ZOytHEb#L3z{!();p;nr_iu7Ulcw zvowqx=^{9=rI;vjC?~6;k%Xg@0fUVhNg>nxN5WkdTmo zz`#JLRP<l{r!=g zoQ!kl&Vl1NT)1!njg5`e`O(p#l%1ddBXcaK$xvq}hmw+OyghN^c&m^69UUFeXf(*n z%R^ydA@q8EpXYHLhf}9cVbP*Ryl=*gK#0X+7!2JLF|GC&=D17(R8-ud3Lif|Z{`53 zNKQ@$$8jdlb9Qz%T5@-Ca)5`&D1MA8FRx^d%OpTm6}|31e*75b0IcZm;%#hf5E>c^ zrBVr{QVCmI<8s^Edn_+NOG_Jcx)ux_>SQu5lK`!)ZItco?D&E+t%o5)h9E2~3`(UE zv9YoJ&J_E~simdOdICIt{N%ahEH8T_BO~GN?v68O&Y-@&9snSh%Q1WQY$%mV#KgqF z!NI`-oT=vp&4~`4|u!xf{7_G2_TV35E$ss+f`NfsCmI)qo_zr zeWIH-?G5I(%%yNd#0<(ld9r{x$Ux)7iG0d_KG*)hEPzrOMcIcAonQ_!ka+m86=%-$ ztN}PU*dZb!gtT`^#1$w z5>!UUZhitX7-(vGh&_Ag1(4@+GzCEdEMLBmngwdLrP#m!xS)X6#HLMOQ8h_q|kzgLd%i=3n{s}=rlX<(n z{SlIqK0O~*-i~KWo5UJknmTuw6yip(mJT9 zsKUGNrckkbeJ4PzUT+qkS)a!I{Cu!`_ZEmmBHs7YPbG+pTZ!7*db1K?fmU0Jn3$zh z)#u<~2aRT@*~_;Yqh1AH*YD@)4zaT-^u%JY=%Ii z*@@`rFpK!DvPC8{b3am3H=(nWUe=Pyq?kWH8jBXah2Y=-s>}2Ty}lFY&;N*h`;MZZ zpxEg6h!MkZ^k^o+!lqf2x5XPIdZW1bXT-;^#_ij8`#kRH>4upzgAg1X03RPOczBG0 zy}cbcjzfFT$IOh7NVYC!c(XEEZzeFlVe@orKiXKV#T1 zXDemcjR6zj85$azap=%Larp2F6c_(&G)BA#j*j*S4-Y|nyb^J7bBxv`t%U&>pf}pv zJ8vw@BV4_D)%L$r + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/assets/textures/workcell.png b/assets/textures/workcell.png new file mode 100644 index 0000000000000000000000000000000000000000..b204f689aae92198c5b989d22c56e0f0341b8093 GIT binary patch literal 2996 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 + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/rmf_site_editor/src/shapes.rs b/rmf_site_editor/src/shapes.rs index a960b2e6..56041c11 100644 --- a/rmf_site_editor/src/shapes.rs +++ b/rmf_site_editor/src/shapes.rs @@ -1057,6 +1057,26 @@ pub(crate) fn make_ring(inner_radius: f32, outer_radius: f32, resolution: usize) MeshBuffer::new(positions, normals, indices) } +pub(crate) fn make_location_icon( + radius: f32, + height: f32, + segments: usize, + position: usize, +) -> MeshBuffer { + let height = 2.0 * height; + let angle = (360.0 / (2.0 * segments as f32)).to_radians(); + let p0 = radius * Vec3::X; + let p1 = Affine3A::from_rotation_z(angle).transform_vector3(p0); + let width = (p1 - p0).length(); + make_flat_square_mesh(width) + .transform_by(Affine3A::from_translation(Vec3::new( + radius + width / 2.0, + 0.0, + height / 2.0, + ))) + .transform_by(Affine3A::from_rotation_z(position as f32 * 2.0 * angle)) +} + pub(crate) fn make_icon_halo(radius: f32, height: f32, segments: usize) -> MeshBuffer { let angle = (360.0 / (2.0 * segments as f32)).to_radians(); let p0 = radius * Vec3::X; diff --git a/rmf_site_editor/src/site/assets.rs b/rmf_site_editor/src/site/assets.rs index 3fbd214a..a22b5fcc 100644 --- a/rmf_site_editor/src/site/assets.rs +++ b/rmf_site_editor/src/site/assets.rs @@ -50,6 +50,16 @@ pub struct SiteAssets { pub physical_camera_material: Handle, pub occupied_material: Handle, pub default_mesh_grey_material: Handle, + pub charger_mesh: Handle, + pub holding_point_mesh: Handle, + pub parking_mesh: Handle, + pub robot_mesh: Handle, + pub workcell_mesh: Handle, + pub charger_material: Handle, + pub holding_point_material: Handle, + pub parking_material: Handle, + pub robot_material: Handle, + pub workcell_material: Handle, } impl FromWorld for SiteAssets { @@ -58,6 +68,21 @@ impl FromWorld for SiteAssets { let wall_texture = asset_server.load(&String::from(&AssetSource::Bundled( "textures/default.png".to_string(), ))); + let charger_texture = asset_server.load(&String::from(&AssetSource::Bundled( + "textures/battery.png".to_string(), + ))); + let holding_point_texture = asset_server.load(&String::from(&AssetSource::Bundled( + "textures/stopwatch.png".to_string(), + ))); + let parking_texture = asset_server.load(&String::from(&AssetSource::Bundled( + "textures/parking.png".to_string(), + ))); + let robot_texture = asset_server.load(&String::from(&AssetSource::Bundled( + "textures/robot.png".to_string(), + ))); + let workcell_texture = asset_server.load(&String::from(&AssetSource::Bundled( + "textures/workcell.png".to_string(), + ))); let mut materials = world .get_resource_mut::>() @@ -144,6 +169,27 @@ impl FromWorld for SiteAssets { let occupied_material = materials.add(Color::rgba(0.8, 0.1, 0.1, 0.2).into()); let default_mesh_grey_material = materials.add(Color::rgb(0.7, 0.7, 0.7).into()); + let charger_material = materials.add(StandardMaterial { + base_color_texture: Some(charger_texture), + ..default() + }); + let holding_point_material = materials.add(StandardMaterial { + base_color_texture: Some(holding_point_texture), + ..default() + }); + let parking_material = materials.add(StandardMaterial { + base_color_texture: Some(parking_texture), + ..default() + }); + let robot_material = materials.add(StandardMaterial { + base_color_texture: Some(robot_texture), + ..default() + }); + let workcell_material = materials.add(StandardMaterial { + base_color_texture: Some(workcell_texture), + ..default() + }); + let mut meshes = world.get_resource_mut::>().unwrap(); let level_anchor_mesh = meshes.add( Mesh::from(shape::UVSphere { @@ -196,6 +242,15 @@ impl FromWorld for SiteAssets { .with_generated_outline_normals() .unwrap(), ); + let charger_mesh = + meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 0).into()); + let holding_point_mesh = + meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 1).into()); + let parking_mesh = + meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 2).into()); + let robot_mesh = meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 3).into()); + let workcell_mesh = + meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 4).into()); let physical_camera_mesh = meshes.add( make_physical_camera_mesh() .with_generated_outline_normals() @@ -233,6 +288,16 @@ impl FromWorld for SiteAssets { physical_camera_material, occupied_material, default_mesh_grey_material, + charger_mesh, + holding_point_mesh, + parking_mesh, + robot_mesh, + workcell_mesh, + charger_material, + holding_point_material, + parking_material, + robot_material, + workcell_material, } } } diff --git a/rmf_site_editor/src/site/location.rs b/rmf_site_editor/src/site/location.rs index 535bf5a4..413a7d79 100644 --- a/rmf_site_editor/src/site/location.rs +++ b/rmf_site_editor/src/site/location.rs @@ -22,6 +22,15 @@ use bevy::prelude::*; // experience z-fighting. const LOCATION_LAYER_HEIGHT: f32 = LANE_LAYER_LIMIT + SELECTED_LANE_OFFSET / 2.0; +#[derive(Component, Clone, Default)] +pub struct LocationTagMeshes { + charger: Option, + parking_spot: Option, + holding_point: Option, + spawn_robot: Option, + workcell: Option, +} + // TODO(MXG): Refactor this implementation with should_display_lane using traits and generics fn should_display_point( point: &Point, @@ -42,7 +51,15 @@ fn should_display_point( pub fn add_location_visuals( mut commands: Commands, - locations: Query<(Entity, &Point, &AssociatedGraphs), Added>, + locations: Query< + ( + Entity, + &Point, + &AssociatedGraphs, + &LocationTags, + ), + Added, + >, graphs: GraphSelect, anchors: AnchorParams, parents: Query<&Parent>, @@ -51,7 +68,7 @@ pub fn add_location_visuals( assets: Res, current_level: Res, ) { - for (e, point, associated_graphs) in &locations { + for (e, point, associated_graphs, tags) in &locations { if let Ok(mut deps) = dependents.get_mut(point.0) { deps.insert(e); } @@ -70,6 +87,47 @@ pub fn add_location_visuals( .point_in_parent_frame_of(point.0, Category::Location, e) .unwrap() + LOCATION_LAYER_HEIGHT * Vec3::Z; + + let mut tag_meshes = LocationTagMeshes::default(); + for tag in tags.iter() { + let id = commands.spawn_empty().id(); + let (mesh, material) = match tag { + LocationTag::Charger => { + tag_meshes.charger = Some(id); + (assets.charger_mesh.clone(), assets.charger_material.clone()) + } + LocationTag::ParkingSpot => { + tag_meshes.parking_spot = Some(id); + (assets.parking_mesh.clone(), assets.parking_material.clone()) + } + LocationTag::HoldingPoint => { + tag_meshes.holding_point = Some(id); + ( + assets.holding_point_mesh.clone(), + assets.holding_point_material.clone(), + ) + } + LocationTag::SpawnRobot(_) => { + tag_meshes.spawn_robot = Some(id); + (assets.robot_mesh.clone(), assets.robot_material.clone()) + } + LocationTag::Workcell(_) => { + tag_meshes.workcell = Some(id); + ( + assets.workcell_mesh.clone(), + assets.workcell_material.clone(), + ) + } + }; + commands.entity(id).insert(PbrBundle { + mesh, + material, + transform: Transform::from_xyz(0., 0., 0.01), + ..default() + }); + commands.entity(e).add_child(id); + } + // TODO(MXG): Put icons on the different visual squares based on the location tags commands .entity(e) @@ -82,6 +140,7 @@ pub fn add_location_visuals( }) .insert(Spinning::new(-10.0)) .insert(Category::Location) + .insert(tag_meshes) .insert(VisualCue::outline()); } } @@ -148,6 +207,119 @@ pub fn update_location_for_moved_anchors( } } +pub fn update_location_for_changed_location_tags( + mut commands: Commands, + mut locations: Query<(Entity, &LocationTags, &mut LocationTagMeshes), Changed>, + assets: Res, +) { + for (e, tags, mut tag_meshes) in &mut locations { + // Despawn the removed tags first + if let Some(id) = tag_meshes.charger { + if !tags.iter().any(|t| t.is_charger()) { + commands.entity(id).despawn_recursive(); + tag_meshes.charger = None; + } + } + if let Some(id) = tag_meshes.parking_spot { + if !tags.iter().any(|t| t.is_parking_spot()) { + commands.entity(id).despawn_recursive(); + tag_meshes.parking_spot = None; + } + } + if let Some(id) = tag_meshes.holding_point { + if !tags.iter().any(|t| t.is_holding_point()) { + commands.entity(id).despawn_recursive(); + tag_meshes.holding_point = None; + } + } + if let Some(id) = tag_meshes.spawn_robot { + if !tags.iter().any(|t| t.spawn_robot().is_some()) { + commands.entity(id).despawn_recursive(); + tag_meshes.spawn_robot = None; + } + } + if let Some(id) = tag_meshes.workcell { + if !tags.iter().any(|t| t.workcell().is_some()) { + commands.entity(id).despawn_recursive(); + tag_meshes.workcell = None; + } + } + // Spawn the new tags + for tag in tags.iter() { + let (id, mesh, material) = match tag { + LocationTag::Charger => { + if tag_meshes.charger.is_none() { + let id = commands.spawn_empty().id(); + tag_meshes.charger = Some(id); + ( + id, + assets.charger_mesh.clone(), + assets.charger_material.clone(), + ) + } else { + continue; + } + } + LocationTag::ParkingSpot => { + if tag_meshes.parking_spot.is_none() { + let id = commands.spawn_empty().id(); + tag_meshes.parking_spot = Some(id); + ( + id, + assets.parking_mesh.clone(), + assets.parking_material.clone(), + ) + } else { + continue; + } + } + LocationTag::HoldingPoint => { + if tag_meshes.holding_point.is_none() { + let id = commands.spawn_empty().id(); + tag_meshes.holding_point = Some(id); + ( + id, + assets.holding_point_mesh.clone(), + assets.holding_point_material.clone(), + ) + } else { + continue; + } + } + LocationTag::SpawnRobot(_) => { + if tag_meshes.spawn_robot.is_none() { + let id = commands.spawn_empty().id(); + tag_meshes.spawn_robot = Some(id); + (id, assets.robot_mesh.clone(), assets.robot_material.clone()) + } else { + continue; + } + } + LocationTag::Workcell(_) => { + if tag_meshes.workcell.is_none() { + let id = commands.spawn_empty().id(); + tag_meshes.workcell = Some(id); + ( + id, + assets.workcell_mesh.clone(), + assets.workcell_material.clone(), + ) + } else { + continue; + } + } + }; + commands.entity(id).insert(PbrBundle { + mesh, + material, + transform: Transform::from_xyz(0., 0., 0.01), + ..default() + }); + commands.entity(e).add_child(id); + } + } +} + pub fn update_visibility_for_locations( mut locations: Query< ( diff --git a/rmf_site_editor/src/site/mod.rs b/rmf_site_editor/src/site/mod.rs index fa526f75..b471aa4c 100644 --- a/rmf_site_editor/src/site/mod.rs +++ b/rmf_site_editor/src/site/mod.rs @@ -247,6 +247,7 @@ impl Plugin for SitePlugin { ) .with_system(update_changed_location) .with_system(update_location_for_moved_anchors) + .with_system(update_location_for_changed_location_tags) .with_system(handle_consider_associated_graph) .with_system(handle_consider_location_tag) .with_system(update_lift_for_moved_anchors) diff --git a/rmf_site_editor/src/site_asset_io.rs b/rmf_site_editor/src/site_asset_io.rs index f50dc4f4..e3e02f1f 100644 --- a/rmf_site_editor/src/site_asset_io.rs +++ b/rmf_site_editor/src/site_asset_io.rs @@ -203,6 +203,26 @@ impl SiteAssetIo { "textures/global.png".to_owned(), include_bytes!("../../assets/textures/global.png").to_vec(), ); + self.bundled_assets.insert( + "textures/battery.png".to_owned(), + include_bytes!("../../assets/textures/battery.png").to_vec(), + ); + self.bundled_assets.insert( + "textures/parking.png".to_owned(), + include_bytes!("../../assets/textures/parking.png").to_vec(), + ); + self.bundled_assets.insert( + "textures/stopwatch.png".to_owned(), + include_bytes!("../../assets/textures/stopwatch.png").to_vec(), + ); + self.bundled_assets.insert( + "textures/robot.png".to_owned(), + include_bytes!("../../assets/textures/robot.png").to_vec(), + ); + self.bundled_assets.insert( + "textures/workcell.png".to_owned(), + include_bytes!("../../assets/textures/workcell.png").to_vec(), + ); } } From 92b82192945f30f8168b3f652c1e501be7da9660 Mon Sep 17 00:00:00 2001 From: Luca Della Vedova Date: Wed, 28 Jun 2023 09:12:47 +0800 Subject: [PATCH 2/3] Cleanup Signed-off-by: Luca Della Vedova --- rmf_site_editor/src/shapes.rs | 19 +++----- rmf_site_editor/src/site/assets.rs | 48 ++++--------------- rmf_site_editor/src/site/location.rs | 69 +++++++++++++--------------- 3 files changed, 46 insertions(+), 90 deletions(-) diff --git a/rmf_site_editor/src/shapes.rs b/rmf_site_editor/src/shapes.rs index 56041c11..b4d9b2ad 100644 --- a/rmf_site_editor/src/shapes.rs +++ b/rmf_site_editor/src/shapes.rs @@ -1057,24 +1057,17 @@ pub(crate) fn make_ring(inner_radius: f32, outer_radius: f32, resolution: usize) MeshBuffer::new(positions, normals, indices) } -pub(crate) fn make_location_icon( - radius: f32, - height: f32, - segments: usize, - position: usize, -) -> MeshBuffer { +pub(crate) fn make_location_icon(radius: f32, height: f32, segments: usize) -> MeshBuffer { let height = 2.0 * height; let angle = (360.0 / (2.0 * segments as f32)).to_radians(); let p0 = radius * Vec3::X; let p1 = Affine3A::from_rotation_z(angle).transform_vector3(p0); let width = (p1 - p0).length(); - make_flat_square_mesh(width) - .transform_by(Affine3A::from_translation(Vec3::new( - radius + width / 2.0, - 0.0, - height / 2.0, - ))) - .transform_by(Affine3A::from_rotation_z(position as f32 * 2.0 * angle)) + make_flat_square_mesh(width).transform_by(Affine3A::from_translation(Vec3::new( + radius + width / 2.0, + 0.0, + height / 2.0, + ))) } pub(crate) fn make_icon_halo(radius: f32, height: f32, segments: usize) -> MeshBuffer { diff --git a/rmf_site_editor/src/site/assets.rs b/rmf_site_editor/src/site/assets.rs index a22b5fcc..2514eab9 100644 --- a/rmf_site_editor/src/site/assets.rs +++ b/rmf_site_editor/src/site/assets.rs @@ -50,11 +50,7 @@ pub struct SiteAssets { pub physical_camera_material: Handle, pub occupied_material: Handle, pub default_mesh_grey_material: Handle, - pub charger_mesh: Handle, - pub holding_point_mesh: Handle, - pub parking_mesh: Handle, - pub robot_mesh: Handle, - pub workcell_mesh: Handle, + pub location_tag_mesh: Handle, pub charger_material: Handle, pub holding_point_material: Handle, pub parking_material: Handle, @@ -169,26 +165,11 @@ impl FromWorld for SiteAssets { let occupied_material = materials.add(Color::rgba(0.8, 0.1, 0.1, 0.2).into()); let default_mesh_grey_material = materials.add(Color::rgb(0.7, 0.7, 0.7).into()); - let charger_material = materials.add(StandardMaterial { - base_color_texture: Some(charger_texture), - ..default() - }); - let holding_point_material = materials.add(StandardMaterial { - base_color_texture: Some(holding_point_texture), - ..default() - }); - let parking_material = materials.add(StandardMaterial { - base_color_texture: Some(parking_texture), - ..default() - }); - let robot_material = materials.add(StandardMaterial { - base_color_texture: Some(robot_texture), - ..default() - }); - let workcell_material = materials.add(StandardMaterial { - base_color_texture: Some(workcell_texture), - ..default() - }); + let charger_material = materials.add(charger_texture.into()); + let holding_point_material = materials.add(holding_point_texture.into()); + let parking_material = materials.add(parking_texture.into()); + let robot_material = materials.add(robot_texture.into()); + let workcell_material = materials.add(workcell_texture.into()); let mut meshes = world.get_resource_mut::>().unwrap(); let level_anchor_mesh = meshes.add( @@ -242,15 +223,8 @@ impl FromWorld for SiteAssets { .with_generated_outline_normals() .unwrap(), ); - let charger_mesh = - meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 0).into()); - let holding_point_mesh = - meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 1).into()); - let parking_mesh = - meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 2).into()); - let robot_mesh = meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 3).into()); - let workcell_mesh = - meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6, 4).into()); + let location_tag_mesh = + meshes.add(make_location_icon(1.1 * LANE_WIDTH / 2.0, 0.01, 6).into()); let physical_camera_mesh = meshes.add( make_physical_camera_mesh() .with_generated_outline_normals() @@ -288,11 +262,7 @@ impl FromWorld for SiteAssets { physical_camera_material, occupied_material, default_mesh_grey_material, - charger_mesh, - holding_point_mesh, - parking_mesh, - robot_mesh, - workcell_mesh, + location_tag_mesh, charger_material, holding_point_material, parking_material, diff --git a/rmf_site_editor/src/site/location.rs b/rmf_site_editor/src/site/location.rs index 413a7d79..4a4ce2ba 100644 --- a/rmf_site_editor/src/site/location.rs +++ b/rmf_site_editor/src/site/location.rs @@ -31,6 +31,21 @@ pub struct LocationTagMeshes { workcell: Option, } +fn location_halo_tf(tag: &LocationTag) -> Transform { + let position = match tag { + LocationTag::Charger => 0, + LocationTag::ParkingSpot => 1, + LocationTag::HoldingPoint => 2, + LocationTag::SpawnRobot(_) => 3, + LocationTag::Workcell(_) => 4, + }; + Transform { + translation: Vec3::new(0., 0., 0.01), + rotation: Quat::from_rotation_z((position as f32 / 6.0 * 360.0).to_radians()), + ..default() + } +} + // TODO(MXG): Refactor this implementation with should_display_lane using traits and generics fn should_display_point( point: &Point, @@ -91,38 +106,32 @@ pub fn add_location_visuals( let mut tag_meshes = LocationTagMeshes::default(); for tag in tags.iter() { let id = commands.spawn_empty().id(); - let (mesh, material) = match tag { + let material = match tag { LocationTag::Charger => { tag_meshes.charger = Some(id); - (assets.charger_mesh.clone(), assets.charger_material.clone()) + assets.charger_material.clone() } LocationTag::ParkingSpot => { tag_meshes.parking_spot = Some(id); - (assets.parking_mesh.clone(), assets.parking_material.clone()) + assets.parking_material.clone() } LocationTag::HoldingPoint => { tag_meshes.holding_point = Some(id); - ( - assets.holding_point_mesh.clone(), - assets.holding_point_material.clone(), - ) + assets.holding_point_material.clone() } LocationTag::SpawnRobot(_) => { tag_meshes.spawn_robot = Some(id); - (assets.robot_mesh.clone(), assets.robot_material.clone()) + assets.robot_material.clone() } LocationTag::Workcell(_) => { tag_meshes.workcell = Some(id); - ( - assets.workcell_mesh.clone(), - assets.workcell_material.clone(), - ) + assets.workcell_material.clone() } }; commands.entity(id).insert(PbrBundle { - mesh, + mesh: assets.location_tag_mesh.clone(), material, - transform: Transform::from_xyz(0., 0., 0.01), + transform: location_halo_tf(tag), ..default() }); commands.entity(e).add_child(id); @@ -246,16 +255,12 @@ pub fn update_location_for_changed_location_tags( } // Spawn the new tags for tag in tags.iter() { - let (id, mesh, material) = match tag { + let (id, material) = match tag { LocationTag::Charger => { if tag_meshes.charger.is_none() { let id = commands.spawn_empty().id(); tag_meshes.charger = Some(id); - ( - id, - assets.charger_mesh.clone(), - assets.charger_material.clone(), - ) + (id, assets.charger_material.clone()) } else { continue; } @@ -264,11 +269,7 @@ pub fn update_location_for_changed_location_tags( if tag_meshes.parking_spot.is_none() { let id = commands.spawn_empty().id(); tag_meshes.parking_spot = Some(id); - ( - id, - assets.parking_mesh.clone(), - assets.parking_material.clone(), - ) + (id, assets.parking_material.clone()) } else { continue; } @@ -277,11 +278,7 @@ pub fn update_location_for_changed_location_tags( if tag_meshes.holding_point.is_none() { let id = commands.spawn_empty().id(); tag_meshes.holding_point = Some(id); - ( - id, - assets.holding_point_mesh.clone(), - assets.holding_point_material.clone(), - ) + (id, assets.holding_point_material.clone()) } else { continue; } @@ -290,7 +287,7 @@ pub fn update_location_for_changed_location_tags( if tag_meshes.spawn_robot.is_none() { let id = commands.spawn_empty().id(); tag_meshes.spawn_robot = Some(id); - (id, assets.robot_mesh.clone(), assets.robot_material.clone()) + (id, assets.robot_material.clone()) } else { continue; } @@ -299,20 +296,16 @@ pub fn update_location_for_changed_location_tags( if tag_meshes.workcell.is_none() { let id = commands.spawn_empty().id(); tag_meshes.workcell = Some(id); - ( - id, - assets.workcell_mesh.clone(), - assets.workcell_material.clone(), - ) + (id, assets.workcell_material.clone()) } else { continue; } } }; commands.entity(id).insert(PbrBundle { - mesh, + mesh: assets.location_tag_mesh.clone(), material, - transform: Transform::from_xyz(0., 0., 0.01), + transform: location_halo_tf(tag), ..default() }); commands.entity(e).add_child(id); From 557d68fef3e07118fd0c44a6b0cc3f8f2cec14a4 Mon Sep 17 00:00:00 2001 From: Luca Della Vedova Date: Thu, 31 Aug 2023 11:23:09 +0800 Subject: [PATCH 3/3] Remove workcell and robot location icons Signed-off-by: Luca Della Vedova --- assets/textures/robot.png | Bin 1783 -> 0 bytes assets/textures/robot.svg | 111 --------------------------- assets/textures/workcell.png | Bin 2996 -> 0 bytes assets/textures/workcell.svg | 92 ---------------------- rmf_site_editor/src/site/assets.rs | 12 --- rmf_site_editor/src/site/location.rs | 48 ++---------- rmf_site_editor/src/site_asset_io.rs | 8 -- 7 files changed, 6 insertions(+), 265 deletions(-) delete mode 100644 assets/textures/robot.png delete mode 100644 assets/textures/robot.svg delete mode 100644 assets/textures/workcell.png delete mode 100644 assets/textures/workcell.svg diff --git a/assets/textures/robot.png b/assets/textures/robot.png deleted file mode 100644 index 094bfe352e6dd8a066b0b0ead29817ddaf0f93c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1783 zcmVpF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H1282mO zK~#90?VC?b6HgS!zqC!Dgc?&0T0#+RVr)XZbVH-u!0;#0YU4o@J%~p=aHEA%7^(tW>!KUQYj-A=o-g}^7-#5Xhh=FPV| z%bVG;3;MCj@1*{oP{#_RQB z@7}$deB>km5n*Ct0-;a{u~-ZX3kw(@AJ-Is7RJWLP*+z6yWI|#%LPFYP*zr!vmfFi z5{Xb_VPg9L?T?{AtG`(9Lrn+3=IvDPNysR0C_H*PDevSL)-#nodSVC zfP0=FJ$e*(@80EVn-9Icy?FNQnQ9wR6yfoBKt%9(JY0Si6$*#LX}`S1Vxi&TVVa$t zrQg4QGj+$0ALo7g^5WdNb4-69KYpay*;yJM9wv*$lJ+Eo!(ml_s#8D|MG^#oaoW_> zM2m}yQkzsNRa61apFhv^_xbZ@scvy`k(!#Cn0i4FNEAgye-4LZSuqcYMx&UVoRsXE zni@QQ{20~M)m)ENF`x~Lxa#U^jE;_?rlv+Jo1C1)>({SUeJBbrIy%bO9*<{B4L%cQ zvl(8mmnoBvLyn>Vu~>|;&zw1z?G**svuBU=Z&4Jnva+%X;T4{rKYt>XN=f#{ab!YKfV#Rm#(wqc zmB!Gt!!re5zI@5p2M!!i^{FU8YilcG2ZO;azja1L2nK^pnS2~_6b0z$=z!U5mh5mi zjDdjxjUg76fq?Q^ySN+y%k($bQ);Lz*!*x8xWM$+-ri15 zr<3%0eOipo&CQfdCRP1$tp=BtmdNRJa;?OQEr8PHbUK-oT?y4xcpbCZjBq%ND_5?- zV9>OIq?v4+9R`B|SFc`0I2`8ATDkTFD=I2*=gu8WO--Szs|$w?9pZ9cENnI#y1KeB zH8q9Xw{N4Oq9UjJ^LiXtS6AuNr%y$l0v9h{WcrIlBDA`?nzui$DWF7od3jp0RA}T= zz+$nWyu4hK&mF%lzO4kvXU8`i+e!dAvU2^&*NXeel1j78Iezc)2C0vYPG^{x8u~QQ)q5(&TGZWwQvZ9 zLUiQFk&^BQbar;C_HVb_DHIBE`{P;+iK2+!-d?y|F3il#47MU zT=!%Z!0-2CaBwi=8@H;eD)%TgAfE!2m6d62hzNl|0DXOZTs~C=c>44y1_uY3GMmkY zk&zL6|Nb5Ec$}+~LNPHhfu*G-jEs!HX0tJMfj|IHo;>05lW~5eQYmU^Xkg}8Yild5 ztgJ9?P{en@<;$0u{@%WQE7c_u32JL=W9l0k8fa~8P0^p~J79c#9MjX&l3ib4j|UGP z6#cQ^h*~0KGMRAy{(aQf*Gpy7)6-cGaVZKA3WXTk>-BQ&v6m8)$&_}SM?MZYiUPcU z|DLf=o;;}`wBjL;Q$7wkiUNH5_U&IIoema@MPq2%;aLkAB>Dfqf*(vef#o1A7C^ZaqZeQ zrYsl?!tHi%nKi-sk1;bd1Gn3aTeog8_1CXo&zLT6r0lPs%)hEAig3H#8IPJBK71Hf zs};|mKbOjEHXFLTyK@{yW`6zpg+G7(Fl7%PKE#_hZzS94bYgjV86Q4;NW0(Va^caV zN6_h%vwcAjegIjP!-+(KPMkQg>4%yNd9}2(P$H4Ynp$(87EdOV4O1ApHEngrPH?EcSD>~4$i3Qz`s91h2iQU_8B-o1Ng Z{14VXaRXdDh2H=G002ovPDHLkV1j3AQcwT@ diff --git a/assets/textures/robot.svg b/assets/textures/robot.svg deleted file mode 100644 index 24f7d01f..00000000 --- a/assets/textures/robot.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - diff --git a/assets/textures/workcell.png b/assets/textures/workcell.png deleted file mode 100644 index b204f689aae92198c5b989d22c56e0f0341b8093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2996 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 - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - diff --git a/rmf_site_editor/src/site/assets.rs b/rmf_site_editor/src/site/assets.rs index c4d49c63..bb706c81 100644 --- a/rmf_site_editor/src/site/assets.rs +++ b/rmf_site_editor/src/site/assets.rs @@ -55,8 +55,6 @@ pub struct SiteAssets { pub charger_material: Handle, pub holding_point_material: Handle, pub parking_material: Handle, - pub robot_material: Handle, - pub workcell_material: Handle, } impl FromWorld for SiteAssets { @@ -71,12 +69,6 @@ impl FromWorld for SiteAssets { let parking_texture = asset_server.load(&String::from(&AssetSource::Bundled( "textures/parking.png".to_string(), ))); - let robot_texture = asset_server.load(&String::from(&AssetSource::Bundled( - "textures/robot.png".to_string(), - ))); - let workcell_texture = asset_server.load(&String::from(&AssetSource::Bundled( - "textures/workcell.png".to_string(), - ))); let mut materials = world .get_resource_mut::>() @@ -162,8 +154,6 @@ impl FromWorld for SiteAssets { let charger_material = materials.add(charger_texture.into()); let holding_point_material = materials.add(holding_point_texture.into()); let parking_material = materials.add(parking_texture.into()); - let robot_material = materials.add(robot_texture.into()); - let workcell_material = materials.add(workcell_texture.into()); let mut meshes = world.get_resource_mut::>().unwrap(); let level_anchor_mesh = meshes.add( @@ -271,8 +261,6 @@ impl FromWorld for SiteAssets { charger_material, holding_point_material, parking_material, - robot_material, - workcell_material, } } } diff --git a/rmf_site_editor/src/site/location.rs b/rmf_site_editor/src/site/location.rs index 5ba9f22e..dc92e610 100644 --- a/rmf_site_editor/src/site/location.rs +++ b/rmf_site_editor/src/site/location.rs @@ -27,8 +27,6 @@ pub struct LocationTagMeshes { charger: Option, parking_spot: Option, holding_point: Option, - spawn_robot: Option, - workcell: Option, } fn location_halo_tf(tag: &LocationTag) -> Transform { @@ -100,8 +98,8 @@ pub fn add_location_visuals( let position = anchors .point_in_parent_frame_of(point.0, Category::Location, e) - .unwrap(); - //+ LOCATION_LAYER_HEIGHT * Vec3::Z; + .unwrap() + + LOCATION_LAYER_HEIGHT * Vec3::Z; let mut tag_meshes = LocationTagMeshes::default(); for tag in tags.iter() { @@ -119,14 +117,8 @@ pub fn add_location_visuals( tag_meshes.holding_point = Some(id); assets.holding_point_material.clone() } - LocationTag::SpawnRobot(_) => { - tag_meshes.spawn_robot = Some(id); - assets.robot_material.clone() - } - LocationTag::Workcell(_) => { - tag_meshes.workcell = Some(id); - assets.workcell_material.clone() - } + // Workcells and robots are not visualized + LocationTag::SpawnRobot(_) | LocationTag::Workcell(_) => continue, }; commands.entity(id).insert(PbrBundle { mesh: assets.location_tag_mesh.clone(), @@ -241,18 +233,6 @@ pub fn update_location_for_changed_location_tags( tag_meshes.holding_point = None; } } - if let Some(id) = tag_meshes.spawn_robot { - if !tags.iter().any(|t| t.spawn_robot().is_some()) { - commands.entity(id).despawn_recursive(); - tag_meshes.spawn_robot = None; - } - } - if let Some(id) = tag_meshes.workcell { - if !tags.iter().any(|t| t.workcell().is_some()) { - commands.entity(id).despawn_recursive(); - tag_meshes.workcell = None; - } - } // Spawn the new tags for tag in tags.iter() { let (id, material) = match tag { @@ -283,24 +263,8 @@ pub fn update_location_for_changed_location_tags( continue; } } - LocationTag::SpawnRobot(_) => { - if tag_meshes.spawn_robot.is_none() { - let id = commands.spawn_empty().id(); - tag_meshes.spawn_robot = Some(id); - (id, assets.robot_material.clone()) - } else { - continue; - } - } - LocationTag::Workcell(_) => { - if tag_meshes.workcell.is_none() { - let id = commands.spawn_empty().id(); - tag_meshes.workcell = Some(id); - (id, assets.workcell_material.clone()) - } else { - continue; - } - } + // Workcells and robots are not visualized + LocationTag::SpawnRobot(_) | LocationTag::Workcell(_) => continue, }; commands.entity(id).insert(PbrBundle { mesh: assets.location_tag_mesh.clone(), diff --git a/rmf_site_editor/src/site_asset_io.rs b/rmf_site_editor/src/site_asset_io.rs index ba29adfd..dee77985 100644 --- a/rmf_site_editor/src/site_asset_io.rs +++ b/rmf_site_editor/src/site_asset_io.rs @@ -263,14 +263,6 @@ impl SiteAssetIo { "textures/stopwatch.png".to_owned(), include_bytes!("../../assets/textures/stopwatch.png").to_vec(), ); - self.bundled_assets.insert( - "textures/robot.png".to_owned(), - include_bytes!("../../assets/textures/robot.png").to_vec(), - ); - self.bundled_assets.insert( - "textures/workcell.png".to_owned(), - include_bytes!("../../assets/textures/workcell.png").to_vec(), - ); } }