honeycomb_render/
render_map.rs

1use bevy::prelude::*;
2
3use crate::{
4    components::{Dart, Edge, FaceId, Vertex},
5    import_map::{Face, VolumeId},
6    resources::{
7        DartHeadMul, DartRenderColor, DartShrink, EdgeRenderColor, FaceNormals, FaceRenderColor,
8        FaceShrink, MapVertices, VertexRenderColor, VertexWidth, VolumeNormals,
9    },
10};
11
12/// Dart gizmos configuration group.
13#[derive(Default, Reflect, GizmoConfigGroup)]
14pub struct DartGizmos;
15
16/// Dart rendering schedule condition.
17pub fn render_dart_enabled(drc: Res<DartRenderColor>) -> bool {
18    drc.0
19}
20
21/// Dart rendering system.
22pub fn render_darts(
23    mut gizmos: Gizmos<DartGizmos>,
24    // common data
25    vertices: Res<MapVertices>,
26    face_normals: Res<FaceNormals>,
27    // dart render params
28    dart_render_color: Res<DartRenderColor>,
29    dart_head_mul: Res<DartHeadMul>,
30    // dart_width: Res<DartWidth>, // config is edited directly in the option functions
31    dart_shrink: Res<DartShrink>,
32    // dart to render
33    q: Query<(&Dart, &FaceId)>,
34) {
35    // let dart_mat = materials.add(Color::Srgba(Srgba::from_u8_array(
36    //     dart_render_color.1.to_array(),
37    // )));
38    let vertices = &vertices.0;
39    let face_normals = &face_normals.0;
40    let [red, green, blue, alpha] = dart_render_color.1.to_srgba_unmultiplied();
41    for (d, face_id) in &q {
42        let (n1, n2) = (
43            &face_normals[&(face_id.0, d.start)],
44            &face_normals[&(face_id.0, d.end)],
45        );
46        let (ov1, ov2) = (&vertices[d.start], &vertices[d.end]);
47
48        let (mut v1, mut v2) = (*ov1 + (*n1 * dart_shrink.0), *ov2 + (*n2 * dart_shrink.0));
49        let (dir, len) = ((v2 - v1).normalize(), (v2 - v1).length());
50        v1 += dir * (len * dart_shrink.0.abs() / 2.0);
51        v2 -= dir * (len * dart_shrink.0.abs() / 2.0);
52
53        gizmos
54            .arrow(v1, v2, Color::srgba_u8(red, green, blue, alpha))
55            .with_tip_length(dart_head_mul.0);
56    }
57}
58
59/// Dart rendering system.
60#[allow(clippy::too_many_arguments)]
61pub fn render_darts_3d(
62    mut gizmos: Gizmos<DartGizmos>,
63    // common data
64    vertices: Res<MapVertices>,
65    face_normals: Res<FaceNormals>,
66    volume_normals: Res<VolumeNormals>,
67    // dart render params
68    dart_render_color: Res<DartRenderColor>,
69    dart_head_mul: Res<DartHeadMul>,
70    // dart_width: Res<DartWidth>, // config is edited directly in the option functions
71    dart_shrink: Res<DartShrink>,
72    // dart to render
73    q: Query<(&Dart, &FaceId, &VolumeId)>,
74) {
75    // let dart_mat = materials.add(Color::Srgba(Srgba::from_u8_array(
76    //     dart_render_color.1.to_array(),
77    // )));
78    let vertices = &vertices.0;
79    let face_normals = &face_normals.0;
80    let volume_normals = &volume_normals.0;
81    let [red, green, blue, alpha] = dart_render_color.1.to_srgba_unmultiplied();
82    for (d, face_id, volume_id) in &q {
83        let (vn1, vn2) = (
84            &volume_normals[&(volume_id.0, d.start)],
85            &volume_normals[&(volume_id.0, d.end)],
86        );
87        let (fn1, fn2) = (
88            &face_normals[&(face_id.0, d.start)],
89            &face_normals[&(face_id.0, d.end)],
90        );
91        let (ov1, ov2) = (&vertices[d.start], &vertices[d.end]);
92
93        let (mut v1, mut v2) = (
94            *ov1 + (*vn1 * dart_shrink.0) + (*fn1 * dart_shrink.0),
95            *ov2 + (*vn2 * dart_shrink.0) + (*fn2 * dart_shrink.0),
96        );
97        let (dir, len) = ((v2 - v1).normalize(), (v2 - v1).length());
98        v1 += dir * (len * dart_shrink.0.abs() / 2.0);
99        v2 -= dir * (len * dart_shrink.0.abs() / 2.0);
100
101        gizmos
102            .arrow(v1, v2, Color::srgba_u8(red, green, blue, alpha))
103            .with_tip_length(dart_head_mul.0);
104    }
105}
106
107/// Vertex gizmos configuration group.
108#[derive(Default, Reflect, GizmoConfigGroup)]
109pub struct VertexGizmos;
110
111/// Vertex rendering schedule condition.
112pub fn render_vertex_enabled(vrc: Res<VertexRenderColor>) -> bool {
113    vrc.0
114}
115
116/// Vertex rendering system.
117pub fn render_vertices(
118    mut gizmos: Gizmos<VertexGizmos>,
119    vertices: Res<MapVertices>,
120    vertex_render_color: Res<VertexRenderColor>,
121    vertex_width: Res<VertexWidth>,
122    q: Query<&Vertex>,
123) {
124    let vertices = &vertices.0;
125    let [red, green, blue, alpha] = vertex_render_color.1.to_srgba_unmultiplied();
126
127    for v in &q {
128        gizmos.sphere(
129            vertices[v.0],
130            Quat::default(),
131            vertex_width.0 / 2.0,
132            Color::srgba_u8(red, green, blue, alpha),
133        );
134    }
135}
136
137/// Edge gizmos configuration group.
138#[derive(Default, Reflect, GizmoConfigGroup)]
139pub struct EdgeGizmos;
140
141/// Edge rendering schedule condition.
142pub fn render_edge_enabled(erc: Res<EdgeRenderColor>) -> bool {
143    erc.0
144}
145
146/// Edge rendering system.
147pub fn render_edges(
148    mut gizmos: Gizmos<EdgeGizmos>,
149    vertices: Res<MapVertices>,
150    edge_render_color: Res<EdgeRenderColor>,
151    // edge_width: Res<EdgeWidth>,
152    q: Query<&Edge>,
153) {
154    let vertices = &vertices.0;
155    let [red, green, blue, alpha] = edge_render_color.1.to_srgba_unmultiplied();
156
157    for e in &q {
158        gizmos.line(
159            vertices[e.0],
160            vertices[e.1],
161            Color::srgba_u8(red, green, blue, alpha),
162        );
163    }
164}
165
166/// Face gizmos configuration group.
167#[derive(Default, Reflect, GizmoConfigGroup)]
168pub struct FaceGizmos;
169
170/// Face rendering schedule condition.
171pub fn render_face_enabled(frc: Res<FaceRenderColor>) -> bool {
172    frc.0
173}
174
175#[allow(clippy::missing_panics_doc)]
176/// Face rendering system.
177///
178/// This currently renders faces using a set of edges; the face isn't fully colored.
179pub fn render_faces(
180    mut gizmos: Gizmos<VertexGizmos>,
181    vertices: Res<MapVertices>,
182    face_normals: Res<FaceNormals>,
183    face_render_color: Res<FaceRenderColor>,
184    face_shrink: Res<FaceShrink>,
185    q: Query<(&Face, &FaceId)>,
186) {
187    let vertices = &vertices.0;
188    let normals = &face_normals.0;
189    let [red, green, blue, alpha] = face_render_color.1.to_srgba_unmultiplied();
190
191    for (Face(v), FaceId(fid)) in &q {
192        v.windows(2).for_each(|sl| {
193            let &[vid1, vid2] = sl else { unreachable!() };
194            let (n1, n2) = (&normals[&(*fid, vid1)], &normals[&(*fid, vid2)]);
195            let (ov1, ov2) = (&vertices[vid1], &vertices[vid2]);
196
197            let (v1, v2) = (*ov1 + (*n1 * face_shrink.0), *ov2 + (*n2 * face_shrink.0));
198
199            gizmos.line(v1, v2, Color::srgba_u8(red, green, blue, alpha));
200        });
201        {
202            let [vid1, vid2] = [*v.last().unwrap(), v[0]];
203            let (n1, n2) = (&normals[&(*fid, vid1)], &normals[&(*fid, vid2)]);
204            let (ov1, ov2) = (&vertices[vid1], &vertices[vid2]);
205
206            let (v1, v2) = (*ov1 + (*n1 * face_shrink.0), *ov2 + (*n2 * face_shrink.0));
207
208            gizmos.line(v1, v2, Color::srgba_u8(red, green, blue, alpha));
209        }
210    }
211}