(&mut self, device: &Device, queue: &Queue, state: &PlotState)
| 1033 | }, |
| 1034 | }), |
| 1035 | write_mask: ColorWrites::ALL, |
| 1036 | })], |
| 1037 | }), |
| 1038 | primitive: PrimitiveState { |
| 1039 | topology: PrimitiveTopology::TriangleList, |
| 1040 | strip_index_format: None, |
| 1041 | front_face: FrontFace::Ccw, |
| 1042 | cull_mode: None, |
| 1043 | polygon_mode: PolygonMode::Fill, |
| 1044 | unclipped_depth: false, |
| 1045 | conservative: false, |
| 1046 | }, |
| 1047 | depth_stencil: None, |
| 1048 | multisample: MultisampleState::default(), |
| 1049 | multiview: None, |
| 1050 | cache: None, |
| 1051 | }); |
| 1052 | self.pipelines.composite = Some(pipeline); |
| 1053 | } |
| 1054 | |
| 1055 | fn rebuild_markers(&mut self, device: &Device, queue: &Queue, state: &PlotState) { |
| 1056 | // Only include series that have markers (marker != u32::MAX) |
| 1057 | let marker_series_count: usize = state |
| 1058 | .series |
| 1059 | .iter() |
| 1060 | .filter(|s| s.marker != u32::MAX) |
| 1061 | .map(|s| s.len) |
| 1062 | .sum(); |
| 1063 | |
| 1064 | if marker_series_count == 0 { |
| 1065 | self.buffers.markers = None; |
| 1066 | return; |
| 1067 | } |
| 1068 | |
| 1069 | let mut writer = VertexWriter::with_capacity(marker_series_count * 36); |
| 1070 | let mut id_map: Vec<(u32, u32)> = Vec::with_capacity(marker_series_count); |
| 1071 | |
| 1072 | // Iterate series so we can pick per-point color/marker for each point. |
| 1073 | for (span_idx, s) in state.series.iter().enumerate() { |
| 1074 | // Skip series without markers |
| 1075 | if s.marker == u32::MAX { |
| 1076 | continue; |
| 1077 | } |
| 1078 | |
| 1079 | // safety: ensure span indexes are valid with respect to points slice |
| 1080 | let end = s.start + s.len; |
| 1081 | if s.len == 0 || end > state.points.len() { |
| 1082 | continue; |
| 1083 | } |
| 1084 | |
| 1085 | for (local_i, p) in state.points[s.start..end].iter().enumerate() { |
| 1086 | // Subtract render_offset for high-precision rendering near zero |
| 1087 | let render_pos = self.world_to_render_pos(p.position, &state.camera); |
| 1088 | let color_idx = s.start + local_i; |
| 1089 | let color = state.point_colors.get(color_idx).unwrap_or(&s.color); |
| 1090 | writer.write_position(render_pos); |
| 1091 | writer.write_color(color); |
| 1092 | writer.write_u32(s.marker); |
no test coverage detected