Skip to content

Commit b94a706

Browse files
authored
refactor: update render code (#62)
* refactor: transform triangular arrows into proper ones * refactor: remove relative computation of arrow thickness/head size * feat: add conditional arrow resize to render params * feat: add a binding to F1 to stop the render * feat: render beta2 as diamonds * chore: mention missing content in changelog
1 parent f1d5836 commit b94a706

File tree

8 files changed

+94
-23
lines changed

8 files changed

+94
-23
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
## To be released
66

7-
...
7+
content from PR #49 / commit ce3948d2e7ccda4e58395ff9e715c946e9b8f744 onward
88

99
---
1010

honeycomb-examples/examples/render/squaremap_shift.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ fn main() {
1111
const N_SQUARE: usize = 16;
1212
let render_params = RenderParameters {
1313
smaa_mode: SmaaMode::Smaa1X,
14+
relative_resize: false,
1415
..Default::default()
1516
};
1617

honeycomb-render/src/handle.rs

Lines changed: 67 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
use crate::representations::intermediates::{Entity, IntermediateFace};
99
use crate::shader_data::Coords2Shader;
1010
use crate::SmaaMode;
11-
use honeycomb_core::{CMap2, CoordsFloat, DartIdentifier, Orbit2, OrbitPolicy};
11+
use honeycomb_core::{
12+
CMap2, CoordsFloat, DartIdentifier, EdgeIdentifier, Orbit2, OrbitPolicy, Vertex2, NULL_DART_ID,
13+
};
1214

1315
// ------ CONTENT
1416

@@ -25,15 +27,18 @@ pub struct RenderParameters {
2527
pub arrow_headsize: f32,
2628
/// Thickness of the darts.
2729
pub arrow_thickness: f32,
30+
/// Size arrow thcikness and head relatively to their length.
31+
pub relative_resize: bool,
2832
}
2933

3034
impl Default for RenderParameters {
3135
fn default() -> Self {
3236
Self {
3337
smaa_mode: SmaaMode::Disabled,
3438
shrink_factor: 0.1, // need to adjust
35-
arrow_headsize: 0.1, // need to adjust
39+
arrow_headsize: 0.05, // need to adjust
3640
arrow_thickness: 0.01, // need to adjust
41+
relative_resize: true,
3742
}
3843
}
3944
}
@@ -87,33 +92,46 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
8792
.filter(|face| face.n_vertices > 1)
8893
.flat_map(|face| {
8994
(0..face.n_vertices).flat_map(|id| {
90-
let mut v1 = face.vertices[id];
91-
let mut v6 = face.vertices[(id + 1) % face.n_vertices];
95+
let mut va = face.vertices[id];
96+
let mut vb = face.vertices[(id + 1) % face.n_vertices];
9297

93-
let seg_dir = (v6 - v1).unit_dir().unwrap();
94-
v1 += seg_dir * T::from(self.params.shrink_factor).unwrap();
95-
v6 -= seg_dir * T::from(self.params.shrink_factor).unwrap();
98+
let seg_dir = (vb - va).unit_dir().unwrap();
99+
va += seg_dir * T::from(self.params.shrink_factor).unwrap();
100+
vb -= seg_dir * T::from(self.params.shrink_factor).unwrap();
96101

97-
let seg = v6 - v1;
98-
let seg_length = seg.norm();
99-
let seg_dir = seg.unit_dir().unwrap();
102+
let seg = vb - va;
100103
let seg_normal = seg.normal_dir();
101104
let ahs = T::from(self.params.arrow_headsize).unwrap();
102105
let at = T::from(self.params.arrow_thickness).unwrap();
103-
104-
let vcenter = v6 - seg_dir * ahs;
105-
let v2 = vcenter - seg_normal * at;
106-
let v3 = vcenter + seg_normal * at;
107-
let v4 = vcenter + seg_normal * (ahs * seg_length);
108-
let v5 = vcenter - seg_normal * (ahs * seg_length);
109-
106+
let mut body_offset = seg_normal * at;
107+
let mut head_offset = seg_normal * ahs;
108+
let mut vcenter = vb - seg * ahs;
109+
if self.params.relative_resize {
110+
let seg_length = seg.norm();
111+
body_offset *= seg_length;
112+
head_offset *= seg_length;
113+
vcenter = vb - seg * seg_length * ahs;
114+
}
115+
116+
let v1 = va + body_offset;
117+
let v2 = va - body_offset;
118+
let v3 = vcenter - body_offset;
119+
let v4 = v3;
120+
let v5 = v1;
121+
let v6 = vcenter + body_offset;
122+
let v7 = vcenter + head_offset;
123+
let v8 = vcenter - head_offset;
124+
let v9 = vb;
110125
[
111126
Coords2Shader::from((v1, Entity::Dart)),
112127
Coords2Shader::from((v2, Entity::Dart)),
113128
Coords2Shader::from((v3, Entity::Dart)),
114129
Coords2Shader::from((v4, Entity::Dart)),
115130
Coords2Shader::from((v5, Entity::Dart)),
116131
Coords2Shader::from((v6, Entity::Dart)),
132+
Coords2Shader::from((v7, Entity::Dart)),
133+
Coords2Shader::from((v8, Entity::Dart)),
134+
Coords2Shader::from((v9, Entity::Dart)),
117135
]
118136
.into_iter()
119137
})
@@ -123,7 +141,37 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
123141

124142
#[allow(dead_code)]
125143
pub fn build_betas(&mut self) {
126-
todo!()
144+
let tmp: Vec<EdgeIdentifier> = self.handle.fetch_edges().identifiers.clone();
145+
let tmp = tmp
146+
.iter()
147+
.map(|edge_id| {
148+
(
149+
*edge_id as DartIdentifier,
150+
self.handle.beta::<2>(*edge_id as DartIdentifier),
151+
)
152+
})
153+
.filter(|(_, b2vid)| *b2vid != NULL_DART_ID)
154+
.flat_map(|(dart_id, b2dart_id)| {
155+
let va = self.handle.vertex(self.handle.vertex_id(dart_id));
156+
let vb = self.handle.vertex(self.handle.vertex_id(b2dart_id));
157+
let seg_dir = vb - va;
158+
let center = Vertex2::average(&va, &vb);
159+
let seg_normal = seg_dir.normal_dir();
160+
let vr = center + seg_dir * T::from(0.01).unwrap();
161+
let vl = center - seg_dir * T::from(0.01).unwrap();
162+
let vt = center + seg_normal * T::from(0.1).unwrap();
163+
let vb = center - seg_normal * T::from(0.1).unwrap();
164+
[
165+
Coords2Shader::from((vt, Entity::Beta)),
166+
Coords2Shader::from((vl, Entity::Beta)),
167+
Coords2Shader::from((vr, Entity::Beta)),
168+
Coords2Shader::from((vl, Entity::Beta)),
169+
Coords2Shader::from((vr, Entity::Beta)),
170+
Coords2Shader::from((vb, Entity::Beta)),
171+
]
172+
.into_iter()
173+
});
174+
self._beta_construction_buffer.extend(tmp);
127175
}
128176

129177
pub fn build_faces(&mut self) {
@@ -155,6 +203,7 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
155203
self.vertices.clear();
156204
self.vertices.append(&mut self.face_construction_buffer);
157205
self.vertices.append(&mut self.dart_construction_buffer);
206+
self.vertices.append(&mut self._beta_construction_buffer);
158207
}
159208

160209
pub fn vertices(&self) -> &[Coords2Shader] {

honeycomb-render/src/representations/intermediates.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use honeycomb_core::{Coords2, CoordsFloat, Vertex2};
22

33
pub enum Entity {
44
Dart,
5+
Beta,
56
Face,
67
}
78

honeycomb-render/src/runner.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ async fn inner<T: CoordsFloat>(
3838
} else {
3939
State::new_test(&window, render_params).await
4040
};
41+
println!("I: Press F1 to quit");
4142
event_loop
4243
.run(move |event, target| {
4344
// process events
@@ -46,7 +47,7 @@ async fn inner<T: CoordsFloat>(
4647
window_id,
4748
event: wevent,
4849
} => {
49-
if window_id == state.window().id() && !state.input(&wevent) {
50+
if window_id == state.window().id() && !state.input(&wevent, target) {
5051
match wevent {
5152
WindowEvent::Resized(new_size) => state.resize(Some(new_size)),
5253
WindowEvent::RedrawRequested => {

honeycomb-render/src/shader_data.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ impl<T: CoordsFloat> From<(Vertex2<T>, Entity)> for Coords2Shader {
4343
position: as_f32_array!(v),
4444
color: match e {
4545
Entity::Dart => 0,
46+
Entity::Beta => 1,
4647
Entity::Face => 2,
4748
},
4849
}

honeycomb-render/src/shaders/shader2.wgsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn vs_main(
3333
fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> {
3434
var color: array<vec4<f32>, 7> = array(
3535
vec4<f32>(0.1, 0.1, 0.1, 1.0), // 0 -> black darts
36-
vec4<f32>(1.0, 0.1, 0.1, 0.1), // 1 ->
36+
vec4<f32>(0.3, 0.8, 0.3, 0.1), // 1 -> beta
3737
vec4<f32>(0.8, 0.3, 0.3, 0.1), // 2 -> face
3838
vec4<f32>(0.1, 0.1, 1.0, 0.1), // 3 ->
3939
vec4<f32>(0.1, 1.0, 1.0, 0.1), // 4 ->

honeycomb-render/src/state.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ use std::borrow::Cow;
1616
use wgpu::util::DeviceExt;
1717
use wgpu::PrimitiveTopology;
1818
use winit::dpi::PhysicalSize;
19+
use winit::event::{ElementState, KeyEvent};
20+
use winit::event_loop::EventLoopWindowTarget;
21+
use winit::keyboard::{Key, NamedKey};
1922
use winit::{event::WindowEvent, window::Window};
2023

2124
// ------ CONTENT
@@ -263,7 +266,7 @@ impl<'a, T: CoordsFloat> State<'a, T> {
263266
map_handle.build_intermediate();
264267
map_handle.build_darts();
265268
map_handle.build_faces();
266-
// map_handle.build_betas();
269+
map_handle.build_betas();
267270
map_handle.save_buffered();
268271

269272
let render_slice = map_handle.vertices();
@@ -364,7 +367,22 @@ impl<'a, T: CoordsFloat> State<'a, T> {
364367
self.window.request_redraw();
365368
}
366369

367-
pub fn input(&mut self, event: &WindowEvent) -> bool {
370+
pub fn input(&mut self, event: &WindowEvent, target: &EventLoopWindowTarget<()>) -> bool {
371+
// early check for exit
372+
if let WindowEvent::KeyboardInput {
373+
event: KeyEvent {
374+
state, logical_key, ..
375+
},
376+
..
377+
} = event
378+
{
379+
let is_pressed = *state == ElementState::Pressed;
380+
if let Key::Named(key) = logical_key {
381+
if is_pressed & (key == &NamedKey::F1) {
382+
target.exit();
383+
}
384+
}
385+
};
368386
self.camera_controller.process_events(event)
369387
}
370388

0 commit comments

Comments
 (0)