#![allow(dead_code)]
use serde::{Deserialize, Serialize};
#[repr(C)]
#[derive(Serialize, Deserialize, Debug)]
pub struct Color {
pub r: f32,
pub g: f32,
pub b: f32,
pub alpha: f32,
}
#[derive(Default, Serialize, Deserialize, Debug)]
pub struct PositionColorVertices {
pub vertices: std::vec::Vec<[f32; 7]>,
}
impl PositionColorVertices {
pub fn to_array(position: nalgebra::Vector3<f32>, color: Color) -> [f32; 7] {
[
position.x,
position.y,
position.z,
color.r,
color.g,
color.b,
color.alpha,
]
}
}
#[repr(C)]
#[derive(Serialize, Deserialize, Debug)]
pub struct PositionUvVertices {
pub vertices: std::vec::Vec<[f32; 5]>,
}
impl PositionUvVertices {
pub fn to_array(position: nalgebra::Vector3<f32>, uv: nalgebra::Vector2<f32>) -> [f32; 5] {
[position.x, position.y, position.z, uv.x, uv.y]
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Texture {}
#[derive(Serialize, Deserialize, Debug)]
pub struct PositionUvVerticesAndTexture {
pub vertices: PositionUvVertices,
pub texture: Texture,
}
#[derive(enum_as_inner::EnumAsInner, Serialize, Deserialize, Debug)]
pub enum MeshVertices {
PositionColor(PositionColorVertices),
PositionUvAndTexture(PositionUvVerticesAndTexture),
}
#[repr(C)]
#[derive(Serialize, Deserialize, Debug)]
pub struct Faces {
pub indices: std::vec::Vec<[i16; 3]>,
}
impl Faces {
fn new(indices: std::vec::Vec<[i16; 3]>) -> Self {
Self { indices }
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct Mesh3 {
pub vertices: MeshVertices,
pub faces: Faces,
}
impl Mesh3 {
fn from_position_color_vertices_and_faces(
vertices: PositionColorVertices,
faces: Faces,
) -> Self {
Self {
vertices: MeshVertices::PositionColor(vertices),
faces,
}
}
fn from_position_uv_vertices_texture_and_faces(
vertices: PositionUvVertices,
texture: Texture,
faces: Faces,
) -> Self {
Self {
vertices: MeshVertices::PositionUvAndTexture(PositionUvVerticesAndTexture {
vertices,
texture,
}),
faces,
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct LineSegments3 {
pub vertices: PositionColorVertices,
pub indices: std::vec::Vec<[i16; 2]>,
}
#[derive(Serialize, Deserialize, Debug)]
pub enum Entity3 {
Mesh(Mesh3),
LineSegments(LineSegments3),
}
#[derive(Serialize, Deserialize, Debug)]
pub struct NamedEntity3 {
pub label: String,
pub entity: Entity3,
pub scene_pose_entity: nalgebra::Isometry3<f32>,
}
pub fn colored_cube(scale: f32) -> Entity3 {
#[rustfmt::skip]
let vertices = PositionColorVertices{vertices: vec![
[-scale, -scale, -scale, 1.0, 0.5, 0.5, 1.0],
[ scale, -scale, -scale, 1.0, 0.5, 0.5, 1.0],
[ scale, scale, -scale, 1.0, 0.5, 0.5, 1.0],
[-scale, scale, -scale, 1.0, 0.5, 0.5, 1.0],
[-scale, -scale, scale, 0.5, 1.0, 0.5, 1.0],
[ scale, -scale, scale, 0.5, 1.0, 0.5, 1.0],
[ scale, scale, scale, 0.5, 1.0, 0.5, 1.0],
[-scale, scale, scale, 0.5, 1.0, 0.5, 1.0],
[-scale, -scale, -scale, 0.5, 0.5, 1.0, 1.0],
[-scale, scale, -scale, 0.5, 0.5, 1.0, 1.0],
[-scale, scale, scale, 0.5, 0.5, 1.0, 1.0],
[-scale, -scale, scale, 0.5, 0.5, 1.0, 1.0],
[ scale, -scale, -scale, 1.0, 0.5, 0.5, 1.0],
[ scale, scale, -scale, 1.0, 0.5, 0.5, 1.0],
[ scale, scale, scale, 1.0, 0.5, 0.5, 1.0],
[ scale, -scale, scale, 1.0, 0.5, 0.5, 1.0],
[-scale, -scale, -scale, 0.5, 0.5, 1.0, 1.0],
[-scale, -scale, scale, 0.5, 0.5, 1.0, 1.0],
[ scale, -scale, scale, 0.5, 0.5, 1.0, 1.0],
[ scale, -scale, -scale, 0.5, 0.5, 1.0, 1.0],
[-scale, scale, -scale, 1.0, 0.5, 0.5, 1.0],
[-scale, scale, scale, 1.0, 0.5, 0.5, 1.0],
[ scale, scale, scale, 1.0, 0.5, 0.5, 1.0],
[ scale, scale, -scale, 1.0, 0.5, 0.5, 1.0],
]};
let faces = Faces::new(vec![
[0, 1, 2],
[0, 2, 3],
[6, 5, 4],
[7, 6, 4],
[8, 9, 10],
[8, 10, 11],
[14, 13, 12],
[15, 14, 12],
[16, 17, 18],
[16, 18, 19],
[22, 21, 20],
[23, 22, 20],
]);
Entity3::Mesh(Mesh3::from_position_color_vertices_and_faces(
vertices, faces,
))
}
pub struct ColoredTriangle {
pub face: [[f32; 3]; 3],
pub color: Color,
}
impl ColoredTriangle {
fn vec_of_arrays(vec_of_triangles: &[ColoredTriangle]) -> std::vec::Vec<[f32; 7]> {
let mut result = std::vec::Vec::<[f32; 7]>::with_capacity(3 * vec_of_triangles.len());
for triangle in vec_of_triangles {
for vertex in triangle.face {
result.push([
vertex[0],
vertex[1],
vertex[2],
triangle.color.r,
triangle.color.g,
triangle.color.b,
triangle.color.alpha,
])
}
}
result
}
}
pub fn colored_triangles(triangles: std::vec::Vec<ColoredTriangle>) -> Entity3 {
let vertices = PositionColorVertices {
vertices: ColoredTriangle::vec_of_arrays(&triangles),
};
let mut faces: Vec<[i16; 3]> = std::vec::Vec::new();
let len: i16 = triangles.len().try_into().unwrap();
for i in 0..len {
faces.push([i * 3, i * 3 + 1, i * 3 + 2])
}
Entity3::Mesh(Mesh3::from_position_color_vertices_and_faces(
vertices,
Faces::new(faces),
))
}
pub struct Axis3 {
scale: f32,
}
impl Axis3 {
pub fn from_scale(scale: f32) -> Self {
Self { scale }
}
}
impl Default for Axis3 {
fn default() -> Self {
Axis3::from_scale(1.0)
}
}
impl From<Axis3> for Entity3 {
fn from(axis: Axis3) -> Entity3 {
let sca = axis.scale;
let vertices = PositionColorVertices {
vertices: vec![
[0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0],
[0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0],
[0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0],
[sca, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0],
[0.0, sca, 0.0, 0.0, 1.0, 0.0, 1.0],
[0.0, 0.0, sca, 0.0, 0.0, 1.0, 1.0],
],
};
let indices = vec![[0, 3], [1, 4], [2, 5]];
Entity3::LineSegments(LineSegments3 { vertices, indices })
}
}
#[derive(Default)]
pub struct ColoredPoints3 {
points: PositionColorVertices,
}
impl ColoredPoints3 {
pub fn from_arrays_and_color(arrays: Vec<[f32; 3]>, color: Color) -> Self {
let mut points = PositionColorVertices::default();
for v in arrays {
points
.vertices
.push([v[0], v[1], v[2], color.r, color.b, color.g, color.alpha]);
}
Self { points }
}
}
impl From<ColoredPoints3> for Entity3 {
fn from(colored_points: ColoredPoints3) -> Entity3 {
let mut vertices = PositionColorVertices::default();
let mut faces: Vec<[i16; 3]> = std::vec::Vec::new();
for i in 0..colored_points.points.vertices.len() {
let v = colored_points.points.vertices[i];
let mut v0 = v;
v0[0] += 0.01;
let mut v1 = v;
v1[1] += 0.01;
let mut v2 = v;
v2[2] += 0.01;
vertices.vertices.push(v0);
vertices.vertices.push(v1);
vertices.vertices.push(v2);
let idx = i as i16;
faces.push([idx * 3, idx * 3 + 1, idx * 3 + 2]);
}
Entity3::Mesh(Mesh3::from_position_color_vertices_and_faces(
vertices,
Faces::new(faces),
))
}
}