use crate::resources::volume_mesh::{TET_SENTINEL, VolumeMeshData};
use crate::GlyphItem;
pub fn volume_mesh_vertex_vectors_to_glyphs(
positions: &[[f32; 3]],
vectors: &[[f32; 3]],
scale: f32,
) -> GlyphItem {
let n = positions.len().min(vectors.len());
let mut glyph_positions = Vec::with_capacity(n);
let mut glyph_vectors = Vec::with_capacity(n);
for i in 0..n {
glyph_positions.push(positions[i]);
glyph_vectors.push(vectors[i]);
}
GlyphItem {
positions: glyph_positions,
vectors: glyph_vectors,
scale,
..Default::default()
}
}
pub fn volume_mesh_cell_vectors_to_glyphs(
data: &VolumeMeshData,
cell_vectors: &[[f32; 3]],
scale: f32,
) -> GlyphItem {
let n = data.cells.len().min(cell_vectors.len());
let mut glyph_positions = Vec::with_capacity(n);
let mut glyph_vectors = Vec::with_capacity(n);
for c in 0..n {
let cell = &data.cells[c];
let valid: Vec<usize> = cell
.iter()
.filter(|&&idx| idx != TET_SENTINEL)
.map(|&idx| idx as usize)
.filter(|&idx| idx < data.positions.len())
.collect();
if valid.is_empty() {
continue;
}
let mut centroid = [0.0f32; 3];
for &vi in &valid {
let p = data.positions[vi];
centroid[0] += p[0];
centroid[1] += p[1];
centroid[2] += p[2];
}
let inv = 1.0 / valid.len() as f32;
centroid[0] *= inv;
centroid[1] *= inv;
centroid[2] *= inv;
glyph_positions.push(centroid);
glyph_vectors.push(cell_vectors[c]);
}
GlyphItem {
positions: glyph_positions,
vectors: glyph_vectors,
scale,
..Default::default()
}
}