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#[derive(Default, Reflect, GizmoConfigGroup)]
14pub struct DartGizmos;
15
16pub fn render_dart_enabled(drc: Res<DartRenderColor>) -> bool {
18 drc.0
19}
20
21pub fn render_darts(
23 mut gizmos: Gizmos<DartGizmos>,
24 vertices: Res<MapVertices>,
26 face_normals: Res<FaceNormals>,
27 dart_render_color: Res<DartRenderColor>,
29 dart_head_mul: Res<DartHeadMul>,
30 dart_shrink: Res<DartShrink>,
32 q: Query<(&Dart, &FaceId)>,
34) {
35 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#[allow(clippy::too_many_arguments)]
61pub fn render_darts_3d(
62 mut gizmos: Gizmos<DartGizmos>,
63 vertices: Res<MapVertices>,
65 face_normals: Res<FaceNormals>,
66 volume_normals: Res<VolumeNormals>,
67 dart_render_color: Res<DartRenderColor>,
69 dart_head_mul: Res<DartHeadMul>,
70 dart_shrink: Res<DartShrink>,
72 q: Query<(&Dart, &FaceId, &VolumeId)>,
74) {
75 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#[derive(Default, Reflect, GizmoConfigGroup)]
109pub struct VertexGizmos;
110
111pub fn render_vertex_enabled(vrc: Res<VertexRenderColor>) -> bool {
113 vrc.0
114}
115
116pub 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#[derive(Default, Reflect, GizmoConfigGroup)]
139pub struct EdgeGizmos;
140
141pub fn render_edge_enabled(erc: Res<EdgeRenderColor>) -> bool {
143 erc.0
144}
145
146pub fn render_edges(
148 mut gizmos: Gizmos<EdgeGizmos>,
149 vertices: Res<MapVertices>,
150 edge_render_color: Res<EdgeRenderColor>,
151 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#[derive(Default, Reflect, GizmoConfigGroup)]
168pub struct FaceGizmos;
169
170pub fn render_face_enabled(frc: Res<FaceRenderColor>) -> bool {
172 frc.0
173}
174
175#[allow(clippy::missing_panics_doc)]
176pub 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}