microcad_core/geo3d/
vertex.rs

1// Copyright © 2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Specializations for 3D triangles.
5
6use crate::Vec3;
7
8/// Vertex
9#[derive(Clone, Copy, Debug)]
10pub struct Vertex {
11    /// position
12    pub pos: Vec3,
13    /// normal vector
14    pub normal: Vec3,
15}
16
17impl Vertex {
18    /// Accumulate normal.
19    pub fn accumulate_normal(vertices: &mut [Vertex], i0: u32, i1: u32, i2: u32) {
20        let v0 = vertices[i0 as usize].pos;
21        let v1 = vertices[i1 as usize].pos;
22        let v2 = vertices[i2 as usize].pos;
23
24        let edge1 = v1 - v0;
25        let edge2 = v2 - v0;
26        let face_normal = edge1.cross(edge2);
27
28        vertices[i0 as usize].normal += face_normal;
29        vertices[i1 as usize].normal += face_normal;
30        vertices[i2 as usize].normal += face_normal;
31    }
32}