@@ -71,53 +71,53 @@ pub struct NodeState {
71
71
enviro : EnviroFactors ,
72
72
}
73
73
impl NodeState {
74
- pub fn root ( ) -> Self {
75
- Self {
76
- kind : NodeStateKind :: ROOT ,
77
- surface : Plane :: from ( Side :: A ) ,
78
- road_state : NodeStateRoad :: ROOT ,
79
- enviro : EnviroFactors {
74
+ pub fn new ( graph : & Graph , node : NodeId ) -> Self {
75
+ let mut parents = graph
76
+ . descenders ( node)
77
+ . map ( |( s, n) | ParentInfo {
78
+ node_id : n,
79
+ side : s,
80
+ node_state : graph. node_state ( n) ,
81
+ } )
82
+ . fuse ( ) ;
83
+ let parents = [ parents. next ( ) , parents. next ( ) , parents. next ( ) ] ;
84
+
85
+ let enviro = match ( parents[ 0 ] , parents[ 1 ] ) {
86
+ ( None , None ) => EnviroFactors {
80
87
max_elevation : 0.0 ,
81
88
temperature : 0.0 ,
82
89
rainfall : 0.0 ,
83
90
blockiness : 0.0 ,
84
91
} ,
85
- }
86
- }
87
-
88
- pub fn child ( & self , graph : & Graph , node : NodeId , side : Side ) -> Self {
89
- let mut d = graph
90
- . descenders ( node)
91
- . map ( |( s, n) | ( s, graph. node_state ( n) ) ) ;
92
- let enviro = match ( d. next ( ) , d. next ( ) ) {
93
- ( Some ( _) , None ) => {
94
- let parent_side = graph. parent ( node) . unwrap ( ) ;
95
- let parent_node = graph. neighbor ( node, parent_side) . unwrap ( ) ;
96
- let parent_state = graph. node_state ( parent_node) ;
92
+ ( Some ( parent) , None ) => {
97
93
let spice = graph. hash_of ( node) as u64 ;
98
- EnviroFactors :: varied_from ( parent_state . enviro , spice)
94
+ EnviroFactors :: varied_from ( parent . node_state . enviro , spice)
99
95
}
100
- ( Some ( ( a_side, a_state) ) , Some ( ( b_side, b_state) ) ) => {
101
- let ab_node = graph
102
- . neighbor ( graph. neighbor ( node, a_side) . unwrap ( ) , b_side)
103
- . unwrap ( ) ;
104
- let ab_state = graph. node_state ( ab_node) ;
105
- EnviroFactors :: continue_from ( a_state. enviro , b_state. enviro , ab_state. enviro )
96
+ ( Some ( parent_a) , Some ( parent_b) ) => {
97
+ let ab_node = graph. neighbor ( parent_a. node_id , parent_b. side ) . unwrap ( ) ;
98
+ let ab_state = & graph. node_state ( ab_node) ;
99
+ EnviroFactors :: continue_from (
100
+ parent_a. node_state . enviro ,
101
+ parent_b. node_state . enviro ,
102
+ ab_state. enviro ,
103
+ )
106
104
}
107
105
_ => unreachable ! ( ) ,
108
106
} ;
109
107
110
- let child_kind = self . kind . child ( side) ;
111
- let child_road = self . road_state . child ( side) ;
108
+ let kind = parents[ 0 ] . map_or ( NodeStateKind :: ROOT , |p| p. node_state . kind . child ( p. side ) ) ;
109
+ let road_state = parents[ 0 ] . map_or ( NodeStateRoad :: ROOT , |p| {
110
+ p. node_state . road_state . child ( p. side )
111
+ } ) ;
112
112
113
113
Self {
114
- kind : child_kind ,
115
- surface : match child_kind {
114
+ kind,
115
+ surface : match kind {
116
116
Land => Plane :: from ( Side :: A ) ,
117
117
Sky => -Plane :: from ( Side :: A ) ,
118
- _ => side * self . surface ,
118
+ _ => parents [ 0 ] . map ( |p| p . side * p . node_state . surface ) . unwrap ( ) ,
119
119
} ,
120
- road_state : child_road ,
120
+ road_state,
121
121
enviro,
122
122
}
123
123
}
@@ -127,6 +127,13 @@ impl NodeState {
127
127
}
128
128
}
129
129
130
+ #[ derive( Clone , Copy ) ]
131
+ struct ParentInfo < ' a > {
132
+ node_id : NodeId ,
133
+ side : Side ,
134
+ node_state : & ' a NodeState ,
135
+ }
136
+
130
137
struct VoxelCoords {
131
138
counter : u32 ,
132
139
dimension : u8 ,
0 commit comments