8
8
use crate :: representations:: intermediates:: { Entity , IntermediateFace } ;
9
9
use crate :: shader_data:: Coords2Shader ;
10
10
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
+ } ;
12
14
13
15
// ------ CONTENT
14
16
@@ -25,15 +27,18 @@ pub struct RenderParameters {
25
27
pub arrow_headsize : f32 ,
26
28
/// Thickness of the darts.
27
29
pub arrow_thickness : f32 ,
30
+ /// Size arrow thcikness and head relatively to their length.
31
+ pub relative_resize : bool ,
28
32
}
29
33
30
34
impl Default for RenderParameters {
31
35
fn default ( ) -> Self {
32
36
Self {
33
37
smaa_mode : SmaaMode :: Disabled ,
34
38
shrink_factor : 0.1 , // need to adjust
35
- arrow_headsize : 0.1 , // need to adjust
39
+ arrow_headsize : 0.05 , // need to adjust
36
40
arrow_thickness : 0.01 , // need to adjust
41
+ relative_resize : true ,
37
42
}
38
43
}
39
44
}
@@ -87,33 +92,46 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
87
92
. filter ( |face| face. n_vertices > 1 )
88
93
. flat_map ( |face| {
89
94
( 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 ] ;
92
97
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 ( ) ;
96
101
97
- let seg = v6 - v1;
98
- let seg_length = seg. norm ( ) ;
99
- let seg_dir = seg. unit_dir ( ) . unwrap ( ) ;
102
+ let seg = vb - va;
100
103
let seg_normal = seg. normal_dir ( ) ;
101
104
let ahs = T :: from ( self . params . arrow_headsize ) . unwrap ( ) ;
102
105
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;
110
125
[
111
126
Coords2Shader :: from ( ( v1, Entity :: Dart ) ) ,
112
127
Coords2Shader :: from ( ( v2, Entity :: Dart ) ) ,
113
128
Coords2Shader :: from ( ( v3, Entity :: Dart ) ) ,
114
129
Coords2Shader :: from ( ( v4, Entity :: Dart ) ) ,
115
130
Coords2Shader :: from ( ( v5, Entity :: Dart ) ) ,
116
131
Coords2Shader :: from ( ( v6, Entity :: Dart ) ) ,
132
+ Coords2Shader :: from ( ( v7, Entity :: Dart ) ) ,
133
+ Coords2Shader :: from ( ( v8, Entity :: Dart ) ) ,
134
+ Coords2Shader :: from ( ( v9, Entity :: Dart ) ) ,
117
135
]
118
136
. into_iter ( )
119
137
} )
@@ -123,7 +141,37 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
123
141
124
142
#[ allow( dead_code) ]
125
143
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) ;
127
175
}
128
176
129
177
pub fn build_faces ( & mut self ) {
@@ -155,6 +203,7 @@ impl<'a, T: CoordsFloat> CMap2RenderHandle<'a, T> {
155
203
self . vertices . clear ( ) ;
156
204
self . vertices . append ( & mut self . face_construction_buffer ) ;
157
205
self . vertices . append ( & mut self . dart_construction_buffer ) ;
206
+ self . vertices . append ( & mut self . _beta_construction_buffer ) ;
158
207
}
159
208
160
209
pub fn vertices ( & self ) -> & [ Coords2Shader ] {
0 commit comments