ak_vis/render/
render_bonds.rs

1use crate::components::FrameBond;
2use crate::visuals::BondVisual;
3use bevy::{
4    light::{NotShadowCaster, NotShadowReceiver},
5    prelude::*,
6};
7
8pub fn render_bonds(
9    visuals: Vec<BondVisual>,
10    commands: &mut Commands,
11    materials: &mut ResMut<Assets<StandardMaterial>>,
12    meshes: &mut ResMut<Assets<Mesh>>,
13) {
14    let cyl_mesh = Cylinder::new(1.0, 2.0);
15
16    for visual in visuals {
17        commands.spawn((
18            Mesh3d(meshes.add(cyl_mesh)),
19            MeshMaterial3d(materials.add(visual.color)),
20            transform_cylinder_between(visual.start, visual.end, visual.radius),
21            FrameBond,
22            NotShadowCaster,
23            NotShadowReceiver,
24        ));
25    }
26}
27
28fn transform_cylinder_between(p0: Vec3, p1: Vec3, radius: f32) -> Transform {
29    let d = p1 - p0;
30    let len = d.length();
31    let mid = (p0 + p1) * 0.5;
32    let dir = d / len;
33    let rot = Quat::from_rotation_arc(Vec3::Y, dir);
34
35    Transform {
36        translation: mid,
37        rotation: rot,
38        scale: Vec3::new(radius, len * 0.5, radius),
39    }
40}