use crate::GlyphItem;
use super::tangent_frames;
pub fn vertex_intrinsic_to_glyphs(
positions: &[[f32; 3]],
normals: &[[f32; 3]],
tangents: Option<&[[f32; 4]]>,
vectors: &[[f32; 2]],
scale: f32,
) -> GlyphItem {
let frames: Vec<([f32; 3], [f32; 3])> = match tangents {
Some(t) => tangent_frames::tangents_from_explicit(normals, t),
None => tangent_frames::compute_vertex_tangent_frames(normals),
};
let n = positions.len().min(normals.len()).min(frames.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 {
let uv = vectors[i];
let (tangent, bitangent) = frames[i];
let t = glam::Vec3::from(tangent);
let b = glam::Vec3::from(bitangent);
let world_vec = t * uv[0] + b * uv[1];
glyph_positions.push(positions[i]);
glyph_vectors.push(world_vec.to_array());
}
let mut item = GlyphItem::default();
item.positions = glyph_positions;
item.vectors = glyph_vectors;
item.scale = scale;
item
}
pub fn face_intrinsic_to_glyphs(
positions: &[[f32; 3]],
normals: &[[f32; 3]],
indices: &[u32],
vectors: &[[f32; 2]],
scale: f32,
) -> GlyphItem {
let _ = normals; let num_tris = indices.len() / 3;
let frames = tangent_frames::compute_face_tangent_frames(positions, indices);
let n = num_tris.min(frames.len()).min(vectors.len());
let mut glyph_positions = Vec::with_capacity(n);
let mut glyph_vectors = Vec::with_capacity(n);
for tri in 0..n {
let i0 = indices[3 * tri] as usize;
let i1 = indices[3 * tri + 1] as usize;
let i2 = indices[3 * tri + 2] as usize;
let p0 = glam::Vec3::from(positions[i0]);
let p1 = glam::Vec3::from(positions[i1]);
let p2 = glam::Vec3::from(positions[i2]);
let centroid = (p0 + p1 + p2) / 3.0;
let uv = vectors[tri];
let (tangent, bitangent) = frames[tri];
let t = glam::Vec3::from(tangent);
let b = glam::Vec3::from(bitangent);
let world_vec = t * uv[0] + b * uv[1];
glyph_positions.push(centroid.to_array());
glyph_vectors.push(world_vec.to_array());
}
let mut item = GlyphItem::default();
item.positions = glyph_positions;
item.vectors = glyph_vectors;
item.scale = scale;
item
}