Skip to content

Commit 1f9d299

Browse files
committed
extended vector-structs with build- functions
1 parent e0c5bb5 commit 1f9d299

File tree

8 files changed

+97
-149
lines changed

8 files changed

+97
-149
lines changed

‎package/vraid/struct.rkt‎

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
#lang racket
22

3-
(require "struct/keyword-struct.rkt"
4-
"struct/vector-struct.rkt")
3+
(require "require.rkt")
54

6-
(provide (all-from-out
7-
"struct/keyword-struct.rkt"
8-
"struct/vector-struct.rkt"))
5+
(require/provide "struct/keyword-struct.rkt"
6+
"struct/vector-struct.rkt")

‎package/vraid/struct/vector-struct.rkt‎

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,27 @@
88
"keyword-struct.rkt"
99
"../util/vector-util.rkt")
1010

11-
(provide vector-struct)
11+
(provide vector-struct
12+
vec
13+
flvec)
14+
15+
(define vec build-vector-accessor)
16+
(define flvec build-flvector-accessor)
1217

1318
(define-syntax (vector-struct stx)
1419
(syntax-case stx ()
15-
[(_ id ([field : type] ...) opt ...)
20+
[(_ id ([field : build-vector-accessor type] ...) opt ...)
1621
(with-syntax ([(set ...) (map (lambda (field)
1722
(format-id field "~a-set!" field))
1823
(syntax->list #'(field ...)))]
1924
[struct/accessors (format-id #'id "~a/accessors" #'id)]
25+
[build-struct (format-id #'id "build-~a" #'id)]
26+
[(kw+function-type ...) (append*
27+
(map (lambda (fld type)
28+
(list (syntax->keyword fld)
29+
(list #'Integer #'-> type)))
30+
(syntax->list #'(field ...))
31+
(syntax->list #'(type ...))))]
2032
[(kw+vector-type ...) (append*
2133
(map (lambda (fld type)
2234
(list (syntax->keyword fld)
@@ -37,4 +49,10 @@
3749
(ann (lambda (kw+fld ...)
3850
(id (vector-accessor-get field) ...
3951
(vector-accessor-set field) ...))
40-
(kw+vector-type ... -> id)))))]))
52+
(kw+vector-type ... -> id)))
53+
(define build-struct
54+
(ann (lambda (n)
55+
(lambda (kw+fld ...)
56+
(let ([field (build-vector-accessor n field)] ...)
57+
(struct/accessors kw+fld ...))))
58+
(Integer -> (kw+function-type ... -> id))))))]))

‎package/vraid/util/vector-util.rkt‎

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#lang typed/racket
22

3-
(provide (all-defined-out))
4-
53
(require math/flonum)
64

5+
(provide (all-defined-out))
6+
77
(: vector-index (All (a) (a (Vectorof a) -> Integer)))
88
(define (vector-index e v)
99
(let ([m (vector-member e v)])
@@ -14,13 +14,13 @@
1414
(: build-vector-ref (All (a) (Integer (Integer -> a) -> (Integer -> a))))
1515
(define (build-vector-ref count f)
1616
(let ([v (build-vector count f)])
17-
(lambda: ([n : Integer])
17+
(λ ([n : Integer])
1818
(vector-ref v n))))
1919

2020
(: build-flvector-ref (Integer (Integer -> Float) -> (Integer -> Float)))
2121
(define (build-flvector-ref count f)
2222
(let ([v (build-flvector count f)])
23-
(lambda: ([n : Integer])
23+
(λ ([n : Integer])
2424
(flvector-ref v n))))
2525

2626
(: vector-take-at-most (All (a) ((Vectorof a) Integer -> (Vectorof a))))
@@ -31,17 +31,38 @@
3131
([get : (Integer -> A)]
3232
[set : (Integer A -> Void)]))
3333

34+
(: vector-get (All (A) ((Vectorof A) -> (Integer -> A))))
35+
(define ((vector-get v) n)
36+
(vector-ref v n))
37+
38+
(: vector-set (All (A) ((Vectorof A) -> (Integer A -> Void))))
39+
(define ((vector-set v) n value)
40+
(vector-set! v n value))
41+
42+
(: flvector-get (FlVector -> (Integer -> Float)))
43+
(define ((flvector-get v) n)
44+
(flvector-ref v n))
45+
46+
(: flvector-set (FlVector -> (Integer Float -> Void)))
47+
(define ((flvector-set v) n value)
48+
(flvector-set! v n value))
49+
3450
(: make-vector-accessor (All (A) ((Vectorof A) -> (vector-accessor A))))
3551
(define (make-vector-accessor v)
36-
(vector-accessor (lambda ([n : Integer])
37-
(vector-ref v n))
38-
(lambda ([n : Integer]
39-
[a : A])
40-
(vector-set! v n a))))
52+
(vector-accessor
53+
(vector-get v)
54+
(vector-set v)))
4155

4256
(: make-flvector-accessor (FlVector -> (vector-accessor Float)))
4357
(define (make-flvector-accessor v)
44-
(vector-accessor (curry flvector-ref v)
45-
(lambda ([n : Integer]
46-
[a : Float])
47-
(flvector-set! v n a))))
58+
(vector-accessor
59+
(flvector-get v)
60+
(flvector-set v)))
61+
62+
(: build-vector-accessor (All (A) (Integer (Integer -> A) -> (vector-accessor A))))
63+
(define (build-vector-accessor n get)
64+
(make-vector-accessor (build-vector n get)))
65+
66+
(: build-flvector-accessor (Integer (Integer -> Float) -> (vector-accessor Float)))
67+
(define (build-flvector-accessor n get)
68+
(make-flvector-accessor (build-flvector n get)))

‎planet/climate/climate-structs.rkt‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,19 @@
3636
(climate-parameters-axial-tilt (planet-climate-parameters planet))))
3737

3838
(vector-struct tile-climate-data
39-
([snow : Float]
40-
[sunlight : Float]
41-
[temperature : Float]
42-
[humidity : Float]
43-
[precipitation : Float]
44-
[leaf-area-index : Float]))
39+
([snow : flvec Float]
40+
[sunlight : flvec Float]
41+
[temperature : flvec Float]
42+
[humidity : flvec Float]
43+
[precipitation : flvec Float]
44+
[leaf-area-index : flvec Float]))
4545

4646
(vector-struct corner-climate-data
47-
([river-flow : Float]))
47+
([river-flow : flvec Float]))
4848

4949
(vector-struct edge-climate-data
50-
([river-flow : Float]
51-
[air-flow : Float]))
50+
([river-flow : flvec Float]
51+
[air-flow : flvec Float]))
5252

5353
(struct/kw planet-climate planet-terrain
5454
([parameters : climate-parameters]

‎planet/terrain-generation/planet-create.rkt‎

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
(require vraid/math
44
vraid/util
55
math/flonum
6-
"terrain-data.rkt"
76
"../grid-base.rkt"
87
"../heightmap.rkt"
98
"../geometry.rkt"
@@ -19,13 +18,13 @@
1918
(define ((planet/sea-level sea-level) p)
2019
(let* ([tile-count (tile-count p)]
2120
[corner-count [corner-count p]]
22-
[tile-data (make-tile-terrain-data tile-count
23-
(curry tile-elevation p)
24-
(λ ([n : Integer])
25-
sea-level))]
26-
[corner-data (make-corner-terrain-data corner-count
27-
(curry corner-elevation p)
28-
(curry corner-river-direction p))])
21+
[tile-data ((build-tile-terrain-data tile-count)
22+
#:elevation (curry tile-elevation p)
23+
#:water-level (λ ([n : Integer])
24+
sea-level))]
25+
[corner-data ((build-corner-terrain-data corner-count)
26+
#:elevation (curry corner-elevation p)
27+
#:river-direction (curry corner-river-direction p))])
2928
(planet-terrain/kw
3029
#:planet-geometry p
3130
#:sea-level sea-level
@@ -38,24 +37,24 @@
3837
(planet-terrain/kw
3938
#:planet-geometry p
4039
#:sea-level (planet-sea-level p)
41-
#:tile (make-tile-terrain-data (tile-count p)
42-
(curry tile-elevation p)
43-
(curry tile-water-level p))
44-
#:corner (make-corner-terrain-data (corner-count p)
45-
(curry corner-elevation p)
46-
(curry corner-river-direction p))
40+
#:tile ((build-tile-terrain-data (tile-count p))
41+
#:elevation (curry tile-elevation p)
42+
#:water-level (curry tile-water-level p))
43+
#:corner ((build-corner-terrain-data (corner-count p))
44+
#:elevation (curry corner-elevation p)
45+
#:river-direction (curry corner-river-direction p))
4746
#:rivers (planet-rivers p)))
4847

4948
(: heightmap->planet (Float FlVector -> (grid/heightmap -> planet-terrain)))
5049
(define ((heightmap->planet radius axis) gh)
5150
(let* ([grid (grid/heightmap-grid gh)]
5251
[h (grid/heightmap-heightmap gh)]
53-
[tile (make-tile-terrain-data (tile-count grid)
54-
(curry flvector-ref (heightmap-tiles h))
55-
(λ ([n : Integer]) 0.0))]
56-
[corner (make-corner-terrain-data (corner-count grid)
57-
(curry flvector-ref (heightmap-corners h))
58-
(λ ([n : Integer]) #f))])
52+
[tile ((build-tile-terrain-data (tile-count grid))
53+
#:elevation (curry flvector-ref (heightmap-tiles h))
54+
#:water-level (λ ([n : Integer]) 0.0))]
55+
[corner ((build-corner-terrain-data (corner-count grid))
56+
#:elevation (curry flvector-ref (heightmap-corners h))
57+
#:river-direction (λ ([n : Integer]) #f))])
5958

6059
(planet-terrain/kw
6160
#:planet-geometry (planet-geometry/kw

‎planet/terrain-generation/river-generation.rkt‎

Lines changed: 7 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,10 @@
33
(require vraid/flow
44
vraid/sorted-tree
55
"../grid-base.rkt"
6-
"../terrain.rkt"
7-
"terrain-data.rkt")
6+
"../terrain.rkt")
87

98
(provide planet/rivers)
109

11-
(: bad-river-end? (planet-terrain Integer -> Boolean))
12-
(define (bad-river-end? planet n)
13-
(and (corner-land? planet n)
14-
(not (corner-river-direction planet n))))
15-
16-
(: has-bad-ends? (planet-terrain -> Boolean))
17-
(define (has-bad-ends? planet)
18-
(ormap (curry bad-river-end? planet)
19-
(range (corner-count planet))))
20-
21-
(: lowest-nearby (planet-terrain Integer -> Float))
22-
(define (lowest-nearby planet n)
23-
(foldl min
24-
+inf.0
25-
(map (curry corner-elevation planet)
26-
(grid-corner-corner-list planet n))))
27-
28-
(: highest-nearby (planet-terrain Integer -> Float))
29-
(define (highest-nearby planet n)
30-
(foldl max
31-
-inf.0
32-
(map (curry corner-elevation planet)
33-
(grid-corner-corner-list planet n))))
34-
35-
(: elevate-ends! (planet-terrain -> Void))
36-
(define (elevate-ends! planet)
37-
(for ([n (corner-count planet)])
38-
(when (bad-river-end? planet n)
39-
((corner-terrain-data-elevation-set! (planet-terrain-corner planet))
40-
n
41-
(* 1.01 (highest-nearby planet n))))))
42-
4310
(define-type corner-node (Pair Integer Float))
4411

4512
(: ref (All (A) ((Vectorof A) -> (Integer -> A))))
@@ -130,12 +97,12 @@
13097

13198
(: planet/rivers (planet-terrain -> planet-terrain))
13299
(define (planet/rivers p)
133-
(let* ([tiles (make-tile-terrain-data (tile-count p)
134-
(curry tile-elevation p)
135-
(curry tile-water-level p))]
136-
[corners (make-corner-terrain-data (corner-count p)
137-
(curry corner-elevation p)
138-
(curry corner-river-direction p))]
100+
(let* ([tiles ((build-tile-terrain-data (tile-count p))
101+
#:elevation (curry tile-elevation p)
102+
#:water-level (curry tile-water-level p))]
103+
[corners ((build-corner-terrain-data (corner-count p))
104+
#:elevation (curry corner-elevation p)
105+
#:river-direction (curry corner-river-direction p))]
139106
[p (planet-terrain/kw
140107
#:planet-geometry p
141108
#:sea-level (planet-sea-level p)
@@ -145,18 +112,3 @@
145112
(set-directions/floodfill! p)
146113
(struct-copy planet-terrain p
147114
[rivers (river-trees p)])))
148-
149-
; direction is -1 if no neighbouring corner has lower elevation
150-
(: lowest-corner-direction (planet-terrain Integer -> Fixnum))
151-
(define (lowest-corner-direction planet n)
152-
(let* ([elevation (λ ([n : Integer])
153-
(corner-elevation planet n))]
154-
[index/elevation (λ ([i : Fixnum])
155-
(cons i (elevation
156-
(corner-corner planet n i))))]
157-
[indices/elevation (map index/elevation
158-
'(0 1 2))])
159-
(car (argmin (λ ([p : (Pair Fixnum Float)])
160-
(cdr p))
161-
(cons (cons -1 (elevation n))
162-
indices/elevation)))))

‎planet/terrain-generation/terrain-data.rkt‎

Lines changed: 0 additions & 40 deletions
This file was deleted.

‎planet/terrain/terrain-structs.rkt‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
(define-type river-list (Listof river))
1515

1616
(vector-struct tile-terrain-data
17-
([elevation : Float]
18-
[water-level : Float]))
17+
([elevation : flvec Float]
18+
[water-level : flvec Float]))
1919

2020
(vector-struct corner-terrain-data
21-
([elevation : Float]
22-
[river-direction : (Option Integer)]))
21+
([elevation : flvec Float]
22+
[river-direction : vec (Option Integer)]))
2323

2424
(struct/kw planet-terrain planet-geometry
2525
([sea-level : Float]

0 commit comments

Comments
 (0)