use bevy::prelude::*;
use crate::{
core::{
parameters::{Point, SimulationSettings},
spawner::{SpawnNode, spawner},
},
prelude::{MaterialType, MeshType},
};
const HALF_SIZE: f32 = 0.225;
pub fn spawn_cube(
commands: &mut Commands,
meshes: &mut ResMut<Assets<Mesh>>,
materials: &mut ResMut<Assets<StandardMaterial>>,
point_material: MaterialType,
stick_material: MaterialType,
center: &Vec3,
sim_settings: &Res<SimulationSettings>,
) {
let point_mesh = MeshType::Sphere;
let stick_mesh = MeshType::Cuboid;
let offsets = [
(-1., -1., -1.), (1., -1., -1.), (1., 1., -1.), (-1., 1., -1.), (-1., -1., 1.), (1., -1., 1.), (1., 1., 1.), (-1., 1., 1.), ];
let corners: Vec<Vec3> = offsets
.iter()
.map(|&(dx, dy, dz)| {
center + Vec3::new(dx * HALF_SIZE, dy * HALF_SIZE, dz * HALF_SIZE - HALF_SIZE)
})
.collect();
let mut edges = vec![
(0, 1),
(1, 2),
(2, 3),
(3, 0),
(4, 5),
(5, 6),
(6, 7),
(7, 4),
(0, 4),
(1, 5),
(2, 6),
(3, 7),
];
let face_diagonals = [
(1, 3), (5, 7), (3, 4), (2, 5), (1, 4), (2, 7), ];
edges.extend_from_slice(&face_diagonals);
let mut adj = vec![Vec::new(); corners.len()];
for &(i, j) in &edges {
adj[i].push(j);
adj[j].push(i);
}
let mesh_network: Vec<SpawnNode> = corners
.iter()
.cloned()
.enumerate()
.map(|(i, pos)| {
let neigh = &adj[i];
SpawnNode {
point: Point::new(pos, pos, false),
connection: Some(neigh.iter().map(|&j| corners[j]).collect()),
point_material: point_material.clone(),
point_mesh: point_mesh.clone(),
point_size: sim_settings.default_geometry_point_size,
connection_mesh: Some(vec![stick_mesh.clone(); neigh.len()]),
connection_material: Some(vec![stick_material.clone(); neigh.len()]),
connection_size: Some(vec![sim_settings.default_geometry_stick_size; neigh.len()]),
connection_scale: Some(vec![Vec3::ONE; neigh.len()]),
..default()
}
})
.collect();
spawner(mesh_network, commands, meshes, materials);
}